From c84564dafd92fb4e21ecfeb6fe3123f368f0394b Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Mon, 24 Nov 2025 09:37:13 +0300 Subject: [PATCH 01/55] minor changes --- .../location/location_view_model.dart | 36 ++++++++----------- .../home_health_care/hhc_procedures_page.dart | 22 +----------- 2 files changed, 16 insertions(+), 42 deletions(-) diff --git a/lib/features/location/location_view_model.dart b/lib/features/location/location_view_model.dart index e2e0cc5..bf5f18a 100644 --- a/lib/features/location/location_view_model.dart +++ b/lib/features/location/location_view_model.dart @@ -2,15 +2,12 @@ import 'dart:async'; import 'package:flutter/foundation.dart' show ChangeNotifier; import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/src/types/camera.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart' as GMSMapServices; import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart'; import 'package:hmg_patient_app_new/features/location/location_repo.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:huawei_map/huawei_map.dart' as HMSCameraServices; -import 'package:google_maps_flutter/google_maps_flutter.dart' as GMSMapServices; - - import 'PlacePrediction.dart'; @@ -20,8 +17,8 @@ class LocationViewModel extends ChangeNotifier { LocationViewModel({required this.locationRepo, required this.errorHandlerService}); - List predictions = []; - PlacePrediction? selectedPrediction; + List predictions = []; + PlacePrediction? selectedPrediction; bool isPredictionLoading = false; GeocodeResponse? geocodeResponse; PlaceDetails? placeDetails; @@ -30,14 +27,14 @@ class LocationViewModel extends ChangeNotifier { FutureOr getPlacesPrediction(String input) async { predictions = []; - isPredictionLoading= true; + isPredictionLoading = true; final result = await locationRepo.getPlacePredictionsAsInput(input); result.fold( (failure) { errorHandlerService.handleError(failure: failure); }, (apiModel) { - predictions = apiModel.data??[]; + predictions = apiModel.data ?? []; }, ); isPredictionLoading = false; @@ -75,21 +72,20 @@ class LocationViewModel extends ChangeNotifier { handleGMSMapCameraMoved(GMSMapServices.CameraPosition value) { mapCapturedLocation = Location(lat: value.target.latitude, lng: value.target.longitude); - } handleHMSMapCameraMoved(HMSCameraServices.CameraPosition value) { mapCapturedLocation = Location(lat: value.target.lat, lng: value.target.lng); } - handleOnCameraIdle(){ - if(mapCapturedLocation != null) { + handleOnCameraIdle() { + if (mapCapturedLocation != null) { getPlaceEncodedData(mapCapturedLocation!.lat, mapCapturedLocation!.lng); } } void updateSearchQuery(String? value) { - if(value == null || value.isEmpty){ + if (value == null || value.isEmpty) { predictions = []; return; } @@ -99,18 +95,16 @@ class LocationViewModel extends ChangeNotifier { void flushSearchPredictions() { predictions = []; - mapCapturedLocation= null; - placeDetails= null; - geocodeResponse= null; - selectedPrediction= null; + mapCapturedLocation = null; + placeDetails = null; + geocodeResponse = null; + selectedPrediction = null; notifyListeners(); } - FutureOr selectPlacePrediction(PlacePrediction placePrediction) async{ - selectedPrediction= placePrediction; + FutureOr selectPlacePrediction(PlacePrediction placePrediction) async { + selectedPrediction = placePrediction; await getPlaceDetails(placePrediction.placeID); } - - -} \ No newline at end of file +} diff --git a/lib/presentation/home_health_care/hhc_procedures_page.dart b/lib/presentation/home_health_care/hhc_procedures_page.dart index 0cf57ce..e4a6656 100644 --- a/lib/presentation/home_health_care/hhc_procedures_page.dart +++ b/lib/presentation/home_health_care/hhc_procedures_page.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.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/hmg_services/hmg_services_view_model.dart'; @@ -213,7 +212,7 @@ class _HhcProceduresPageState extends State { margin: EdgeInsets.symmetric(horizontal: 16.w), padding: EdgeInsets.all(16.w), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.primaryRedColor.withValues(alpha: 0.1), + color: AppColors.greyLightColor, borderRadius: 16.r, ), child: Row( @@ -232,25 +231,6 @@ class _HhcProceduresPageState extends State { ), ], ), - Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - "Total Amount".needTranslation.toText12( - color: AppColors.textColorLight, - fontWeight: FontWeight.w600, - ), - Utils.getPaymentAmountWithSymbol( - viewModel.getHhcSelectedServicesTotal().toStringAsFixed(2).toText16( - isBold: true, - weight: FontWeight.bold, - color: AppColors.primaryRedColor, - ), - AppColors.primaryRedColor, - 14, - isSaudiCurrency: true, - ), - ], - ), ], ), ), From 8068de70cbadfea6992d6950f7bb2fb0df303263 Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Mon, 24 Nov 2025 10:58:31 +0300 Subject: [PATCH 02/55] Completed the HHC and CMC --- lib/core/api_consts.dart | 10 +- .../appointment_details_page.dart | 46 ++-- .../cmc_selection_review_page.dart | 106 ++-------- .../home_health_care/hhc_procedures_page.dart | 195 +++++++++++++---- .../hhc_selection_review_page.dart | 46 +++- lib/widgets/map/location_map_widget.dart | 199 ++++++++++++++++++ lib/widgets/map/map_utility_screen.dart | 103 ++++----- 7 files changed, 467 insertions(+), 238 deletions(-) create mode 100644 lib/widgets/map/location_map_widget.dart diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index a1f4062..f5aa29d 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -513,12 +513,6 @@ var PATIENT_ER_INSERT_PRES_ORDER = 'Services/Patients.svc/REST/PatientER_InsertP var BLOOD_DONATION_REGISTER_BLOOD_TYPE = 'Services/PatientVarification.svc/REST/BloodDonation_RegisterBloodType'; var ADD_USER_AGREEMENT_FOR_BLOOD_DONATION = 'Services/PatientVarification.svc/REST/AddUserAgreementForBloodDonation'; -// HHC RC SERVICES -var HHC_GET_ALL_SERVICES_RC = "api/HHC/getallhhc"; -var ADD_HHC_ORDER_RC = "api/HHC/add"; -var GET_ALL_HHC_ORDERS_RC = 'api/hhc/list'; -var UPDATE_HHC_ORDER_RC = 'api/hhc/update'; - // RRT RC SERVICES var ADD_RRT_ORDER_RC = "api/rrt/add"; var GET_ALL_RRT_ORDERS_RC = "api/rrt/list"; @@ -858,3 +852,7 @@ class ApiConsts { static final String appGeneralId = "Cs2020@2016\$2958"; static final String sessionID = 'TMRhVmkGhOsvamErw'; } + +class ApiKeyConstants { + static final String googleMapsApiKey = 'AIzaSyB6TERnxIr0yJ3qG4ULBZbu0sAD4tGqtng'; +} diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index e620783..4c725aa 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -26,11 +26,7 @@ import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointmen import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; import 'package:hmg_patient_app_new/presentation/contact_us/feedback_page.dart'; -import 'package:hmg_patient_app_new/presentation/lab/lab_orders_page.dart'; -import 'package:hmg_patient_app_new/presentation/medical_file/widgets/lab_rad_card.dart'; import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_detail_page.dart'; -import 'package:hmg_patient_app_new/presentation/prescriptions/prescriptions_list_page.dart'; -import 'package:hmg_patient_app_new/presentation/radiology/radiology_orders_page.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'; @@ -208,7 +204,7 @@ class _AppointmentDetailsPageState extends State { borderRadius: BorderRadius.circular(24.r), // Todo: what is this???? Api Key??? 😲 child: Image.network( - "https://maps.googleapis.com/maps/api/staticmap?center=${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&zoom=14&size=350x165&maptype=roadmap&markers=color:red%7C${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&key=AIzaSyB6TERnxIr0yJ3qG4ULBZbu0sAD4tGqtng", + "https://maps.googleapis.com/maps/api/staticmap?center=${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&zoom=14&size=350x165&maptype=roadmap&markers=color:red%7C${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&key=${ApiKeyConstants.googleMapsApiKey}", fit: BoxFit.contain, ), ), @@ -286,17 +282,17 @@ class _AppointmentDetailsPageState extends State { ) // : SizedBox.shrink() : GridView( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - crossAxisSpacing: 16.h, - mainAxisSpacing: 16.w, - mainAxisExtent: 115.h, - ), - physics: NeverScrollableScrollPhysics(), - padding: EdgeInsets.zero, - shrinkWrap: true, - children: [ - MedicalFileCard( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 16.h, + mainAxisSpacing: 16.w, + mainAxisExtent: 115.h, + ), + physics: NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + shrinkWrap: true, + children: [ + MedicalFileCard( label: LocaleKeys.labResults.tr(context: context), textColor: AppColors.blackColor, backgroundColor: AppColors.whiteColor, @@ -385,13 +381,15 @@ class _AppointmentDetailsPageState extends State { ); Navigator.of(context).push( CustomPageRoute( - page: PrescriptionDetailPage(isFromAppointments: true, prescriptionsResponseModel: patientPrescriptionsResponseModel), + page: PrescriptionDetailPage( + isFromAppointments: true, prescriptionsResponseModel: patientPrescriptionsResponseModel), ), ); } else { showCommonBottomSheetWithoutHeight( context, - child: Utils.getErrorWidget(loadingText: "You don't have any prescriptions for this appointment.".needTranslation), + child: Utils.getErrorWidget( + loadingText: "You don't have any prescriptions for this appointment.".needTranslation), callBackFunc: () {}, isFullScreen: false, isCloseButtonVisible: true, @@ -412,11 +410,11 @@ class _AppointmentDetailsPageState extends State { // Navigator.of(context).push( // CustomPageRoute( // page: VaccineListPage(), - // ), - // ); - }), - ], - ), + // ), + // ); + }), + ], + ), // Column( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ diff --git a/lib/presentation/comprehensive_checkup/cmc_selection_review_page.dart b/lib/presentation/comprehensive_checkup/cmc_selection_review_page.dart index b6164d9..3be209b 100644 --- a/lib/presentation/comprehensive_checkup/cmc_selection_review_page.dart +++ b/lib/presentation/comprehensive_checkup/cmc_selection_review_page.dart @@ -2,7 +2,6 @@ import 'dart:developer'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -22,6 +21,7 @@ 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/map/location_map_widget.dart'; import 'package:maps_launcher/maps_launcher.dart'; import 'package:provider/provider.dart'; @@ -155,100 +155,26 @@ class _CmcSelectionReviewPageState extends State { } Widget _buildHospitalMap(HospitalsModel selectedHospital) { - final String lat = selectedHospital.latitude ?? "0.0"; - final String lng = selectedHospital.longitude ?? "0.0"; + final String lat = ((selectedHospital.latitude == null || selectedHospital.latitude!.isEmpty) ? "0.0" : selectedHospital.latitude) ?? "0.0"; + final String lng = ((selectedHospital.longitude == null || selectedHospital.longitude!.isEmpty) ? "0.0" : selectedHospital.longitude) ?? "0.0"; log("selectedHospital: $lng and $lat"); if (lat == "0.0" || lng == "0.0") return SizedBox.shrink(); - final String staticMapUrl = - "https://maps.googleapis.com/maps/api/staticmap?center=$lat,$lng&zoom=16&size=600x300&maptype=roadmap&markers=color:red%7C$lat,$lng&key=AIzaSyCyDbWUM9d_sBUGIE8PcuShzPaqO08NSC8"; - - return Stack( - children: [ - ClipRRect( - borderRadius: BorderRadius.circular(12.r), - child: Image.network( - staticMapUrl, - height: 200.h, - width: double.infinity, - fit: BoxFit.cover, - loadingBuilder: (context, child, loadingProgress) { - if (loadingProgress == null) return child; - return Container( - height: 200.h, - decoration: BoxDecoration( - color: AppColors.bgScaffoldColor, - borderRadius: BorderRadius.circular(12.r), - ), - child: Center( - child: CircularProgressIndicator( - color: AppColors.primaryRedColor, - ), - ), - ); - }, - errorBuilder: (context, error, stackTrace) { - return Container( - height: 200.h, - decoration: BoxDecoration( - color: AppColors.bgScaffoldColor, - borderRadius: BorderRadius.circular(12.r), - ), - child: Center( - child: Icon( - Icons.error_outline, - size: 48.h, - color: AppColors.greyTextColor, - ), - ), - ); - }, - ), - ), - Positioned( - bottom: 12.h, - right: 12.w, - child: InkWell( - onTap: () => _launchDirections(selectedHospital), - child: Container( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 8.h), - decoration: BoxDecoration( - color: AppColors.whiteColor, - borderRadius: BorderRadius.circular(1000.r), - boxShadow: [ - BoxShadow( - color: Color.fromARGB(26, 0, 0, 0), - blurRadius: 8, - offset: Offset(0, 2), - ), - ], - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Utils.buildSvgWithAssets( - icon: AppAssets.directions_icon, - width: 16.w, - height: 16.h, - ), - SizedBox(width: 6.w), - Text( - "Get Directions".needTranslation, - style: TextStyle( - fontSize: 12.f, - fontWeight: FontWeight.w600, - color: AppColors.blackColor, - letterSpacing: -0.4, - ), - ), - ], - ), - ), - ), - ), - ], + final appState = getIt.get(); + final isArabic = appState.isArabic(); + final hospitalName = isArabic ? (selectedHospital.nameN ?? selectedHospital.name ?? '') : (selectedHospital.name ?? ''); + + return LocationMapWidget( + latitude: double.parse(lat), + longitude: double.parse(lng), + address: hospitalName, + title: "Hospital Location".needTranslation, + showTitle: false, + showAddress: false, + padding: EdgeInsets.zero, + onDirectionsTap: () => _launchDirections(selectedHospital), ); } diff --git a/lib/presentation/home_health_care/hhc_procedures_page.dart b/lib/presentation/home_health_care/hhc_procedures_page.dart index e4a6656..bdc2e45 100644 --- a/lib/presentation/home_health_care/hhc_procedures_page.dart +++ b/lib/presentation/home_health_care/hhc_procedures_page.dart @@ -13,9 +13,11 @@ import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_order_detail_page.dart'; import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_selection_review_page.dart'; import 'package:hmg_patient_app_new/presentation/home_health_care/widgets/hhc_ui_selection_helper.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/map/map_utility_screen.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'package:shimmer/shimmer.dart'; @@ -78,6 +80,15 @@ class _HhcProceduresPageState extends State { } final canCancel = order.statusId == 1 || order.statusId == 2; + final isArabic = getIt.get().isArabic(); + + // Extract services from orderselectedservice + List selectedServices = []; + if (order.orderselectedservice != null) { + if (order.orderselectedservice is List) { + selectedServices = order.orderselectedservice as List; + } + } return Container( width: double.infinity, @@ -128,6 +139,85 @@ class _HhcProceduresPageState extends State { ], ), + // Services List + if (selectedServices.isNotEmpty) ...[ + SizedBox(height: 16.h), + Container( + padding: EdgeInsets.all(12.w), + decoration: BoxDecoration( + color: AppColors.bgScaffoldColor, + borderRadius: BorderRadius.circular(12.r), + border: Border.all( + color: AppColors.greyColor.withAlpha(51), + width: 1, + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.medical_services_outlined, + size: 18.h, + color: AppColors.primaryRedColor, + ), + SizedBox(width: 6.w), + "Requested Services".needTranslation.toText14( + weight: FontWeight.w600, + color: AppColors.blackColor, + ), + ], + ), + SizedBox(height: 8.h), + ...selectedServices.asMap().entries.map((entry) { + int index = entry.key; + var service = entry.value; + String serviceName = ''; + + if (service is Map) { + if (isArabic) { + serviceName = service['SelectedServiceNameAR']?.toString() ?? + service['selectedServiceNameAR']?.toString() ?? + service['SelectedServiceName']?.toString() ?? + service['selectedServiceName']?.toString() ?? + ''; + } else { + serviceName = service['SelectedServiceName']?.toString() ?? service['selectedServiceName']?.toString() ?? ''; + } + } + + return Padding( + padding: EdgeInsets.only(top: index > 0 ? 6.h : 0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.only(top: 6.h), + width: 6.w, + height: 6.w, + decoration: BoxDecoration( + color: AppColors.primaryRedColor, + shape: BoxShape.circle, + ), + ), + SizedBox(width: 8.w), + Expanded( + child: serviceName.toText14( + color: AppColors.blackColor, + weight: FontWeight.w500, + maxlines: 3, + ), + ), + ], + ), + ); + }).toList(), + ], + ), + ), + ], + SizedBox(height: 12.h), // Info message @@ -206,36 +296,6 @@ class _HhcProceduresPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 8.h), - if (viewModel.selectedHhcServices.isNotEmpty) ...[ - SizedBox(height: 16.h), - Container( - margin: EdgeInsets.symmetric(horizontal: 16.w), - padding: EdgeInsets.all(16.w), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.greyLightColor, - borderRadius: 16.r, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "Selected Services".needTranslation.toText12( - color: AppColors.textColorLight, - fontWeight: FontWeight.w600, - ), - "${viewModel.selectedHhcServices.length} service(s) selected".toText14( - isBold: true, - weight: FontWeight.bold, - ), - ], - ), - ], - ), - ), - ], - SizedBox(height: 16.h), Text( 'Select Services'.needTranslation, @@ -304,18 +364,35 @@ class _HhcProceduresPageState extends State { ); }, ), - // Summary Section ], ); }, ); } - void _proceedWithSelectedService() { + void _proceedWithSelectedService() async { + final navigationServices = getIt.get(); + final appState = getIt.get(); final hmgServicesViewModel = context.read(); if (hmgServicesViewModel.selectedHhcServices.isNotEmpty) { hmgServicesViewModel.setSelectedServiceForHhcOrder(hmgServicesViewModel.selectedHhcServices.first); - Navigator.of(context).pushReplacement( + + bool result = await navigationServices.push( + CustomPageRoute( + page: MapUtilityScreen( + confirmButtonString: "Submit Request ".needTranslation, + titleString: "Select Location", + subTitleString: "Please select the location".needTranslation, + isGmsAvailable: appState.isGMSAvailable, + ), + direction: AxisDirection.down), + ); + + if (!result) { + return; + } + + Navigator.of(context).push( CustomPageRoute( page: HhcSelectionReviewPage(selectedServices: hmgServicesViewModel.selectedHhcServices), direction: AxisDirection.left, @@ -359,16 +436,48 @@ class _HhcProceduresPageState extends State { if (pendingOrder == null && hmgServicesViewModel.selectedHhcServices.isNotEmpty) { return SafeArea( top: false, - child: Padding( - padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 12.h), - child: CustomButton( - borderWidth: 0, - text: "Next".needTranslation, - onPressed: _proceedWithSelectedService, - textColor: AppColors.whiteColor, - borderRadius: 12.r, - borderColor: Colors.transparent, - padding: EdgeInsets.symmetric(vertical: 14.h), + child: Container( + color: AppColors.whiteColor, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Selected Services Summary Widget + Container( + margin: EdgeInsets.symmetric(horizontal: 16.w, vertical: 4.h), + padding: EdgeInsets.all(16.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Selected Services".needTranslation.toText12( + color: AppColors.textColorLight, + fontWeight: FontWeight.w600, + ), + "${hmgServicesViewModel.selectedHhcServices.length} service(s) selected".toText14( + isBold: true, + weight: FontWeight.bold, + ), + ], + ), + ], + ), + ), + // Next Button + Padding( + padding: EdgeInsets.only(left: 16.w, right: 16.w), + child: CustomButton( + borderWidth: 0, + text: "Next".needTranslation, + onPressed: _proceedWithSelectedService, + textColor: AppColors.whiteColor, + borderRadius: 12.r, + borderColor: Colors.transparent, + padding: EdgeInsets.symmetric(vertical: 14.h), + ), + ), + ], ), ), ); diff --git a/lib/presentation/home_health_care/hhc_selection_review_page.dart b/lib/presentation/home_health_care/hhc_selection_review_page.dart index 7baeec0..8e9ba90 100644 --- a/lib/presentation/home_health_care/hhc_selection_review_page.dart +++ b/lib/presentation/home_health_care/hhc_selection_review_page.dart @@ -10,13 +10,14 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_view_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/cmc_create_new_order_req_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_services_resp_model.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.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/map/location_map_widget.dart'; import 'package:maps_launcher/maps_launcher.dart'; import 'package:provider/provider.dart'; @@ -57,6 +58,8 @@ class _HhcSelectionReviewPageState extends State { children: [ _buildSelectedServicesCard(isArabic), SizedBox(height: 16.h), + _buildLocationMap(), + SizedBox(height: 16.h), ], ), ), @@ -104,6 +107,36 @@ class _HhcSelectionReviewPageState extends State { ); } + Widget _buildLocationMap() { + final locationViewModel = getIt.get(); + final geocodeResponse = locationViewModel.geocodeResponse; + final mapCapturedLocation = locationViewModel.mapCapturedLocation; + + // Check if we have location data + if (mapCapturedLocation == null || (mapCapturedLocation.lat == 0.0 && mapCapturedLocation.lng == 0.0)) { + return SizedBox.shrink(); + } + + final double lat = mapCapturedLocation.lat ?? 0.0; + final double lng = mapCapturedLocation.lng ?? 0.0; + + if (lat == 0.0 || lng == 0.0) return SizedBox.shrink(); + + // Get address from geocode response + String address = "Selected Location".needTranslation; + if (geocodeResponse != null && geocodeResponse.results.isNotEmpty) { + address = geocodeResponse.results.first.formattedAddress; + } + + return LocationMapWidget( + latitude: lat, + longitude: lng, + address: address, + title: "Service Location".needTranslation, + onDirectionsTap: () => _launchDirectionsToLocation(lat, lng, address), + ); + } + Widget _buildBottomButton() { return SafeArea( top: false, @@ -133,16 +166,9 @@ class _HhcSelectionReviewPageState extends State { ); } - void _launchDirections(HospitalsModel selectedHospital) { - final double lat = double.parse(selectedHospital.latitude ?? "0.0"); - final double lng = double.parse(selectedHospital.longitude ?? "0.0"); - + void _launchDirectionsToLocation(double lat, double lng, String locationName) { if (lat != 0.0 && lng != 0.0) { - MapsLauncher.launchCoordinates( - lat, - lng, - selectedHospital.name ?? "Hospital", - ); + MapsLauncher.launchCoordinates(lat, lng, locationName); } } diff --git a/lib/widgets/map/location_map_widget.dart b/lib/widgets/map/location_map_widget.dart new file mode 100644 index 0000000..4cf5eae --- /dev/null +++ b/lib/widgets/map/location_map_widget.dart @@ -0,0 +1,199 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.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/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:maps_launcher/maps_launcher.dart'; + +/// A reusable location map widget that displays a static map with address and directions button +/// Can be used in any review screen (HHC, CMC, etc.) +class LocationMapWidget extends StatelessWidget { + /// The latitude coordinate of the location + final double latitude; + + /// The longitude coordinate of the location + final double longitude; + + /// The formatted address or location name to display + final String address; + + /// The title to show above the map (e.g., "Service Location", "Hospital Location") + final String title; + + /// The zoom level for the map (default: 14) + final int zoomLevel; + + /// The size of the map image (default: 350x165) + final String mapSize; + + /// Optional callback when directions button is pressed + /// If not provided, will use default MapsLauncher + final VoidCallback? onDirectionsTap; + + /// Whether to show the address container (default: true) + final bool showAddress; + + /// Whether to show the title (default: true) + final bool showTitle; + + /// Custom map type (default: roadmap) + final String mapType; + final EdgeInsets? padding; + + const LocationMapWidget({ + super.key, + required this.latitude, + required this.longitude, + required this.address, + required this.title, + this.zoomLevel = 14, + this.mapSize = '350x165', + this.onDirectionsTap, + this.showAddress = true, + this.showTitle = true, + this.mapType = 'roadmap', + this.padding, + }); + + void _defaultLaunchDirections() { + if (latitude != 0.0 && longitude != 0.0) { + MapsLauncher.launchCoordinates(latitude, longitude, address); + } + } + + @override + Widget build(BuildContext context) { + final String staticMapUrl = + "https://maps.googleapis.com/maps/api/staticmap?center=$latitude,$longitude&zoom=$zoomLevel&size=$mapSize&maptype=$mapType&markers=color:red%7C$latitude,$longitude&key=${ApiKeyConstants.googleMapsApiKey}"; + + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 16.r, + ), + padding: padding ?? EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Title + if (showTitle) ...[ + Text( + title, + style: TextStyle( + fontSize: 16.f, + fontWeight: FontWeight.w700, + color: AppColors.blackColor, + letterSpacing: -0.5, + ), + ), + SizedBox(height: 12.h), + ], + + // Address display + if (showAddress) ...[ + Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 14.h), + decoration: BoxDecoration( + color: AppColors.bgScaffoldColor, + borderRadius: BorderRadius.circular(12.r), + border: Border.all( + color: AppColors.greyColor.withAlpha(51), + width: 1, + ), + ), + child: Row( + children: [ + Icon(Icons.location_on, color: AppColors.primaryRedColor, size: 20.h), + SizedBox(width: 8.w), + Expanded( + child: Text( + address, + style: TextStyle( + fontSize: 14.f, + fontWeight: FontWeight.w500, + color: AppColors.blackColor, + letterSpacing: -0.4, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ), + SizedBox(height: 16.h), + ], + + // Map display with bottom button overlay + Stack( + children: [ + ClipRRect( + clipBehavior: Clip.hardEdge, + borderRadius: BorderRadius.circular(24.r), + child: Image.network( + staticMapUrl, + fit: BoxFit.contain, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return Container( + height: 165.h, + decoration: BoxDecoration( + color: AppColors.bgScaffoldColor, + borderRadius: BorderRadius.circular(24.r), + ), + child: Center( + child: CircularProgressIndicator( + color: AppColors.primaryRedColor, + ), + ), + ); + }, + errorBuilder: (context, error, stackTrace) { + return Container( + height: 165.h, + decoration: BoxDecoration( + color: AppColors.bgScaffoldColor, + borderRadius: BorderRadius.circular(24.r), + ), + child: Center( + child: Icon( + Icons.error_outline, + size: 48.h, + color: AppColors.greyTextColor, + ), + ), + ); + }, + ), + ), + Positioned( + bottom: 0, + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.785, + child: CustomButton( + text: "Get Directions".needTranslation, + onPressed: onDirectionsTap ?? _defaultLaunchDirections, + backgroundColor: AppColors.textColor.withValues(alpha: 0.8), + borderColor: AppColors.textColor.withValues(alpha: 0.01), + textColor: AppColors.whiteColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 40.h, + icon: AppAssets.directions_icon, + iconColor: AppColors.whiteColor, + iconSize: 14.h, + ).paddingAll(12.h), + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/widgets/map/map_utility_screen.dart b/lib/widgets/map/map_utility_screen.dart index 87c99fc..e05c104 100644 --- a/lib/widgets/map/map_utility_screen.dart +++ b/lib/widgets/map/map_utility_screen.dart @@ -1,29 +1,13 @@ -import 'dart:io'; - -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.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/utils/utils.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/emergency_services/emergency_services_view_model.dart'; -import 'package:hmg_patient_app_new/features/emergency_services/models/AmbulanceCallingPlace.dart'; -import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; -import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart'; -import 'package:hmg_patient_app_new/features/location/PlacePrediction.dart'; import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_doctor_card.dart'; -import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/AddressItem.dart'; -import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart'; -import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart' show AppointmentBottomSheet; import 'package:hmg_patient_app_new/presentation/emergency_services/widgets/location_input_bottom_sheet.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/widgets/CustomSwitch.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; -import 'package:hmg_patient_app_new/widgets/expandable_bottom_sheet/ExpandableBottomSheet.dart'; -import 'package:hmg_patient_app_new/widgets/expandable_bottom_sheet/model/BottomSheetType.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:hmg_patient_app_new/widgets/map/HMSMap.dart'; import 'package:hmg_patient_app_new/widgets/map/gms_map.dart'; @@ -42,14 +26,22 @@ import '../../../widgets/common_bottom_sheet.dart'; /// it results [true] if the user clicks on the submit button /// and [false] if the user closes the screen without giving the consent to proceed for the request class MapUtilityScreen extends StatelessWidget { - final String confirmButtonString; final String titleString; final String subTitleString; final bool isGmsAvailable; final VoidCallback? onCrossClicked; + final VoidCallback? onSubmitted; - const MapUtilityScreen({super.key, required this.confirmButtonString, required this.titleString, required this.subTitleString, required this.isGmsAvailable, this.onCrossClicked}); + const MapUtilityScreen({ + super.key, + required this.confirmButtonString, + required this.titleString, + required this.subTitleString, + required this.isGmsAvailable, + this.onCrossClicked, + this.onSubmitted, + }); @override Widget build(BuildContext context) { @@ -57,15 +49,9 @@ class MapUtilityScreen extends StatelessWidget { floatingActionButton: Padding( padding: EdgeInsetsDirectional.only(end: 8.h, bottom: 68.h), child: DecoratedBox( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, borderRadius: 12.h), - child: Utils.buildSvgWithAssets( - icon: AppAssets.locate_me, width: 24.h, height: 24.h) - .paddingAll(12.h) - .onPress(() { - context - .read() - .moveToCurrentLocation(); + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.h), + child: Utils.buildSvgWithAssets(icon: AppAssets.locate_me, width: 24.h, height: 24.h).paddingAll(12.h).onPress(() { + context.read().moveToCurrentLocation(); }), ), ), @@ -74,38 +60,26 @@ class MapUtilityScreen extends StatelessWidget { children: [ if (isGmsAvailable) GMSMap( - currentLocation: - context.read().getGMSLocation(), - onCameraMoved: (value) => context - .read() - .handleGMSMapCameraMoved(value), - onCameraIdle: - context.read().handleOnCameraIdle, + currentLocation: context.read().getGMSLocation(), + onCameraMoved: (value) => context.read().handleGMSMapCameraMoved(value), + onCameraIdle: context.read().handleOnCameraIdle, myLocationEnabled: true, - inputController: - context.read().gmsController, + inputController: context.read().gmsController, showCenterMarker: true, ) else HMSMap( - currentLocation: - context.read().getHMSLocation(), - onCameraMoved: (value) => context - .read() - .handleHMSMapCameraMoved(value), - onCameraIdle: - context.read().handleOnCameraIdle, + currentLocation: context.read().getHMSLocation(), + onCameraMoved: (value) => context.read().handleHMSMapCameraMoved(value), + onCameraIdle: context.read().handleOnCameraIdle, myLocationEnabled: false, - inputController: - context.read().hmsController, + inputController: context.read().hmsController, showCenterMarker: true, ), Align( alignment: AlignmentDirectional.topStart, - child: Utils.buildSvgWithAssets( - icon: AppAssets.closeBottomNav, width: 32.h, height: 32.h) - .onPress(() { - onCrossClicked?.call(); + child: Utils.buildSvgWithAssets(icon: AppAssets.closeBottomNav, width: 32.h, height: 32.h).onPress(() { + onCrossClicked?.call(); // context // .read() // .flushPickupInformation(); @@ -120,8 +94,7 @@ class MapUtilityScreen extends StatelessWidget { Widget FixedBottomSheet(BuildContext context) { return GestureDetector( - onVerticalDragUpdate: (details){ - }, + onVerticalDragUpdate: (details) {}, child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.end, @@ -149,20 +122,23 @@ class MapUtilityScreen extends StatelessWidget { spacing: 4.h, children: [ titleString.toText21( - weight: FontWeight.w600, - color: AppColors.textColor, - ), + weight: FontWeight.w600, + color: AppColors.textColor, + ), subTitleString.needTranslation.toText12( - fontWeight: FontWeight.w500, - color: AppColors.greyTextColor, - ) + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + ) ], ), CustomButton( - text: confirmButtonString.needTranslation, - onPressed: () { - ///indicates that the screen has resulted success and should be closed - Navigator.pop(context,true); + text: confirmButtonString.needTranslation, + onPressed: () { + if (onSubmitted != null) { + onSubmitted!(); + } else { + Navigator.pop(context, true); + } }, ) ], @@ -190,8 +166,6 @@ class MapUtilityScreen extends StatelessWidget { ); } - - textPlaceInput(context) { return Consumer(builder: (_, vm, __) { return SizedBox( @@ -200,8 +174,7 @@ class MapUtilityScreen extends StatelessWidget { labelText: "Enter Pickup Location Manually".needTranslation, hintText: "Enter Pickup Location".needTranslation, controller: TextEditingController( - text: vm.geocodeResponse?.results.first.formattedAddress ?? - vm.selectedPrediction?.description, + text: vm.geocodeResponse?.results.first.formattedAddress ?? vm.selectedPrediction?.description, ), leadingIcon: AppAssets.location_pickup, isAllowLeadingIcon: true, From 757ace2ba1eb6db950cace88e9acdffee213f24a Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Tue, 25 Nov 2025 16:42:18 +0300 Subject: [PATCH 03/55] Added Organ Selector --- assets/images/png/full_body_back.png | Bin 0 -> 225750 bytes assets/images/png/full_body_front.png | Bin 0 -> 229850 bytes assets/images/svg/body_icon.svg | 10 + assets/images/svg/rotate_icon.svg | 3 + lib/core/app_assets.dart | 22 +- lib/core/dependencies.dart | 21 +- lib/core/enums.dart | 4 +- lib/core/utils/utils.dart | 6 +- lib/extensions/route_extensions.dart | 2 +- .../symptoms_checker/models/organ_model.dart | 41 + .../symptoms_checker/organ_mapping_data.dart | 371 ++++++++++ lib/main.dart | 4 + .../appointment_payment_page.dart | 4 +- .../immediate_livecare_payment_details.dart | 2 +- .../immediate_livecare_payment_page.dart | 4 +- .../review_appointment_page.dart | 2 +- .../RRT/rrt_request_type_select.dart | 4 +- .../er_online_checkin_payment_page.dart | 4 +- .../wallet_payment_confirm_page.dart | 2 +- .../home/data/landing_page_data.dart | 2 +- lib/presentation/home/landing_page.dart | 700 +++++++++--------- .../home/widgets/large_service_card.dart | 2 +- .../medical_file/medical_file_page.dart | 4 +- .../my_family/widget/family_cards.dart | 4 +- .../profile_settings/profile_settings.dart | 41 +- .../widgets/family_card_widget.dart | 207 ++++++ .../organ_selector_screen.dart | 337 +++++++++ .../symptoms_checker_view_model.dart | 108 +++ .../widgets/interactive_body_widget.dart | 121 +++ .../widgets/organ_dot_widget.dart | 49 ++ .../widgets/selected_organs_section.dart | 133 ++++ .../ancillary_order_payment_page.dart | 2 +- .../ancillary_procedures_details_page.dart | 2 +- lib/routes/app_routes.dart | 7 +- lib/theme/colors.dart | 1 + lib/widgets/appbar/collapsing_list_view.dart | 20 +- lib/widgets/buttons/custom_button.dart | 7 +- 37 files changed, 1824 insertions(+), 429 deletions(-) create mode 100644 assets/images/png/full_body_back.png create mode 100644 assets/images/png/full_body_front.png create mode 100644 assets/images/svg/body_icon.svg create mode 100644 assets/images/svg/rotate_icon.svg create mode 100644 lib/features/symptoms_checker/models/organ_model.dart create mode 100644 lib/features/symptoms_checker/organ_mapping_data.dart create mode 100644 lib/presentation/profile_settings/widgets/family_card_widget.dart create mode 100644 lib/presentation/symptoms_checker/organ_selector_screen.dart create mode 100644 lib/presentation/symptoms_checker/symptoms_checker_view_model.dart create mode 100644 lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart create mode 100644 lib/presentation/symptoms_checker/widgets/organ_dot_widget.dart create mode 100644 lib/presentation/symptoms_checker/widgets/selected_organs_section.dart diff --git a/assets/images/png/full_body_back.png b/assets/images/png/full_body_back.png new file mode 100644 index 0000000000000000000000000000000000000000..2eda5e8f991cbec87aa9a39c2250db1b4e4bad33 GIT binary patch literal 225750 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
m%5?tjalHZq0hUjF`$)*tN}0mzqe zz5Imyx$pm{Klbro`T6genXHNDc!^uc!(}NVtY}F;GGq*tz2vZGu_<{7lhak$ufb5d zduid>az%>ytk`f}d^jcnHs0*vL(oG2F3THI9Y^S3dD^}(giU+b19wSD0{Or@{=010 z75S5YEikJY(LHzckgL@DGEOyh++83~JUlS09Bz_K2~<=Mq^AtZ_y7QtTX02Y8sIKcO^ z+j9EN-|EcFeEimXJz^q%^lJnlU#9g^@Oa{hC!A0J%uoNv&wcpqf9(KH({^IVwOY+Q zh$FhbvjdSaC$nG`2CU9LD`&@N<;cPeV*g!f;?&JTfUJyFz%t-u42BRH5k3H5O1YeD zuCI$1#M&*rJ~X86dNMx0D6`mzLD-iU&s~rwHg@IP{^1YHSfzxYzacK9FFT74wAb1U72ksCh*~3S`c6Q;`Z0XoeGYNVKXTI5(JN}_t@A(Ks z{%F@oMEx?Xmu8l}_^D4F_|T93vrj($+wb~oQ?)4>T2@>eubMR(%1zMt0bGc&62Jo? zNU!IM2b*@X>`4!9NgY~3rU>vTLwjhoR16KQM8;urT7D#JSFVW*;_ejlvYoj2*|N;X zeaT+CEbUHDb_TIrN3`(`-~CUehR~?FwGL5|-PT=%C$v*pn(tt zAJB}{K7`yb>PkTeY1^=21GqCiiEV6rgggD+HFZ@oRfIX?N5t%OVclYbH@0QCepB%9 z0JCXW#jdoVhiq?eNOpEXD#e0ypLty3#)iZblad%|`$U6{+VMJLyv~FJzTxID0nLO{ z6hQ-WE}s|EfVMInjL@GFnr@F6cF8aIRgIO*kgTy$?$U&d$=sYch4{piGpo zVWF{DSx-3PlFg4}7P_&uF?f<;!HG#CXdy$%g4I|t^TV2ZZc9fD#}ltu6U$7*5842t zO*k!h?u;v)%_Z@>yHa`ZwURAVWr&dI`sxa7XKZ}D&i1t%V#97Ov8hmZ07qsE^r#^`qWOaov3F}C zh4|v*KOdca{CjR`AtQ(8k8X_svVK)OeC{ zang%#aL7^zlst=#QN?Bn`(5b-hM1+2%;YjM*xJyMkS6mnV6V2f@beHYnY>jJ=3TU; ziBsCOT!b{x0w9L=>N~OpO{06}0hzt;RWcd2B*6)9LaP`Dkgz48(Zlyz8(KLFE&Kx#OlU`PbWP$=S%Pcey0+_*FHUF})VOpW zVB$&nRj-%)cnzUfOU_-qB-z>w!lp@SZ$L0bD3XDgYWQ$uz>Y!yiU*g+fwL45R1kS2 zt-g-WjH&$q;H-@mi2;&+ZA@!#IJ`T?pRLtvVzkyII(Ax2HaQCW8F}$DKNfuUw|^d= zLwS_B`bW1$Z}693z0?Ib_snOH|Jo1zz}sH<=!fo}oSv3Up`2J|Y-I7TVGk!~1tAMU z5HCUa(2HanpTNR_X_dKW%H^jR8RdVuGua;uiks(|Rfo@^~w1$$00|VUyfDizL z9Oj+?FtER+vD218eOYR-k-hO_vUL5L)R!;G>3i=-bO9&DH=t!qLxTueMJq)B(T(Sx z7Oy-f^QVuB$xPL!J}w{s(1-C_$K_3L{yMlPo3g!h6^sg@kek)f4s7?%x*C`LQt?23 zDX+zM%0%GC1aN-r9^NB=C<&aWh?>XNvew{OF0Oxl6+h>QfB2-Bjb37HT!qgKfwgw% zg8Rrf{CT5NdE(`t&Hi40lz9tZ{Bw-}ebo=>sey% z4l{#)&4SX~6=rfGt{=7~>I|fZ&9n&csDdH%+6`=MY)+3nV<-V0ay(ydghM9u zhRgzNRIjQQZ4k05w+wv)x<=H)hOS8K#&x-P?s>5gcFY2ldi|c{O|Sv5BMTu*cQ=qc zfS~~4m+A0s0#L+ezI^ezWbypd5Q(d>p1Y5KTAuyrhhz;Q*K5A+Eiwrgsl9X^KvU8V zXmpp@Tu9ig8GvE~&_ZY>F&PNNWW+cSmn}(X4}&O20FeZ&#Hp_XfWX{J6JjnSoPpjF z9z2BCfX7(HziqETkj-_hhyLXETF1})`!Do4jnY~pjT19dsfo*`=H0GDy`BsK4h!>hG673+b!`LA2kcI4 zA`_SsBCxN3;txRe*(f>hIQX3|HohlQ0HDt9rZhrR4xBh9rD9Gxc)UCW)WF1s!($vc zc2GB2>+A&y!7A*{I|s0w-kyfUtD+x=e!2 z%*@Pd_3zH^IySlq*5YXW&CJ+>WDE$c^(ArO6qyLcmH;9#Hgc|3li7oFlIwNk{KtMr z)*8EVfRlOv z*3chf>yAyzkpolWY;DQvW?kG0^Z>Al2pc&IDxar)3el6cXHk6F+HFF_oRBFv5pB@) zz$?q4gA1BWwgsmqJ2Nel_#E5@exMh z^-s25oEw)U1}GYdl_XiuFaauwoAZO$e%-%w&%EKE z;q&Y7eSZ5~8@WAdIYt2TMXZle*2wY_1rt({;%s#KXyOkcS;@HOcVjVd{(ju z7udqj;|UL~A!dRUYf8W_Sicgr8q&db$(TIhLwX`$3y5z5fQJ=H4d4-X`%;IkIyN;S zGuTL5a4Rg>v4u=lLTCYni7^=;8^iDT65tef5at+;CAl0J48kKDUvar6-aNt=gfJ}m z7q%3n7zsUt6|=F8??J#!1Yjbxc;OTE8{&FnILQmz({xzBh}U*a+C57u>}49zVjjpi zG#qBc$14&u8(n9B}1HeQR3+TyyQry)p)-(Yg4d3b{E5sO&9b zv&nLM2VXsi#9%@h*wTI=*7Ovx1V4lKk6H-{6_=<-;L*1SGU;Vti`WyeYQ=Is?jMkTAjR52iSTAQCPkrJO zZ@BR2@BHISkA388GU33i=5wIlgSfZZGDDo2J?a+-QOaNuR_treMr>Gc5TK>niCC~& z4Q5wiv(uur5f<>orJ?F~x)Q=htriP1?DbV>oEWbn^ns1KTi02&1voDP)?q<6$l{Wi z4`EZFg;Qe}vJgHUDNW2uwo+2SuqsvQ@4_PO_5d0=gicifm6v#K5x)e1l?{L>SQ>Wv zg29xy0S%|1^(o8*>o>2e^Ro@c)M|BPa(W!$OA$g`dN>{nm_y+0m#eN7mAVBFJGR#@Z6_=@aj{a`>Re8 zy3?TBWD7$$1cOc!_kJW3hYw+6=VfVWMLOqRkm)R9_<(VJsF|M3ps?_e8BqKHCoHu< z8^Wm-MbZR#48aQADo%Y0rwDZl6E&UW#vBii!eq9Dun7OfCWx?U185T-+zz$|%zh){VsJEn47!wcTuuouvd$fty+<^8mHeQnhlT%WOhvIK9 zOMP=kYi=qCr@~=Z1_0Q?+`JU3<2v?%<1=1h zf^L%daAWLrw5D)81pf#olDG)L4jk36#RiZ`9U%?hUw~NxCTAgZWFcPCsY?t-WEUzD z7sq9I=-9e7bLzjkmD!&%a=De4-vc8s`Qp|HKwh$5dgJiV^_9zWkAL!0-?DP$;@`>H z$&rcaS-2uN#h^cMvzo&|I^8x7x}KD0r?F9LvbMA&&GRovg(oFWL54R&0LYN7$JtFC zfYTrJ1)c~5QEX70zC*AB1EEJDq05nI%Rf%FH&(W^qgSb1QL0~tJHyHMT{h!^=2Czb z;pN!Rv;=mdY)Fa#kPJ2@yPszrN8OA%#M~To2$`Li5E_VKFvM~+`!pfrAZFtFOb)~L zx3wmP-N)kI2DFa0T)uQe>`YB2Ir|nHm7Uk^*pdS5-JnsI!RChSuCB@Q){ZtlIsjd! z2K{F$3r2$1Yx3D#L=gbo2m*0-Y(gwBHrd^gXtyB=n399nV8GfnA^;get^U}wYBU~f z*_bnFid6s&1lsDPhCtLdDE10I3!Tf!7K!-eV4Xu3>8o>N;{B#h5OsI)BLPI&DKWs% z!pUi!>N(sAoBmeS#F+x@~%rSKJ`yqE0@1v zYi%v(xMi7!ooVA#bFcv-P=14bL2(0f9Au18Bn$A!WeT#hzATL^7bTBy!iqR^7B@6D z03SZAHL9u$*&vP5rj?cDA%UKf}j>o!r@6 zmknC0;87C*hRHH?3xr9TQdaV8lZcQdf)Z;~CjbO^FV~h~2Lrg^?y#WG0w5Sc7k02E zgWNb+1DF}YnWzbY6ymelAZzg?svr#Gn*yQMYVGQ05rb{gDq-;D!yNdiZ=!>f z7h6u6ja_H}*TE(t2$D<)gWP}{HW>OkQzg>_mB;DXWOp%~q+M33x&RPZwm}JiflbuD zz9a)MkQz3iwD9w=Fgt@DHqe+BImPe2A#I z)2GBccvK<}E(fgO5UjvNr~;7%*BkRa&{38#u7^Tu9QQ!?m+*Q#xJqf4_CY6Og@elsPos}zpcJaUg=gd8K zi%qwLY1G)bJ~k@TwxL)+gK#14Z_CO~PtM%;8UTtbxL>vDunT?T`c>G75Ck1SQ+J3H z(Q;sZKra~t3M5g#3wyPzwA{-Uqzla>qJ=v?rioNT*qZ@D6dQu7$wD@ORfxxMVAXOO z-Ea#U3q(i@_Gb={%cjW|z{$ZiuteX61609g_aLOY%z6b)j{rIbtl+o;>Q2VP5N3~g zsEC^IZGdmYM6Na%$E7C`qCw*T^J(>cZ0HDL=#*^jZfcfjfeZlQNN00f+>lf01`^Z} z`gHIf#0QMocrqUR65zf#>h{7)J z3DjW+&#xWK!0ad@$B8fD&W2cc|FYd3G1njvXF2Jvq97RJ1(^g5gjg2Xh(WLiyNjkc z)ep}JS4+T51R4xe>VbdwJlZmBci|?j%I?}FXgeZvciaaspXqpJ;Xm4z^LEF{UBbQ6 z{6hE6SNi&jV<0c3q|6}w_&a{>ADn;Yv;SzfzvJyR`Z|j7(BVayn5as%R+b6e>{*~e zHb>22T(t-uuk~gJz>(l4w7@!gvW1g6fopMSZbl|2C$;>&522MVOb0hJlQdl1-~)il zfb(Y^M-#j(h=QEnW&kvNpJ3%H)#ntqUJ?Qja#900`JnEd9fUAU#6YN1U%Dy1^);yi zG{(wh8Hao0f`#<>T-f9#Y+er=3rDQ@tfoDBO5DRo#UGo;HF2)3y3V>{a;Jn+0+YrQ zx%}iuWqWf8*i+T~5DVYWaN{9-N_hG+yup_X5HRSbP`7{(oFF{0$%>#=ICxE2POQTw zw%KJ3?7)L$5h2uyAb#4kzgZ*)QFG`4ASPzS<@@Wm(?qr$fDZp=hh5EO5r9YnkT4Lk zgaB68#&vXI(+dl9o<2hBu1zRLMEYR_a^Fs`4DHbnUV^sosA7?uHA%? z+et$>L^74dgHoD1DT5H;3YHZaS-dZsT_dHKa(HQmyG#J#h=cOQ+qpvhMdfV}+V zc;X}P|N75->_a~?9QMx~KYdbaIQ`aER^{T=D>&%_Y#XwMJ~lbn0bG}bVsm?74eefoBVaV!G-fzPL9`EmGr*1z=6QG?m&~b+&5bZZ;Ld1Rm19~u!Wu9d z#6bdd)#AMno74w;v!*A+ot%M_3&B@)ZFfFFh@u zdg`f(Yfpdr`>$O(_c!vnyvWfv!ZtJ%N?A3}?O zZHv=$5*F*p<40s}W=3*w51c|(a-~TPOWLhA?8}C1!IiLaljb>08aKGkg5^ocWJ_)m zA_QCv=6qzR0YDU8+t`sV|L#CcG+f;TbWunT$QDXqA3jc3c2Y0lI*a&kA1s9PTwI*` zd2Hlj4pt=`5F4z+q*#c*$J+p?a$fT)GMTDGU?!Zu!Y;<#j0z-V7ksb4m|ULLJJ+QL zSEbV%!a?%W33Jd%aOJRvdlIz46c7?b+`KWfY$GWH5Cpo94VF^k>|TTth|yFFF#!TD z^az<4*P0#^nn$nGmIy$cJ#m+qHN1ZiUwvGQgD}R@$Bp+Q=}29pSW=)(KrDQ3 zh)q{2fkD9OSz6uFkjOGv>;~%-H?X-EI3)-l65I~yStI}Oxl`LEx7XX(7z!VwE zkhTLj*jF_KGhxA+!3l9pRtM8E^9T=|f+mm|WJauar4FKQF0(?wFj`wWhj$m7n(YN6 zyr6;4)`EuWKqeiRl{K9}mq6RF%|tgB;ab509Q=NaP3(fH1+apR65jXm zX$3J8dV~N(s9UfvDzog#GC26#(EB1qhGb8tNi^It^}i{Ih=K^8TbTQTH#h)Gids85 z_?s-T4ZySVp3ELSE#>MM^KG@Mk_2#z2FuFE467(no1NP@DmVvx%bY$kI|Mfrr$;aOR-tQb|Q)1kp zOb7RH+BiHlLDQ!W90CKGQs!Zjj=LOQ4ebD%k7?OV)N(;{OVC72Y_bMe$tEnz?bVwA z2b^FyrAwYAl?rn+aN5FgAP}+Vg$*zwcnC*5!n(95_dY;^T$6~%aeZ(q;=9S#M{;c#NGV=M@)r@^x zS&HvK{EZ>z4qJ8UH(GFn7*s@BpvQzcCWsaA-r5LPY&=&M07<6SBjY%HO021Q=o|nw z2*d;lhXN@W5%m_f8X%}CD@szvVQ9!TRECt^%~8rnxZxu@UcP?rOx0)UfQ8>R@V-;T z=4X(BxEx1qymz}2!_jf^+M+)Dui!I?^Y{$$*kCy>m=PT#lXHB{QhGDN(KYdT#bFQs zZ9)Qqw-&nW+}4hYg`X*9$A1vl+WJZqSZ#R)uDuUZTMJSs{kPxyJ@0(tx8MEM;}y6M zeG+%WC}4vp00{OG&BCSd97Be?TUvxhi_tE@RjK4O{*GzULZtIS;p=b?T!aXP0_U}y zkkiLbN)M<14&0NQSFXy9C7#%z{eBnWNCOeNFV$*Z%B6gI+9S+}Vd=Qg1 zI4!Nl4cXjiNVmNv$4;IQFB3^0A(K8oPj-4h*oZ^erWr7!j^C1v^_DPIsyH7L<+_-&YvP_fCAq^{XaXgi!lve?7vqL=qRv$n@ahO)B0|53kPaY8rHY!6h7eK=O z7{EcX>BivwHW}I^wuV5|H!LF!R}wO#M5%y+1l}!ZA$_nlLqm*2Q`2JkT?Ny@=V+v_ zhYw=%G5CG39~KD48)A3*0J)Ad*%7YZ(>kC`VI1#i3K(w5(fT0`85K#blzB3g;(KF2 z--#O%_BRX%&X6^X$*PK0V*I_%%>2EbPUp|!e%p9STg$Hq5P8J`$V<7OW((&PDHB+5~XpoAz$>-S+K`z78{Xs(+p24(rT%)5Q zrYoAo!{*Qe24wc|ypSZAT*vFfbsJ!BA>P9-*kWU&4uI|gm~v8`hT}6fCE4)>ZDgcj z8wFVQiVb6J+?)U~s2c0FAfDkNVme@-5RdK66#xAXbI(=Z_LD#M!HXY#-vfuHr^U$Up>cX(v?&mnY+%DlXzcPs zn-Xjw2R6b`p@=^Zu^E^$T^S$8VeF+REp&uzwxD(9O0K!pGHnQD!j^|K%Pko>}jJ}So^xL;m(-wEx!e&?w(GCMzy zv(wfaoZ$w6jEQ2br{@{TW;}Vs^}*V*)L%RYJq8*Mtx&L^8_z!}=dW+b{3EZEgJ+Z{hI(VeYiE*gGZpf*fKy^Rl4Io&Crd= zOyIhtTqDu2B_?|zP~c~GH?FIoyKo3%G_!AWi+G32QeV3PJGY7JHna+v)-Y%KMi9hX zO#lj5Qs|q~>;w-7wXYt4$kzlq zeh)W-7(qv@<*QeZ+nW;QN_GF$-|*dq1NZ#m-o5yW2a#74fZY1P*wpyv zfApVy=(&%6`1QwUrzMkxx#>8Di<>jT%}J|}W$)nH+Fd*coudTNv4qodfcTyptvWdl zZ4Vkl0zes`5(i;}2Ov>$%g_f}1UHCD{QzRA_NgG~FdQK5M4lV0FW-2 zn**>aKupe$fjxjx1eU4qD_IoN`6*0Cj5gwwg%C7U3X0vm@F~E*5Ahk}y@GZkY-Fvv z5k7N-Mb6GDh~rR2wJ~Bh$azIPC+Rgjp7nF^pn1EUeUn zU(7XoV$J`ryqQy zEG@0c6EE(_dVNXW^RNGnROV*oyMF2?B|kAGabuukIZX<-{7lFu0KPFtWb%<>LmM;= z=wb~*&5IE$6}TzDMg)y@)IyGTT$QD3ONfzca%7^6 z7`!J-*RM(rry6Tb3R%SP?1RD6)S*CHlK{eCptlI$Qd5)B*u*A+Na%sBL>|e0EEnLI zeCng0knZx5c+g(%#bcd?`1$Gs^YZkQpOxpHd0rm4>mK~7t#fNTy@B>ptpI#luzPXU z;$s8Mj?Ku6Pdq6r3q4twpO9*1Oj~r?K`CT#1pc4{fZ25 zX_K#?0+7N^C2QijXvAtYQ=6e{ft`nwnS!N{u#1IszD(8TBohzx)Ml1w1olGVnS;Lv zyLE|aDMMH!xVm6U7G5{sgC4V05%w9rEmStFkM) zEfi-hRtwuW0Bm{dpZ`B-?8*m!^k2xL8_C0OdISusDY>aRk(nvk-CmKT!Lbk6+z4ml zVHd(E01|9N-Cr{mT@%(9m}%~d=(kfrR-GJXnea@&K@zn)%=*LO0SAd%h>h3Gw+7l& zFkIJ+VuoGXBR0o-2@I;=V1l3-PA|k}$1|Oe{Mru$XFoP{?)a)7xizcil_;$4`w-@( z*4g{t`Sw5kpT7J5`qfe%AElR%V}M77jsPr0k6Dj)Y7>%L=dxK%x`NaOM`NI>dXF@{ zjPH+4NWNB+F=`CWwuUrGF)P!PGpcR4F5+hdNn>?%~>;|0$+^qrQYR)uaX&S;L z+Jf6V+W?N|G$UijkISk1?v|zZ|CVea?w|kKw~Dv9 zf!7OW@~Q`AxN=omm(EKYk5@bMkmP0#0Pswm%*6Z&gW0hThuUrY)p1DcDB@+Fs?bYg`;U z4ge2!PA6F{L(}j$7>SeM@Ua$gBbFw{#G+6LZGk_VAmpgANe zm5I4S(g0JLdfjW}5JIo@54=aN1%@2|x^EDB&=j*aE&12}35naA5F}TnkMO6c#dQ;K zLmXyTs&LA5?y$2dD=$1Dmu_6fiR{T_c^V;KqFO=1#5mZwtoZ@6!$!sT0)&Rxv{}4Y z8H8_Eud4-W2|}5Wqbd;M<;Nzax;QU+h|?}u&Y;njCYW1r;tnY-9MpUpVX8ZThLk}` z13xQ*2|qjh`TgJfT@qh?QU1i&e7)Rw?l~zyG(LA@MK(Cscj2&{_?oxM@dqE$Lcaj4 z#vk-GOEv{0Qxn59NtGG}!yCqtaE90+-gI)BamqfgAsnj^x{1qtq4gyRy4zZQkO949 z4iAeJq1uYsuPfdq?8CCTgb=5fwr^kxKXj5XUydP4;pP~0?63Rtj~I&&zVJ!}k=qJD z{;&zDx4`4(%@=Av_-FsZW4kw(ju&gyq~GZpdE6MxBF*5&WFiv_#ds>QsgJ`75C~uJ z0JM3P0ddd4jo~78=M6;Pkvc&Y4oo&*QlZsG2vNk}nLomi#DS%l0VU7d%wzDR(e2B| z_NFXfyCG|9H)Z4MHECWvFPYY^6rf=oJuoX{un*ZVXB||ygw3)Hy4=G}eec|uG`8Ea zix__@4Vnf;=d=IwA5aHFd zT)K8mPJHwKCI=z5UiihIm+oX)W)GgyZs+4~{#r>EPUu9t7`ABG#%alkb=kaxr2foP z)!;vp#?2*p;pxwb2kW-VSuxCe09}unvC9yJnVLB5*_Kf7#dLfZOe4bvKh#RdAfU_S z02YN(MHz&H_l)W39yV_W@0njaAnutn$|g99!eT=pup?%OT6R`ze^}Y;lxxykTagcZ z&)<>P-f;v3sUqBoolGSbIdR#-}zT zqS?I^pc1fBZEr}nz=~-b0Zy2x;}x-}5g;4vBGlse3B2A6oUJ0hLg+}$c(rB@ON7rv z)>m|X4zqlXR#(i{hO!X|SlWI-vV|B7jq&WZ|0loeq3ra*Yp*mtha0AC(C&2D6N8o;f0iMIY3b<~GG#hRdq-^G)Xr7LWd=Xgudk)0 z<+-Bd%0=xv+DBN^cZM=KR@JUwS)58`(D@LjB%%Zr5tnv$W$E&=oPGXT*}QUDb~jgK zf(>mr!6fgrm>^5WqaLFReWZvPTDzXgQ;v`6IQ@7hM?gbE42&fgEDL( zUy%-+l@Kh6XIBQ!#=(=v<%92iznnULSPIyTO@Laiv&}4UIXpfs7k~S`Qv9p`yBz=e zx61kVzh4HWO<6~1W<2+T%x1@BfDnxtu@?0Q-0Yz$iD8;kK_N4;WgNEm-FF_7ZpW7% z1XL@q)7lW)G@6@F071wG0h%F6=+LrF02m_mR#WpnrT`ilghbjsjP4giV2Y$6tlQY| z00MAH*sTpA4`;pfT46fs64ymBB4Kz$KMI?=e*Q(7D;6aW_v)tKle->zjch*q0sst$ zz~q>mICVmffpu)Zcu}7HiGL|qvB9Svc|=aX(!C(4F(%E>`tz@%T3JclyBI?ucd&l2={Jrn~+PR~L za1wTvZDjTu>R5Y;Mw+XEznGxYOmU`6M^&CTIGgW=HcpjN9s(t>T5}F3I-NGVH`F(%jmXVZAOno|M=OC4@u|%~Zt%p>5Zm* zttD8JgJxgsFiq03yO#DC;q~TVBQqU- z3L%iw+L0SzIuAW`k6b-p6W50|Tx0=VL8cq4^32ctj647kIRG(rb?v&$%^j92&w)`K zJ|vUH(_lRmcUiz!Oq~n4mBhsrYOPKfb!9L_7zHPaiB`-=4YkS_C$-7J+%_y}glhP= z98Pm3Tq^<)iIeA9r@3>Qr-1mS?9$JtR93i?ZZ0;1O*c)o&q7Z_5jMvK$Eo!!)X#wa< zCAFIi2*3IlUyu%Tmlgmc55}4Y1BtRMxHZ zI~cw1zrP*e@g{&r@Ja!ZeF-49-u&d+HSZsO=U@2imC1_q`@_UeV#D3b&(PRcJC3Ib zKrwF!?UaQRler28M=3C;s-SMc&IZ5-`o|&MfaB9OwHVho>vHzFbFzjLsIj^(Smj#Y715<)@$@md{Gktu_vhyj-{-Yw zMg;vJK}cgIp}G}p*kdQmq>Ut7I|9(WfsKg}U>K)KRIJp6u*_`F7(T2EkPx;s0IT!x zJ{QVm&E9N71K`LCX7wguH+`m&V?!0-3i;}RSZSgez+&~rHSMB4F?&c|jX2`zO~&P@ zXgdT0^WiMn1R8`$C(9)n;B&FC=_?2`**vLRVbP9C}cggE_Jp8U*H za_#X?%8lQsNHDt~6UR=-?9qeJUKXS_i~j=XIsGqfgbG`heOJMj24t!bhJ(vjfCq_q z;}halCndabMZ)Fl(g#R7bJGx#)8xLeK)V;O4lFWJQ94bB2OXAV7#J4EPTY9rwS)Kn z;=jQ^eAkG9+y?7izxj^8c;nK!lNL_73{wXnaH@{au?iGCY2&ku0e@Heoa_}_?M-Sc zmaA}HLfHa^oqh0LsZC7Dpw*H`-}|JjUcHJNw;=_k>AtM_i5!@!$X6YnmjpEX8Wj1H z^V4uZa`Kt8S7o{u%bf^sHlY(R<8%z0;|5ML4-~nK4g9Hi^d}Vkt10X{H z2Pe#B7(QkYoZ(uT&Q4d1^KasvP3f&~%J`|fw7a~DoUn`Oo>&@!rZZz=fOa2lSpM(~ zj4w+Ea2F>hwd*=9-~hsM5kT6xzAQVq{;ByI4wP7$2wBd&6J=p;-Y4eUOeq)yQ0W^gEO5=l`8?@Z_~u0t?x9 z0P=bEktE)Cf7L_(sE-eItT@f)5vHTQex%`wo+dH7`&+6xkfO7)HNc;l30f!>wdSM? zYJTGNZ-6+rC7*u#Z_4(KC7Hy{Jq}Tjy+W$B98SGFHnt_daCsZ7r7z!n*O<&L9+St< zU6XqYGji{dd3o&Gx*RB5aHFfZWn3vAU&SRgD-NVP^@SEQ#&prNWIsLWYD2LpqWN`Iqad_ghI~m_o(DDe+ z$EM6alfc-B8C$H26P3281D7I*485iS!X;+EMw~s1*EED^>JnifnhqdJ=Bat$cY4_H zHnb+{Nf|g28=x}1DAD>^8JvAm zhPY=uh}=Vn|p5dGYn9|2E$CzxPUD zA?EM*54W+utC#kPU;po4bNPkm4^QAEvS8vr&>OS|#hshg z#zt-6bR0k!U3~aHoYYUqr+@9&C5Myd@I*xp<0iaw5v~b!5dg;;e4Bgbr{rI~;gnoz z4CTK+@uHLvx1Wan`ofhpgh#PFG(Qe-G304jlzley!Ji2_q}(n5trzxTU1rr*W@uI5 z04dhsR4cHBUG2PH!u7Ctj^RrLy6$uMl-BJ8np5FpQ(0h0%w3qm4ZnHmyqFMnE1oOu zRj`GbX}JMw*8;Peg0)HT-2Ui?C5zj1JZH-FM?WI&tKTH~^0*{C{WmwnX44)!%?AlM z8`nsg8&A;zLYY2peiraCi7W=aw+*;ZPF9oam;{!^H70Pb+7N!Ngls91I)vpx7lQEg z1Ws~jNIo^B5cVpBOoV7ILY)$TXmxoVVdE4+&QRG98#NQ`BWCmZENlxkCBNHlYmXln zx{%-Mz%B*(0ejw?_ZM-{oj8} zKK$SQvn+=IiZ_3|S`kbJ48RODQ7=^I4wiqy z9<|Bx^M5tjzBwnafc5(V$ZY|QUjW7EysWOS=05T3zx)H)0`1fc*&=|SgPR=ORGywn zP9~#qsFtd8uoJWcmtr0^MgzzBpv11~i}K<}9+hVw|EwIEnUv!YO%Iek>4E_;6yXr3 zB72JBbba5Y8|oPRz?<)uwmT;O<>@834vySCUV^rFp!-gbP`-t2RF_p zxc)rCoJt0c3jrbHY33ta0&s3igj0&~JX5OetfzH0?AXOF;eI&Ox()-h-ohqhPm1m? zV*E~9Cg$hF>a}DWfH8AmQHo(#S~xw6a5t`=eO|m1$7OnQ0UK^hTF*ZvhY;Fir7v60 zJptQ#Qip51yY7BHNI@@)PYjU{8K6Ia* z`i{03NZ{@?AOeSAc;koWQ?`N6f+sN9$PhnEmf?aS>^}XZ44k}-k5#m7WV6xKEYMrE zCJZ|n2gJ>;^Z+0PY0t8?DH1~ltrceVFY`bMf?zoLYDwLsF|dcR*?9@rPtwhNEx=gv9*UM1s)|-9pvmg1E7eDvdeU-^63ZfKvHb&Fab@0u|5@&kVCFZ18{$FCtU!R>yb3`NcIMc@8L3~pER_RCG{m@a2>4NL2s-Q!sq%jQfLJ_~|U4(up{-{0A&OJQtG z%Fr~zb|3*j8h8v48ERXDIP9mX^K2`~_zmw}3GW%(C3F$i7yy=-wMr1Lhnx*l&WQ;z zHV1(@suU#v2nVgU)JkP>N;PeJ$lE=G>l@eK3A7#M!uXhc8VvO5a~I{<={qD>osg}Y zH)Ikh`n2yNgq%kT2p8!zl)uOX|#QQG!up5J&|Y0j=DNpL|RTIKfUW&gq<4b~Eqd zMqLBVUcpAT*j>!d>c(cH<4P7=$j!?O+XK0J<&ymPx4cFUA3Y&I`Ron3&}+!)@v2PV zq0{?LapUK(i7hY>m-bICqkzInJR1yvAi^FNApk4KN%cIn zah(pUc5$-rt}KH=C5X9)QeR)!O4=;vrnIn0SuT&zrve>iV`D{*zWNbqKK-JsW8+Rg ze786_`8V24DdsAwxv&N%YGA_xgxt!Q7R#}rkO}d$QD2w(=8E{e9mpDuw5*+{Cv_6` zM#cNiELZ|tzde+NL&wB{{?frFsZN5y0i?p_4s;7>6bMWDU@a~)X+t&W z4nRO4WKmvpb6G-I@f}$AtZe>?;7_diEplK5_Gf=O4)z zN<1|UCWkSJ$zh=!m_`vyVu%}$AE0Q17{t^}6vNG##U^Ku(WU3lYiF$kb2Z8A`SnF? zwi0gQDQs@`7G?2P0Ii~njl2uDf&EiYlpxyShX2^=wmkOuv+{jkbHBXxuH*7^pSdd6 zAvm5M%j=M*4Qw2r{UbQMDCx`M*tpbv3ZdyZgFILWM^`s5jJtutGkk z&686LI>!Arqse7CXb>KIk?w568Vsd?8+vPHi3udo0(@CKG$*SUUQ_}1=+VQn{`k|< z!s$D6>WFk;Mfd6CXnS*Cd$Rg#OPYsbWKy=40h4RvW?x-hk@fXDz+?xmbw_J^m?6pp zOAn_v2~=xq7w_kc1lSkN?R5ojrkAUJ!W;{PUu|6DJi-ai)(N3$Sj955ogS0@v;Z&g zp^4yq=|Gprl`;q?cD0ETLnZBg8m1r;8)^Pd7a>9r^tH!oLLgy50{+g#xJ)LiVamO9T@4rBsL@-4hSTOMRDV>=SK#c`oiT)n%-W>yVAr7y4fDcI;8YXFpmu~kZvN~ zFg-oSag!b7pz2{F&ukARpDh3+IP5sF-ZqPDmLE4p#$PKz!aD^UMb_5GGG~5dHi!v$k@I2OA*xm`q>vHci<3c zdr_JjYZBqwSrDfdF)infB~4$qv;#UqzhXtU*PF6*V_7%21At-P3|WB9G%!IRVeE^`r&TqIDe%3C)#pYu%6hsUWlL;Vv zbO728e$OtlQrFecjl%P%pSdYZU@5P?Ye6b^+$p&S-XOCF?vmP>SHU&&^zaE?HpIqZ zfG~}v5o|b>z`pOn)v*p9lDod;jdGy1Do_8!f0CVp2pvz~sq=BHY)LDz0}>04(8Qq@ zak^d`VOQ4Bnwf~>PMaIAO18F&vX9rk1CZtOFW%4eYfiRjr)~oIkbNuwC=6rTIPEG3 zVFLE)a9D-_ArvRNWqESp>NV|_RReX8aPwKrM#X1b!s%be?~i3|*ta-kBgEOwp4@13 zrHLDIYO(}@RKPNZvdzRHCz3bZb6l2p`ttS{FUWU&;~PQw2Xbi_ngIte;pQF77i70P z(2nSAKEqxhMHYJTM9OBte5`bqD|1$GLj|~&KCa2dMrY5BfMFEQr9Lw*aZ_?eN(Yv; z0|pTR?Aj0li>0bmvEi3*+z@wqN;a^W7VpJL*sROVjfNb(=K=B7S7a4JYXPoOf#Vtw zT5zcJ5E_IBJ5(!HJ51#cw8;I?i8GomU&KjV0kbjPbgYDssez>susF|#XwhF=(cG1> z!v|Fqt}m}59O_62a2a2i$J-Q04?2WzU^C-!=n63e;U;%+60;+Hw7I2#+g)9PSPDxx zYb*2MCmTcP(cn_6ViX?c{zCJ5t(%ZdH!dAQJRZ~#J%GTG#i9`6XRkaY>e3^0s?r% z4sZw;P23X^M}~MBE=@^)JWRRw&f|!sx3mo(XXkS8O9>kzpsmQ+wXjO_#hivK zEcxdc1lEzTnvWJHC0@q=%*Qav2AHWuCjvKquh|fC8Nb<BHOdUR~^LsZhUQyt)5hAz{ zsl!fFns`pWw?pbu1TBO|)SB`T7g@Y7uvcMmX%gMa`HSLJ#{rOOo5hHFNHS0d%~T1O zARA~}zfVR4SQ)^IXWmwpfnL3Xu&yrw^_M+xF_=k88=TFfv>A{k=bnB}>ivd%!&_dh z?H1WDHoo|@gzHzd^SobgN)6$Ned2D2upO|rEigZp=zCh?z^Q;Pm{Xn;`tbeM`3ul} zrscuYi}Kvt-X%-y*E$QEJjVUW0baOt)z5n)fE&YB!Gh_sTwA`wBp| zFFZHfs&7ts+M++w=DM6a%lWiX5b89zEI#BePNlSQ40~uga&u)Ca*x3A1-(E!Nx)0H$!;V?D2Me=+leh?A$mqP4kV-mSk|N^Sn+OFewVJFzFMtRy zO_t!ZZzyvi0A};!HG~&^;TdXaYeQ4VLulVmoa*fKp60JWtHGumAjApv&*{9{A*nxf z9S*fxoTy1_b5jD?uO4V|mwi@oO3s`M&2{dIPOnmj?oCc>p@k-?%ChM-IsmfI*XeN&x;&OppSj z1!LNH`V%U&CeVJeU=Ov|eJ$S8th!@lMXZJBF{}a;jG3iNhYGGvJT)&}XjJ*RX?fj) zXJq4rD{^(SD<%L`M{y3iTAiKHfulI@u>}M%8UnB1x`%U%WS_2m0U)Wz!%?$Hqe zIKgu`VcEpk!G}U;g^iNKA^Vg1+Nh@t*MvGp7s4b5O&fc5X&wxsfE&Ju4N-s|l80bf zhULny5;kcDtbmF?J5G@yWHVW9NW>nSX_%8}N3uqr1z)y!hNHu?=cdQx@YJ|$amX~D zr;O*^#c5iDb!g%`d)Nh<2ZGJmWljV)h$Xs72DjWI)=;on&oC7c0{}{Z*OX8Qqy>tf z>45d*91q4zNgMWb@jDAAPl>g&DL1w@WU^Y2_S%MYEk|=hT(~y7TXo&w7KO>}U5PU$ zLOIa)%NG&bw{>2O2xt>-Xq{h}@bFy^LiukUEOdt~4oF@rV>(XhwlGuW+6=t4XMfC3xA>*%iD5YDWio5p_&*|+45kpRRoq!T_b+-PPsSm^x>~Q01Sc=vr`v8-d{rHy#HwJFwc>9c**Et(%rE zjR`Ky0y=6FtjlmY){=8^p;5F!dw0Mb)yeoHzAXzZftHZjo2?<5;th+}ycP2uk?Y%qpOr24#33OI2G)KM~yX2!C?51B$tFv4{Wse^DR zc9>{LMsT6HNei>xhA7D#l^y^GudjtLfIU%NTEKWM-K}kzI(ArD&(-J7OOE|P07@M& zv3_id2X`cFA~fNoIWPpLn2{!|OABC;LFf}~-9+eNq|KF?vCCw(LQUt;vH~~`(`#eC zMi?|9g6=}V1q%YzXW=39GvFFaf4i=sj}4899mgVU_}Q@uspI-s7)Q|INCYwloe|6r zm9t&IdfEuDau65^4rDvA4i!(d%9s6Vsedrrlc64|N5Chw98LLmIC&2L^_iQB_rvA; z2oQ@kn;gJH0UFn`zSEQ{Q|QM^8m!>u732B z5&|&o%A`bWY=r|w!@mg3WiNR!_Pbdt?jMzXy7mo#tX;fV>bIJASX%#Qq`4E=m=PzR z;lCk!l5$2W?lIb+E9+a*25qgu4PkjTT@AM1r^xAYCJ0WIZPl?DZxg$-0h5^li ztqEyq+ARCWh8-~N9gjmjV8V^%0B*`_*RF%2)@2-mp+D$qig{D}T41wt_6y$C2sd*U zCmDNIkUb>KL7+3hF#=!}kq&N3PfzL(6#fWs9Na|a6tdenOUn07>kdy^H*Jgqgj8GA zfiPKL*^mf;cY=f3gfU^Yia4i`Lhu0H)IFkv$fumVR2eEajz_|Z9#YHO0N$nLkL+IUy$)5cgp15 zuaV-J*NAcSjL7l(WOw0=l#U*f+{%(X|0};K=FB9-(}FT7Q$wUk)9;gPCP~<4qTk5L zK3)5!8W)T@Gwd{rjCGkip))+#99IRlv_zi=Sf%QK6%J$*H%1NCDaQnGL)S8CE5jXF zg$)2g#7%({fSHWUO3bpQp0zjCok2HGxs0u|RmocV%vQzbIz3mCZ$oJCb02+DCg9j` zOhf~ZX@C-Yj-@UCJeIPvYn|5Oz-Bgl)d_gbZ0^j^gnd5fv@l14&W6%)nliY#*>4mV zr%sU%IzD7efvIU3n_1L3xI+k|%p55@scpT3u%ve2pqx3hB3I8}mHCIxV3Wf&f=6BK z#Ig?dR2v%y7ldGu<@di+j0+d#!M47~=7w^G%#_&h){kJp)lR#G~1A3nfXu7Bh=p}j51sn@+mKKF^w z%DE4IL{7c_5eY6`)*KdUKoR>6WpG^KI*o3BLiXv}HvrOWv^`MfEGtJjg1}*Ueh}&0 z58j}3Dwu1Lg=qKq`E&SCJp~5FwprXyWl{4?!`;;(5VH05mV+PRqq+UGatpl2}=9Y zLHzBrP!3=eX}u0iN9ZS{bc_G-lqHo)n~9vVd!Vc}*S;6&Y8U6BLh zlX3+cq%&+w8BP>PwzNUH8aSnEb8|91JuYp83|GMtW|&^yYRbf96#%j;1F(Z!p$sN6 z6tCZx;Wkdu(wMdcBr}U)ZL*kd2h603=N`oDVd1l*fP(Z;*^nvK>1pl6-q_ld7@Lsn z&&j(QCUgO)+uP>7|Nh|NE6Gs+y;5l+}I6`xZd>}vp# zHCmf7h!ecjPz@nt`$$-cMesBGHW-QpWqAhs)J?{8Li-ns1V%(-!@t za9}i_L0EG6yqFWy(!im#o~?+mDbd7~hB)EsRXM&`mE!SNi2>c^j>C)cJHPR6IAn`5 zeqc`gD>u^VcGO3B=rO}R?46cv?Ko6Ez^JcSd3DeFvOXQ3SPG4um9UG3DaCnav?9B6GECz?}2 zL5(-+BwUUTZr!J@-jp{!@_;P8zk|)XD~DK0(DyhiQA7-@vqb zOHWjWV9{QKBNkb)VwH>~WbY46Ff+A&!)8JmuBidtVhq;dc~7Q;GKc|0zX?$CW<%OwG&*6A*C#1^ON!W_*qFoRCEWYa1gcYD^&L18p}q%o zW^{rru+<=|o7IJ(@XK_6ocik*FG~QOp$uV`Iuu=z7C@p{DQiI^9Td7w6h8U(cIb$( zsyCOmWi&E5Y__4c0ieF(O-}2WPy?Y|dmGmH?1E+!3tKKg1Ij^=CJ&;6MP}$>M~8`MUFbATJnkIco3P*I6kT!8JRsRqr{vP}*HoaMD>#yY zaJ;*GNpf4)W$NG|8Gv!zeDMjnifcXahBqttuycD<9E13ad#M5In$_RNGR!rA;_9TV zuk{_w4GH>|pa0 zA^MHubjq{;sODNEX%QQn3xTy{!5AzpBZr%SIJ|}5q14A>JvJYrR?$K%&CFFBfEAdb z+CPW@&nAwkx}VX>JF?uO4%E@Ohcc z(}0Cr-`P=txX%GpU^sNqsH2d51OmXY15q z;DWGxf#IHa_^4ElpONclVS(fGnhUoix%xS2e&!<*z4)ADz|%MQd{D{TSE< z3ZcdZl=exl2#RaSQmZFdb~-9Hmf5}#Zb+Wt4E`;P7`lp^t(dXXDPyr{4^IzwCJp&? zKz0Jr5gQdZM-R@2tr~_%vkgHLp~;OKa4*_Tt;N}eX2A?q)^JP!Y}g)&<<4xBE$0lDtPG^M_=2V_O1zj!v*8 zc4tR25YQ_Lm`~W2?nWH~bVH`b3zD0h!aZTg>WAMe>sK!WFg@wvwM{+rRbm}Hq3nfW zBs<^@aKCU;VXxDah1oIrs<(c%9GgEPSDv~ok3MrzrlCP)@LsT7!J;zl`x?Su4 zeOOk)wSO+!veFR^RI&}x&B&OO$De~6h9?v|cypG?3ar*{pN)@Q2%VtaU=bCZVtD{Y z0XH}kz6=&^;b!BQ%N#a;juRblk}*+F{V5e{XgMvIKA{czKz| z<8L-PT3)ZoK`g-5D0b#+t@%C=1~x4mglor^A5_ARy+cIN%5b zh;a#SdJb%2A5oj_13~#YK9eUaXZf-)kAiCs?1;^MZmum0JG61A1la`ZPV&%73ILc0 zH~#kWO>xJkrGStofF;f3u^hspw9!wfA<e$fC?4#MX^Xyyt-m&IAzlN-+pP;~BHEyIO}X7E3kkN|r;TAcUI;N5DO0@!+%^hb;~ZP1`06!PbVoj-30z z`(%3)e~0cOIHW3fKOkGsyV?kg$Rqd>8p%+bS#2z>%G%8(so;HIfS|m+yd_t5@%rH4 zw85}UGPGWlCde^t91KT^WMA%u8zj~gaN1w$!ldFJX$V0>PkBxs#O7xfC>#86`Z|Xn z5AgS0mebS1W86yNPhAeJK*0?=)V6^HjxIJU^C7h7C&7b)CvQl080%An6-`BMV3V^* z?jT~?jbl?O~9PNd#aFs9$KeuSnCK`Dd1|b5Sg16J!-%En8>C^tJxQQ0tfp zP(wT>C+ZEEHOpi)+{k@AZV60+eLtyNFeRF^WlBy~#XuimSOLqRph(bS4-HzdHGl@E z?QJncz=mcZH^hx@fdN>o4(>&o9olF#@wkD8CS(Y#O|h($jhPOo-2)f^9;|#8&W6D? zb5D^8Fh_^1gx%6vE7RzOGIQ*hhIbUH*%gk>f|AazzV-ya*4GerS=yMGRx&^HA%$19!hN-CMYDD}tJYNz=V#0MAuG>u3t%4z<2bI;z-OFc z>&MnW5`g~L!Fg>#keGO0$I!8%g~LbSuH@w=fNN=^3EzHBa$of)C42Adq_@5#=RWjq z=>%QbS-&nfAN!1!>vs@}HX+b6OxtPr%(hFN}@JE`;3r`i^W~ zhGtU8>Ch|{(qla+VB@~HFGHApBceKv4HE+rV1)l9rWUs`WH3m*5gYH|!|CC~rKMLb zX4G=);O075D@m5F0&ZAt_zpI3EnAf7Y7HCQPs`YobRbd_r{MYkEGEM+!DJ6~?eZP~ zcnl^(G2eg;$V?ee1CKd7UX{V+o3f2lm<9FRXaP=Jj!x`g6OXg~Kg-;4x>mRWaE;n1 zS!3r|Sqo^8=AE>Hy&4bBxA7@V_Ou|6IRo)tsy)XnvK}R`?F3tzjvZ?;VMg3e1TAD; z4o^>M5}axfh_y3Pfc^q!qy)DE*VM7b#6B=C++~^t;I5N6z!EL_*E2icXBUQA#KrXT`LUv$Ix;6`4kEsXpwN9=o&U( znF1z0&#O?|Hvk3!tjGa20qxa@6|`NPTsUo5w8tJ57M^RV4p74BK2t5oRvRpaO@DDR zGG&`IzXc(VRNuu--)1%_7!0)zo~Gu2cXZIK{bnsK4N*C-bN;Z9^G<4bB$8wF%v#i4b)KA~t*4Zk>HmlI>NgV!zv3sojCN z-i3%?fPPdHccv`WV+W;=&)UWJm?6Beu?n{g;Vurd;N~*I7-(lW#LVtcljN)*a)HEI z*@tW20Em;x1gdPR?P;hu8Z%WJfI-UN1KQ^yvQdB=>PUcC2RQNM+JWkAdRbVhrW{P z0f6w7=M=P1(%7D2Dzn0!LIJ>+L#WWw)ch8}u2d*X8R6Uw(Bw?1DtUkepO@9HF+ipW zJ*B(3q3Pr~gmt;;d1f9Q(Kq#{6 z8lcan)8!Dr0LO|kse$*ia{4YA~aLmk~5+C) z(H$HD8(=j}e9mR|m%)8Das05%o;s!?dxI?t?5y@AnVOvx3qRk(HI?ymMSQ-^r448- zS-p0XBRmp_L)w&f|E+xkAS53;)0P+#rseLcf#BHTCS{F5mi;jiR|b2`q{Jy|tb=4F zEq<}EEN5BAXEgObB08{lDv0HY!RWV+Q-Buw)VaFViJ zBJ(x|1CBcw$_`jS88;der8e1XBOYpIDg*W`PO=tzRBwTi<6&oT5c|{ zNp)(BRrxyNg8BhpcM-33XMIIn#Nm}nSqf8A(p3ydIVxzgC##%qCl0bmYrjUL#D!3NoGS!wrlZhj`pg_9M6ft;l7<6dEYtPs~MPr76WO^NHCDcIxIJ>a$+W^(v z$p^%RP1}Qb-G$qd!~4m;FW0W!5O=PkR%_?656b`|vgq92SPHOZhx13JRd3*Z%}a8} zBVrvoq9N)ULff;?J}t(OrGtjHTpaY$Q5S4}RK-0szc2^9g55klBPHlR6vsnLxe!9k zGJrj+iHR}Z-zxszzkWl*VM|N>`%LA>4JG?>?Vn;g(`3$3qHYIIZGHgE{KHMkI+lDc zr`e0FqGE<;88^M>X0)hEsWS76@~P0*!_CdSggj{Fq2ov7p1babD(`7?;(45k8GNue zx&f$jnlF;*jmvqmrrK~l&ii0lIsV*ckBubJkr7(}G8>@ARsjv%)MI$QV90Tlv9|hW zHf)E9W^4iArwxR=*idzV1>G3YD%40@{c*T7C&x3XjKi6<=`ao{_Cbl$B5@6CLTtDM z(Mh(H1@JYsqgf4B?m8To0j_I&ViKFJuQe`oovIuS3Ag4Z^o1PQnuQRL45zcPt|425 zO*v?912{YS9`hPI&4${?jQ6uRahZ^{y;YZq+PLP5updi6y@763udms_)SZ~z#ouSO zFFzWxCpL(7iwKYK*|2Yj59Yw^;vRmWh){5_y-lxN`r8dPQUZdMox)}@`jF54WaRnU4k;h)@L>@i=#9xdEc#l z10Xps!=?|(V34{P)E-^ORkY`6jZ|+L06-|nYDNlxpamLQ z7FwGChe3MkGNcjqJVmU{Q3SMu2l%-zs5+SjyPU;AT3E+X4ef4UyMG1DuEfs`d%lj1 zq;}HB_i1m2W}-H+z6YF{OD769;O16CrocS9IK|nYBt!NEx=rexL1>c8z%}CJc>n-u z#XOuN9~NbsITo<4>|9Ao5T18-w`6T&O**Y@*;u&&kk}GV{?jmvr=^+BR@vBElgZkI zCeFE4h}6L6`qrkb13*2n8jhJ{SjbWXCa<%via`enUp^~g!8i)0p@XCX{8s^{Sdb~N zAj4HK2?(_z+#s^Nft%CZ4=)LoeNlLB?*WK#_*SbcD}4av!>H)Tb1GV zx>RtTOY5uB#X(aYo0jn8T~c`PjhcqP`^ophIu4XA8emDend9PsN#$G)&i3Sq4}U;b zKlpwK@mZNG=cEX>QX9)_f*!nInVFeT!G5EIyYavbLKSF8)k(1t-kD$>S_=h0&w`cc z@N)d!0*kZQBK!6xdk@2GLBxNa{; z1pl4~wPs2)S&8MOj)9S57c$tH5D2wTCr)y&Qk4d7t}$4fM-DE?Y&9=;!&y06_GAN_ ze0RWZAP8X7EGM2v`XlupEDwHm11+ zCOEm722P=np;r%KQUH52in_R|4V}D3mf}KmWBGT)VzDSvYn0v1N_IxJVLNsZa!nwv zW*!3d9-rFER@ryA(UCxGpDT>N-G;lkj$%vfFLSk*|KM9DU@q5N~h7CT%FAA)^r5=y<%{ z&234>rnEEMu+xOj0kQMxC&YN{QT$Axc{}H?-joxIi{icJP2$bWXyfSY{jZY*LTTe; z?~&fh&6L$aeC9r{gPr}-fBrA>^soOCSfnHK6IH3grI{>OVB02AgM-IBm)s=&TSl0O z*Rg{r#F?4X{33UJQtv|@Z3zG=&7@hlv^*(U7ht)!S66lFp2?&_(Q=A?se$Yp8#n6~ zhPGGmqjrm<$h3Ul4+tPVZT3QqfFA`@nV8<37PQ&w^@psV$Z>dePFwG>a#NVr4Jyui z(ZUH`n3%%f!Cb%w%GkgU14LTGO}U9pxKPPUUaLq04Urf+(d8jvahwEun}(*3Q{Rv! zp4L5VJm?_JY`Rf4Ak1>!G&eq?7+G_>D$wo*taAy}7G)g|BQ&3NCrpT9&;YQsAOv;+ zWEC(b4`9&?duj6?PTIrYv$#R+-G*F;x_|oEAqbmWV$?D^zolTfU^h)EPEE@sHviSF zb#W>aGInHAw!uy!h(7^yBn*b&F0Nq=2kEq2xwa(5a#=Gv*(`}^<{U?%-QRG^ckoyh zI2mOC-?bN>fkTp!>fE%>!s!6aG;|st7bfa+qF%ybQG9J=4G3KvZ74m|hEQz(NYQl; z4pMJ>M>U@uz_kqql9Z>k6~UpIiadAY3S5*IWNLa+r`@%RV0S}<8Ol<++toG>WSiU9 zuE^{SI3>`cx^Ql;-CPCBGUR~;SkQ1o*jOnU!2X^)D#jUz#ZP}w%%=ir#Fn_MS%Pl$ zo)3IVo_YG59Gxpl5nvPJ^>OI=bk&n-geN}Ui<8jM7>apW9AL!>*vGC6s?(}R8D&fJ zI~)qTECi$$#X?IkSdMk@5V~+SO}N$6#?oXaec7LD-!PDJp%6I5f*-SYhUP%W8cHzX ziQ=Dj_+nuf#YQLX(5^GK`F|NUOU~;Dr~NE*UV1t@o;H=S5!wU{Yv#vf0h+-SHqR6+ z$v5HewiBsEt4F2Qy962{aWmxbFIus}hX^=)V0gip(CD7Qz&^Y9tU10NfQ=^PIVJgNvea#!Q=9G5=`T-OFGO zlR?(E+OiMVz5$REkd}o&&SWl`$#8aay@q*E|;v!RCzH0XA=p z*J$%ZN61xyzB6U@<@&Q{#X#sbRz^s-T^9rTkssnT&J@I~&5Jv>sH`IAnQDD&2QOSx z53eIXKP?pi-o=l69M6+T36IHa-hN|K>Hw~M8A2uVF5qafK@kOJX6O=sU4RTLjJ0Kpef}o4!rTrE!^j z{Uee;b+2qa{iL*@*@OrgY6vMZcf49Y1pzgJxSj#%PiYZTLn;)$Kl>5stX&rdx;#W8 zry_&Ku2^t@5?Ci6SgOk=w4DhEpB{9KaWEEI*u_d#Cc!w^vGphf)Goq5Z+c2hFjo#K zi!N3YD#9#(?7Qn!wISv&9<)=4K)N6h|soWnmQa8?Gb^KG)lXx8|H5iww6Rb=(-^O{>SwK%UM8>v5S z)tj)DOAxQ~nxnyPWDI*uP0fd}3&6_3j;4OZu@wY2wnk<{9(I+B*{TumQwUHh#H>>? zb++x<_x`4I*4JdWS(owIMLGQq-=s~iX}NMlXN(P+>~6~0k9-JBf!au0g6fn^0BkmJ zjTLOr0<%}~ekBlKLkPGg6KROl%oElF2!+Rw-m`ng?1_u*0yO^;SUN^%y zp^(np9?Op9e%Y66UsV8>CTFgy4xw&H8dIBAT0)>XW>gUf44iFBOdvndtVv5J)aj^5 zEdjR`L|llCEVI|+c$SV%KP^9e(XXNw-X^qY_u5o>1M|*O#@!Ylv2L`*Wi@2UcE|}BM za5Av2PsrB#Hi!-4bPw+*sI-~b+Q2#LK|Jk2D_{pMZZd2No|Z$r)&f}F>hou1z`3#y z+=sZG`6v)U5x%jDeX&@?DQjr`kXHcf!=|E^5tj~6OU1bX;Db&M@ER9!-+ z2^RBviG6!ukv0y|ziU5EZeRrxM<0WUUN#vDz8u^PY~}AkkeonBvsfLMDV#WGW~%f| z0Un9|&Tv4nGcE2LaDFTP%$9rX1j4Rc9%$-8{AoMr%NBcj;AY&#O}mYgu*GY)Y)wk) zlGYLoW4aNMvMJtJ+)$eH!CDV(PaZ1JFkO;0C)(^dN^5B{U=BOGEh&K}^A!!@Owkfu z#?1-sND|H^L1>kuaJyA!*|97x)-+AqG8`RQNyEF-f^FMe!AafJA~o%e%8B+&w!)j6 zAY`O3Q-ILA%{&H{6##UYL^Tfgh3{z{o3+G7L->6*qh@{-b0G%om7)Wm`Y9OVXEWH) zHo`3<80ulbw0`FA^zfc-^x$lfO_BlJcQ+qJn>&%ckg46ga8{a6e_CozPPU&p(cu?OEIh530+>SOwT|M_QNr(Tst+n00o zj(mE%3x)+Z4Z6n+v=`>*?Baf_P-gF5pnUF@kgGG1< zW%?}S!{f9#K-x%iS6H|fbLK3-qvxmMuqMDUKTew+fmqSLwVgD)h*(?}YWqfZx1!}- z%vi8LhuR%X5H_tNG+K31Z|agx%1Tu+&OHW)TIvGyyeuP@8Z>o;X>vmx8q{44;Z zEsPz9@S+O_0g?E?ln$xZ+(wAC^89(RvJhL#)E2Uu(R=E_SIP8i zUL$9hH>JT&VGvq30G#i6+poyr(MRPVELWeQDcv({ba%TU!Q~eHf}p zByK_M1|Ym2?iJxb1bcIHMQuP-g9v@I0|6KZ%Pd%Fp;FXtXaVbPa&CGE3`1=k6;X2w z)BGF>p=S+SYTY7!<}@yGI8e&A_IlYE+WwMl9azs~c=-)UW%_-$_Kl6pRT{62aUfNZ%G5enY)Z2e}4P@}1=pQtPh3uGyd8gh$NuR5{$HU4s4BR3aBsi%8{f1Ag2mRa{g&N9>9II? zYcBe9l>?apd&XBJQ6+o5>>-+iI^2zD`qpesWAukwW zA?{K6A_Mtxck0N9h+3!Ao>X$^JI@g_rPA}jWi4#;Qmu+?M*^Y}dl{o+Es4zv z+J*s6*Jp2TqkA&9PwJ2C;V>?ngIH8PQ5}o)b`M`*dF6{%4{(*G(!znOe1C0{(3hBV zEDCr$jWWn0YDk@nSk$MY%L4#RI^Po#!(!v1+PleEQepO<6u$H=a0t7Y5S+_p!=AbJ1~fmtN7Wyue4)ab^I>*As`(3wf1 zyTaEL8;asRw5SLP(xOc}Zk<^QrN#B@*MV{Ltq#0leYuKFoU%UJ$!u$~3&WI&Q?+xQ zwkFwuNq;O!0t#Knr@k_?xTctA$ap5`%)VgN*Ea2Q0f}2VOX4#uedjy&_CNb=dUE;w=x3RGXOMmNzayX-$qn!8+(@F>=Lr5 zRSHCX?~f4xCbo(|H^O^;Z~w@C(i-9Z1Cs(czqORNd-x2Wxwc_tfZ#d2XBH{ogVxlp zT}`57ssNZC0~$&RlVM2}_WI_PWJCjuBq=>x+L#(igItbN&q-GTuhN=yp+y?HeU{Ym z)cbZpUl*!`sa(CSn?0dR^< z!(hb}HIJ@G8Ew@ie7%Z)E?07PvsSXtZmrm7FRj=s_~)xT%l4J$uGrUJyk>9Q-mzbK zcE{d$X2))=lr%oyAIUgTVmdw+WtnQ@vmo+{HFr%E2*xIDlc|dOx`>RS)$U4AnB@@Q zJgKJV*gC{#xqsTQQNC#Fz$>`$r?OCByF0D1f8r^d+gEMp+D%(3SFw4rYKeRDU@@^~ zDRfj^+pwj}*U-)B*~z_6tb`4QUKaw@5I|!FrAA(c+%Z4l{E0Qj9|-%<$UebD>Znrd zln*3>jf9M<@WP9>@vC36o}bf1F6U&DXpOEs_q_aY3-l<)XaC3l*Z-S+xciARx_oiP zp8sqAk%hUe)sXj#QjAKAZmOsM1qvyVdKn*T=zdN{NqCqJ7n!;DBD-}umplN4b%;Tv0aj84j5PI8 zyJcqw4NIcr*~lmCIaPh8|w(kjTtfNf)`C(EIYDrijaiQ$YH zy<{Nm*#beUjb0(g*ePV(W}7xsMu{^LoqQAREFfD#prA>%wQbaD z$|^L8VC3T($4KKT?31b>BS1Z0zjxpEKK$4=R+lxVPC=&S%a;+v($+e9WC>spR4tP| z4oaX&XDF`D^F331V0-HU`n!6i8w##Ezf z0FGq^MR>v}#PGpWd28<8vo8xmPgV$gN|X;gsn<0OMz!`1QuXR`*?a(r%~nsdHU)NZ z0HUQS5g2mT1+_eaQ<+>7bF56x(NMOq4}7DDjhXdacZh<{oFMk&Sm4>JU7r^*#BL^?~VghD5Wa~8;Wrjk>1!ox%0DhYt4!8C4Hfl)l@ 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/full_body_front.png b/assets/images/png/full_body_front.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f34b4e583cfc22d68d23943a4e378d2550536b GIT binary patch literal 229850 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

wKM0@PvkIh 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%0AJZt5|ADaBjv3<|v|~cRyX^A`vy)>8goxTTgQi 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

D
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

literal 0
HcmV?d00001

diff --git a/assets/images/svg/body_icon.svg b/assets/images/svg/body_icon.svg
new file mode 100644
index 0000000..03591ec
--- /dev/null
+++ b/assets/images/svg/body_icon.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/svg/rotate_icon.svg b/assets/images/svg/rotate_icon.svg
new file mode 100644
index 0000000..cb52c31
--- /dev/null
+++ b/assets/images/svg/rotate_icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index 5fccc6e..eb6f74c 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -176,7 +176,6 @@ class AppAssets {
   static const String all_payment_method = '$svgBasePath/all_payment_method.svg';
   static const String ic_rrt_vehicle = '$svgBasePath/ic_rrt_vehicle.svg';
 
-
   //bottom navigation//
   static const String homeBottom = '$svgBasePath/home_bottom.svg';
   static const String bookAppoBottom = '$svgBasePath/book_appo_bottom.svg';
@@ -190,22 +189,29 @@ class AppAssets {
   static const String alertSquare = '$svgBasePath/alert-square.svg';
   static const String arrowRight = '$svgBasePath/arrow-right.svg';
 
+  // Symptoms Checker
+  static const String bodyIcon = '$svgBasePath/body_icon.svg';
+  static const String rotateIcon = '$svgBasePath/rotate_icon.svg';
+
   // PNGS //
-  static const String hmg_logo = '$pngBasePath/hmg_logo.png';
-  static const String livecare_service = '$pngBasePath/livecare_service.png';
-  static const String male_img = '$pngBasePath/male_img.png';
+  static const String hmgLogo = '$pngBasePath/hmg_logo.png';
+  static const String liveCareService = '$pngBasePath/livecare_service.png';
+  static const String maleImg = '$pngBasePath/male_img.png';
   static const String femaleImg = '$pngBasePath/female_img.png';
   static const String babyGirlImg = '$pngBasePath/baby_girl_img.png';
   static const String babyBoyImg = '$pngBasePath/baby_img.png';
-  static const String apple_pay = '$pngBasePath/Apple_Pay.png';
+  static const String applePay = '$pngBasePath/Apple_Pay.png';
   static const String mada = '$pngBasePath/Mada.png';
-  static const String Mastercard = '$pngBasePath/Mastercard.png';
-  static const String tamara_en = '$pngBasePath/tamara_en.png';
+  static const String mastercard = '$pngBasePath/Mastercard.png';
+  static const String tamaraEng = '$pngBasePath/tamara_en.png';
   static const String visa = '$pngBasePath/visa.png';
   static const String lockIcon = '$pngBasePath/lock-icon.png';
-  static const String dummy_user = '$pngBasePath/dummy_user.png';
+  static const String dummyUser = '$pngBasePath/dummy_user.png';
   static const String comprehensiveCheckupEn = '$pngBasePath/cc_en.png';
   static const String comprehensiveCheckupAr = '$pngBasePath/cc_er.png';
+
+  static const String fullBodyFront = '$pngBasePath/full_body_front.png';
+  static const String fullBodyBack = '$pngBasePath/full_body_back.png';
 }
 
 class AppAnimations {
diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart
index 73a93c6..58c4a66 100644
--- a/lib/core/dependencies.dart
+++ b/lib/core/dependencies.dart
@@ -16,7 +16,6 @@ import 'package:hmg_patient_app_new/features/emergency_services/emergency_servic
 import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_repo.dart';
 import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart';
 import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_repo.dart';
-import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_view_model.dart';
 import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_repo.dart';
 import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart';
 import 'package:hmg_patient_app_new/features/insurance/insurance_repo.dart';
@@ -39,6 +38,7 @@ import 'package:hmg_patient_app_new/features/radiology/radiology_repo.dart';
 import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart';
 import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart';
 import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_checker_view_model.dart';
 import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart';
 import 'package:hmg_patient_app_new/services/cache_service.dart';
 import 'package:hmg_patient_app_new/services/dialog_service.dart';
@@ -123,11 +123,7 @@ class AppDependencies {
     getIt.registerLazySingleton(() => LabViewModel(labRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()));
 
     getIt.registerLazySingleton(
-      () => RadiologyViewModel(
-        radiologyRepo: getIt(),
-        errorHandlerService: getIt(),
-        navigationService: getIt()
-      ),
+      () => RadiologyViewModel(radiologyRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()),
     );
 
     getIt.registerLazySingleton(() => PrescriptionsViewModel(prescriptionsRepo: getIt(), errorHandlerService: getIt()));
@@ -220,17 +216,6 @@ class AppDependencies {
       () => TodoSectionViewModel(todoSectionRepo: getIt(), errorHandlerService: getIt()),
     );
 
-    getIt.registerLazySingleton(
-      () => HmgServicesViewModel(bookAppointmentsRepo: getIt(), hmgServicesRepo: getIt(), errorHandlerService: getIt()),
-    );
-
-    // Screen-specific VMs → Factory
-    // getIt.registerFactory(
-    //       () => BookAppointmentsViewModel(
-    //     bookAppointmentsRepo: getIt(),
-    //     dialogService: getIt(),
-    //     errorHandlerService: getIt(),
-    //   ),
-    // );
+    getIt.registerLazySingleton(() => SymptomsCheckerViewModel());
   }
 }
diff --git a/lib/core/enums.dart b/lib/core/enums.dart
index 4151bed..e318401 100644
--- a/lib/core/enums.dart
+++ b/lib/core/enums.dart
@@ -32,6 +32,8 @@ enum AppEnvironmentTypeEnum { dev, uat, preProd, qa, staging, prod }
 
 enum FamilyFileEnum { active, inactive, blocked, deleted, pending, rejected }
 
+enum BodyView { front, back }
+
 extension CalenderExtension on CalenderEnum {
   int get toInt {
     switch (this) {
@@ -172,7 +174,7 @@ extension FamilyFileEnumExtenshion on FamilyFileEnum {
         return isArabic ? 'محذوف' : 'Deleted';
       case FamilyFileEnum.pending:
         return isArabic ? 'قيد الانتظار' : 'Pending';
-        case FamilyFileEnum.rejected:
+      case FamilyFileEnum.rejected:
         return isArabic ? 'مرفوض' : 'Rejected';
     }
   }
diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart
index e3b108f..9fdd947 100644
--- a/lib/core/utils/utils.dart
+++ b/lib/core/utils/utils.dart
@@ -721,10 +721,10 @@ class Utils {
       mainAxisAlignment: MainAxisAlignment.spaceBetween,
       children: [
         Image.asset(AppAssets.mada, width: 25.h, height: 25.h),
-        Image.asset(AppAssets.tamara_en, width: 25.h, height: 25.h),
+        Image.asset(AppAssets.tamaraEng, width: 25.h, height: 25.h),
         Image.asset(AppAssets.visa, width: 25.h, height: 25.h),
-        Image.asset(AppAssets.Mastercard, width: 25.h, height: 25.h),
-        Image.asset(AppAssets.apple_pay, width: 25.h, height: 25.h),
+        Image.asset(AppAssets.mastercard, width: 25.h, height: 25.h),
+        Image.asset(AppAssets.applePay, width: 25.h, height: 25.h),
       ],
     );
   }
diff --git a/lib/extensions/route_extensions.dart b/lib/extensions/route_extensions.dart
index 0dcc54b..b76acfa 100644
--- a/lib/extensions/route_extensions.dart
+++ b/lib/extensions/route_extensions.dart
@@ -17,7 +17,7 @@ extension NavigationExtensions on BuildContext {
     Navigator.of(this).pop();
   }
 
-  void navigateTo(Widget page) {
+  void pushNavigateTo(Widget page) {
     Navigator.push(this, MaterialPageRoute(builder: (context) => page));
   }
 
diff --git a/lib/features/symptoms_checker/models/organ_model.dart b/lib/features/symptoms_checker/models/organ_model.dart
new file mode 100644
index 0000000..984a290
--- /dev/null
+++ b/lib/features/symptoms_checker/models/organ_model.dart
@@ -0,0 +1,41 @@
+import 'package:hmg_patient_app_new/core/enums.dart';
+
+class OrganModel {
+  final String id;
+  final String name;
+  final BodyView bodyView;
+  final OrganPosition position;
+
+  const OrganModel({
+    required this.id,
+    required this.name,
+    required this.bodyView,
+    required this.position,
+  });
+
+  OrganModel copyWith({
+    String? id,
+    String? name,
+    BodyView? bodyView,
+    OrganPosition? position,
+  }) {
+    return OrganModel(
+      id: id ?? this.id,
+      name: name ?? this.name,
+      bodyView: bodyView ?? this.bodyView,
+      position: position ?? this.position,
+    );
+  }
+}
+
+class OrganPosition {
+  final double x; // Percentage from left (0.0 to 1.0)
+  final double y; // Percentage from top (0.0 to 1.0)
+
+  const OrganPosition({
+    required this.x,
+    required this.y,
+  });
+}
+
+
diff --git a/lib/features/symptoms_checker/organ_mapping_data.dart b/lib/features/symptoms_checker/organ_mapping_data.dart
new file mode 100644
index 0000000..a2395e4
--- /dev/null
+++ b/lib/features/symptoms_checker/organ_mapping_data.dart
@@ -0,0 +1,371 @@
+import 'package:hmg_patient_app_new/core/enums.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart';
+
+class OrganData {
+  // ==================== FRONT VIEW ====================
+  static const List frontViewOrgans = [
+    // ========== HEAD & FACE ==========
+    OrganModel(
+      id: 'head',
+      name: 'Head',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.50, y: 0.03),
+    ),
+    OrganModel(
+      id: 'left_eye',
+      name: 'Left Eye',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.43, y: 0.07),
+    ),
+    OrganModel(
+      id: 'right_eye',
+      name: 'Right Eye',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.57, y: 0.07),
+    ),
+    OrganModel(
+      id: 'nose_mouth',
+      name: 'Nose/Mouth',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.50, y: 0.09),
+    ),
+
+    // ========== NECK ==========
+    OrganModel(
+      id: 'throat',
+      name: 'Throat',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.50, y: 0.15),
+    ),
+
+    // ========== SHOULDERS ==========
+    OrganModel(
+      id: 'left_shoulder',
+      name: 'Left Shoulder',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.22, y: 0.22),
+    ),
+    OrganModel(
+      id: 'right_shoulder',
+      name: 'Right Shoulder',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.8, y: 0.22),
+    ),
+
+    // ========== CHEST ==========
+    OrganModel(
+      id: 'left_chest',
+      name: 'Left Chest',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.38, y: 0.22),
+    ),
+    OrganModel(
+      id: 'center_chest',
+      name: 'Center Chest',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.52, y: 0.25),
+    ),
+    OrganModel(
+      id: 'right_chest',
+      name: 'Right Chest',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.65, y: 0.22),
+    ),
+
+    // ========== RIBS ==========
+    OrganModel(
+      id: 'left_ribs',
+      name: 'Left Ribs',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.38, y: 0.35),
+    ),
+    OrganModel(
+      id: 'right_ribs',
+      name: 'Right Ribs',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.64, y: 0.35),
+    ),
+
+    // ========== ABDOMEN ==========
+    OrganModel(
+      id: 'upper_abdomen',
+      name: 'Upper Abdomen',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.51, y: 0.31),
+    ),
+    OrganModel(
+      id: 'navel',
+      name: 'Navel',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.51, y: 0.38),
+    ),
+    OrganModel(
+      id: 'lower_abdomen',
+      name: 'Lower Abdomen',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.51, y: 0.44),
+    ),
+
+    // ========== PELVIS ==========
+    OrganModel(
+      id: 'left_groin',
+      name: 'Left Groin',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.42, y: 0.49),
+    ),
+    OrganModel(
+      id: 'right_groin',
+      name: 'Right Groin',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.59, y: 0.49),
+    ),
+
+    // ========== LEFT ARM ==========
+
+    OrganModel(
+      id: 'left_elbow',
+      name: 'Left Elbow',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.21, y: 0.35),
+    ),
+    OrganModel(
+      id: 'left_forearm',
+      name: 'Left Forearm',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.19, y: 0.43),
+    ),
+    OrganModel(
+      id: 'left_wrist',
+      name: 'Left Wrist',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.14, y: 0.5),
+    ),
+
+    // ========== RIGHT ARM ==========
+
+    OrganModel(
+      id: 'right_elbow',
+      name: 'Right Elbow',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.79, y: 0.35),
+    ),
+    OrganModel(
+      id: 'right_forearm',
+      name: 'Right Forearm',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.81, y: 0.43),
+    ),
+    OrganModel(
+      id: 'right_wrist',
+      name: 'Right Wrist',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.85, y: 0.5),
+    ),
+
+    // ========== LEFT LEG ==========
+    OrganModel(
+      id: 'left_thigh',
+      name: 'Left Thigh',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.4, y: 0.60),
+    ),
+    OrganModel(
+      id: 'left_knee',
+      name: 'Left Knee',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.4, y: 0.72),
+    ),
+    OrganModel(
+      id: 'left_shin',
+      name: 'Left Shin',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.41, y: 0.82),
+    ),
+    OrganModel(
+      id: 'left_ankle',
+      name: 'Left Ankle',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.43, y: 0.91),
+    ),
+
+    // ========== RIGHT LEG ==========
+    OrganModel(
+      id: 'right_thigh',
+      name: 'Right Thigh',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.65, y: 0.60),
+    ),
+    OrganModel(
+      id: 'right_knee',
+      name: 'Right Knee',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.6, y: 0.72),
+    ),
+    OrganModel(
+      id: 'right_shin',
+      name: 'Right Shin',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.57, y: 0.82),
+    ),
+    OrganModel(
+      id: 'right_ankle',
+      name: 'Right Ankle',
+      bodyView: BodyView.front,
+      position: OrganPosition(x: 0.57, y: 0.91),
+    ),
+  ];
+
+  // ==================== BACK VIEW ====================
+  static const List backViewOrgans = [
+    // ========== HEAD & NECK ==========
+    OrganModel(
+      id: 'back_of_head',
+      name: 'Back of Head',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.50, y: 0.04),
+    ),
+    OrganModel(
+      id: 'neck_back',
+      name: 'Neck',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.50, y: 0.14),
+    ),
+
+    // ========== SHOULDERS ==========
+    OrganModel(
+      id: 'left_shoulder_back',
+      name: 'Left Shoulder',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.33, y: 0.19),
+    ),
+    OrganModel(
+      id: 'right_shoulder_back',
+      name: 'Right Shoulder',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.67, y: 0.19),
+    ),
+
+    // ========== UPPER BACK ==========
+    OrganModel(
+      id: 'upper_spine',
+      name: 'Upper Spine',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.50, y: 0.23),
+    ),
+    OrganModel(
+      id: 'left_upper_back',
+      name: 'Left Upper Back',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.38, y: 0.28),
+    ),
+    OrganModel(
+      id: 'right_upper_back',
+      name: 'Right Upper Back',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.62, y: 0.28),
+    ),
+
+    // ========== MID BACK ==========
+    OrganModel(
+      id: 'mid_spine',
+      name: 'Mid Spine',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.50, y: 0.35),
+    ),
+    OrganModel(
+      id: 'left_mid_back',
+      name: 'Left Mid Back',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.38, y: 0.35),
+    ),
+    OrganModel(
+      id: 'right_mid_back',
+      name: 'Right Mid Back',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.62, y: 0.35),
+    ),
+
+    // ========== LOWER BACK ==========
+    OrganModel(
+      id: 'lower_spine',
+      name: 'Lower Back',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.50, y: 0.43),
+    ),
+    OrganModel(
+      id: 'left_lower_back',
+      name: 'Left Lower Back',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.40, y: 0.43),
+    ),
+    OrganModel(
+      id: 'right_lower_back',
+      name: 'Right Lower Back',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.60, y: 0.43),
+    ),
+
+    // ========== GLUTES ==========
+    OrganModel(
+      id: 'sacrum',
+      name: 'Sacrum',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.50, y: 0.52),
+    ),
+    OrganModel(
+      id: 'left_glute',
+      name: 'Left Glute',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.45, y: 0.56),
+    ),
+    OrganModel(
+      id: 'right_glute',
+      name: 'Right Glute',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.55, y: 0.56),
+    ),
+
+    // ========== LEGS ==========
+    OrganModel(
+      id: 'left_hamstring',
+      name: 'Left Hamstring',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.43, y: 0.65),
+    ),
+    OrganModel(
+      id: 'right_hamstring',
+      name: 'Right Hamstring',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.57, y: 0.65),
+    ),
+    OrganModel(
+      id: 'left_calf',
+      name: 'Left Calf',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.43, y: 0.79),
+    ),
+    OrganModel(
+      id: 'right_calf',
+      name: 'Right Calf',
+      bodyView: BodyView.back,
+      position: OrganPosition(x: 0.57, y: 0.79),
+    ),
+  ];
+
+  // Helper methods
+  static List getOrgansForView(BodyView view) {
+    return view == BodyView.front ? frontViewOrgans : backViewOrgans;
+  }
+
+  static List getAllOrgans() {
+    return [...frontViewOrgans, ...backViewOrgans];
+  }
+
+  static OrganModel? getOrganById(String id) {
+    try {
+      return getAllOrgans().firstWhere((organ) => organ.id == id);
+    } catch (e) {
+      return null;
+    }
+  }
+}
diff --git a/lib/main.dart b/lib/main.dart
index 1af80b6..254a2ca 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -28,6 +28,7 @@ import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_mo
 import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart';
 import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart';
 import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_checker_view_model.dart';
 import 'package:hmg_patient_app_new/routes/app_routes.dart';
 import 'package:hmg_patient_app_new/services/logger_service.dart';
 import 'package:hmg_patient_app_new/services/navigation_service.dart';
@@ -145,6 +146,9 @@ void main() async {
         ),
         ChangeNotifierProvider(
           create: (_) => getIt.get(),
+        ),
+        ChangeNotifierProvider(
+          create: (_) => getIt.get(),
         )
       ], child: MyApp()),
     ),
diff --git a/lib/presentation/appointments/appointment_payment_page.dart b/lib/presentation/appointments/appointment_payment_page.dart
index faf1c2a..ccd7018 100644
--- a/lib/presentation/appointments/appointment_payment_page.dart
+++ b/lib/presentation/appointments/appointment_payment_page.dart
@@ -149,7 +149,7 @@ class _AppointmentPaymentPageState extends State {
                                   children: [
                                     Image.asset(AppAssets.visa, width: 50.h, height: 50.h),
                                     SizedBox(width: 8.h),
-                                    Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h),
+                                    Image.asset(AppAssets.mastercard, width: 40.h, height: 40.h),
                                   ],
                                 ).toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
                                 SizedBox(height: 16.h),
@@ -191,7 +191,7 @@ class _AppointmentPaymentPageState extends State {
                                   Column(
                                     crossAxisAlignment: CrossAxisAlignment.start,
                                     children: [
-                                      Image.asset(AppAssets.tamara_en, width: 72.h, height: 25.h)
+                                      Image.asset(AppAssets.tamaraEng, width: 72.h, height: 25.h)
                                           .toShimmer2(isShow: myAppointmentsVM.isAppointmentPatientShareLoading),
                                       SizedBox(height: 16.h),
                                       "Tamara"
diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart
index af7d053..d16e441 100644
--- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart
+++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart
@@ -61,7 +61,7 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget {
                         child: Row(
                           children: [
                             Image.asset(
-                              appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg,
+                              appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg,
                               width: 52.h,
                               height: 52.h,
                             ),
diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart
index 914ac4a..b052969 100644
--- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart
+++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart
@@ -147,7 +147,7 @@ class _ImmediateLiveCarePaymentPageState extends State {
                         child: Row(
                           children: [
                             Image.asset(
-                              appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg,
+                              appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg,
                               width: 52.h,
                               height: 52.h,
                             ),
diff --git a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart
index d628c1d..66894b6 100644
--- a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart
+++ b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart
@@ -131,8 +131,8 @@ class RrtRequestTypeSelect extends StatelessWidget {
                     children: [
                       Image.asset(AppAssets.mada, width: 24.h, height: 24.h),
                       Image.asset(AppAssets.visa, width: 24.h, height: 24.h),
-                      Image.asset(AppAssets.Mastercard, width: 24.h, height: 24.h),
-                      Image.asset(AppAssets.apple_pay, width: 24.h, height: 24.h),
+                      Image.asset(AppAssets.mastercard, width: 24.h, height: 24.h),
+                      Image.asset(AppAssets.applePay, width: 24.h, height: 24.h),
                     ],
                   ),
                   Column(
diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart
index a3524fd..8de7518 100644
--- a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart
+++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart
@@ -137,7 +137,7 @@ class _ErOnlineCheckinPaymentPageState extends State
                                 children: [
                                   Image.asset(AppAssets.visa, width: 50.h, height: 50.h),
                                   SizedBox(width: 8.h),
-                                  Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h),
+                                  Image.asset(AppAssets.mastercard, width: 40.h, height: 40.h),
                                 ],
                               ),
                               SizedBox(height: 16.h),
@@ -176,7 +176,7 @@ class _ErOnlineCheckinPaymentPageState extends State
                                 Column(
                                   crossAxisAlignment: CrossAxisAlignment.start,
                                   children: [
-                                    Image.asset(AppAssets.tamara_en, width: 72.h, height: 25.h),
+                                    Image.asset(AppAssets.tamaraEng, width: 72.h, height: 25.h),
                                     SizedBox(height: 16.h),
                                     "Tamara".needTranslation.toText16(isBold: true),
                                   ],
diff --git a/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart b/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart
index 8be6ce2..1341af7 100644
--- a/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart
+++ b/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart
@@ -120,7 +120,7 @@ class _WalletPaymentConfirmPageState extends State {
                                 children: [
                                   Image.asset(AppAssets.visa, width: 40.h, height: 40.h),
                                   SizedBox(width: 8.h),
-                                  Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h),
+                                  Image.asset(AppAssets.mastercard, width: 40.h, height: 40.h),
                                 ],
                               ).toShimmer2(isShow: false),
                               SizedBox(height: 16.h),
diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart
index 31b4598..0178720 100644
--- a/lib/presentation/home/data/landing_page_data.dart
+++ b/lib/presentation/home/data/landing_page_data.dart
@@ -142,7 +142,7 @@ class LandingPageData {
 
   static List getServiceCardsList = [
     ServiceCardData(
-      icon: AppAssets.livecare_service,
+      icon: AppAssets.liveCareService,
       title: "LiveCare",
       subtitle: "Explore our app, View our services and offers",
       largeCardIcon: AppAssets.livecare_icon,
diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart
index 1007547..454f1e7 100644
--- a/lib/presentation/home/landing_page.dart
+++ b/lib/presentation/home/landing_page.dart
@@ -12,6 +12,7 @@ import 'package:hmg_patient_app_new/core/dependencies.dart';
 import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
 import 'package:hmg_patient_app_new/core/utils/utils.dart';
 import 'package:hmg_patient_app_new/extensions/int_extensions.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/authentication/authentication_view_model.dart';
@@ -39,6 +40,7 @@ import 'package:hmg_patient_app_new/presentation/home/widgets/small_service_card
 import 'package:hmg_patient_app_new/presentation/home/widgets/welcome_widget.dart';
 import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
 import 'package:hmg_patient_app_new/presentation/profile_settings/profile_settings.dart';
+import 'package:hmg_patient_app_new/routes/app_routes.dart';
 import 'package:hmg_patient_app_new/services/cache_service.dart';
 import 'package:hmg_patient_app_new/theme/colors.dart';
 import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
@@ -104,6 +106,346 @@ class _LandingPageState extends State {
     super.initState();
   }
 
+  Widget buildOptionsForAuthenticatedUser() {
+    return Column(
+      children: [
+        SizedBox(height: 12.h),
+        Row(
+          mainAxisAlignment: MainAxisAlignment.spaceBetween,
+          children: [
+            "Appointments & Visits".toText16(isBold: true),
+            Row(
+              children: [
+                LocaleKeys.viewAll.tr(context: context).toText12(color: AppColors.primaryRedColor),
+                SizedBox(width: 2.h),
+                Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h),
+              ],
+            ),
+          ],
+        ).paddingSymmetrical(24.h, 0.h).onPress(() {
+          Navigator.of(context).push(CustomPageRoute(page: MyAppointmentsPage()));
+        }),
+        SizedBox(height: 16.h),
+        Consumer(
+          builder: (context, myAppointmentsVM, child) {
+            return myAppointmentsVM.isMyAppointmentsLoading
+                ? Container(
+                    decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                      color: AppColors.whiteColor,
+                      borderRadius: 24.r,
+                      hasShadow: true,
+                    ),
+                    child: AppointmentCard(
+                      patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(),
+                      myAppointmentsViewModel: myAppointmentsViewModel,
+                      bookAppointmentsViewModel: bookAppointmentsViewModel,
+                      isLoading: true,
+                      isFromHomePage: true,
+                    ),
+                  ).paddingSymmetrical(24.h, 0.h)
+                : myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty
+                    ? myAppointmentsVM.patientAppointmentsHistoryList.length == 1
+                        ? Container(
+                            decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                              color: AppColors.whiteColor,
+                              borderRadius: 24.r,
+                              hasShadow: true,
+                            ),
+                            child: AppointmentCard(
+                              patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList.first,
+                              myAppointmentsViewModel: myAppointmentsViewModel,
+                              bookAppointmentsViewModel: bookAppointmentsViewModel,
+                              isLoading: false,
+                              isFromHomePage: true,
+                            ),
+                          ).paddingSymmetrical(24.h, 0.h)
+                        : Swiper(
+                            itemCount: myAppointmentsVM.isMyAppointmentsLoading
+                                ? 3
+                                : myAppointmentsVM.patientAppointmentsHistoryList.length < 3
+                                    ? myAppointmentsVM.patientAppointmentsHistoryList.length
+                                    : 3,
+                            layout: SwiperLayout.STACK,
+                            loop: true,
+                            itemWidth: MediaQuery.of(context).size.width - 48.h,
+                            indicatorLayout: PageIndicatorLayout.COLOR,
+                            axisDirection: AxisDirection.right,
+                            controller: _controller,
+                            itemHeight: 200.h,
+                            pagination: const SwiperPagination(
+                              alignment: Alignment.bottomCenter,
+                              margin: EdgeInsets.only(top: 210 + 8 + 24),
+                              builder: DotSwiperPaginationBuilder(color: Color(0xffD9D9D9), activeColor: AppColors.blackBgColor),
+                            ),
+                            itemBuilder: (BuildContext context, int index) {
+                              return Container(
+                                decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                                  color: AppColors.whiteColor,
+                                  borderRadius: 24.r,
+                                  hasShadow: true,
+                                ),
+                                child: AppointmentCard(
+                                  patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index],
+                                  myAppointmentsViewModel: myAppointmentsViewModel,
+                                  bookAppointmentsViewModel: bookAppointmentsViewModel,
+                                  isLoading: false,
+                                  isFromHomePage: true,
+                                ),
+                              );
+                            },
+                          )
+                    : Container(
+                        width: double.infinity,
+                        decoration:
+                            RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true),
+                        child: Padding(
+                          padding: EdgeInsets.all(12.h),
+                          child: Column(
+                            children: [
+                              Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h),
+                              SizedBox(height: 12.h),
+                              "You do not have any upcoming appointment. Please book an appointment".needTranslation.toText12(isCenter: true),
+                              SizedBox(height: 12.h),
+                              CustomButton(
+                                text: LocaleKeys.bookAppo.tr(context: context),
+                                onPressed: () {
+                                  Navigator.of(context).push(CustomPageRoute(page: BookAppointmentPage()));
+                                },
+                                backgroundColor: Color(0xffFEE9EA),
+                                borderColor: Color(0xffFEE9EA),
+                                textColor: Color(0xffED1C2B),
+                                fontSize: 14.f,
+                                fontWeight: FontWeight.w500,
+                                padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0),
+                                icon: AppAssets.add_icon,
+                                iconColor: AppColors.primaryRedColor,
+                                height: 46.h,
+                              ),
+                            ],
+                          ),
+                        ),
+                      ).paddingSymmetrical(24.h, 0.h);
+          },
+        ),
+
+        // Consumer for LiveCare pending request
+        Consumer(
+          builder: (context, immediateLiveCareVM, child) {
+            return immediateLiveCareVM.patientHasPendingLiveCareRequest
+                ? Column(
+                    children: [
+                      SizedBox(height: 12.h),
+                      Container(
+                        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                          color: AppColors.whiteColor,
+                          borderRadius: 20.r,
+                          hasShadow: true,
+                          side: BorderSide(color: AppColors.ratingColorYellow, width: 3.h),
+                        ),
+                        width: double.infinity,
+                        child: Padding(
+                          padding: EdgeInsets.all(16.h),
+                          child: Column(
+                            crossAxisAlignment: CrossAxisAlignment.start,
+                            children: [
+                              Row(
+                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                children: [
+                                  AppCustomChipWidget(
+                                    labelText: immediateLiveCareViewModel.patientLiveCareHistoryList[0].stringCallStatus,
+                                    backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20),
+                                    textColor: AppColors.alertColor,
+                                  ),
+                                  Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h),
+                                  // Lottie.asset(AppAnimations.pending_loading_animation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 40.h, height: 40.h, fit: BoxFit.contain),
+                                ],
+                              ),
+                              SizedBox(height: 8.h),
+                              Row(
+                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                children: [
+                                  "You have a pending LiveCare request".needTranslation.toText12(isBold: true),
+                                  Utils.buildSvgWithAssets(
+                                    icon: AppAssets.forward_arrow_icon_small,
+                                    iconColor: AppColors.blackColor,
+                                    width: 20.h,
+                                    height: 15.h,
+                                    fit: BoxFit.contain,
+                                  ),
+                                ],
+                              ),
+                            ],
+                          ),
+                        ),
+                      ).paddingSymmetrical(24.h, 0.h).onPress(() {
+                        Navigator.of(context).push(CustomPageRoute(page: ImmediateLiveCarePendingRequestPage()));
+                      }),
+                      SizedBox(height: 12.h),
+                    ],
+                  )
+                : SizedBox(height: 12.h);
+          },
+        ),
+
+        // Consumer for ER Online Check-In pending request
+        Consumer(
+          builder: (context, emergencyServicesVM, child) {
+            return emergencyServicesVM.patientHasAdvanceERBalance
+                ? Column(
+                    children: [
+                      SizedBox(height: 4.h),
+                      Container(
+                        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                          color: AppColors.whiteColor,
+                          borderRadius: 20.r,
+                          hasShadow: true,
+                          side: BorderSide(color: AppColors.primaryRedColor, width: 3.h),
+                        ),
+                        width: double.infinity,
+                        child: Padding(
+                          padding: EdgeInsets.all(16.h),
+                          child: Column(
+                            crossAxisAlignment: CrossAxisAlignment.start,
+                            children: [
+                              Row(
+                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                children: [
+                                  AppCustomChipWidget(
+                                    labelText: "ER Online Check-In Request",
+                                    backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.10),
+                                    textColor: AppColors.primaryRedColor,
+                                  ),
+                                  Utils.buildSvgWithAssets(
+                                      icon: AppAssets.appointment_checkin_icon, width: 24.h, height: 24.h, iconColor: AppColors.primaryRedColor),
+                                ],
+                              ),
+                              SizedBox(height: 8.h),
+                              Row(
+                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                children: [
+                                  "You have ER Online Check-In Request".needTranslation.toText12(isBold: true),
+                                  Utils.buildSvgWithAssets(
+                                    icon: AppAssets.forward_arrow_icon_small,
+                                    iconColor: AppColors.blackColor,
+                                    width: 20.h,
+                                    height: 15.h,
+                                    fit: BoxFit.contain,
+                                  ),
+                                ],
+                              ),
+                            ],
+                          ),
+                        ),
+                      ).paddingSymmetrical(24.h, 0.h).onPress(() {
+                        Navigator.of(context).push(CustomPageRoute(page: ErOnlineCheckinHome()));
+                        // context.read().navigateToEROnlineCheckIn();
+                      }),
+                      SizedBox(height: 12.h),
+                    ],
+                  )
+                : SizedBox(height: 12.h);
+          },
+        ),
+
+        Row(
+          mainAxisAlignment: MainAxisAlignment.spaceBetween,
+          children: [
+            "Quick Links".needTranslation.toText16(isBold: true),
+            Row(
+              children: [
+                "View medical file".needTranslation.toText12(color: AppColors.primaryRedColor),
+                SizedBox(width: 2.h),
+                Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h),
+              ],
+            ),
+          ],
+        ).paddingSymmetrical(24.h, 0.h).onPress(() {
+          Navigator.of(context).push(CustomPageRoute(page: MedicalFilePage()));
+        }),
+        SizedBox(height: 16.h),
+        Container(
+          height: 121.h,
+          decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+          child: Column(
+            children: [
+              Expanded(
+                child: ListView.separated(
+                  scrollDirection: Axis.horizontal,
+                  itemCount: LandingPageData.getLoggedInServiceCardsList.length,
+                  shrinkWrap: true,
+                  padding: EdgeInsets.only(left: 16.h, right: 16.h),
+                  itemBuilder: (context, index) {
+                    return AnimationConfiguration.staggeredList(
+                      position: index,
+                      duration: const Duration(milliseconds: 1000),
+                      child: SlideAnimation(
+                        horizontalOffset: 100.0,
+                        child: FadeInAnimation(
+                          child: SmallServiceCard(
+                            icon: LandingPageData.getLoggedInServiceCardsList[index].icon,
+                            title: LandingPageData.getLoggedInServiceCardsList[index].title,
+                            subtitle: LandingPageData.getLoggedInServiceCardsList[index].subtitle,
+                            iconColor: LandingPageData.getLoggedInServiceCardsList[index].iconColor,
+                            textColor: LandingPageData.getLoggedInServiceCardsList[index].textColor,
+                            backgroundColor: LandingPageData.getLoggedInServiceCardsList[index].backgroundColor,
+                            isBold: LandingPageData.getLoggedInServiceCardsList[index].isBold,
+                            serviceName: LandingPageData.getLoggedInServiceCardsList[index].serviceName,
+                          ),
+                        ),
+                      ),
+                    );
+                  },
+                  separatorBuilder: (BuildContext cxt, int index) => 10.width,
+                ),
+              ),
+            ],
+          ),
+        ).paddingSymmetrical(24.h, 0.h),
+      ],
+    );
+  }
+
+  Widget buildOptionsForNotAuthenticatedUser() {
+    return Container(
+      height: 127.h,
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+      child: Column(
+        children: [
+          Expanded(
+            child: ListView.separated(
+              scrollDirection: Axis.horizontal,
+              itemCount: LandingPageData.getNotLoggedInServiceCardsList.length,
+              shrinkWrap: true,
+              padding: EdgeInsets.only(left: 16.h, right: 16.h),
+              itemBuilder: (context, index) {
+                return AnimationConfiguration.staggeredList(
+                  position: index,
+                  duration: const Duration(milliseconds: 1000),
+                  child: SlideAnimation(
+                    horizontalOffset: 100.0,
+                    child: FadeInAnimation(
+                      child: SmallServiceCard(
+                        serviceName: LandingPageData.getNotLoggedInServiceCardsList[index].serviceName,
+                        icon: LandingPageData.getNotLoggedInServiceCardsList[index].icon,
+                        title: LandingPageData.getNotLoggedInServiceCardsList[index].title,
+                        subtitle: LandingPageData.getNotLoggedInServiceCardsList[index].subtitle,
+                        iconColor: LandingPageData.getNotLoggedInServiceCardsList[index].iconColor,
+                        textColor: LandingPageData.getNotLoggedInServiceCardsList[index].textColor,
+                        backgroundColor: LandingPageData.getNotLoggedInServiceCardsList[index].backgroundColor,
+                        isBold: LandingPageData.getNotLoggedInServiceCardsList[index].isBold,
+                      ),
+                    ),
+                  ),
+                );
+              },
+              separatorBuilder: (BuildContext cxt, int index) => 0.width,
+            ),
+          ),
+        ],
+      ),
+    ).paddingSymmetrical(24.h, 0.h);
+  }
+
   @override
   Widget build(BuildContext context) {
     bookAppointmentsViewModel = Provider.of(context, listen: false);
@@ -132,7 +474,7 @@ class _LandingPageState extends State {
                             Navigator.of(context).push(springPageRoute(ProfileSettings()));
                           },
                           name: ('${appState.getAuthenticatedUser()!.firstName!} ${appState.getAuthenticatedUser()!.lastName!}'),
-                          imageUrl: appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg,
+                          imageUrl: appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg,
                         ).expanded
                       : CustomButton(
                           text: LocaleKeys.loginOrRegister.tr(context: context),
@@ -152,22 +494,9 @@ class _LandingPageState extends State {
                     mainAxisSize: MainAxisSize.min,
                     spacing: 12.h,
                     children: [
-                      Utils.buildSvgWithAssets(icon: AppAssets.bell, height: 18.h, width: 18.h).onPress(() {
-                        Navigator.of(context).push(
-                          CustomPageRoute(
-                            page: MedicalFilePage(),
-                            // page: LoginScreen(),
-                          ),
-                        );
-                      }),
-                      Utils.buildSvgWithAssets(icon: AppAssets.search_icon, height: 18.h, width: 18.h).onPress(() {
-                        Navigator.of(context).push(
-                          CustomPageRoute(
-                            page: MedicalFilePage(),
-                            // page: LoginScreen(),
-                          ),
-                        );
-                      }),
+                      Utils.buildSvgWithAssets(icon: AppAssets.bell, height: 18.h, width: 18.h)
+                          .onPress(() => context.navigateWithName(AppRoutes.organSelectorPage)),
+                      Utils.buildSvgWithAssets(icon: AppAssets.search_icon, height: 18.h, width: 18.h).onPress(() {}),
                       Utils.buildSvgWithAssets(icon: AppAssets.contact_icon, height: 18.h, width: 18.h).onPress(() {
                         showCommonBottomSheetWithoutHeight(
                           context,
@@ -181,342 +510,7 @@ class _LandingPageState extends State {
                   ),
                 ],
               ).paddingSymmetrical(24.h, 0.h),
-              appState.isAuthenticated
-                  ? Column(
-                      children: [
-                        SizedBox(height: 12.h),
-                        Row(
-                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                          children: [
-                            "Appointments & Visits".toText16(isBold: true),
-                            Row(
-                              children: [
-                                LocaleKeys.viewAll.tr(context: context).toText12(color: AppColors.primaryRedColor),
-                                SizedBox(width: 2.h),
-                                Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h),
-                              ],
-                            ),
-                          ],
-                        ).paddingSymmetrical(24.h, 0.h).onPress(() {
-                          Navigator.of(context).push(CustomPageRoute(page: MyAppointmentsPage()));
-                        }),
-                        SizedBox(height: 16.h),
-                        Consumer(
-                          builder: (context, myAppointmentsVM, child) {
-                            return myAppointmentsVM.isMyAppointmentsLoading
-                                ? Container(
-                                    decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                      color: AppColors.whiteColor,
-                                      borderRadius: 24.r,
-                                      hasShadow: true,
-                                    ),
-                                    child: AppointmentCard(
-                                      patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(),
-                                      myAppointmentsViewModel: myAppointmentsViewModel,
-                                      bookAppointmentsViewModel: bookAppointmentsViewModel,
-                                      isLoading: true,
-                                      isFromHomePage: true,
-                                    ),
-                                  ).paddingSymmetrical(24.h, 0.h)
-                                : myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty
-                                    ? myAppointmentsVM.patientAppointmentsHistoryList.length == 1
-                                        ? Container(
-                                            decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                              color: AppColors.whiteColor,
-                                              borderRadius: 24.r,
-                                              hasShadow: true,
-                                            ),
-                                            child: AppointmentCard(
-                                              patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList.first,
-                                              myAppointmentsViewModel: myAppointmentsViewModel,
-                                              bookAppointmentsViewModel: bookAppointmentsViewModel,
-                                              isLoading: false,
-                                              isFromHomePage: true,
-                                            ),
-                                          ).paddingSymmetrical(24.h, 0.h)
-                                        : Swiper(
-                                            itemCount: myAppointmentsVM.isMyAppointmentsLoading
-                                                ? 3
-                                                : myAppointmentsVM.patientAppointmentsHistoryList.length < 3
-                                                    ? myAppointmentsVM.patientAppointmentsHistoryList.length
-                                                    : 3,
-                                            layout: SwiperLayout.STACK,
-                                            loop: true,
-                                            itemWidth: MediaQuery.of(context).size.width - 48.h,
-                                            indicatorLayout: PageIndicatorLayout.COLOR,
-                                            axisDirection: AxisDirection.right,
-                                            controller: _controller,
-                                            itemHeight: 200.h,
-                                            pagination: const SwiperPagination(
-                                              alignment: Alignment.bottomCenter,
-                                              margin: EdgeInsets.only(top: 210 + 8 + 24),
-                                              builder: DotSwiperPaginationBuilder(color: Color(0xffD9D9D9), activeColor: AppColors.blackBgColor),
-                                            ),
-                                            itemBuilder: (BuildContext context, int index) {
-                                              return Container(
-                                                decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                                  color: AppColors.whiteColor,
-                                                  borderRadius: 24.r,
-                                                  hasShadow: true,
-                                                ),
-                                                child: AppointmentCard(
-                                                  patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index],
-                                                  myAppointmentsViewModel: myAppointmentsViewModel,
-                                                  bookAppointmentsViewModel: bookAppointmentsViewModel,
-                                                  isLoading: false,
-                                                  isFromHomePage: true,
-                                                ),
-                                              );
-                                            },
-                                          )
-                                    : Container(
-                                        width: double.infinity,
-                                        decoration: RoundedRectangleBorder()
-                                            .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true),
-                                        child: Padding(
-                                          padding: EdgeInsets.all(12.h),
-                                          child: Column(
-                                            children: [
-                                              Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h),
-                                              SizedBox(height: 12.h),
-                                              "You do not have any upcoming appointment. Please book an appointment"
-                                                  .needTranslation
-                                                  .toText12(isCenter: true),
-                                              SizedBox(height: 12.h),
-                                              CustomButton(
-                                                text: LocaleKeys.bookAppo.tr(context: context),
-                                                onPressed: () {
-                                                  Navigator.of(context).push(CustomPageRoute(page: BookAppointmentPage()));
-                                                },
-                                                backgroundColor: Color(0xffFEE9EA),
-                                                borderColor: Color(0xffFEE9EA),
-                                                textColor: Color(0xffED1C2B),
-                                                fontSize: 14.f,
-                                                fontWeight: FontWeight.w500,
-                                                padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0),
-                                                icon: AppAssets.add_icon,
-                                                iconColor: AppColors.primaryRedColor,
-                                                height: 46.h,
-                                              ),
-                                            ],
-                                          ),
-                                        ),
-                                      ).paddingSymmetrical(24.h, 0.h);
-                          },
-                        ),
-
-                        // Consumer for LiveCare pending request
-                        Consumer(
-                          builder: (context, immediateLiveCareVM, child) {
-                            return immediateLiveCareVM.patientHasPendingLiveCareRequest
-                                ? Column(
-                                    children: [
-                                      SizedBox(height: 12.h),
-                                      Container(
-                                        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                          color: AppColors.whiteColor,
-                                          borderRadius: 20.r,
-                                          hasShadow: true,
-                                          side: BorderSide(color: AppColors.ratingColorYellow, width: 3.h),
-                                        ),
-                                        width: double.infinity,
-                                        child: Padding(
-                                          padding: EdgeInsets.all(16.h),
-                                          child: Column(
-                                            crossAxisAlignment: CrossAxisAlignment.start,
-                                            children: [
-                                              Row(
-                                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                                                children: [
-                                                  AppCustomChipWidget(
-                                                    labelText: immediateLiveCareViewModel.patientLiveCareHistoryList[0].stringCallStatus,
-                                                    backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20),
-                                                    textColor: AppColors.alertColor,
-                                                  ),
-                                                  Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h),
-                                                  // Lottie.asset(AppAnimations.pending_loading_animation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 40.h, height: 40.h, fit: BoxFit.contain),
-                                                ],
-                                              ),
-                                              SizedBox(height: 8.h),
-                                              Row(
-                                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                                                children: [
-                                                  "You have a pending LiveCare request".needTranslation.toText12(isBold: true),
-                                                  Utils.buildSvgWithAssets(
-                                                    icon: AppAssets.forward_arrow_icon_small,
-                                                    iconColor: AppColors.blackColor,
-                                                    width: 20.h,
-                                                    height: 15.h,
-                                                    fit: BoxFit.contain,
-                                                  ),
-                                                ],
-                                              ),
-                                            ],
-                                          ),
-                                        ),
-                                      ).paddingSymmetrical(24.h, 0.h).onPress(() {
-                                        Navigator.of(context).push(CustomPageRoute(page: ImmediateLiveCarePendingRequestPage()));
-                                      }),
-                                      SizedBox(height: 12.h),
-                                    ],
-                                  )
-                                : SizedBox(height: 12.h);
-                          },
-                        ),
-
-                        // Consumer for ER Online Check-In pending request
-                        Consumer(
-                          builder: (context, emergencyServicesVM, child) {
-                            return emergencyServicesVM.patientHasAdvanceERBalance
-                                ? Column(
-                                    children: [
-                                      SizedBox(height: 4.h),
-                                      Container(
-                                        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                          color: AppColors.whiteColor,
-                                          borderRadius: 20.r,
-                                          hasShadow: true,
-                                          side: BorderSide(color: AppColors.primaryRedColor, width: 3.h),
-                                        ),
-                                        width: double.infinity,
-                                        child: Padding(
-                                          padding: EdgeInsets.all(16.h),
-                                          child: Column(
-                                            crossAxisAlignment: CrossAxisAlignment.start,
-                                            children: [
-                                              Row(
-                                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                                                children: [
-                                                  AppCustomChipWidget(
-                                                    labelText: "ER Online Check-In Request",
-                                                    backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.10),
-                                                    textColor: AppColors.primaryRedColor,
-                                                  ),
-                                                  Utils.buildSvgWithAssets(icon: AppAssets.appointment_checkin_icon, width: 24.h, height: 24.h, iconColor: AppColors.primaryRedColor),
-                                                ],
-                                              ),
-                                              SizedBox(height: 8.h),
-                                              Row(
-                                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                                                children: [
-                                                  "You have ER Online Check-In Request".needTranslation.toText12(isBold: true),
-                                                  Utils.buildSvgWithAssets(
-                                                    icon: AppAssets.forward_arrow_icon_small,
-                                                    iconColor: AppColors.blackColor,
-                                                    width: 20.h,
-                                                    height: 15.h,
-                                                    fit: BoxFit.contain,
-                                                  ),
-                                                ],
-                                              ),
-                                            ],
-                                          ),
-                                        ),
-                                      ).paddingSymmetrical(24.h, 0.h).onPress(() {
-                                        Navigator.of(context).push(CustomPageRoute(page: ErOnlineCheckinHome()));
-                                        // context.read().navigateToEROnlineCheckIn();
-                                      }),
-                                      SizedBox(height: 12.h),
-                                    ],
-                                  )
-                                : SizedBox(height: 12.h);
-                          },
-                        ),
-
-                        Row(
-                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                          children: [
-                            "Quick Links".needTranslation.toText16(isBold: true),
-                            Row(
-                              children: [
-                                "View medical file".needTranslation.toText12(color: AppColors.primaryRedColor),
-                                SizedBox(width: 2.h),
-                                Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h),
-                              ],
-                            ),
-                          ],
-                        ).paddingSymmetrical(24.h, 0.h).onPress(() {
-                          Navigator.of(context).push(CustomPageRoute(page: MedicalFilePage()));
-                        }),
-                        SizedBox(height: 16.h),
-                        Container(
-                          height: 121.h,
-                          decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
-                          child: Column(
-                            children: [
-                              Expanded(
-                                child: ListView.separated(
-                                  scrollDirection: Axis.horizontal,
-                                  itemCount: LandingPageData.getLoggedInServiceCardsList.length,
-                                  shrinkWrap: true,
-                                  padding: EdgeInsets.only(left: 16.h, right: 16.h),
-                                  itemBuilder: (context, index) {
-                                    return AnimationConfiguration.staggeredList(
-                                      position: index,
-                                      duration: const Duration(milliseconds: 1000),
-                                      child: SlideAnimation(
-                                        horizontalOffset: 100.0,
-                                        child: FadeInAnimation(
-                                          child: SmallServiceCard(
-                                            icon: LandingPageData.getLoggedInServiceCardsList[index].icon,
-                                            title: LandingPageData.getLoggedInServiceCardsList[index].title,
-                                            subtitle: LandingPageData.getLoggedInServiceCardsList[index].subtitle,
-                                            iconColor: LandingPageData.getLoggedInServiceCardsList[index].iconColor,
-                                            textColor: LandingPageData.getLoggedInServiceCardsList[index].textColor,
-                                            backgroundColor: LandingPageData.getLoggedInServiceCardsList[index].backgroundColor,
-                                            isBold: LandingPageData.getLoggedInServiceCardsList[index].isBold,
-                                            serviceName: LandingPageData.getLoggedInServiceCardsList[index].serviceName,
-                                          ),
-                                        ),
-                                      ),
-                                    );
-                                  },
-                                  separatorBuilder: (BuildContext cxt, int index) => 10.width,
-                                ),
-                              ),
-                            ],
-                          ),
-                        ).paddingSymmetrical(24.h, 0.h),
-                      ],
-                    )
-                  : Container(
-                      height: 127.h,
-                      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
-                      child: Column(
-                        children: [
-                          Expanded(
-                            child: ListView.separated(
-                              scrollDirection: Axis.horizontal,
-                              itemCount: LandingPageData.getNotLoggedInServiceCardsList.length,
-                              shrinkWrap: true,
-                              padding: EdgeInsets.only(left: 16.h, right: 16.h),
-                              itemBuilder: (context, index) {
-                                return AnimationConfiguration.staggeredList(
-                                  position: index,
-                                  duration: const Duration(milliseconds: 1000),
-                                  child: SlideAnimation(
-                                    horizontalOffset: 100.0,
-                                    child: FadeInAnimation(
-                                      child: SmallServiceCard(
-                                        serviceName: LandingPageData.getNotLoggedInServiceCardsList[index].serviceName,
-                                        icon: LandingPageData.getNotLoggedInServiceCardsList[index].icon,
-                                        title: LandingPageData.getNotLoggedInServiceCardsList[index].title,
-                                        subtitle: LandingPageData.getNotLoggedInServiceCardsList[index].subtitle,
-                                        iconColor: LandingPageData.getNotLoggedInServiceCardsList[index].iconColor,
-                                        textColor: LandingPageData.getNotLoggedInServiceCardsList[index].textColor,
-                                        backgroundColor: LandingPageData.getNotLoggedInServiceCardsList[index].backgroundColor,
-                                        isBold: LandingPageData.getNotLoggedInServiceCardsList[index].isBold,
-                                      ),
-                                    ),
-                                  ),
-                                );
-                              },
-                              separatorBuilder: (BuildContext cxt, int index) => 0.width,
-                            ),
-                          ),
-                        ],
-                      ),
-                    ).paddingSymmetrical(24.h, 0.h),
+              if (appState.isAuthenticated) buildOptionsForAuthenticatedUser() else buildOptionsForNotAuthenticatedUser(),
               Row(
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 children: [
diff --git a/lib/presentation/home/widgets/large_service_card.dart b/lib/presentation/home/widgets/large_service_card.dart
index 3989523..7a155df 100644
--- a/lib/presentation/home/widgets/large_service_card.dart
+++ b/lib/presentation/home/widgets/large_service_card.dart
@@ -34,7 +34,7 @@ class LargeServiceCard extends StatelessWidget {
         mainAxisAlignment: MainAxisAlignment.start,
         crossAxisAlignment: CrossAxisAlignment.start,
         children: [
-          Image.asset(AppAssets.livecare_service, width: 220.w, fit: BoxFit.contain),
+          Image.asset(AppAssets.liveCareService, width: 220.w, fit: BoxFit.contain),
           SizedBox(height: 10.h),
           Row(
             children: [
diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart
index 883ca37..05ae91a 100644
--- a/lib/presentation/medical_file/medical_file_page.dart
+++ b/lib/presentation/medical_file/medical_file_page.dart
@@ -123,7 +123,7 @@ class _MedicalFilePageState extends State {
                 fit: BoxFit.contain,
               ),
               Utils.buildImgWithAssets(
-                icon: AppAssets.male_img,
+                icon: AppAssets.maleImg,
                 height: 32.h,
                 border: 1.5,
                 borderRadius: 50.r,
@@ -174,7 +174,7 @@ class _MedicalFilePageState extends State {
                   Row(
                     crossAxisAlignment: CrossAxisAlignment.start,
                     children: [
-                      Image.asset(appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, width: 56.w, height: 56.h),
+                      Image.asset(appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg, width: 56.w, height: 56.h),
                       SizedBox(width: 8.w),
                       Column(
                         crossAxisAlignment: CrossAxisAlignment.start,
diff --git a/lib/presentation/my_family/widget/family_cards.dart b/lib/presentation/my_family/widget/family_cards.dart
index 4db5470..3621cc3 100644
--- a/lib/presentation/my_family/widget/family_cards.dart
+++ b/lib/presentation/my_family/widget/family_cards.dart
@@ -173,9 +173,9 @@ class _FamilyCardsState extends State {
                     children: [
                       Utils.buildImgWithAssets(
                         icon: profile.gender == null
-                            ? AppAssets.dummy_user
+                            ? AppAssets.dummyUser
                             : profile.gender == 1
-                                ? ((profile.age ?? 0) < 7 ? AppAssets.babyBoyImg : AppAssets.male_img)
+                                ? ((profile.age ?? 0) < 7 ? AppAssets.babyBoyImg : AppAssets.maleImg)
                                 : (profile.age! < 7 ? AppAssets.babyGirlImg : AppAssets.femaleImg),
                         width: 72.h,
                         height: 70.h,
diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart
index ee7465d..9e4c808 100644
--- a/lib/presentation/profile_settings/profile_settings.dart
+++ b/lib/presentation/profile_settings/profile_settings.dart
@@ -29,18 +29,14 @@ import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.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 ProfileSettings extends StatefulWidget {
-  ProfileSettings({Key? key}) : super(key: key);
+  const ProfileSettings({super.key});
 
   @override
-  _ProfileSettingsState createState() {
-    return _ProfileSettingsState();
-  }
+  ProfileSettingsState createState() => ProfileSettingsState();
 }
 
-class _ProfileSettingsState extends State {
+class ProfileSettingsState extends State {
   @override
   void initState() {
     super.initState();
@@ -184,7 +180,10 @@ class _ProfileSettingsState extends State {
                     ),
                   ],
                 ),
-                "Quick Actions".needTranslation.toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24.w, right: 24.w),
+                "Quick Actions"
+                    .needTranslation
+                    .toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1)
+                    .paddingOnly(left: 24.w, right: 24.w),
                 Container(
                   margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h, bottom: 24.h),
                   padding: EdgeInsets.only(top: 4.h, bottom: 4.h),
@@ -192,9 +191,12 @@ class _ProfileSettingsState extends State {
                   child: Column(
                     children: [
                       actionItem(AppAssets.language_change, "Language".needTranslation, () {
-                        showCommonBottomSheetWithoutHeight(context, title: "Application Language".needTranslation, child: AppLanguageChange(), callBackFunc: () {}, isFullScreen: false);
+                        showCommonBottomSheetWithoutHeight(context,
+                            title: "Application Language".needTranslation, child: AppLanguageChange(), callBackFunc: () {}, isFullScreen: false);
                       }, trailingLabel: Utils.appState.isArabic() ? "العربية".needTranslation : "English".needTranslation),
                       1.divider,
+                      actionItem(AppAssets.accessibility, "Symptoms Checker".needTranslation, () {}),
+                      1.divider,
                       actionItem(AppAssets.accessibility, "Accessibility".needTranslation, () {}),
                       1.divider,
                       actionItem(AppAssets.bell, "Notifications Settings".needTranslation, () {}),
@@ -203,7 +205,10 @@ class _ProfileSettingsState extends State {
                     ],
                   ),
                 ),
-                "Personal Information".needTranslation.toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24.w, right: 24.w),
+                "Personal Information"
+                    .needTranslation
+                    .toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1)
+                    .paddingOnly(left: 24.w, right: 24.w),
                 Container(
                   margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h, bottom: 24.h),
                   padding: EdgeInsets.only(top: 4.h, bottom: 4.h),
@@ -220,7 +225,10 @@ class _ProfileSettingsState extends State {
                     ],
                   ),
                 ),
-                "Help & Support".needTranslation.toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24.w, right: 24.w),
+                "Help & Support"
+                    .needTranslation
+                    .toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1)
+                    .paddingOnly(left: 24.w, right: 24.w),
                 Container(
                   margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h),
                   padding: EdgeInsets.only(top: 4.h, bottom: 4.h),
@@ -261,12 +269,13 @@ class _ProfileSettingsState extends State {
         children: [
           Utils.buildSvgWithAssets(icon: icon, iconColor: AppColors.greyTextColor),
           label.toText14(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded,
-          if (trailingLabel.isNotEmpty) trailingLabel.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1),
+          if (trailingLabel.isNotEmpty)
+            trailingLabel.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1),
           switchValue != null
               ? Switch(
                   value: switchValue,
                   onChanged: (value) {},
-                  activeColor: AppColors.successColor,
+                  activeThumbColor: AppColors.successColor,
                   activeTrackColor: AppColors.successColor.withValues(alpha: .15),
                 )
               : Transform.scale(
@@ -295,8 +304,8 @@ class FamilyCardWidget extends StatelessWidget {
   Widget build(BuildContext context) {
     AppState appState = getIt.get();
     final isActive = (profile.responseId == appState.getAuthenticatedUser()?.patientId);
-    final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false;
-    final canSwitch = isParentUser || (!isParentUser && profile.responseId == appState.getSuperUserID);
+    // final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false;
+    // final canSwitch = isParentUser || (!isParentUser && profile.responseId == appState.getSuperUserID);
     return Container(
       decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
         color: AppColors.whiteColor,
@@ -312,7 +321,7 @@ class FamilyCardWidget extends StatelessWidget {
               Row(
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
-                  Image.asset(profile.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, width: 56.w, height: 56.h),
+                  Image.asset(profile.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg, width: 56.w, height: 56.h),
                   Column(
                     crossAxisAlignment: CrossAxisAlignment.start,
                     mainAxisSize: MainAxisSize.min,
diff --git a/lib/presentation/profile_settings/widgets/family_card_widget.dart b/lib/presentation/profile_settings/widgets/family_card_widget.dart
new file mode 100644
index 0000000..eaee4c0
--- /dev/null
+++ b/lib/presentation/profile_settings/widgets/family_card_widget.dart
@@ -0,0 +1,207 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.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/app_state.dart';
+import 'package:hmg_patient_app_new/core/dependencies.dart';
+import 'package:hmg_patient_app_new/core/utils/date_util.dart';
+import 'package:hmg_patient_app_new/extensions/int_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/insurance/insurance_view_model.dart';
+import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
+import 'package:provider/provider.dart';
+
+class FamilyCardWidget extends StatelessWidget {
+  final Function() onAddFamilyMemberPress;
+  final Function(FamilyFileResponseModelLists member) onFamilySwitchPress;
+  final FamilyFileResponseModelLists profile;
+
+  const FamilyCardWidget({
+    super.key,
+    required this.onAddFamilyMemberPress,
+    required this.profile,
+    required this.onFamilySwitchPress(FamilyFileResponseModelLists member),
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    AppState appState = getIt.get();
+    final isActive = (profile.responseId == appState.getAuthenticatedUser()?.patientId);
+    final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false;
+    final canSwitch = isParentUser || (!isParentUser && profile.responseId == appState.getSuperUserID);
+    return Container(
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+        color: AppColors.whiteColor,
+        borderRadius: 24.r,
+        hasShadow: true,
+      ),
+      child: Column(
+        children: [
+          Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            spacing: 8.h,
+            children: [
+              Row(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  Image.asset(profile.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg, width: 56.w, height: 56.h),
+                  Column(
+                    crossAxisAlignment: CrossAxisAlignment.start,
+                    mainAxisSize: MainAxisSize.min,
+                    children: [
+                      "${profile.patientName}".toText18(isBold: true, weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1),
+                      AppCustomChipWidget(
+                        icon: AppAssets.file_icon,
+                        labelText: "${LocaleKeys.fileNo.tr(context: context)}: ${profile.responseId}",
+                        iconSize: 12.w,
+                      ),
+                    ],
+                  ).expanded,
+                  Icon(Icons.qr_code, size: 56.h)
+                ],
+              ),
+              SizedBox(height: 4.h),
+              SizedBox(
+                child: Wrap(
+                  alignment: WrapAlignment.start,
+                  spacing: 4.w,
+                  runSpacing: 4.h,
+                  children: [
+                    AppCustomChipWidget(
+                      labelText: "${profile.age} Years Old".needTranslation,
+                    ),
+                    isActive && appState.getAuthenticatedUser()!.bloodGroup != null
+                        ? AppCustomChipWidget(
+                            icon: AppAssets.blood_icon,
+                            labelPadding: EdgeInsetsDirectional.only(start: -6.w, end: 8.w),
+                            labelText: "Blood: ${appState.getAuthenticatedUser()!.bloodGroup ?? ""}",
+                            iconColor: AppColors.primaryRedColor)
+                        : SizedBox(),
+                    Selector(
+                      selector: (context, insuranceVM) => (
+                        isEmpty: insuranceVM.patientInsuranceList.isEmpty,
+                        patientID: insuranceVM.patientInsuranceList.isNotEmpty ? insuranceVM.patientInsuranceList.first.patientID : null,
+                        isLoading: insuranceVM.isInsuranceLoading,
+                        cardValidTo: insuranceVM.patientInsuranceList.isNotEmpty ? insuranceVM.patientInsuranceList.first.cardValidTo : null
+                      ),
+                      builder: (context, data, child) {
+                        if (data.isEmpty) {
+                          return const SizedBox();
+                        } else if (profile.responseId != data.patientID) {
+                          return SizedBox();
+                        }
+
+                        final isLoading = data.isLoading;
+                        final isExpired = !isLoading && DateTime.now().isAfter(DateUtil.convertStringToDate(data.cardValidTo));
+
+                        final String icon;
+                        final String labelText;
+                        final Color iconColor;
+                        final Color backgroundColor;
+
+                        if (isLoading) {
+                          icon = AppAssets.cancel_circle_icon;
+                          labelText = "Insurance".needTranslation;
+                          iconColor = AppColors.primaryRedColor;
+                          backgroundColor = AppColors.primaryRedColor;
+                        } else if (isExpired) {
+                          icon = AppAssets.cancel_circle_icon;
+                          labelText = "Insurance Expired".needTranslation;
+                          iconColor = AppColors.primaryRedColor;
+                          backgroundColor = AppColors.primaryRedColor.withValues(alpha: 0.15);
+                        } else {
+                          icon = AppAssets.insurance_active_icon;
+                          labelText = "Insurance Active".needTranslation;
+                          iconColor = AppColors.successColor;
+                          backgroundColor = AppColors.successColor.withValues(alpha: 0.15);
+                        }
+
+                        return AppCustomChipWidget(
+                          icon: icon,
+                          labelText: labelText,
+                          iconColor: iconColor,
+                          iconSize: 12.w,
+                          backgroundColor: backgroundColor,
+                          labelPadding: EdgeInsetsDirectional.only(start: -6.w, end: 8.w),
+                          // padding: EdgeInsets.zero,
+                        ).toShimmer2(isShow: isLoading);
+                      },
+                    )
+                  ],
+                ),
+              ),
+            ],
+          ).paddingOnly(top: 16.h, right: 16.w, left: 16.w, bottom: 12.h),
+          1.divider,
+          _buildActionButton(appState),
+        ],
+      ),
+    );
+  }
+
+  Widget _buildActionButton(AppState appState) {
+    final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false;
+    final int? currentUserId = appState.getAuthenticatedUser()?.patientId;
+    final int? superUserId = appState.getSuperUserID;
+
+    if (isParentUser) {
+      return _buildParentUserButton(currentUserId);
+    } else {
+      return _buildNonParentUserButton(superUserId);
+    }
+  }
+
+  Widget _buildParentUserButton(int? currentUserId) {
+    final canSwitch = profile.responseId != currentUserId;
+
+    return CustomButton(
+      icon: canSwitch ? AppAssets.switch_user : AppAssets.add_family,
+      text: canSwitch ? "Switch Family File".needTranslation : "Add a new family member".needTranslation,
+      onPressed: canSwitch ? () => onFamilySwitchPress(profile) : onAddFamilyMemberPress,
+      backgroundColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor,
+      borderColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor,
+      textColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor,
+      iconColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor,
+      height: isFoldable ? 50.h : 40.h,
+      fontSize: 14.f,
+    ).paddingOnly(top: 12.h, right: 16.w, left: 16.w, bottom: 16.h);
+  }
+
+  Widget _buildNonParentUserButton(int? superUserId) {
+    final canSwitchBack = superUserId != null && superUserId == profile.responseId;
+
+    return CustomButton(
+      icon: AppAssets.switch_user,
+      text: canSwitchBack ? "Switch Back To Family File".needTranslation : "Switch".needTranslation,
+      backgroundColor: canSwitchBack ? AppColors.primaryRedColor : Colors.grey.shade200,
+      borderColor: canSwitchBack ? AppColors.primaryRedColor : Colors.grey.shade200,
+      textColor: canSwitchBack ? AppColors.whiteColor : AppColors.greyTextColor,
+      iconColor: canSwitchBack ? AppColors.whiteColor : AppColors.greyTextColor,
+      onPressed: canSwitchBack ? () => onFamilySwitchPress(profile) : () {},
+      height: isFoldable ? 50.h : 40.h,
+      fontSize: 14.f,
+    ).paddingOnly(top: 12.h, right: 16.w, left: 16.w, bottom: 16.h);
+  }
+
+//    //TODO: Add family file switch logic here
+//           isRootUser
+//               ? CustomButton(icon: AppAssets.add_family, text: "Add a new family member".needTranslation, height: 40.h, fontSize: 14, onPressed: () {})
+//                   .paddingOnly(top: 12, right: 16, left: 16, bottom: 16)
+//               : CustomButton(
+//                       icon: AppAssets.add_family,
+//                       backgroundColor: AppColors.secondaryLightRedColor,
+//                       borderColor: AppColors.secondaryLightRedColor,
+//                       textColor: AppColors.primaryRedColor,
+//                       iconColor: AppColors.primaryRedColor,
+//                       text: "Switch to this medical file".needTranslation,
+//                       height: 40.h,
+//                       fontSize: 14,
+//                       onPressed: () {})
+//                   .paddingOnly(top: 12, right: 16, left: 16, bottom: 16),
+//
+}
diff --git a/lib/presentation/symptoms_checker/organ_selector_screen.dart b/lib/presentation/symptoms_checker/organ_selector_screen.dart
new file mode 100644
index 0000000..6b9582c
--- /dev/null
+++ b/lib/presentation/symptoms_checker/organ_selector_screen.dart
@@ -0,0 +1,337 @@
+import 'package:flutter/material.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/app_state.dart';
+import 'package:hmg_patient_app_new/core/dependencies.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/string_extensions.dart';
+import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/widgets/interactive_body_widget.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
+import 'package:provider/provider.dart';
+
+class OrganSelectorPage extends StatefulWidget {
+  const OrganSelectorPage({super.key});
+
+  @override
+  State createState() => _OrganSelectorPageState();
+}
+
+class _OrganSelectorPageState extends State {
+  late final AppState _appState;
+
+  @override
+  void initState() {
+    super.initState();
+    _appState = getIt.get();
+  }
+
+  void _onNextPressed(SymptomsCheckerViewModel viewModel) {
+    if (!viewModel.validateSelection()) {
+      ScaffoldMessenger.of(context).showSnackBar(
+        SnackBar(
+          content: Text('Please select at least one organ'.needTranslation),
+          backgroundColor: AppColors.errorColor,
+        ),
+      );
+      return;
+    }
+
+    ScaffoldMessenger.of(context).showSnackBar(
+      SnackBar(
+        content: Text('Selected organs:\n\n ${viewModel.getSelectedOrganIds()}'),
+        backgroundColor: AppColors.successColor,
+      ),
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return ChangeNotifierProvider(
+      create: (_) => SymptomsCheckerViewModel(),
+      child: Scaffold(
+        backgroundColor: AppColors.bgScaffoldColor,
+        appBar: _buildAppBar(),
+        body: Consumer(
+          builder: (context, viewModel, _) {
+            return Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                _buildTitle(),
+                SizedBox(height: 8.h),
+                Expanded(
+                  child: Stack(
+                    children: [
+                      _buildBodyViewer(viewModel),
+                      _buildViewToggleButtons(viewModel),
+                      _buildBottomSheet(viewModel),
+                    ],
+                  ),
+                ),
+              ],
+            );
+          },
+        ),
+      ),
+    );
+  }
+
+  PreferredSizeWidget _buildAppBar() {
+    return AppBar(
+      backgroundColor: AppColors.bgScaffoldColor,
+      elevation: 0,
+      leading: Transform.flip(
+        flipX: _appState.isArabic(),
+        child: IconButton(
+          icon: Utils.buildSvgWithAssets(
+            icon: AppAssets.arrow_back,
+            width: 32.h,
+            height: 32.h,
+          ),
+          padding: const EdgeInsets.only(left: 12),
+          onPressed: () => Navigator.pop(context),
+          highlightColor: Colors.transparent,
+        ),
+      ),
+    );
+  }
+
+  Widget _buildTitle() {
+    return Padding(
+      padding: EdgeInsets.symmetric(horizontal: 16.w),
+      child: Text(
+        "Organ Selector".needTranslation,
+        style: TextStyle(
+          color: AppColors.textColor,
+          fontSize: 22.f,
+          fontWeight: FontWeight.w600,
+        ),
+      ),
+    );
+  }
+
+  Widget _buildBodyViewer(SymptomsCheckerViewModel viewModel) {
+    return Padding(
+      padding: EdgeInsets.fromLTRB(16.h, 16.h, 16.h, 45.h),
+      child: AnimatedSwitcher(
+        duration: const Duration(milliseconds: 600),
+        transitionBuilder: (child, animation) => _build3DFlipTransition(child, animation),
+        switchInCurve: Curves.easeInOut,
+        switchOutCurve: Curves.easeInOut,
+        child: InteractiveBodyWidget(
+          key: ValueKey(viewModel.currentView),
+          bodyImageAsset: viewModel.currentView == BodyView.front ? AppAssets.fullBodyFront : AppAssets.fullBodyBack,
+          organs: viewModel.currentOrgans,
+          selectedOrganIds: viewModel.selectedOrganIds,
+          onOrganTap: viewModel.toggleOrganSelection,
+          isBodyHidden: viewModel.isBodyHidden,
+        ),
+      ),
+    );
+  }
+
+  Widget _build3DFlipTransition(Widget child, Animation animation) {
+    final rotateAnimation = Tween(begin: 0.5, end: 0.0).animate(
+      CurvedAnimation(parent: animation, curve: Curves.easeInOut),
+    );
+
+    return AnimatedBuilder(
+      animation: rotateAnimation,
+      builder: (context, child) {
+        final angle = rotateAnimation.value * 3.14159;
+        final transform = Matrix4.identity()
+          ..setEntry(3, 2, 0.001)
+          ..rotateY(angle);
+
+        return Transform(
+          transform: transform,
+          alignment: Alignment.center,
+          child: child,
+        );
+      },
+      child: child,
+    );
+  }
+
+  Widget _buildViewToggleButtons(SymptomsCheckerViewModel viewModel) {
+    return Positioned(
+      left: 16.w,
+      top: 36.h,
+      child: Column(
+        children: [
+          _buildToggleButton(
+            icon: AppAssets.bodyIcon,
+            onTap: viewModel.toggleIsBodyHidden,
+          ),
+          SizedBox(height: 16.h),
+          _buildToggleButton(
+            icon: AppAssets.rotateIcon,
+            onTap: viewModel.toggleView,
+          ),
+        ],
+      ),
+    );
+  }
+
+  Widget _buildToggleButton({required String icon, required VoidCallback onTap}) {
+    return GestureDetector(
+      onTap: onTap,
+      child: Container(
+        width: 48.w,
+        height: 48.h,
+        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+          color: AppColors.whiteColor,
+          borderRadius: 11.r,
+        ),
+        child: Center(
+          child: Utils.buildSvgWithAssets(
+            icon: icon,
+            width: 25.w,
+            height: 25.h,
+          ),
+        ),
+      ),
+    );
+  }
+
+  Widget _buildBottomSheet(SymptomsCheckerViewModel viewModel) {
+    return Positioned(
+      left: 0,
+      right: 0,
+      bottom: 0,
+      child: AnimatedContainer(
+        duration: const Duration(milliseconds: 300),
+        curve: Curves.easeInOut,
+        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+        child: SafeArea(
+          top: false,
+          child: Stack(
+            clipBehavior: Clip.none,
+            children: [
+              Column(
+                mainAxisSize: MainAxisSize.min,
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  if (viewModel.isBottomSheetExpanded) ...[
+                    SizedBox(height: 20.h),
+                    _buildBottomSheetTitle(),
+                    SizedBox(height: 12.h),
+                    _buildSelectedOrgansContent(viewModel),
+                    SizedBox(height: 16.h),
+                    _buildNextButton(viewModel),
+                    SizedBox(height: 16.h),
+                  ] else
+                    SizedBox(height: 20.h),
+                ],
+              ),
+              _buildExpandCollapseButton(viewModel),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+
+  Widget _buildBottomSheetTitle() {
+    return Padding(
+      padding: EdgeInsets.symmetric(horizontal: 16.w),
+      child: Text(
+        'Selected Organs'.needTranslation,
+        style: TextStyle(
+          fontSize: 16.f,
+          fontWeight: FontWeight.w600,
+          color: AppColors.textColor,
+        ),
+      ),
+    );
+  }
+
+  Widget _buildSelectedOrgansContent(SymptomsCheckerViewModel viewModel) {
+    if (viewModel.selectedOrgans.isEmpty) {
+      return Padding(
+        padding: EdgeInsets.symmetric(horizontal: 16.w),
+        child: Text(
+          'No organs selected yet'.needTranslation,
+          style: TextStyle(
+            color: AppColors.greyTextColor,
+            fontSize: 14.f,
+          ),
+        ),
+      );
+    }
+
+    return ConstrainedBox(
+      constraints: BoxConstraints(maxHeight: 150.h),
+      child: SingleChildScrollView(
+        padding: EdgeInsets.symmetric(horizontal: 16.w),
+        child: Wrap(
+          spacing: 8.w,
+          runSpacing: 8.h,
+          children: viewModel.selectedOrgans.map((organ) {
+            return AppCustomChipWidget(
+              labelText: organ.name,
+              backgroundColor: AppColors.secondaryLightRedColor,
+              textColor: AppColors.primaryRedColor,
+              deleteIcon: AppAssets.cancel,
+              deleteIconColor: AppColors.primaryRedColor,
+              deleteIconHasColor: false,
+              onDeleteTap: () => viewModel.removeOrgan(organ.id),
+            );
+          }).toList(),
+        ),
+      ),
+    );
+  }
+
+  Widget _buildNextButton(SymptomsCheckerViewModel viewModel) {
+    return Padding(
+      padding: EdgeInsets.symmetric(horizontal: 16.w),
+      child: CustomButton(
+        text: 'Next'.needTranslation,
+        onPressed: () => _onNextPressed(viewModel),
+        isDisabled: viewModel.selectedOrgans.isEmpty,
+        backgroundColor: AppColors.primaryRedColor,
+        textColor: AppColors.whiteColor,
+      ),
+    );
+  }
+
+  Widget _buildExpandCollapseButton(SymptomsCheckerViewModel viewModel) {
+    return Positioned(
+      right: 24.w,
+      top: -24.h,
+      child: GestureDetector(
+        onTap: viewModel.toggleBottomSheet,
+        behavior: HitTestBehavior.opaque,
+        child: Container(
+          width: 70.w,
+          height: 70.h,
+          alignment: Alignment.center,
+          child: Container(
+            width: 48.w,
+            height: 48.h,
+            decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+              color: AppColors.whiteColor,
+              borderRadius: 11.r,
+            ),
+            child: Center(
+              child: AnimatedRotation(
+                duration: const Duration(milliseconds: 300),
+                turns: viewModel.isBottomSheetExpanded ? 0.25 : -0.25,
+                child: Utils.buildSvgWithAssets(
+                  icon: AppAssets.arrowRight,
+                  width: 25.w,
+                  height: 25.h,
+                ),
+              ),
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart b/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
new file mode 100644
index 0000000..35a23f1
--- /dev/null
+++ b/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
@@ -0,0 +1,108 @@
+import 'package:flutter/cupertino.dart';
+import 'package:hmg_patient_app_new/core/enums.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/organ_mapping_data.dart';
+
+class SymptomsCheckerViewModel extends ChangeNotifier {
+  // State variables
+  bool isBodyHidden = false;
+  BodyView _currentView = BodyView.front;
+  final Set _selectedOrganIds = {};
+  bool _isBottomSheetExpanded = false;
+
+  // Getters
+
+  BodyView get currentView => _currentView;
+
+  Set get selectedOrganIds => _selectedOrganIds;
+
+  bool get isBottomSheetExpanded => _isBottomSheetExpanded;
+
+  /// Get organs for current view
+  List get currentOrgans => OrganData.getOrgansForView(_currentView);
+
+  /// Get all selected organs from both views
+  List get selectedOrgans {
+    final allOrgans = [
+      ...OrganData.frontViewOrgans,
+      ...OrganData.backViewOrgans,
+    ];
+    return allOrgans.where((organ) => _selectedOrganIds.contains(organ.id)).toList();
+  }
+
+  /// Check if any organs are selected
+  bool get hasSelectedOrgans => _selectedOrganIds.isNotEmpty;
+
+  /// Get count of selected organs
+  int get selectedOrgansCount => _selectedOrganIds.length;
+
+  // Methods
+
+  /// Toggle between front and back body view
+  void toggleView() {
+    _currentView = _currentView == BodyView.front ? BodyView.back : BodyView.front;
+    notifyListeners();
+  }
+
+  toggleIsBodyHidden() {
+    isBodyHidden = !isBodyHidden;
+    notifyListeners();
+  }
+
+  /// Toggle organ selection (add if not selected, remove if selected)
+  void toggleOrganSelection(String organId) {
+    if (_selectedOrganIds.contains(organId)) {
+      _selectedOrganIds.remove(organId);
+    } else {
+      _selectedOrganIds.add(organId);
+    }
+    notifyListeners();
+  }
+
+  /// Remove a specific organ from selection
+  void removeOrgan(String organId) {
+    _selectedOrganIds.remove(organId);
+    notifyListeners();
+  }
+
+  /// Clear all selected organs
+  void clearAllSelections() {
+    _selectedOrganIds.clear();
+    notifyListeners();
+  }
+
+  /// Toggle bottom sheet expanded/collapsed state
+  void toggleBottomSheet() {
+    _isBottomSheetExpanded = !_isBottomSheetExpanded;
+    notifyListeners();
+  }
+
+  /// Set bottom sheet expanded state
+  void setBottomSheetExpanded(bool isExpanded) {
+    _isBottomSheetExpanded = isExpanded;
+    notifyListeners();
+  }
+
+  /// Validate if at least one organ is selected
+  bool validateSelection() {
+    return _selectedOrganIds.isNotEmpty;
+  }
+
+  /// Get selected organ IDs as a list
+  List getSelectedOrganIds() {
+    return _selectedOrganIds.toList();
+  }
+
+  /// Get selected organ names as a list
+  List getSelectedOrganNames() {
+    return selectedOrgans.map((organ) => organ.name).toList();
+  }
+
+  /// Reset the view model to initial state
+  void reset() {
+    _currentView = BodyView.front;
+    _selectedOrganIds.clear();
+    _isBottomSheetExpanded = false;
+    notifyListeners();
+  }
+}
diff --git a/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart b/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
new file mode 100644
index 0000000..33663b5
--- /dev/null
+++ b/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
@@ -0,0 +1,121 @@
+import 'dart:ui' as ui;
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/widgets/organ_dot_widget.dart';
+
+class InteractiveBodyWidget extends StatefulWidget {
+  final String bodyImageAsset;
+  final List organs;
+  final Set selectedOrganIds;
+  final bool isBodyHidden;
+  final Function(String organId) onOrganTap;
+
+  const InteractiveBodyWidget({
+    super.key,
+    required this.bodyImageAsset,
+    required this.organs,
+    required this.selectedOrganIds,
+    required this.onOrganTap,
+    this.isBodyHidden = false,
+  });
+
+  @override
+  State createState() => _InteractiveBodyWidgetState();
+}
+
+class _InteractiveBodyWidgetState extends State {
+  double? _imageAspectRatio;
+  final TransformationController _transformationController = TransformationController();
+
+  @override
+  void initState() {
+    super.initState();
+    _loadImageAspectRatio();
+  }
+
+  @override
+  void didUpdateWidget(InteractiveBodyWidget oldWidget) {
+    super.didUpdateWidget(oldWidget);
+    if (oldWidget.bodyImageAsset != widget.bodyImageAsset) {
+      _loadImageAspectRatio();
+      // Reset zoom when switching views
+      _transformationController.value = Matrix4.identity();
+    }
+  }
+
+  @override
+  void dispose() {
+    _transformationController.dispose();
+    super.dispose();
+  }
+
+  Future _loadImageAspectRatio() async {
+    final ByteData data = await rootBundle.load(widget.bodyImageAsset);
+    final ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List());
+    final ui.FrameInfo frameInfo = await codec.getNextFrame();
+    final image = frameInfo.image;
+
+    if (mounted) {
+      setState(() {
+        _imageAspectRatio = image.width / image.height;
+      });
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    if (_imageAspectRatio == null) {
+      return const Center(child: CircularProgressIndicator());
+    }
+
+    return LayoutBuilder(
+      builder: (context, constraints) {
+        return Center(
+          child: InteractiveViewer(
+            transformationController: _transformationController,
+            minScale: 0.5,
+            maxScale: 4.0,
+            boundaryMargin: const EdgeInsets.all(20),
+            clipBehavior: Clip.none,
+            child: AspectRatio(
+              aspectRatio: _imageAspectRatio!,
+              child: LayoutBuilder(
+                builder: (context, imageConstraints) {
+                  return Stack(
+                    children: [
+                      // Body image
+                      Positioned.fill(
+                        child: Image.asset(
+                          widget.bodyImageAsset,
+                          fit: BoxFit.fill,
+                          color: widget.isBodyHidden ? Colors.black.withValues(alpha: 0.5) : null,
+                        ),
+                      ),
+
+                      // Organ dots
+                      ...widget.organs.map((organ) {
+                        final isSelected = widget.selectedOrganIds.contains(organ.id);
+                        final dotSize = 16.0;
+
+                        final leftPos = (organ.position.x * imageConstraints.maxWidth) - (dotSize / 2);
+                        final topPos = (organ.position.y * imageConstraints.maxHeight) - (dotSize / 2);
+
+                        return Positioned(
+                          left: leftPos,
+                          top: topPos,
+                          child: OrganDot(isSelected: isSelected, onTap: () => widget.onOrganTap(organ.id), size: dotSize),
+                        );
+                      }),
+                    ],
+                  );
+                },
+              ),
+            ),
+          ),
+        );
+      },
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/widgets/organ_dot_widget.dart b/lib/presentation/symptoms_checker/widgets/organ_dot_widget.dart
new file mode 100644
index 0000000..0783dfb
--- /dev/null
+++ b/lib/presentation/symptoms_checker/widgets/organ_dot_widget.dart
@@ -0,0 +1,49 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+
+class OrganDot extends StatelessWidget {
+  final bool isSelected;
+  final VoidCallback onTap;
+  final double size;
+
+  const OrganDot({super.key, required this.isSelected, required this.onTap, this.size = 50.0});
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: onTap,
+      child: AnimatedContainer(
+        duration: const Duration(milliseconds: 250),
+        curve: Curves.easeInOut,
+        width: size.w,
+        height: size.h,
+        decoration: BoxDecoration(
+          shape: BoxShape.circle,
+          color: isSelected ? AppColors.whiteColor : AppColors.blackColor.withValues(alpha: 0.6),
+        ),
+        child: Padding(
+          padding: EdgeInsets.all(isSelected ? 2.w : 3.w),
+          child: Container(
+            decoration: BoxDecoration(
+              shape: BoxShape.circle,
+              color: isSelected ? AppColors.primaryRedColor : AppColors.whiteColor,
+            ),
+            child: isSelected
+                ? Center(
+                    child: Container(
+                      width: size.w * 0.25,
+                      height: size.h * 0.25,
+                      decoration: const BoxDecoration(
+                        shape: BoxShape.circle,
+                        color: AppColors.whiteColor,
+                      ),
+                    ),
+                  )
+                : null,
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/widgets/selected_organs_section.dart b/lib/presentation/symptoms_checker/widgets/selected_organs_section.dart
new file mode 100644
index 0000000..dbb93ab
--- /dev/null
+++ b/lib/presentation/symptoms_checker/widgets/selected_organs_section.dart
@@ -0,0 +1,133 @@
+import 'package:flutter/material.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/extensions/string_extensions.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
+
+class SelectedOrgansSection extends StatefulWidget {
+  final List selectedOrgans;
+  final Function(String organId) onRemoveOrgan;
+
+  const SelectedOrgansSection({
+    super.key,
+    required this.selectedOrgans,
+    required this.onRemoveOrgan,
+  });
+
+  @override
+  State createState() => _SelectedOrgansSectionState();
+}
+
+class _SelectedOrgansSectionState extends State {
+  bool _isExpanded = true;
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: EdgeInsets.all(16.h),
+      decoration: BoxDecoration(
+        color: AppColors.whiteColor,
+        borderRadius: BorderRadius.circular(12.r),
+        boxShadow: [
+          BoxShadow(
+            color: AppColors.blackColor.withValues(alpha: 0.05),
+            blurRadius: 10,
+            offset: const Offset(0, -2),
+          ),
+        ],
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        mainAxisSize: MainAxisSize.min,
+        children: [
+          GestureDetector(
+            onTap: () {
+              setState(() {
+                _isExpanded = !_isExpanded;
+              });
+            },
+            child: Row(
+              mainAxisAlignment: MainAxisAlignment.spaceBetween,
+              children: [
+                Text(
+                  'Selected Organs'.needTranslation,
+                  style: TextStyle(
+                    fontSize: 16.f,
+                    fontWeight: FontWeight.w600,
+                    color: AppColors.textColor,
+                  ),
+                ),
+                Row(
+                  children: [
+                    if (widget.selectedOrgans.isNotEmpty)
+                      Container(
+                        padding: EdgeInsets.symmetric(
+                          horizontal: 8.w,
+                          vertical: 4.h,
+                        ),
+                        decoration: BoxDecoration(
+                          color: AppColors.primaryRedColor,
+                          borderRadius: BorderRadius.circular(12.r),
+                        ),
+                        child: Text(
+                          '${widget.selectedOrgans.length}',
+                          style: TextStyle(
+                            color: AppColors.whiteColor,
+                            fontSize: 12.f,
+                            fontWeight: FontWeight.w600,
+                          ),
+                        ),
+                      ),
+                    SizedBox(width: 8.w),
+                    AnimatedRotation(
+                      turns: _isExpanded ? 0.5 : 0.0,
+                      duration: const Duration(milliseconds: 200),
+                      child: Icon(
+                        Icons.keyboard_arrow_down,
+                        color: AppColors.textColorLight,
+                        size: 24.h,
+                      ),
+                    ),
+                  ],
+                ),
+              ],
+            ),
+          ),
+          if (_isExpanded) ...[
+            SizedBox(height: 16.h),
+            if (widget.selectedOrgans.isEmpty)
+              Padding(
+                padding: EdgeInsets.symmetric(vertical: 8.h),
+                child: Text(
+                  'No organs selected yet'.needTranslation,
+                  style: TextStyle(
+                    color: AppColors.greyTextColor,
+                    fontSize: 14.f,
+                  ),
+                ),
+              )
+            else
+              Wrap(
+                spacing: 8.w,
+                runSpacing: 8.h,
+                children: widget.selectedOrgans.map((organ) {
+                  return AppCustomChipWidget(
+                    labelText: organ.name,
+                    backgroundColor: AppColors.secondaryLightRedColor,
+                    textColor: AppColors.primaryRedColor,
+                    deleteIcon: AppAssets.cross_circle,
+                    deleteIconColor: AppColors.primaryRedColor,
+                    deleteIconHasColor: true,
+                    onDeleteTap: () => widget.onRemoveOrgan(organ.id),
+                    padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 8.h),
+                  );
+                }).toList(),
+              ),
+          ],
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/todo_section/ancillary_order_payment_page.dart b/lib/presentation/todo_section/ancillary_order_payment_page.dart
index f9995dc..ad204fa 100644
--- a/lib/presentation/todo_section/ancillary_order_payment_page.dart
+++ b/lib/presentation/todo_section/ancillary_order_payment_page.dart
@@ -148,7 +148,7 @@ class _AncillaryOrderPaymentPageState extends State {
                                     children: [
                                       Image.asset(AppAssets.visa, width: 50.h, height: 50.h),
                                       SizedBox(width: 8.h),
-                                      Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h),
+                                      Image.asset(AppAssets.mastercard, width: 40.h, height: 40.h),
                                     ],
                                   ).toShimmer2(isShow: todoVM.isProcessingPayment),
                                   SizedBox(height: 16.h),
diff --git a/lib/presentation/todo_section/ancillary_procedures_details_page.dart b/lib/presentation/todo_section/ancillary_procedures_details_page.dart
index 449d21e..940c8eb 100644
--- a/lib/presentation/todo_section/ancillary_procedures_details_page.dart
+++ b/lib/presentation/todo_section/ancillary_procedures_details_page.dart
@@ -221,7 +221,7 @@ class _AncillaryOrderDetailsListState extends State {
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
                   Image.asset(
-                    gender == 1 ? AppAssets.male_img : AppAssets.femaleImg,
+                    gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg,
                     width: 56.w,
                     height: 56.h,
                   ),
diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart
index a0ee1e5..a144d19 100644
--- a/lib/routes/app_routes.dart
+++ b/lib/routes/app_routes.dart
@@ -7,6 +7,7 @@ import 'package:hmg_patient_app_new/presentation/e_referral/e_referral_page_home
 import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart';
 import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures_page.dart';
 import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/organ_selector_screen.dart';
 import 'package:hmg_patient_app_new/splashPage.dart';
 
 class AppRoutes {
@@ -20,6 +21,9 @@ class AppRoutes {
   static const String comprehensiveCheckupPage = '/comprehensiveCheckupPage';
   static const String homeHealthCarePage = '/homeHealthCarePage';
 
+  // Symptoms Checker
+  static const String organSelectorPage = '/organSelectorPage';
+
   static Map get routes => {
         initialRoute: (context) => SplashPage(),
         loginScreen: (context) => LoginScreen(),
@@ -29,6 +33,7 @@ class AppRoutes {
         medicalFilePage: (context) => MedicalFilePage(),
         eReferralPage: (context) => EReferralPage(),
         comprehensiveCheckupPage: (context) => ComprehensiveCheckupPage(),
-        homeHealthCarePage: (context) => HhcProceduresPage()
+        homeHealthCarePage: (context) => HhcProceduresPage(),
+        organSelectorPage: (context) => OrganSelectorPage()
       };
 }
diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart
index b3abe6a..ccdf030 100644
--- a/lib/theme/colors.dart
+++ b/lib/theme/colors.dart
@@ -9,6 +9,7 @@ class AppColors {
   static const lightGreyEFColor = Color(0xffeaeaff);
   static const greyF7Color = Color(0xffF7F7F7);
   static const lightGrayColor = Color(0xff808080);
+  static const greyTextColorLight = Color(0xFFA2A2A2);
 
 // New UI Colors
   static const whiteColor = Color(0xFFffffff);
diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart
index 8fa5f99..e124f02 100644
--- a/lib/widgets/appbar/collapsing_list_view.dart
+++ b/lib/widgets/appbar/collapsing_list_view.dart
@@ -92,7 +92,8 @@ class CollapsingListView extends StatelessWidget {
                             t,
                           )!,
                           child: Padding(
-                              padding: EdgeInsets.only(left: appState.isArabic() ? 0 : leftPadding, right: appState.isArabic() ? leftPadding : 0, bottom: bottomPadding),
+                              padding: EdgeInsets.only(
+                                  left: appState.isArabic() ? 0 : leftPadding, right: appState.isArabic() ? leftPadding : 0, bottom: bottomPadding),
                               child: Row(
                                 spacing: 4.h,
                                 children: [
@@ -109,11 +110,18 @@ class CollapsingListView extends StatelessWidget {
                                         color: AppColors.blackColor,
                                         letterSpacing: -0.5),
                                   ).expanded,
-                                  if (logout != null) actionButton(context, t, title: "Logout".needTranslation, icon: AppAssets.logout).onPress(logout!),
-                                  if (report != null) actionButton(context, t, title: "Report".needTranslation, icon: AppAssets.report_icon).onPress(report!),
-                                  if (history != null) actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon).onPress(history!),
-                                  if (instructions != null) actionButton(context, t, title: "Instructions".needTranslation, icon: AppAssets.requests).onPress(instructions!),
-                                  if (requests != null) actionButton(context, t, title: "Requests".needTranslation, icon: AppAssets.insurance_history_icon).onPress(requests!),
+                                  if (logout != null)
+                                    actionButton(context, t, title: "Logout".needTranslation, icon: AppAssets.logout).onPress(logout!),
+                                  if (report != null)
+                                    actionButton(context, t, title: "Report".needTranslation, icon: AppAssets.report_icon).onPress(report!),
+                                  if (history != null)
+                                    actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon)
+                                        .onPress(history!),
+                                  if (instructions != null)
+                                    actionButton(context, t, title: "Instructions".needTranslation, icon: AppAssets.requests).onPress(instructions!),
+                                  if (requests != null)
+                                    actionButton(context, t, title: "Requests".needTranslation, icon: AppAssets.insurance_history_icon)
+                                        .onPress(requests!),
                                   if (search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(search!).paddingOnly(right: 24),
                                   if (trailing != null) trailing!,
                                 ],
diff --git a/lib/widgets/buttons/custom_button.dart b/lib/widgets/buttons/custom_button.dart
index b823eae..676f0bc 100644
--- a/lib/widgets/buttons/custom_button.dart
+++ b/lib/widgets/buttons/custom_button.dart
@@ -3,6 +3,7 @@ import 'package:hmg_patient_app_new/core/app_export.dart';
 import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart';
 
 class CustomButton extends StatelessWidget {
   final String text;
@@ -64,10 +65,10 @@ class CustomButton extends StatelessWidget {
           width: width,
           padding: padding,
           decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-              color: isDisabled ? backgroundColor.withValues(alpha: .5) : backgroundColor,
+              color: isDisabled ? AppColors.inputLabelTextColor.withValues(alpha: 0.3) : backgroundColor,
               borderRadius: radius,
               customBorder: BorderRadius.circular(radius),
-              side: borderSide ?? BorderSide(width: borderWidth.h, color: borderColor)),
+              side: borderSide ?? BorderSide(width: borderWidth.h, color: isDisabled ? Colors.transparent : borderColor)),
           child: Row(
             crossAxisAlignment: CrossAxisAlignment.center,
             mainAxisAlignment: MainAxisAlignment.center,
@@ -86,7 +87,7 @@ class CustomButton extends StatelessWidget {
                     overflow: textOverflow,
                     style: context.dynamicTextStyle(
                       fontSize: fontS,
-                      color: isDisabled ? textColor.withValues(alpha: 0.5) : textColor,
+                      color: isDisabled ? AppColors.greyTextColor : textColor,
                       letterSpacing: 0,
                       fontWeight: fontWeight,
                     ),

From acb6d31ff3b5d4ff90544de3013f57c9b7f2cdc8 Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Wed, 26 Nov 2025 23:54:14 +0300
Subject: [PATCH 04/55] Added possible conditions screen

---
 assets/images/svg/home_bordered.svg           |   4 +
 assets/images/svg/refresh.svg                 |   4 +
 lib/core/app_assets.dart                      |   2 +
 lib/core/enums.dart                           |   4 +
 .../emergency_services_view_model.dart        | 167 +++++++--------
 .../models/conditions_model.dart              |  97 +++++++++
 lib/presentation/lab/lab_orders_page.dart     |   2 +-
 .../organ_selector_screen.dart                |   5 +-
 .../possible_conditions_screen.dart           | 177 ++++++++++++++++
 .../symptoms_checker_view_model.dart          |  46 ++++
 .../widgets/condition_card.dart               | 199 ++++++++++++++++++
 .../widgets/custom_progress_bar.dart          |  60 ++++++
 .../widgets/interactive_body_widget.dart      |  17 +-
 .../widgets/organ_tooltip_widget.dart         |  34 +++
 lib/routes/app_routes.dart                    |   5 +-
 lib/theme/colors.dart                         |   7 +
 16 files changed, 735 insertions(+), 95 deletions(-)
 create mode 100644 assets/images/svg/home_bordered.svg
 create mode 100644 assets/images/svg/refresh.svg
 create mode 100644 lib/features/symptoms_checker/models/conditions_model.dart
 create mode 100644 lib/presentation/symptoms_checker/possible_conditions_screen.dart
 create mode 100644 lib/presentation/symptoms_checker/widgets/condition_card.dart
 create mode 100644 lib/presentation/symptoms_checker/widgets/custom_progress_bar.dart
 create mode 100644 lib/presentation/symptoms_checker/widgets/organ_tooltip_widget.dart

diff --git a/assets/images/svg/home_bordered.svg b/assets/images/svg/home_bordered.svg
new file mode 100644
index 0000000..b9f6291
--- /dev/null
+++ b/assets/images/svg/home_bordered.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/images/svg/refresh.svg b/assets/images/svg/refresh.svg
new file mode 100644
index 0000000..6a84970
--- /dev/null
+++ b/assets/images/svg/refresh.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index eb6f74c..ab2bfb2 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -192,6 +192,8 @@ class AppAssets {
   // Symptoms Checker
   static const String bodyIcon = '$svgBasePath/body_icon.svg';
   static const String rotateIcon = '$svgBasePath/rotate_icon.svg';
+  static const String refreshIcon = '$svgBasePath/refresh.svg';
+  static const String homeBorderedIcon = '$svgBasePath/home_bordered.svg';
 
   // PNGS //
   static const String hmgLogo = '$pngBasePath/hmg_logo.png';
diff --git a/lib/core/enums.dart b/lib/core/enums.dart
index e318401..6754e8c 100644
--- a/lib/core/enums.dart
+++ b/lib/core/enums.dart
@@ -241,3 +241,7 @@ extension ServiceTypeEnumExt on ServiceTypeEnum {
     }
   }
 }
+
+// SymptomsChecker
+
+enum PossibleConditionsSeverityEnum { seekMedicalAdvice, monitorOnly, emergency }
diff --git a/lib/features/emergency_services/emergency_services_view_model.dart b/lib/features/emergency_services/emergency_services_view_model.dart
index ad72ef4..0f264c5 100644
--- a/lib/features/emergency_services/emergency_services_view_model.dart
+++ b/lib/features/emergency_services/emergency_services_view_model.dart
@@ -3,12 +3,10 @@ import 'dart:async';
 import 'package:flutter/material.dart';
 import 'package:google_maps_flutter/google_maps_flutter.dart' as GMSMapServices;
 import 'package:hmg_patient_app_new/core/app_assets.dart';
-
 import 'package:hmg_patient_app_new/core/app_state.dart';
 import 'package:hmg_patient_app_new/core/dependencies.dart';
 import 'package:hmg_patient_app_new/core/location_util.dart';
 import 'package:hmg_patient_app_new/core/utils/date_util.dart';
-import 'package:hmg_patient_app_new/core/utils/doctor_response_mapper.dart';
 import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
 import 'package:hmg_patient_app_new/core/utils/utils.dart';
 import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
@@ -16,29 +14,24 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
 import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
 import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart';
 import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_repo.dart';
-import 'package:hmg_patient_app_new/features/emergency_services/models/OrderDisplay.dart';
-import 'package:hmg_patient_app_new/features/emergency_services/models/request_model/RRTRequestModel.dart';
-import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/EROnlineCheckInPaymentDetailsResponse.dart';
-import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/RRTServiceData.dart';
-import 'package:hmg_patient_app_new/features/location/location_view_model.dart';
-import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart';
-import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart';
 import 'package:hmg_patient_app_new/features/emergency_services/models/AmbulanceCallingPlace.dart';
+import 'package:hmg_patient_app_new/features/emergency_services/models/OrderDisplay.dart';
 import 'package:hmg_patient_app_new/features/emergency_services/models/request_model/PatientER_RC.dart';
+import 'package:hmg_patient_app_new/features/emergency_services/models/request_model/RRTRequestModel.dart';
 import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart';
 import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/EROnlineCheckInPaymentDetailsResponse.dart';
 import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/PatientERTransportationMethod.dart'
     show PatientERTransportationMethod;
 import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/ProjectAvgERWaitingTime.dart';
+import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/RRTServiceData.dart';
 import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/rrt_procedures_response_model.dart';
 import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart' show PlaceDetails;
 import 'package:hmg_patient_app_new/features/location/PlacePrediction.dart';
+import 'package:hmg_patient_app_new/features/location/location_view_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart';
-import 'package:hmg_patient_app_new/presentation/authentication/login.dart';
-import 'package:hmg_patient_app_new/presentation/emergency_services/RRT/rrt_map_screen.dart';
 import 'package:hmg_patient_app_new/presentation/emergency_services/RRT/rrt_request_type_select.dart';
 import 'package:hmg_patient_app_new/presentation/emergency_services/RRT/terms_and_condition.dart';
 import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/call_ambulance_page.dart';
@@ -85,7 +78,6 @@ class EmergencyServicesViewModel extends ChangeNotifier {
   List nearestERList = [];
   List nearestERFilteredList = [];
 
-
   List? hospitalList;
   List? hmgHospitalList;
   List? hmcHospitalList;
@@ -104,7 +96,6 @@ class EmergencyServicesViewModel extends ChangeNotifier {
   AmbulanceCallingPlace callingPlace = AmbulanceCallingPlace.FROM_HOSPITAL;
   AmbulanceDirection ambulanceDirection = AmbulanceDirection.ONE_WAY;
 
-
   bool patientHasAdvanceERBalance = false;
   bool isERBookAppointment = false;
   late EROnlineCheckInPaymentDetailsResponse erOnlineCheckInPaymentDetailsResponse;
@@ -118,14 +109,11 @@ class EmergencyServicesViewModel extends ChangeNotifier {
   RRTServiceData? ordersRRT;
   TextEditingController rrtNotes = TextEditingController();
 
-
   List allOrders = [];
   List orderDisplayList = [];
-  bool historyLoading=  false;
+  bool historyLoading = false;
   OrderDislpay currentlyDisplayedOrder = OrderDislpay.ALL;
 
-
-
   setSelectedRRTProcedure(RRTProceduresResponseModel procedure) {
     selectedRRTProcedure = procedure;
     notifyListeners();
@@ -161,7 +149,6 @@ class EmergencyServicesViewModel extends ChangeNotifier {
   String? termsAndConditions;
 
   Future getRRTProcedures({Function(dynamic)? onSuccess, Function(String)? onError}) async {
-
     print("the app state is ${appState.isAuthenticated}");
     if (!appState.isAuthenticated) {
       dialogService.showErrorBottomSheet(
@@ -797,8 +784,8 @@ class EmergencyServicesViewModel extends ChangeNotifier {
         historyLoading = false;
         ambulanceOrders = apiResponse.data;
         allOrders.clear();
-        allOrders.addAll(ambulanceOrders??[]);
-        allOrders.addAll(ordersRRT?.completedOrders??[]);
+        allOrders.addAll(ambulanceOrders ?? []);
+        allOrders.addAll(ordersRRT?.completedOrders ?? []);
         changeOrderDisplayItems(OrderDislpay.ALL);
         notifyListeners();
       },
@@ -889,8 +876,7 @@ class EmergencyServicesViewModel extends ChangeNotifier {
         });
   }
 
-
-  RRTRequestModel createRRTRequest(GeocodeResult? result, PlaceDetails? place, PlacePrediction? placePrediction){
+  RRTRequestModel createRRTRequest(GeocodeResult? result, PlaceDetails? place, PlacePrediction? placePrediction) {
     AuthenticatedUser? user = appState.getAuthenticatedUser();
     if (user == null) throw Exception("Authentication Required to Continue");
 
@@ -898,7 +884,6 @@ class EmergencyServicesViewModel extends ChangeNotifier {
     Procedures procedures = new Procedures();
     rrtRequestModel.procedures = [];
 
-
     procedures.serviceID = selectedRRTProcedure?.procedureID;
 
     rrtRequestModel.latitude = ((result?.geometry.location.lat) ?? place?.lat);
@@ -920,7 +905,7 @@ class EmergencyServicesViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-  FutureOr submitRRTRequest(GeocodeResult? result, PlaceDetails? place, PlacePrediction? placePrediction)  async {
+  FutureOr submitRRTRequest(GeocodeResult? result, PlaceDetails? place, PlacePrediction? placePrediction) async {
     RRTRequestModel request = createRRTRequest(result, place, placePrediction);
     navServices.push(CustomPageRoute(page: RequestingServicesPage()));
 
@@ -929,9 +914,9 @@ class EmergencyServicesViewModel extends ChangeNotifier {
       navServices.pushAndRemoveUntil(
           CustomPageRoute(
               page: TrackingScreen(
-                isRRTOrder: true,
-                state: OrderTrackingState.failed,
-              )),
+            isRRTOrder: true,
+            state: OrderTrackingState.failed,
+          )),
           ModalRoute.withName("/EmergencyServicesPage"));
     }, (success) {
       getRRTOrders(shouldNavigateToTrackingScreen: true);
@@ -939,7 +924,7 @@ class EmergencyServicesViewModel extends ChangeNotifier {
   }
 
   Future getRRTOrders({bool shouldNavigateToTrackingScreen = false, bool showLoader = false}) async {
-    if(shouldNavigateToTrackingScreen == false && showLoader ) {
+    if (shouldNavigateToTrackingScreen == false && showLoader) {
       LoaderBottomSheet.showLoader(loadingText: "Fetching Orders");
     }
     historyLoading = true;
@@ -947,39 +932,40 @@ class EmergencyServicesViewModel extends ChangeNotifier {
     int? id = appState.getAuthenticatedUser()?.patientId;
 
     var response = await emergencyServicesRepo.getRRTOrders(id: id);
-    if(shouldNavigateToTrackingScreen == false && showLoader ) {
-      LoaderBottomSheet.hideLoader();}
+    if (shouldNavigateToTrackingScreen == false && showLoader) {
+      LoaderBottomSheet.hideLoader();
+    }
     response.fold(
-          (failure) async {
-            historyLoading = false;
-            notifyListeners();
+      (failure) async {
+        historyLoading = false;
+        notifyListeners();
         if (shouldNavigateToTrackingScreen) {
-          navServices.pushAndRemoveUntil(CustomPageRoute(page: TrackingScreen(isRRTOrder: true,state: OrderTrackingState.waitingForCall)), ModalRoute.withName("/EmergencyServicesPage"));
+          navServices.pushAndRemoveUntil(CustomPageRoute(page: TrackingScreen(isRRTOrder: true, state: OrderTrackingState.waitingForCall)),
+              ModalRoute.withName("/EmergencyServicesPage"));
         }
       },
-          (apiResponse) {
+      (apiResponse) {
         if (shouldNavigateToTrackingScreen) {
           navServices.pushAndRemoveUntil(
               CustomPageRoute(
                   page: TrackingScreen(
-                    state: OrderTrackingState.waitingForCall,
-                    isRRTOrder: true,
-                    rrtOrder: apiResponse.data?.pendingOrders.first,
-                  )),
+                state: OrderTrackingState.waitingForCall,
+                isRRTOrder: true,
+                rrtOrder: apiResponse.data?.pendingOrders.first,
+              )),
               ModalRoute.withName("/EmergencyServicesPage"));
         }
         historyLoading = false;
         ordersRRT = apiResponse.data;
         allOrders.clear();
-        allOrders.addAll(ambulanceOrders??[]);
-        allOrders.addAll(ordersRRT?.completedOrders??[]);
+        allOrders.addAll(ambulanceOrders ?? []);
+        allOrders.addAll(ordersRRT?.completedOrders ?? []);
         changeOrderDisplayItems(OrderDislpay.ALL);
         notifyListeners();
       },
     );
   }
 
-
   FutureOr cancelRRTOrder(int? orderID, {bool shouldPop = false}) async {
     dialogService.showCommonBottomSheetWithoutH(
         message: "Do you want to cancel the request".needTranslation,
@@ -998,52 +984,54 @@ class EmergencyServicesViewModel extends ChangeNotifier {
         });
   }
 
-  void changeOrderDisplayItems(OrderDislpay currentlyDisplayedOrder){
+  void changeOrderDisplayItems(OrderDislpay currentlyDisplayedOrder) {
     this.currentlyDisplayedOrder = currentlyDisplayedOrder;
-    switch(currentlyDisplayedOrder){
+    switch (currentlyDisplayedOrder) {
       case OrderDislpay.ALL:
-          orderDisplayList = allOrders;
-          break;
+        orderDisplayList = allOrders;
+        break;
       case OrderDislpay.RRT:
         orderDisplayList = ordersRRT?.completedOrders ?? [];
         break;
       case OrderDislpay.AMBULANCE:
-        orderDisplayList = ambulanceOrders??[];
+        orderDisplayList = ambulanceOrders ?? [];
         break;
     }
     notifyListeners();
   }
 
-  void openRRT(){
+  void openRRT() {
     print("the app state is ${appState.isAuthenticated}");
     if (appState.isAuthenticated) {
-      if(agreedToTermsAndCondition == false){
-        dialogService.showErrorBottomSheet(message: "You Need To Agree To Terms And Conditions".needTranslation, onOkPressed: (){
-          if(navServices.context == null ) return;
-          showCommonBottomSheetWithoutHeight(
-            navServices.context!,
-            padding: EdgeInsets.only(top: 24.h),
-            titleWidget:  Transform.flip(
-              flipX: isArabic,
-              child: Utils.buildSvgWithAssets(
-                icon: AppAssets.arrow_back,
-                iconColor: Color(0xff2B353E),
-                fit: BoxFit.contain,
-              ),
-            ).onPress(() {
-              navServices.pop();
-            }),
-            // title: "Rapid Response Team (RRT)".needTranslation,
-            child: RrtRequestTypeSelect(),
-            isFullScreen: false,
-            isCloseButtonVisible: true,
-            hasBottomPadding: false,
-            backgroundColor: AppColors.bottomSheetBgColor,
-            callBackFunc: () {
-              navServices.pop();
-            },
-          );
-        });
+      if (agreedToTermsAndCondition == false) {
+        dialogService.showErrorBottomSheet(
+            message: "You Need To Agree To Terms And Conditions".needTranslation,
+            onOkPressed: () {
+              if (navServices.context == null) return;
+              showCommonBottomSheetWithoutHeight(
+                navServices.context!,
+                padding: EdgeInsets.only(top: 24.h),
+                titleWidget: Transform.flip(
+                  flipX: isArabic,
+                  child: Utils.buildSvgWithAssets(
+                    icon: AppAssets.arrow_back,
+                    iconColor: Color(0xff2B353E),
+                    fit: BoxFit.contain,
+                  ),
+                ).onPress(() {
+                  navServices.pop();
+                }),
+                // title: "Rapid Response Team (RRT)".needTranslation,
+                child: RrtRequestTypeSelect(),
+                isFullScreen: false,
+                isCloseButtonVisible: true,
+                hasBottomPadding: false,
+                backgroundColor: AppColors.bottomSheetBgColor,
+                callBackFunc: () {
+                  navServices.pop();
+                },
+              );
+            });
         return;
       }
       placeValueInController();
@@ -1051,7 +1039,7 @@ class EmergencyServicesViewModel extends ChangeNotifier {
           isShowConfirmDialog: true,
           onSuccess: (position) async {
             updateBottomSheetState(BottomSheetType.FIXED);
-           bool result =  await navServices.push(
+            bool result = await navServices.push(
               CustomPageRoute(
                   page: MapUtilityScreen(
                     confirmButtonString: "Submit Request ".needTranslation,
@@ -1061,16 +1049,15 @@ class EmergencyServicesViewModel extends ChangeNotifier {
                   ),
                   direction: AxisDirection.down),
             );
-           if(result){
-             LocationViewModel locationViewModel = getIt.get();
-             GeocodeResponse? response = locationViewModel.geocodeResponse;
-             PlaceDetails? placeDetails = locationViewModel.placeDetails;
-             PlacePrediction? placePrediction = locationViewModel.selectedPrediction;
-             submitRRTRequest(response?.results.first, placeDetails, placePrediction);
-           }
-
+            if (result) {
+              LocationViewModel locationViewModel = getIt.get();
+              GeocodeResponse? response = locationViewModel.geocodeResponse;
+              PlaceDetails? placeDetails = locationViewModel.placeDetails;
+              PlacePrediction? placePrediction = locationViewModel.selectedPrediction;
+              submitRRTRequest(response?.results.first, placeDetails, placePrediction);
+            }
           });
-    } else{
+    } else {
       dialogService.showErrorBottomSheet(
           message: "You Need To Login First To Continue".needTranslation,
           onOkPressed: () {
@@ -1079,24 +1066,22 @@ class EmergencyServicesViewModel extends ChangeNotifier {
           });
     }
   }
-  clearRRTData(){
+
+  clearRRTData() {
     selectedRRTProcedure = null;
   }
 
-
   FutureOr getTermsAndConditions() async {
     LoaderBottomSheet.showLoader(loadingText: "Fetching Terms And Conditions".needTranslation);
     var response = await emergencyServicesRepo.getTermsAndCondition();
     LoaderBottomSheet.hideLoader();
-    response.fold((failure)=>errorHandlerService.handleError(failure: failure),(success){
+    response.fold((failure) => errorHandlerService.handleError(failure: failure), (success) {
       termsAndConditions = success.data;
       print("the response terms are $termsAndConditions");
       notifyListeners();
       navServices.push(
-        CustomPageRoute(
-            page: TermsAndCondition(termsAndCondition:success.data??""), direction: AxisDirection.down),
+        CustomPageRoute(page: TermsAndCondition(termsAndCondition: success.data ?? ""), direction: AxisDirection.down),
       );
     });
   }
-
 }
diff --git a/lib/features/symptoms_checker/models/conditions_model.dart b/lib/features/symptoms_checker/models/conditions_model.dart
new file mode 100644
index 0000000..774d8c3
--- /dev/null
+++ b/lib/features/symptoms_checker/models/conditions_model.dart
@@ -0,0 +1,97 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/enums.dart';
+
+class ConditionsModel {
+  final IconData icon;
+  final String title;
+  final int percentage;
+  final String tagText;
+  final String clinic;
+  final List symptoms;
+  final String description;
+  final String? monitorNote;
+  final String? appointmentLabel;
+  final PossibleConditionsSeverityEnum possibleConditionsSeverityEnum;
+
+  ConditionsModel({
+    required this.icon,
+    required this.title,
+    required this.percentage,
+    required this.tagText,
+    required this.clinic,
+    required this.symptoms,
+    required this.description,
+    required this.possibleConditionsSeverityEnum,
+    this.monitorNote,
+    this.appointmentLabel,
+  });
+}
+
+List dummyConditions = [
+  ConditionsModel(
+    icon: Icons.psychology_alt,
+    possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
+    title: "Migraine",
+    percentage: 87,
+    tagText: "Seek Medical Advice",
+    clinic: "Internal Medicine Clinic",
+    symptoms: ["Headache", "Nausea", "Sensitivity to light"],
+    description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
+    appointmentLabel: "Book Appointment",
+  ),
+  ConditionsModel(
+    icon: Icons.deblur,
+    title: "Tension Headache",
+    percentage: 37,
+    tagText: "Monitor",
+    monitorNote: "No need to visit doctor",
+    clinic: "GP Clinic",
+    symptoms: ["Mild head pressure", "Scalp tenderness"],
+    description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+    possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
+  ),
+  ConditionsModel(
+    icon: Icons.medication_liquid,
+    title: "Meningitis",
+    percentage: 28,
+    tagText: "Emergency",
+    clinic: "Neurology Clinic",
+    symptoms: ["Mild head pressure", "Scalp tenderness"],
+    description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+    appointmentLabel: "Book Appointment",
+    possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
+  ),
+  ConditionsModel(
+    icon: Icons.psychology_alt,
+    title: "Migraine",
+    percentage: 87,
+    tagText: "Seek Medical Advice",
+    clinic: "Internal Medicine Clinic",
+    symptoms: ["Headache", "Nausea", "Sensitivity to light"],
+    description: "A migraine is a type of headache that can cause severe throbbing pain, usually on one side of the head.",
+    appointmentLabel: "Book Appointment",
+    possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.seekMedicalAdvice,
+  ),
+  ConditionsModel(
+    icon: Icons.deblur,
+    title: "Tension Headache",
+    percentage: 37,
+    tagText: "Monitor",
+    monitorNote: "No need to visit doctor",
+    clinic: "GP Clinic",
+    symptoms: ["Mild head pressure", "Scalp tenderness"],
+    description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+    possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.monitorOnly,
+  ),
+  ConditionsModel(
+    icon: Icons.medication_liquid,
+    title: "Meningitis",
+    percentage: 28,
+    tagText: "Emergency",
+    clinic: "Neurology Clinic",
+    symptoms: ["Mild head pressure", "Scalp tenderness"],
+    description: "A tension-type headache is generally a mild to moderate pain that feels like a tight band around your head.",
+    appointmentLabel: "Book Appointment",
+    possibleConditionsSeverityEnum: PossibleConditionsSeverityEnum.emergency,
+  ),
+];
diff --git a/lib/presentation/lab/lab_orders_page.dart b/lib/presentation/lab/lab_orders_page.dart
index 4ffd979..0efa5da 100644
--- a/lib/presentation/lab/lab_orders_page.dart
+++ b/lib/presentation/lab/lab_orders_page.dart
@@ -1 +1 @@
-import 'dart:async';

import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
import 'package:hmg_patient_app_new/core/app_state.dart';
import 'package:hmg_patient_app_new/core/dependencies.dart';
import 'package:hmg_patient_app_new/core/enums.dart';
import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/core/utils/utils.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/lab/models/resp_models/patient_lab_orders_response_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_order_by_test.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart';
import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart';
import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart';
import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart';
import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart';
import 'package:provider/provider.dart';
import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart';
import '../../widgets/appbar/collapsing_list_view.dart';

class LabOrdersPage extends StatefulWidget {
  const LabOrdersPage({super.key});

  @override
  State createState() => _LabOrdersPageState();
}

class _LabOrdersPageState extends State {
  late LabViewModel labProvider;
  late DateRangeSelectorRangeViewModel rangeViewModel;
  late AppState _appState;
  List?> labSuggestions = [];
  int? expandedIndex;
  String? selectedFilterText = '';
  int activeIndex = 0;

  @override
  void initState() {
    scheduleMicrotask(() {
      labProvider.initLabProvider();
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    labProvider = Provider.of(context, listen: false);
    rangeViewModel = Provider.of(context);
    _appState = getIt();

    return Scaffold(
        backgroundColor: AppColors.bgScaffoldColor,
        body: CollapsingListView(
          title: LocaleKeys.labResults.tr(),
          search: () async {
            final lavVM = Provider.of(context, listen: false);
            if (lavVM.isLabOrdersLoading) {
              return;
            } else {
              String? value = await Navigator.of(context).push(
                CustomPageRoute(
                  page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions),
                  fullScreenDialog: true,
                  direction: AxisDirection.down,
                ),
              );
              if (value != null) {
                selectedFilterText = value;
                lavVM.filterLabReports(value);
              }
            }
          },
          child: SingleChildScrollView(
            padding: EdgeInsets.all(24.h),
            physics: NeverScrollableScrollPhysics(),
            child: Consumer(
              builder: (context, model, child) {
                return Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    CustomTabBar(
                      activeTextColor: Color(0xffED1C2B),
                      activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1),
                      tabs: [
                        CustomTabBarModel(null, "By Visit".needTranslation),
                        CustomTabBarModel(null, "By Test".needTranslation),
                        // CustomTabBarModel(null, "Completed".needTranslation),
                      ],
                      onTabChange: (index) {
                        activeIndex = index;
                        setState(() {});
                      },
                    ),
                    SizedBox(height: 8.h),
                    selectedFilterText!.isNotEmpty
                        ? CustomChipWidget(
                            chipText: selectedFilterText!,
                            chipType: ChipTypeEnum.alert,
                            isSelected: true,
                          )
                        : SizedBox(),
                    activeIndex == 0
                        ? ListView.builder(
                            shrinkWrap: true,
                            physics: NeverScrollableScrollPhysics(),
                            padding: EdgeInsets.zero,
                            itemCount: model.isLabOrdersLoading
                                ? 5
                                : model.patientLabOrders.isNotEmpty
                                    ? model.patientLabOrders.length
                                    : 1,
                            itemBuilder: (context, index) {
                              final isExpanded = expandedIndex == index;
                              return model.isLabOrdersLoading
                                  ? LabResultItemView(
                                      onTap: () {},
                                      labOrder: null,
                                      index: index,
                                      isLoading: true,
                                    )
                                  : model.patientLabOrders.isNotEmpty
                                      ? AnimationConfiguration.staggeredList(
                                          position: index,
                                          duration: const Duration(milliseconds: 500),
                                          child: SlideAnimation(
                                            verticalOffset: 100.0,
                                            child: FadeInAnimation(
                                                child: LabResultItemView(
                                                    onTap: () {
                                                      model.currentlySelectedPatientOrder =
                                                          model.patientLabOrders[
                                                              index];
                                                    labProvider.getPatientLabResultByHospital(model.patientLabOrders[
                                                                    index]);
                                                        labProvider
                                                            .getPatientSpecialResult(
                                                                model.patientLabOrders[
                                                                    index]);
                                                      Navigator.push(
                                                          context,
                                                          CustomPageRoute(
                                                          page: LabResultByClinic(labOrder: model.patientLabOrders[index]),
                                                        ));
                                                    },
                                                    labOrder: model.patientLabOrders[index],
                                                    index: index,
                                                  isExpanded: isExpanded),
                                            ),
                                          ),
                                        )
                                      : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation);
                            },
                          )
                        : ListView.builder(
                            shrinkWrap: true,
                            physics: NeverScrollableScrollPhysics(),
                            padding: EdgeInsets.zero,
                            itemCount: model.isLabOrdersLoading
                                ? 5
                                : model.uniqueTests.toList().isNotEmpty
                                    ? model.uniqueTests.toList().length
                                    : 1,
                            itemBuilder: (context, index) {
                              final isExpanded = expandedIndex == index;
                              return model.isLabOrdersLoading
                                  ? LabResultItemView(
                                      onTap: () {},
                                      labOrder: null,
                                      index: index,
                                      isLoading: true,
                                    )
                                  : model.uniqueTests.toList().isNotEmpty
                                      ? AnimationConfiguration.staggeredList(
                                          position: index,
                                          duration: const Duration(milliseconds: 500),
                                          child: SlideAnimation(
                                            verticalOffset: 100.0,
                                            child: FadeInAnimation(
                                                child: LabOrderByTest(
                                                    appState: _appState,
                                                    onTap: () {
                                                      if (model.uniqueTests.toList()[index].model != null) {
                                                        rangeViewModel.flush();
                                                        model.getPatientLabResult(model.uniqueTests.toList()[index].model!, model.uniqueTests.toList()[index].description!,
                                                            (_appState.isArabic() ? model.uniqueTests.toList()[index].testDescriptionAr! : model.uniqueTests.toList()[index].testDescriptionEn!));
                                                      }
                                                    },
                                                    tests: model.uniqueTests.toList()[index],
                                                    index: index,
                                                isExpanded: isExpanded)),
                                      ),
                                        )
                                      : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation);
                            },
                          )
                  ],
                );
              },
            ),
          ),
        ));
  }

  Color getLabOrderStatusColor(num status) {
    switch (status) {
      case 44:
        return AppColors.warningColorYellow;
      case 45:
        return AppColors.warningColorYellow;
      case 16:
        return AppColors.successColor;
      case 17:
        return AppColors.successColor;
      default:
        return AppColors.greyColor;
    }
  }

  String getLabOrderStatusText(num status) {
    switch (status) {
      case 44:
        return LocaleKeys.resultsPending.tr(context: context);
      case 45:
        return LocaleKeys.resultsPending.tr(context: context);
      case 16:
        return LocaleKeys.resultsAvailable.tr(context: context);
      case 17:
        return LocaleKeys.resultsAvailable.tr(context: context);
      default:
        return "";
    }
  }

  getLabSuggestions(LabViewModel model) {
    if (model.patientLabOrders.isEmpty) {
      return [];
    }
    return model.patientLabOrders.map((m) => m.testDetails).toList();
  }
}
\ No newline at end of file
+import 'dart:async';

import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
import 'package:hmg_patient_app_new/core/app_state.dart';
import 'package:hmg_patient_app_new/core/dependencies.dart';
import 'package:hmg_patient_app_new/core/enums.dart';
import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart';
import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_order_by_test.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart';
import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart';
import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart';
import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart';
import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart';
import 'package:provider/provider.dart';

import '../../widgets/appbar/collapsing_list_view.dart';

class LabOrdersPage extends StatefulWidget {
  const LabOrdersPage({super.key});

  @override
  State createState() => _LabOrdersPageState();
}

class _LabOrdersPageState extends State {
  late LabViewModel labProvider;
  late DateRangeSelectorRangeViewModel rangeViewModel;
  late AppState _appState;
  List?> labSuggestions = [];
  int? expandedIndex;
  String? selectedFilterText = '';
  int activeIndex = 0;

  @override
  void initState() {
    scheduleMicrotask(() {
      labProvider.initLabProvider();
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    labProvider = Provider.of(context, listen: false);
    rangeViewModel = Provider.of(context);
    _appState = getIt();

    return Scaffold(
        backgroundColor: AppColors.bgScaffoldColor,
        body: CollapsingListView(
          title: LocaleKeys.labResults.tr(),
          search: () async {
            final lavVM = Provider.of(context, listen: false);
            if (lavVM.isLabOrdersLoading) {
              return;
            } else {
              String? value = await Navigator.of(context).push(
                CustomPageRoute(
                  page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions),
                  fullScreenDialog: true,
                  direction: AxisDirection.down,
                ),
              );
              if (value != null) {
                selectedFilterText = value;
                lavVM.filterLabReports(value);
              }
            }
          },
          child: SingleChildScrollView(
            padding: EdgeInsets.all(24.h),
            physics: NeverScrollableScrollPhysics(),
            child: Consumer(
              builder: (context, model, child) {
                return Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    CustomTabBar(
                      activeTextColor: Color(0xffED1C2B),
                      activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1),
                      tabs: [
                        CustomTabBarModel(null, "By Visit".needTranslation),
                        CustomTabBarModel(null, "By Test".needTranslation),
                        // CustomTabBarModel(null, "Completed".needTranslation),
                      ],
                      onTabChange: (index) {
                        activeIndex = index;
                        setState(() {});
                      },
                    ),
                    SizedBox(height: 8.h),
                    selectedFilterText!.isNotEmpty
                        ? CustomChipWidget(
                            chipText: selectedFilterText!,
                            chipType: ChipTypeEnum.alert,
                            isSelected: true,
                          )
                        : SizedBox(),
                    activeIndex == 0
                        ? ListView.builder(
                            shrinkWrap: true,
                            physics: NeverScrollableScrollPhysics(),
                            padding: EdgeInsets.zero,
                            itemCount: model.isLabOrdersLoading
                                ? 5
                                : model.patientLabOrders.isNotEmpty
                                    ? model.patientLabOrders.length
                                    : 1,
                            itemBuilder: (context, index) {
                              final isExpanded = expandedIndex == index;
                              return model.isLabOrdersLoading
                                  ? LabResultItemView(
                                      onTap: () {},
                                      labOrder: null,
                                      index: index,
                                      isLoading: true,
                                    )
                                  : model.patientLabOrders.isNotEmpty
                                      ? AnimationConfiguration.staggeredList(
                                          position: index,
                                          duration: const Duration(milliseconds: 500),
                                          child: SlideAnimation(
                                            verticalOffset: 100.0,
                                            child: FadeInAnimation(
                                              child: LabResultItemView(
                                                  onTap: () {
                                                    model.currentlySelectedPatientOrder = model.patientLabOrders[index];
                                                    labProvider.getPatientLabResultByHospital(model.patientLabOrders[index]);
                                                    labProvider.getPatientSpecialResult(model.patientLabOrders[index]);
                                                    Navigator.push(
                                                        context,
                                                        CustomPageRoute(
                                                          page: LabResultByClinic(labOrder: model.patientLabOrders[index]),
                                                        ));
                                                  },
                                                  labOrder: model.patientLabOrders[index],
                                                  index: index,
                                                  isExpanded: isExpanded),
                                            ),
                                          ),
                                        )
                                      : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation);
                            },
                          )
                        : ListView.builder(
                            shrinkWrap: true,
                            physics: NeverScrollableScrollPhysics(),
                            padding: EdgeInsets.zero,
                            itemCount: model.isLabOrdersLoading
                                ? 5
                                : model.uniqueTests.toList().isNotEmpty
                                    ? model.uniqueTests.toList().length
                                    : 1,
                            itemBuilder: (context, index) {
                              final isExpanded = expandedIndex == index;
                              return model.isLabOrdersLoading
                                  ? LabResultItemView(
                                      onTap: () {},
                                      labOrder: null,
                                      index: index,
                                      isLoading: true,
                                    )
                                  : model.uniqueTests.toList().isNotEmpty
                                      ? AnimationConfiguration.staggeredList(
                                          position: index,
                                          duration: const Duration(milliseconds: 500),
                                          child: SlideAnimation(
                                            verticalOffset: 100.0,
                                            child: FadeInAnimation(
                                                child: LabOrderByTest(
                                                    appState: _appState,
                                                    onTap: () {
                                                      if (model.uniqueTests.toList()[index].model != null) {
                                                        rangeViewModel.flush();
                                                        model.getPatientLabResult(
                                                            model.uniqueTests.toList()[index].model!,
                                                            model.uniqueTests.toList()[index].description!,
                                                            (_appState.isArabic()
                                                                ? model.uniqueTests.toList()[index].testDescriptionAr!
                                                                : model.uniqueTests.toList()[index].testDescriptionEn!));
                                                      }
                                                    },
                                                    tests: model.uniqueTests.toList()[index],
                                                    index: index,
                                                    isExpanded: isExpanded)),
                                          ),
                                        )
                                      : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation);
                            },
                          )
                  ],
                );
              },
            ),
          ),
        ));
  }

  Color getLabOrderStatusColor(num status) {
    switch (status) {
      case 44:
        return AppColors.warningColorYellow;
      case 45:
        return AppColors.warningColorYellow;
      case 16:
        return AppColors.successColor;
      case 17:
        return AppColors.successColor;
      default:
        return AppColors.greyColor;
    }
  }

  String getLabOrderStatusText(num status) {
    switch (status) {
      case 44:
        return LocaleKeys.resultsPending.tr(context: context);
      case 45:
        return LocaleKeys.resultsPending.tr(context: context);
      case 16:
        return LocaleKeys.resultsAvailable.tr(context: context);
      case 17:
        return LocaleKeys.resultsAvailable.tr(context: context);
      default:
        return "";
    }
  }

  getLabSuggestions(LabViewModel model) {
    if (model.patientLabOrders.isEmpty) {
      return [];
    }
    return model.patientLabOrders.map((m) => m.testDetails).toList();
  }
}
\ No newline at end of file
diff --git a/lib/presentation/symptoms_checker/organ_selector_screen.dart b/lib/presentation/symptoms_checker/organ_selector_screen.dart
index 6b9582c..d945b5b 100644
--- a/lib/presentation/symptoms_checker/organ_selector_screen.dart
+++ b/lib/presentation/symptoms_checker/organ_selector_screen.dart
@@ -5,6 +5,7 @@ import 'package:hmg_patient_app_new/core/app_state.dart';
 import 'package:hmg_patient_app_new/core/dependencies.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/presentation/symptoms_checker/symptoms_checker_view_model.dart';
@@ -47,6 +48,7 @@ class _OrganSelectorPageState extends State {
         backgroundColor: AppColors.successColor,
       ),
     );
+    context.navigateWithName(AppRoutes.possibleConditionsScreen);
   }
 
   @override
@@ -116,7 +118,7 @@ class _OrganSelectorPageState extends State {
 
   Widget _buildBodyViewer(SymptomsCheckerViewModel viewModel) {
     return Padding(
-      padding: EdgeInsets.fromLTRB(16.h, 16.h, 16.h, 45.h),
+      padding: EdgeInsets.fromLTRB(16.h, 16.h, 16.h, 60.h),
       child: AnimatedSwitcher(
         duration: const Duration(milliseconds: 600),
         transitionBuilder: (child, animation) => _build3DFlipTransition(child, animation),
@@ -129,6 +131,7 @@ class _OrganSelectorPageState extends State {
           selectedOrganIds: viewModel.selectedOrganIds,
           onOrganTap: viewModel.toggleOrganSelection,
           isBodyHidden: viewModel.isBodyHidden,
+          tooltipOrganId: viewModel.tooltipOrganId,
         ),
       ),
     );
diff --git a/lib/presentation/symptoms_checker/possible_conditions_screen.dart b/lib/presentation/symptoms_checker/possible_conditions_screen.dart
new file mode 100644
index 0000000..0587c32
--- /dev/null
+++ b/lib/presentation/symptoms_checker/possible_conditions_screen.dart
@@ -0,0 +1,177 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.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/dependencies.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/symptoms_checker/models/conditions_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/widgets/condition_card.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/common_bottom_sheet.dart';
+import 'package:provider/provider.dart';
+import 'package:shimmer/shimmer.dart';
+
+class PossibleConditionsScreen extends StatelessWidget {
+  const PossibleConditionsScreen({super.key});
+
+  Widget _buildLoadingShimmer() {
+    return ListView.separated(
+      shrinkWrap: true,
+      physics: const NeverScrollableScrollPhysics(),
+      padding: EdgeInsets.all(16.w),
+      itemCount: 10,
+      separatorBuilder: (_, __) => SizedBox(height: 12.h),
+      itemBuilder: (context, index) {
+        return Shimmer.fromColors(
+          baseColor: Colors.grey[300]!,
+          highlightColor: Colors.grey[100]!,
+          child: Container(
+            height: 80.h,
+            decoration: BoxDecoration(
+              color: Colors.white,
+              borderRadius: BorderRadius.circular(10.r),
+            ),
+          ),
+        );
+      },
+    );
+  }
+
+  Widget _buildPredictionsList(List conditions) {
+    if (conditions.isEmpty) {
+      return Center(
+        child: Padding(
+          padding: EdgeInsets.all(24.h),
+          child: Text(
+            'No Predictions available'.needTranslation,
+            style: TextStyle(
+              fontSize: 16.h,
+              color: AppColors.greyTextColor,
+            ),
+          ),
+        ),
+      );
+    }
+
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        SizedBox(height: 16.h),
+        ListView.separated(
+          padding: EdgeInsets.zero,
+          itemCount: conditions.length,
+          shrinkWrap: true,
+          physics: NeverScrollableScrollPhysics(),
+          separatorBuilder: (context, index) => SizedBox(height: 16.h),
+          itemBuilder: (context, index) {
+            final conditionModel = conditions[index];
+            return ConditionCard(
+              icon: conditionModel.icon,
+              title: conditionModel.title,
+              percentage: conditionModel.percentage,
+              tagText: conditionModel.tagText,
+              clinic: conditionModel.clinic,
+              symptoms: conditionModel.symptoms,
+              description: conditionModel.description,
+              possibleConditionsSeverityEnum: conditionModel.possibleConditionsSeverityEnum,
+              onActionPressed: () {
+                ScaffoldMessenger.of(context).showSnackBar(
+                  SnackBar(
+                    content: Text('We are not available for a week. May you Rest In Peace :('),
+                    backgroundColor: AppColors.primaryRedColor,
+                  ),
+                );
+              },
+            );
+          },
+        ).paddingSymmetrical(24.w, 0),
+        SizedBox(height: 24.h),
+      ],
+    );
+  }
+
+  _buildConfirmationBottomSheet({required BuildContext context, required VoidCallback onConfirm}) {
+    return showCommonBottomSheetWithoutHeight(
+      title: LocaleKeys.notice.tr(context: context),
+      context,
+      child: Utils.getWarningWidget(
+        loadingText: "Are you sure you want to restart the organ selection?".needTranslation,
+        isShowActionButtons: true,
+        onCancelTap: () => Navigator.pop(context),
+        onConfirmTap: () => onConfirm(),
+      ),
+      callBackFunc: () {},
+      isFullScreen: false,
+      isCloseButtonVisible: true,
+    );
+  }
+
+  _restartOrganSelection(BuildContext context) async {
+    final symptomsCheckerVm = context.read();
+    symptomsCheckerVm.reset();
+    context.pop();
+    await Future.delayed(Duration(seconds: 1)).whenComplete(() => context.pop());
+  }
+
+  _navigateToLandingPage() {
+    NavigationService navigationService = getIt.get();
+    navigationService.replaceAllRoutesAndNavigateToLanding();
+  }
+
+  _buildTrailingSection(BuildContext context) {
+    return Row(
+      children: [
+        Container(
+          height: 40.h,
+          padding: EdgeInsets.all(8.w),
+          child: Center(
+            child: Utils.buildSvgWithAssets(
+              icon: AppAssets.refreshIcon,
+              height: 20.h,
+              width: 20.w,
+              iconColor: AppColors.textColor,
+            ),
+          ),
+        ).onPress(() => _buildConfirmationBottomSheet(context: context, onConfirm: () => _restartOrganSelection(context))),
+        Container(
+          height: 40.h,
+          padding: EdgeInsets.all(8.w),
+          child: Center(
+            child: Utils.buildSvgWithAssets(
+              icon: AppAssets.homeBorderedIcon,
+              height: 20.h,
+              width: 20.w,
+              iconColor: AppColors.textColor,
+            ),
+          ),
+        ).onPress(() => _buildConfirmationBottomSheet(context: context, onConfirm: () => _navigateToLandingPage())),
+      ],
+    ).paddingSymmetrical(20.w, 0);
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      backgroundColor: AppColors.bgScaffoldColor,
+      body: CollapsingListView(
+        title: "Possible Conditions".needTranslation,
+        trailing: _buildTrailingSection(context),
+        child: Consumer(
+          builder: (context, symptomsCheckerViewModel, child) {
+            if (symptomsCheckerViewModel.isPossibleConditionsLoading || symptomsCheckerViewModel.isPossibleConditionsLoading) {
+              return _buildLoadingShimmer();
+            }
+            return _buildPredictionsList(dummyConditions);
+          },
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart b/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
index 35a23f1..e162b67 100644
--- a/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
+++ b/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
@@ -1,3 +1,5 @@
+import 'dart:async';
+
 import 'package:flutter/cupertino.dart';
 import 'package:hmg_patient_app_new/core/enums.dart';
 import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart';
@@ -10,14 +12,22 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   final Set _selectedOrganIds = {};
   bool _isBottomSheetExpanded = false;
 
+  // Tooltip state
+  String? _tooltipOrganId;
+  Timer? _tooltipTimer;
+
   // Getters
 
+  bool isPossibleConditionsLoading = false;
+
   BodyView get currentView => _currentView;
 
   Set get selectedOrganIds => _selectedOrganIds;
 
   bool get isBottomSheetExpanded => _isBottomSheetExpanded;
 
+  String? get tooltipOrganId => _tooltipOrganId;
+
   /// Get organs for current view
   List get currentOrgans => OrganData.getOrgansForView(_currentView);
 
@@ -56,6 +66,33 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     } else {
       _selectedOrganIds.add(organId);
     }
+
+    // Show tooltip
+    _showTooltip(organId);
+
+    notifyListeners();
+  }
+
+  /// Show tooltip for an organ
+  void _showTooltip(String organId) {
+    // Cancel any existing timer
+    _tooltipTimer?.cancel();
+
+    // Set the tooltip organ
+    _tooltipOrganId = organId;
+    notifyListeners();
+
+    // Hide tooltip after 2 seconds
+    _tooltipTimer = Timer(const Duration(seconds: 1), () {
+      _tooltipOrganId = null;
+      notifyListeners();
+    });
+  }
+
+  /// Hide tooltip immediately
+  void hideTooltip() {
+    _tooltipTimer?.cancel();
+    _tooltipOrganId = null;
     notifyListeners();
   }
 
@@ -103,6 +140,15 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     _currentView = BodyView.front;
     _selectedOrganIds.clear();
     _isBottomSheetExpanded = false;
+    _tooltipTimer?.cancel();
+    _tooltipOrganId = null;
     notifyListeners();
   }
+
+  @override
+  void dispose() {
+    _tooltipTimer?.cancel();
+    super.dispose();
+  }
+
 }
diff --git a/lib/presentation/symptoms_checker/widgets/condition_card.dart b/lib/presentation/symptoms_checker/widgets/condition_card.dart
new file mode 100644
index 0000000..87a8f3d
--- /dev/null
+++ b/lib/presentation/symptoms_checker/widgets/condition_card.dart
@@ -0,0 +1,199 @@
+import 'package:flutter/material.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/extensions/string_extensions.dart';
+import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/widgets/custom_progress_bar.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
+
+class ConditionCard extends StatelessWidget {
+  final IconData icon;
+  final String title;
+  final int percentage;
+  final String tagText;
+  final String clinic;
+  final List symptoms;
+  final String description;
+  final String? monitorNote;
+  final String? appointmentLabel;
+  final PossibleConditionsSeverityEnum possibleConditionsSeverityEnum;
+  final VoidCallback? onActionPressed;
+
+  const ConditionCard({
+    super.key,
+    required this.icon,
+    required this.title,
+    required this.percentage,
+    required this.tagText,
+    required this.clinic,
+    required this.symptoms,
+    required this.description,
+    this.monitorNote,
+    this.appointmentLabel,
+    required this.possibleConditionsSeverityEnum,
+    this.onActionPressed,
+  });
+
+  Color getChipColorBySeverityEnum(PossibleConditionsSeverityEnum possibleConditionsSeverityEnum) {
+    switch (possibleConditionsSeverityEnum) {
+      case PossibleConditionsSeverityEnum.seekMedicalAdvice:
+        return AppColors.chipColorSeekMedicalAdvice;
+      case PossibleConditionsSeverityEnum.monitorOnly:
+        return AppColors.chipColorMonitor;
+      case PossibleConditionsSeverityEnum.emergency:
+        return AppColors.chipColorEmergency;
+    }
+  }
+
+  Color getChipTextColorBySeverityEnum(PossibleConditionsSeverityEnum possibleConditionsSeverityEnum) {
+    switch (possibleConditionsSeverityEnum) {
+      case PossibleConditionsSeverityEnum.seekMedicalAdvice:
+        return AppColors.chipTextColorSeekMedicalAdvice;
+      case PossibleConditionsSeverityEnum.monitorOnly:
+        return AppColors.chipColorMonitor;
+      case PossibleConditionsSeverityEnum.emergency:
+        return AppColors.chipColorEmergency;
+    }
+  }
+
+  _buildSymptomsRow() {
+    return Wrap(
+      spacing: 6.w,
+      crossAxisAlignment: WrapCrossAlignment.center,
+      children: [
+        for (int i = 0; i < symptoms.length; i++) ...[
+          Text(symptoms[i], style: TextStyle(color: AppColors.greyTextColor, fontWeight: FontWeight.w500, fontSize: 12.f)),
+          if (i != symptoms.length - 1)
+            Padding(
+              padding: EdgeInsets.symmetric(horizontal: 2.w),
+              child: Icon(Icons.circle, size: 7, color: AppColors.textColor),
+            ),
+        ],
+      ],
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity,
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          Row(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              Container(
+                width: 48.w,
+                height: 48.w,
+                decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                  color: getChipColorBySeverityEnum(possibleConditionsSeverityEnum).withValues(alpha: 0.2),
+                  borderRadius: 12.r,
+                  hasShadow: false,
+                ),
+                child: Icon(icon, color: getChipTextColorBySeverityEnum(possibleConditionsSeverityEnum), size: 24.f),
+              ),
+              SizedBox(width: 12.w),
+              Expanded(
+                child: Column(
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    Row(
+                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                      children: [
+                        Expanded(
+                          child: Text(
+                            title,
+                            style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
+                            overflow: TextOverflow.ellipsis,
+                          ),
+                        ),
+                        AppCustomChipWidget(
+                          labelText: tagText,
+                          backgroundColor: getChipColorBySeverityEnum(possibleConditionsSeverityEnum).withValues(alpha: 0.2),
+                          textColor: getChipTextColorBySeverityEnum(possibleConditionsSeverityEnum),
+                        ),
+                      ],
+                    ),
+                    CustomRoundedProgressBar(
+                      percentage: percentage,
+                      height: 6.h,
+                      color: getChipColorBySeverityEnum(possibleConditionsSeverityEnum),
+                      backgroundColor: AppColors.scaffoldBgColor,
+                      titleWidget: Row(
+                        children: [
+                          Text(
+                            "$percentage%",
+                            style: TextStyle(
+                              fontWeight: FontWeight.bold,
+                              fontSize: 12.f,
+                              color: getChipColorBySeverityEnum(possibleConditionsSeverityEnum),
+                            ),
+                          ),
+                        ],
+                      ).paddingSymmetrical(0, 4.h),
+                    ),
+                  ],
+                ),
+              ),
+            ],
+          ).paddingAll(16.w),
+          Divider(color: AppColors.bottomNAVBorder, height: 1, thickness: 1),
+          Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              Text(
+                clinic,
+                style: TextStyle(
+                  fontWeight: FontWeight.w600,
+                  fontSize: 14.f,
+                  color: AppColors.textColor,
+                ),
+              ),
+              _buildSymptomsRow(),
+              SizedBox(height: 16.h),
+              Text("Description".needTranslation, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14.f, color: AppColors.textColor)),
+              SizedBox(height: 2.h),
+              Text(description, style: TextStyle(color: AppColors.greyTextColor, fontWeight: FontWeight.w500, fontSize: 12.f)),
+              if (possibleConditionsSeverityEnum == PossibleConditionsSeverityEnum.emergency)
+                CustomButton(
+                  text: appointmentLabel ?? "Book Appointment".needTranslation,
+                  onPressed: () {
+                    if (onActionPressed != null) {
+                      onActionPressed!();
+                    }
+                  },
+                  backgroundColor: AppColors.lightRedButtonColor,
+                  borderColor: Colors.transparent,
+                  textColor: AppColors.primaryRedColor,
+                  fontSize: 16.f,
+                  fontWeight: FontWeight.w500,
+                  borderRadius: 12.r,
+                  padding: EdgeInsets.symmetric(horizontal: 10.w),
+                  height: 48.h,
+                  icon: AppAssets.add_icon,
+                  iconColor: AppColors.primaryRedColor,
+                  iconSize: 18.h,
+                ).paddingOnly(top: 16.w),
+              if (monitorNote != null)
+                Container(
+                  margin: EdgeInsets.only(top: 12.h),
+                  child: AppCustomChipWidget(
+                    labelText: monitorNote!,
+                    backgroundColor: AppColors.whiteColor,
+                    textColor: AppColors.textColor,
+                    padding: EdgeInsets.symmetric(horizontal: 14.w, vertical: 8.h),
+                    shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.r)),
+                  ),
+                ),
+            ],
+          ).paddingAll(16.w),
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/widgets/custom_progress_bar.dart b/lib/presentation/symptoms_checker/widgets/custom_progress_bar.dart
new file mode 100644
index 0000000..5f55395
--- /dev/null
+++ b/lib/presentation/symptoms_checker/widgets/custom_progress_bar.dart
@@ -0,0 +1,60 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+
+class CustomRoundedProgressBar extends StatelessWidget {
+  final int percentage;
+  final Color color;
+  final Color backgroundColor;
+  final double? height;
+  final Widget? titleWidget;
+
+  const CustomRoundedProgressBar({
+    super.key,
+    this.titleWidget,
+    required this.percentage,
+    required this.color,
+    required this.backgroundColor,
+    this.height,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    final h = height ?? 8.h;
+    return Column(
+      children: [
+        if (titleWidget != null) ...[
+          titleWidget!,
+        ],
+        LayoutBuilder(
+          builder: (context, constraints) {
+            double radius = h / 2;
+            return Container(
+              height: h,
+              width: constraints.maxWidth,
+              decoration: BoxDecoration(
+                color: backgroundColor,
+                borderRadius: BorderRadius.circular(radius),
+              ),
+              child: Align(
+                alignment: Alignment.centerLeft,
+                child: FractionallySizedBox(
+                  widthFactor: (percentage.clamp(0, 100)) / 100,
+                  child: Container(
+                    height: height,
+                    decoration: BoxDecoration(
+                      color: color,
+                      borderRadius: BorderRadius.horizontal(
+                        left: Radius.circular(radius),
+                        right: Radius.circular(radius),
+                      ),
+                    ),
+                  ),
+                ),
+              ),
+            );
+          },
+        ),
+      ],
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart b/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
index 33663b5..4c41ddd 100644
--- a/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
+++ b/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/widgets/organ_dot_widget.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/widgets/organ_tooltip_widget.dart';
 
 class InteractiveBodyWidget extends StatefulWidget {
   final String bodyImageAsset;
@@ -11,6 +12,7 @@ class InteractiveBodyWidget extends StatefulWidget {
   final Set selectedOrganIds;
   final bool isBodyHidden;
   final Function(String organId) onOrganTap;
+  final String? tooltipOrganId;
 
   const InteractiveBodyWidget({
     super.key,
@@ -19,6 +21,7 @@ class InteractiveBodyWidget extends StatefulWidget {
     required this.selectedOrganIds,
     required this.onOrganTap,
     this.isBodyHidden = false,
+    this.tooltipOrganId,
   });
 
   @override
@@ -77,13 +80,13 @@ class _InteractiveBodyWidgetState extends State {
             transformationController: _transformationController,
             minScale: 0.5,
             maxScale: 4.0,
-            boundaryMargin: const EdgeInsets.all(20),
             clipBehavior: Clip.none,
             child: AspectRatio(
               aspectRatio: _imageAspectRatio!,
               child: LayoutBuilder(
                 builder: (context, imageConstraints) {
                   return Stack(
+                    clipBehavior: Clip.none,
                     children: [
                       // Body image
                       Positioned.fill(
@@ -108,6 +111,18 @@ class _InteractiveBodyWidgetState extends State {
                           child: OrganDot(isSelected: isSelected, onTap: () => widget.onOrganTap(organ.id), size: dotSize),
                         );
                       }),
+
+                      // Tooltip
+                      if (widget.tooltipOrganId != null)
+                        ...widget.organs.where((organ) => organ.id == widget.tooltipOrganId).map((organ) {
+                          final centerX = organ.position.x * imageConstraints.maxWidth;
+                          final centerY = organ.position.y * imageConstraints.maxHeight;
+
+                          return OrganTooltipWidget(
+                            organName: organ.name,
+                            position: Offset(centerX, centerY),
+                          );
+                        }),
                     ],
                   );
                 },
diff --git a/lib/presentation/symptoms_checker/widgets/organ_tooltip_widget.dart b/lib/presentation/symptoms_checker/widgets/organ_tooltip_widget.dart
new file mode 100644
index 0000000..77e8319
--- /dev/null
+++ b/lib/presentation/symptoms_checker/widgets/organ_tooltip_widget.dart
@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+
+class OrganTooltipWidget extends StatelessWidget {
+  final String organName;
+  final Offset position;
+
+  const OrganTooltipWidget({super.key, required this.organName, required this.position});
+
+  @override
+  Widget build(BuildContext context) {
+    return Positioned(
+      left: position.dx,
+      top: position.dy,
+      child: FractionalTranslation(
+        translation: const Offset(-0.5, -1.2), // Center horizontally, position above the dot
+        child: Container(
+          padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h),
+          decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.scaffoldBgColor, borderRadius: 8.h),
+          child: Text(
+            organName,
+            style: TextStyle(
+              color: AppColors.primaryRedColor,
+              fontSize: 12.f,
+              fontWeight: FontWeight.w500,
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart
index a144d19..08686d3 100644
--- a/lib/routes/app_routes.dart
+++ b/lib/routes/app_routes.dart
@@ -8,6 +8,7 @@ import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart';
 import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures_page.dart';
 import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/organ_selector_screen.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/possible_conditions_screen.dart';
 import 'package:hmg_patient_app_new/splashPage.dart';
 
 class AppRoutes {
@@ -23,6 +24,7 @@ class AppRoutes {
 
   // Symptoms Checker
   static const String organSelectorPage = '/organSelectorPage';
+  static const String possibleConditionsScreen = '/possibleConditionsScreen';
 
   static Map get routes => {
         initialRoute: (context) => SplashPage(),
@@ -34,6 +36,7 @@ class AppRoutes {
         eReferralPage: (context) => EReferralPage(),
         comprehensiveCheckupPage: (context) => ComprehensiveCheckupPage(),
         homeHealthCarePage: (context) => HhcProceduresPage(),
-        organSelectorPage: (context) => OrganSelectorPage()
+        organSelectorPage: (context) => OrganSelectorPage(),
+        possibleConditionsScreen: (context) => PossibleConditionsScreen()
       };
 }
diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart
index ccdf030..03e889b 100644
--- a/lib/theme/colors.dart
+++ b/lib/theme/colors.dart
@@ -82,4 +82,11 @@ class AppColors {
   static const Color infoBannerBorderColor = Color(0xFFFFE5B4);
   static const Color infoBannerIconColor = Color(0xFFCC9B14);
   static const Color infoBannerTextColor = Color(0xFF856404);
+
+  // SymptomsChecker
+
+  static const Color chipColorSeekMedicalAdvice = Color(0xFFFFAF15);
+  static const Color chipTextColorSeekMedicalAdvice = Color(0xFFAB7103);
+  static const Color chipColorMonitor = Color(0xFF18C273);
+  static const Color chipColorEmergency = Color(0xFFED1C2B);
 }

From ac84d268e94442d191c7f4900c60e06c94f6ae97 Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Wed, 3 Dec 2025 15:17:13 +0300
Subject: [PATCH 05/55] triage design

---
 .../data/triage_questions_data.dart           | 209 +++++++++++++
 .../models/triage_question_model.dart         |  85 +++++
 .../organ_selector_screen.dart                |  47 ++-
 .../triage_progress_screen.dart               | 292 ++++++++++++++++++
 .../widgets/custom_progress_bar.dart          |   6 +
 lib/routes/app_routes.dart                    |   5 +-
 lib/theme/app_theme.dart                      |   2 +-
 lib/widgets/appbar/collapsing_list_view.dart  |  11 +-
 8 files changed, 629 insertions(+), 28 deletions(-)
 create mode 100644 lib/features/symptoms_checker/data/triage_questions_data.dart
 create mode 100644 lib/features/symptoms_checker/models/triage_question_model.dart
 create mode 100644 lib/presentation/symptoms_checker/triage_progress_screen.dart

diff --git a/lib/features/symptoms_checker/data/triage_questions_data.dart b/lib/features/symptoms_checker/data/triage_questions_data.dart
new file mode 100644
index 0000000..ffaef92
--- /dev/null
+++ b/lib/features/symptoms_checker/data/triage_questions_data.dart
@@ -0,0 +1,209 @@
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/triage_question_model.dart';
+
+class TriageQuestionsData {
+  static List getSampleTriageQuestions() {
+    return [
+      // Question 1: Pain Location
+      TriageQuestionModel(
+        id: 'q1',
+        question: 'Where do you feel the chest pain, and where does the pain spread or move to?',
+        options: [
+          TriageOptionModel(
+            id: 'q1_opt1',
+            text: 'It is all over',
+            severityScore: 3,
+          ),
+          TriageOptionModel(
+            id: 'q1_opt2',
+            text: 'It is behind the breast bone',
+            severityScore: 5,
+          ),
+          TriageOptionModel(
+            id: 'q1_opt3',
+            text: 'Moves or spread to the upper limb; for example the shoulder, arm, or fingers',
+            severityScore: 7,
+          ),
+          TriageOptionModel(
+            id: 'q1_opt4',
+            text: 'Moves or spread to the upper back; between the shoulder blades',
+            severityScore: 6,
+          ),
+          TriageOptionModel(
+            id: 'q1_opt5',
+            text: 'Moves or spread to the neck or jaw',
+            severityScore: 8,
+          ),
+        ],
+      ),
+
+      // Question 2: Pain Intensity
+      TriageQuestionModel(
+        id: 'q2',
+        question: 'How would you describe the intensity of your chest pain?',
+        options: [
+          TriageOptionModel(
+            id: 'q2_opt1',
+            text: 'Mild - Barely noticeable, does not interfere with daily activities',
+            severityScore: 2,
+          ),
+          TriageOptionModel(
+            id: 'q2_opt2',
+            text: 'Moderate - Noticeable but manageable, some interference with activities',
+            severityScore: 4,
+          ),
+          TriageOptionModel(
+            id: 'q2_opt3',
+            text: 'Severe - Significantly interferes with activities, difficult to ignore',
+            severityScore: 7,
+          ),
+          TriageOptionModel(
+            id: 'q2_opt4',
+            text: 'Very severe - Unbearable, cannot perform any activities',
+            severityScore: 9,
+          ),
+        ],
+      ),
+
+      // Question 3: Pain Duration
+      TriageQuestionModel(
+        id: 'q3',
+        question: 'How long have you been experiencing this chest pain?',
+        options: [
+          TriageOptionModel(
+            id: 'q3_opt1',
+            text: 'Less than 5 minutes',
+            severityScore: 3,
+          ),
+          TriageOptionModel(
+            id: 'q3_opt2',
+            text: 'Between 5 to 15 minutes',
+            severityScore: 5,
+          ),
+          TriageOptionModel(
+            id: 'q3_opt3',
+            text: 'Between 15 to 30 minutes',
+            severityScore: 7,
+          ),
+          TriageOptionModel(
+            id: 'q3_opt4',
+            text: 'More than 30 minutes',
+            severityScore: 8,
+          ),
+          TriageOptionModel(
+            id: 'q3_opt5',
+            text: 'Comes and goes (intermittent)',
+            severityScore: 4,
+          ),
+        ],
+      ),
+
+      // Question 4: Associated Symptoms
+      TriageQuestionModel(
+        id: 'q4',
+        question: 'Are you experiencing any of these symptoms along with chest pain?',
+        options: [
+          TriageOptionModel(
+            id: 'q4_opt1',
+            text: 'Shortness of breath or difficulty breathing',
+            severityScore: 8,
+          ),
+          TriageOptionModel(
+            id: 'q4_opt2',
+            text: 'Sweating, nausea, or vomiting',
+            severityScore: 7,
+          ),
+          TriageOptionModel(
+            id: 'q4_opt3',
+            text: 'Dizziness or lightheadedness',
+            severityScore: 7,
+          ),
+          TriageOptionModel(
+            id: 'q4_opt4',
+            text: 'Rapid or irregular heartbeat',
+            severityScore: 6,
+          ),
+          TriageOptionModel(
+            id: 'q4_opt5',
+            text: 'None of the above',
+            severityScore: 2,
+          ),
+        ],
+      ),
+
+      // Question 5: Triggering Factors
+      TriageQuestionModel(
+        id: 'q5',
+        question: 'What triggers or worsens your chest pain?',
+        options: [
+          TriageOptionModel(
+            id: 'q5_opt1',
+            text: 'Physical activity or exertion',
+            severityScore: 6,
+          ),
+          TriageOptionModel(
+            id: 'q5_opt2',
+            text: 'Emotional stress or anxiety',
+            severityScore: 4,
+          ),
+          TriageOptionModel(
+            id: 'q5_opt3',
+            text: 'Deep breathing or coughing',
+            severityScore: 3,
+          ),
+          TriageOptionModel(
+            id: 'q5_opt4',
+            text: 'Eating or lying down',
+            severityScore: 3,
+          ),
+          TriageOptionModel(
+            id: 'q5_opt5',
+            text: 'Nothing specific, pain is constant',
+            severityScore: 7,
+          ),
+        ],
+      ),
+    ];
+  }
+
+  /// Calculate total severity score from answered questions
+  static int calculateTotalScore(List questions) {
+    int totalScore = 0;
+    int answeredCount = 0;
+
+    for (var question in questions) {
+      if (question.isConfirmed && question.confirmedOption != null) {
+        totalScore += question.confirmedOption!.severityScore ?? 0;
+        answeredCount++;
+      }
+    }
+
+    // Return average score or 0 if no questions answered
+    return answeredCount > 0 ? (totalScore / answeredCount * 10).round() : 0;
+  }
+
+  /// Get risk level based on score
+  static String getRiskLevel(int score) {
+    if (score >= 70) {
+      return 'High Risk - Seek immediate medical attention';
+    } else if (score >= 50) {
+      return 'Moderate Risk - Consult a doctor soon';
+    } else if (score >= 30) {
+      return 'Low to Moderate Risk - Monitor symptoms';
+    } else {
+      return 'Low Risk - Self-care may be sufficient';
+    }
+  }
+
+  /// Get suggested condition based on score
+  static String getSuggestedCondition(int score) {
+    if (score >= 70) {
+      return 'Acute Coronary Syndrome';
+    } else if (score >= 50) {
+      return 'Angina or Cardiac concern';
+    } else if (score >= 30) {
+      return 'Non-cardiac chest pain';
+    } else {
+      return 'Musculoskeletal chest pain';
+    }
+  }
+}
diff --git a/lib/features/symptoms_checker/models/triage_question_model.dart b/lib/features/symptoms_checker/models/triage_question_model.dart
new file mode 100644
index 0000000..fb8ab20
--- /dev/null
+++ b/lib/features/symptoms_checker/models/triage_question_model.dart
@@ -0,0 +1,85 @@
+class TriageQuestionModel {
+  final String id;
+  final String question;
+  final List options;
+  int? selectedOptionIndex;
+  int? confirmedOptionIndex; // Confirmed answer when user presses Next
+
+  TriageQuestionModel({
+    required this.id,
+    required this.question,
+    required this.options,
+    this.selectedOptionIndex,
+    this.confirmedOptionIndex,
+  });
+
+  bool get isAnswered => selectedOptionIndex != null;
+
+  bool get isConfirmed => confirmedOptionIndex != null;
+
+  void selectOption(int index) {
+    selectedOptionIndex = index;
+  }
+
+  void confirmSelection() {
+    confirmedOptionIndex = selectedOptionIndex;
+  }
+
+  void clearSelection() {
+    selectedOptionIndex = null;
+  }
+
+  TriageOptionModel? get selectedOption {
+    if (selectedOptionIndex != null && selectedOptionIndex! < options.length) {
+      return options[selectedOptionIndex!];
+    }
+    return null;
+  }
+
+  TriageOptionModel? get confirmedOption {
+    if (confirmedOptionIndex != null && confirmedOptionIndex! < options.length) {
+      return options[confirmedOptionIndex!];
+    }
+    return null;
+  }
+
+  TriageQuestionModel copyWith({
+    String? id,
+    String? question,
+    List? options,
+    int? selectedOptionIndex,
+    int? confirmedOptionIndex,
+  }) {
+    return TriageQuestionModel(
+      id: id ?? this.id,
+      question: question ?? this.question,
+      options: options ?? this.options,
+      selectedOptionIndex: selectedOptionIndex ?? this.selectedOptionIndex,
+      confirmedOptionIndex: confirmedOptionIndex ?? this.confirmedOptionIndex,
+    );
+  }
+}
+
+class TriageOptionModel {
+  final String id;
+  final String text;
+  final int? severityScore; // Optional: for calculating risk scores
+
+  TriageOptionModel({
+    required this.id,
+    required this.text,
+    this.severityScore,
+  });
+
+  TriageOptionModel copyWith({
+    String? id,
+    String? text,
+    int? severityScore,
+  }) {
+    return TriageOptionModel(
+      id: id ?? this.id,
+      text: text ?? this.text,
+      severityScore: severityScore ?? this.severityScore,
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/organ_selector_screen.dart b/lib/presentation/symptoms_checker/organ_selector_screen.dart
index d945b5b..738adff 100644
--- a/lib/presentation/symptoms_checker/organ_selector_screen.dart
+++ b/lib/presentation/symptoms_checker/organ_selector_screen.dart
@@ -48,36 +48,33 @@ class _OrganSelectorPageState extends State {
         backgroundColor: AppColors.successColor,
       ),
     );
-    context.navigateWithName(AppRoutes.possibleConditionsScreen);
+    context.navigateWithName(AppRoutes.triageProgressScreen);
   }
 
   @override
   Widget build(BuildContext context) {
-    return ChangeNotifierProvider(
-      create: (_) => SymptomsCheckerViewModel(),
-      child: Scaffold(
-        backgroundColor: AppColors.bgScaffoldColor,
-        appBar: _buildAppBar(),
-        body: Consumer(
-          builder: (context, viewModel, _) {
-            return Column(
-              crossAxisAlignment: CrossAxisAlignment.start,
-              children: [
-                _buildTitle(),
-                SizedBox(height: 8.h),
-                Expanded(
-                  child: Stack(
-                    children: [
-                      _buildBodyViewer(viewModel),
-                      _buildViewToggleButtons(viewModel),
-                      _buildBottomSheet(viewModel),
-                    ],
-                  ),
+    return Scaffold(
+      backgroundColor: AppColors.bgScaffoldColor,
+      appBar: _buildAppBar(),
+      body: Consumer(
+        builder: (context, viewModel, _) {
+          return Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              _buildTitle(),
+              SizedBox(height: 8.h),
+              Expanded(
+                child: Stack(
+                  children: [
+                    _buildBodyViewer(viewModel),
+                    _buildViewToggleButtons(viewModel),
+                    _buildBottomSheet(viewModel),
+                  ],
                 ),
-              ],
-            );
-          },
-        ),
+              ),
+            ],
+          );
+        },
       ),
     );
   }
diff --git a/lib/presentation/symptoms_checker/triage_progress_screen.dart b/lib/presentation/symptoms_checker/triage_progress_screen.dart
new file mode 100644
index 0000000..a3d0c1a
--- /dev/null
+++ b/lib/presentation/symptoms_checker/triage_progress_screen.dart
@@ -0,0 +1,292 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.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/symptoms_checker/data/triage_questions_data.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/triage_question_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/widgets/custom_progress_bar.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';
+
+class TriageProgressScreen extends StatefulWidget {
+  const TriageProgressScreen({super.key});
+
+  @override
+  State createState() => _TriageProgressScreenState();
+}
+
+class _TriageProgressScreenState extends State {
+  late List triageQuestions;
+  int currentQuestionIndex = 0;
+
+  @override
+  void initState() {
+    super.initState();
+    triageQuestions = TriageQuestionsData.getSampleTriageQuestions();
+  }
+
+  TriageQuestionModel get currentQuestion => triageQuestions[currentQuestionIndex];
+
+  bool get isFirstQuestion => currentQuestionIndex == 0;
+
+  bool get isLastQuestion => currentQuestionIndex == triageQuestions.length - 1;
+
+  void _onOptionSelected(int optionIndex) {
+    setState(() {
+      currentQuestion.selectOption(optionIndex);
+    });
+  }
+
+  void _onPreviousPressed() {
+    if (!isFirstQuestion) {
+      setState(() {
+        currentQuestionIndex--;
+      });
+    }
+  }
+
+  void _onNextPressed() {
+    if (currentQuestion.isAnswered) {
+      currentQuestion.confirmSelection();
+      if (isLastQuestion) {
+        context.navigateWithName(AppRoutes.possibleConditionsScreen);
+      } else {
+        setState(() {
+          currentQuestionIndex++;
+        });
+      }
+    } else {
+      ScaffoldMessenger.of(context).showSnackBar(
+        SnackBar(
+          content: Text('Please select an option before proceeding'.needTranslation),
+          backgroundColor: AppColors.errorColor,
+        ),
+      );
+    }
+  }
+
+  _buildConfirmationBottomSheet({required BuildContext context, required VoidCallback onConfirm}) {
+    return showCommonBottomSheetWithoutHeight(
+      title: LocaleKeys.notice.tr(context: context),
+      context,
+      child: Utils.getWarningWidget(
+        loadingText: "Are you sure you want to restart the organ selection?".needTranslation,
+        isShowActionButtons: true,
+        onCancelTap: () => Navigator.pop(context),
+        onConfirmTap: () => onConfirm(),
+      ),
+      callBackFunc: () {},
+      isFullScreen: false,
+      isCloseButtonVisible: true,
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      backgroundColor: AppColors.bgScaffoldColor,
+      body: Column(
+        children: [
+          Expanded(
+            child: CollapsingListView(
+              title: "Triage".needTranslation,
+              onLeadingTapped: () => _buildConfirmationBottomSheet(
+                  context: context,
+                  onConfirm: () => {
+                        context.pop(),
+                        context.pop(),
+                      }),
+              child: Column(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  SizedBox(height: 16.h),
+                  _buildQuestionCard(),
+                ],
+              ),
+            ),
+          ),
+          _buildStickyBottomCard(context),
+        ],
+      ),
+    );
+  }
+
+  Widget _buildQuestionCard() {
+    return AnimatedSwitcher(
+      duration: const Duration(milliseconds: 400),
+      transitionBuilder: (Widget child, Animation animation) {
+        final offsetAnimation = Tween(
+          begin: const Offset(1.0, 0.0),
+          end: Offset.zero,
+        ).animate(CurvedAnimation(
+          parent: animation,
+          curve: Curves.easeInOut,
+        ));
+
+        return SlideTransition(
+          position: offsetAnimation,
+          child: FadeTransition(
+            opacity: animation,
+            child: child,
+          ),
+        );
+      },
+      child: Container(
+        key: ValueKey(currentQuestionIndex),
+        width: double.infinity,
+        margin: EdgeInsets.symmetric(horizontal: 24.w),
+        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+        padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 20.w),
+        child: Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            Text(
+              currentQuestion.question,
+              style: TextStyle(fontSize: 16.f, fontWeight: FontWeight.w500, color: AppColors.textColor),
+            ),
+            SizedBox(height: 24.h),
+            ...List.generate(currentQuestion.options.length, (index) {
+              bool selected = currentQuestion.selectedOptionIndex == index;
+              return _buildOptionItem(index, selected, currentQuestion.options[index].text);
+            }),
+          ],
+        ),
+      ),
+    );
+  }
+
+  Widget _buildOptionItem(int index, bool selected, String optionText) {
+    return GestureDetector(
+      onTap: () => _onOptionSelected(index),
+      child: Container(
+        margin: EdgeInsets.only(bottom: 12.h),
+        child: Row(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            AnimatedContainer(
+              duration: const Duration(milliseconds: 300),
+              curve: Curves.easeInOut,
+              width: 24.w,
+              height: 24.w,
+              decoration: BoxDecoration(
+                color: selected ? AppColors.primaryRedColor : Colors.transparent,
+                borderRadius: BorderRadius.circular(8.r),
+                border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.borderGrayColor, width: 2.w),
+              ),
+              child: selected ? Icon(Icons.check, size: 16.f, color: AppColors.whiteColor) : null,
+            ),
+            SizedBox(width: 12.w),
+            Expanded(
+              child: Text(
+                optionText,
+                style: TextStyle(fontSize: 14.f, color: AppColors.textColor, fontWeight: FontWeight.w500),
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  Widget _buildStickyBottomCard(BuildContext context) {
+    final currentScore = TriageQuestionsData.calculateTotalScore(triageQuestions);
+    final suggestedCondition = TriageQuestionsData.getSuggestedCondition(currentScore);
+
+    return Container(
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+      child: Column(
+        mainAxisSize: MainAxisSize.min,
+        children: [
+          SizedBox(height: 16.h),
+          Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              RichText(
+                text: TextSpan(
+                  text: "Possible symptom: ".needTranslation,
+                  style: TextStyle(
+                    color: AppColors.greyTextColor,
+                    fontWeight: FontWeight.w600,
+                    fontSize: 14.f,
+                  ),
+                  children: [
+                    TextSpan(
+                      text: suggestedCondition,
+                      style: TextStyle(
+                        color: AppColors.textColor,
+                        fontWeight: FontWeight.w600,
+                        fontSize: 14.f,
+                      ),
+                    ),
+                  ],
+                ),
+              ),
+              SizedBox(height: 16.h),
+              CustomRoundedProgressBar(
+                percentage: currentScore,
+                paddingBetween: 5.h,
+                color: AppColors.primaryRedColor,
+                backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.17),
+                height: 8.h,
+                titleWidget: RichText(
+                  text: TextSpan(
+                    text: "$currentScore% ",
+                    style: TextStyle(
+                      color: AppColors.primaryRedColor,
+                      fontWeight: FontWeight.w600,
+                      fontSize: 14.f,
+                    ),
+                    children: [
+                      TextSpan(
+                        text: "- Symptoms checker finding score".needTranslation,
+                        style: TextStyle(
+                          color: AppColors.textColor,
+                          fontWeight: FontWeight.w500,
+                          fontSize: 13.f,
+                        ),
+                      ),
+                    ],
+                  ),
+                ),
+              ),
+              SizedBox(height: 12.h),
+              Row(
+                children: [
+                  Expanded(
+                    child: CustomButton(
+                      text: "Previous".needTranslation,
+                      onPressed: isFirstQuestion ? () {} : _onPreviousPressed,
+                      isDisabled: isFirstQuestion,
+                      backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
+                      borderColor: Colors.transparent,
+                      textColor: AppColors.primaryRedColor,
+                      fontSize: 16.f,
+                    ),
+                  ),
+                  SizedBox(width: 12.w),
+                  Expanded(
+                    child: CustomButton(
+                      text: isLastQuestion ? "Finish".needTranslation : "Next".needTranslation,
+                      onPressed: _onNextPressed,
+                      backgroundColor: AppColors.primaryRedColor,
+                      borderColor: AppColors.primaryRedColor,
+                      textColor: AppColors.whiteColor,
+                      fontSize: 16.f,
+                    ),
+                  ),
+                ],
+              ),
+            ],
+          ),
+          SizedBox(height: 24.h),
+        ],
+      ).paddingSymmetrical(24.w, 0),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/widgets/custom_progress_bar.dart b/lib/presentation/symptoms_checker/widgets/custom_progress_bar.dart
index 5f55395..d09c244 100644
--- a/lib/presentation/symptoms_checker/widgets/custom_progress_bar.dart
+++ b/lib/presentation/symptoms_checker/widgets/custom_progress_bar.dart
@@ -6,12 +6,14 @@ class CustomRoundedProgressBar extends StatelessWidget {
   final Color color;
   final Color backgroundColor;
   final double? height;
+  final double? paddingBetween;
   final Widget? titleWidget;
 
   const CustomRoundedProgressBar({
     super.key,
     this.titleWidget,
     required this.percentage,
+    this.paddingBetween,
     required this.color,
     required this.backgroundColor,
     this.height,
@@ -21,9 +23,13 @@ class CustomRoundedProgressBar extends StatelessWidget {
   Widget build(BuildContext context) {
     final h = height ?? 8.h;
     return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
       children: [
         if (titleWidget != null) ...[
           titleWidget!,
+          if (paddingBetween != null) ...[
+            SizedBox(height: paddingBetween),
+          ]
         ],
         LayoutBuilder(
           builder: (context, constraints) {
diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart
index 08686d3..0e6ec4d 100644
--- a/lib/routes/app_routes.dart
+++ b/lib/routes/app_routes.dart
@@ -9,6 +9,7 @@ import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures
 import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/organ_selector_screen.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/possible_conditions_screen.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/triage_progress_screen.dart';
 import 'package:hmg_patient_app_new/splashPage.dart';
 
 class AppRoutes {
@@ -25,6 +26,7 @@ class AppRoutes {
   // Symptoms Checker
   static const String organSelectorPage = '/organSelectorPage';
   static const String possibleConditionsScreen = '/possibleConditionsScreen';
+  static const String triageProgressScreen = '/triageProgressScreen';
 
   static Map get routes => {
         initialRoute: (context) => SplashPage(),
@@ -37,6 +39,7 @@ class AppRoutes {
         comprehensiveCheckupPage: (context) => ComprehensiveCheckupPage(),
         homeHealthCarePage: (context) => HhcProceduresPage(),
         organSelectorPage: (context) => OrganSelectorPage(),
-        possibleConditionsScreen: (context) => PossibleConditionsScreen()
+        possibleConditionsScreen: (context) => PossibleConditionsScreen(),
+        triageProgressScreen: (context) => TriageProgressScreen()
       };
 }
diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart
index f185479..c09d537 100644
--- a/lib/theme/app_theme.dart
+++ b/lib/theme/app_theme.dart
@@ -10,7 +10,7 @@ class AppTheme {
         pageTransitionsTheme: const PageTransitionsTheme(
           builders: {
             TargetPlatform.android: ZoomPageTransitionsBuilder(),
-            TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
+            TargetPlatform.iOS: CupertinoPageTransitionsBuilder()
           },
         ),
         hintColor: Colors.grey[400],
diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart
index e124f02..919e787 100644
--- a/lib/widgets/appbar/collapsing_list_view.dart
+++ b/lib/widgets/appbar/collapsing_list_view.dart
@@ -6,6 +6,7 @@ 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/app_state.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/theme/colors.dart';
@@ -25,6 +26,7 @@ class CollapsingListView extends StatelessWidget {
   Widget? trailing;
   bool isClose;
   bool isLeading;
+  VoidCallback? onLeadingTapped;
 
   CollapsingListView({
     super.key,
@@ -40,6 +42,7 @@ class CollapsingListView extends StatelessWidget {
     this.requests,
     this.isLeading = true,
     this.trailing,
+    this.onLeadingTapped,
   });
 
   @override
@@ -65,7 +68,13 @@ class CollapsingListView extends StatelessWidget {
                         child: IconButton(
                           icon: Utils.buildSvgWithAssets(icon: isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 32.h, height: 32.h),
                           padding: EdgeInsets.only(left: 12),
-                          onPressed: () => Navigator.pop(context),
+                          onPressed: () {
+                            if (onLeadingTapped != null) {
+                              onLeadingTapped!();
+                            } else {
+                              context.pop();
+                            }
+                          },
                           highlightColor: Colors.transparent,
                         ),
                       )

From 2173d091ed0797ad0b93c32459b954771090eeab Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Mon, 8 Dec 2025 10:27:57 +0300
Subject: [PATCH 06/55] Added symptoms selector

---
 .../data/symptoms_mapping_data.dart           | 323 ++++++++++++++++++
 .../models/symptom_model.dart                 |  55 +++
 .../organ_selector_screen.dart                |   8 +-
 .../symptoms_checker_view_model.dart          |  86 +++++
 .../symptoms_selector_screen.dart             | 224 ++++++++++++
 ...rogress_screen.dart => triage_screen.dart} |  26 +-
 .../widgets/interactive_body_widget.dart      |  16 +-
 .../widgets/organ_tooltip_widget.dart         |   8 +-
 lib/routes/app_routes.dart                    |   9 +-
 lib/widgets/chip/custom_chip_widget.dart      |   7 +-
 lib/widgets/chip/custom_selectable_chip.dart  |  55 +++
 11 files changed, 783 insertions(+), 34 deletions(-)
 create mode 100644 lib/features/symptoms_checker/data/symptoms_mapping_data.dart
 create mode 100644 lib/features/symptoms_checker/models/symptom_model.dart
 create mode 100644 lib/presentation/symptoms_checker/symptoms_selector_screen.dart
 rename lib/presentation/symptoms_checker/{triage_progress_screen.dart => triage_screen.dart} (94%)
 create mode 100644 lib/widgets/chip/custom_selectable_chip.dart

diff --git a/lib/features/symptoms_checker/data/symptoms_mapping_data.dart b/lib/features/symptoms_checker/data/symptoms_mapping_data.dart
new file mode 100644
index 0000000..65aa152
--- /dev/null
+++ b/lib/features/symptoms_checker/data/symptoms_mapping_data.dart
@@ -0,0 +1,323 @@
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/symptom_model.dart';
+
+class SymptomsMappingData {
+  // Map of organ IDs to their possible symptoms
+  static final Map> organSymptomsMap = {
+    // HEAD & FACE
+    'head': [
+      SymptomModel(id: 'head_s1', name: 'Headache', organId: 'head'),
+      SymptomModel(id: 'head_s2', name: 'Dizziness', organId: 'head'),
+      SymptomModel(id: 'head_s3', name: 'Migraine', organId: 'head'),
+      SymptomModel(id: 'head_s4', name: 'Head pressure', organId: 'head'),
+      SymptomModel(id: 'head_s5', name: 'Vertigo', organId: 'head'),
+      SymptomModel(id: 'head_s6', name: 'Confusion', organId: 'head'),
+      SymptomModel(id: 'head_s7', name: 'Memory problems', organId: 'head'),
+    ],
+    'left_eye': [
+      SymptomModel(id: 'left_eye_s1', name: 'Blurred vision', organId: 'left_eye'),
+      SymptomModel(id: 'left_eye_s2', name: 'Eye pain', organId: 'left_eye'),
+      SymptomModel(id: 'left_eye_s3', name: 'Redness', organId: 'left_eye'),
+      SymptomModel(id: 'left_eye_s4', name: 'Itching', organId: 'left_eye'),
+      SymptomModel(id: 'left_eye_s5', name: 'Watering', organId: 'left_eye'),
+      SymptomModel(id: 'left_eye_s6', name: 'Sensitivity to light', organId: 'left_eye'),
+      SymptomModel(id: 'left_eye_s7', name: 'Double vision', organId: 'left_eye'),
+    ],
+    'right_eye': [
+      SymptomModel(id: 'right_eye_s1', name: 'Blurred vision', organId: 'right_eye'),
+      SymptomModel(id: 'right_eye_s2', name: 'Eye pain', organId: 'right_eye'),
+      SymptomModel(id: 'right_eye_s3', name: 'Redness', organId: 'right_eye'),
+      SymptomModel(id: 'right_eye_s4', name: 'Itching', organId: 'right_eye'),
+      SymptomModel(id: 'right_eye_s5', name: 'Watering', organId: 'right_eye'),
+      SymptomModel(id: 'right_eye_s6', name: 'Sensitivity to light', organId: 'right_eye'),
+      SymptomModel(id: 'right_eye_s7', name: 'Double vision', organId: 'right_eye'),
+    ],
+    'nose_mouth': [
+      SymptomModel(id: 'nose_mouth_s1', name: 'Nasal congestion', organId: 'nose_mouth'),
+      SymptomModel(id: 'nose_mouth_s2', name: 'Runny nose', organId: 'nose_mouth'),
+      SymptomModel(id: 'nose_mouth_s3', name: 'Nosebleed', organId: 'nose_mouth'),
+      SymptomModel(id: 'nose_mouth_s4', name: 'Loss of smell', organId: 'nose_mouth'),
+      SymptomModel(id: 'nose_mouth_s5', name: 'Mouth pain', organId: 'nose_mouth'),
+      SymptomModel(id: 'nose_mouth_s6', name: 'Dry mouth', organId: 'nose_mouth'),
+      SymptomModel(id: 'nose_mouth_s7', name: 'Difficulty swallowing', organId: 'nose_mouth'),
+    ],
+
+    // NECK & THROAT
+    'throat': [
+      SymptomModel(id: 'throat_s1', name: 'Sore throat', organId: 'throat'),
+      SymptomModel(id: 'throat_s2', name: 'Difficulty swallowing', organId: 'throat'),
+      SymptomModel(id: 'throat_s3', name: 'Hoarseness', organId: 'throat'),
+      SymptomModel(id: 'throat_s4', name: 'Throat pain', organId: 'throat'),
+      SymptomModel(id: 'throat_s5', name: 'Swollen glands', organId: 'throat'),
+      SymptomModel(id: 'throat_s6', name: 'Cough', organId: 'throat'),
+      SymptomModel(id: 'throat_s7', name: 'Difficulty breathing', organId: 'throat'),
+    ],
+
+    // SHOULDERS
+    'left_shoulder': [
+      SymptomModel(id: 'left_shoulder_s1', name: 'Shoulder pain', organId: 'left_shoulder'),
+      SymptomModel(id: 'left_shoulder_s2', name: 'Stiffness', organId: 'left_shoulder'),
+      SymptomModel(id: 'left_shoulder_s3', name: 'Limited mobility', organId: 'left_shoulder'),
+      SymptomModel(id: 'left_shoulder_s4', name: 'Swelling', organId: 'left_shoulder'),
+      SymptomModel(id: 'left_shoulder_s5', name: 'Weakness', organId: 'left_shoulder'),
+      SymptomModel(id: 'left_shoulder_s6', name: 'Clicking sound', organId: 'left_shoulder'),
+    ],
+    'right_shoulder': [
+      SymptomModel(id: 'right_shoulder_s1', name: 'Shoulder pain', organId: 'right_shoulder'),
+      SymptomModel(id: 'right_shoulder_s2', name: 'Stiffness', organId: 'right_shoulder'),
+      SymptomModel(id: 'right_shoulder_s3', name: 'Limited mobility', organId: 'right_shoulder'),
+      SymptomModel(id: 'right_shoulder_s4', name: 'Swelling', organId: 'right_shoulder'),
+      SymptomModel(id: 'right_shoulder_s5', name: 'Weakness', organId: 'right_shoulder'),
+      SymptomModel(id: 'right_shoulder_s6', name: 'Clicking sound', organId: 'right_shoulder'),
+    ],
+
+    // CHEST
+    'left_chest': [
+      SymptomModel(id: 'left_chest_s1', name: 'Chest pain', organId: 'left_chest'),
+      SymptomModel(id: 'left_chest_s2', name: 'Tightness', organId: 'left_chest'),
+      SymptomModel(id: 'left_chest_s3', name: 'Pressure', organId: 'left_chest'),
+      SymptomModel(id: 'left_chest_s4', name: 'Sharp pain', organId: 'left_chest'),
+      SymptomModel(id: 'left_chest_s5', name: 'Burning sensation', organId: 'left_chest'),
+      SymptomModel(id: 'left_chest_s6', name: 'Palpitations', organId: 'left_chest'),
+      SymptomModel(id: 'left_chest_s7', name: 'Shortness of breath', organId: 'left_chest'),
+    ],
+    'center_chest': [
+      SymptomModel(id: 'center_chest_s1', name: 'Chest pain', organId: 'center_chest'),
+      SymptomModel(id: 'center_chest_s2', name: 'Tightness', organId: 'center_chest'),
+      SymptomModel(id: 'center_chest_s3', name: 'Pressure', organId: 'center_chest'),
+      SymptomModel(id: 'center_chest_s4', name: 'Sharp pain', organId: 'center_chest'),
+      SymptomModel(id: 'center_chest_s5', name: 'Burning sensation', organId: 'center_chest'),
+      SymptomModel(id: 'center_chest_s6', name: 'Heartburn', organId: 'center_chest'),
+      SymptomModel(id: 'center_chest_s7', name: 'Difficulty breathing', organId: 'center_chest'),
+      SymptomModel(id: 'center_chest_s8', name: 'Palpitations', organId: 'center_chest'),
+    ],
+    'right_chest': [
+      SymptomModel(id: 'right_chest_s1', name: 'Chest pain', organId: 'right_chest'),
+      SymptomModel(id: 'right_chest_s2', name: 'Tightness', organId: 'right_chest'),
+      SymptomModel(id: 'right_chest_s3', name: 'Pressure', organId: 'right_chest'),
+      SymptomModel(id: 'right_chest_s4', name: 'Sharp pain', organId: 'right_chest'),
+      SymptomModel(id: 'right_chest_s5', name: 'Burning sensation', organId: 'right_chest'),
+      SymptomModel(id: 'right_chest_s6', name: 'Shortness of breath', organId: 'right_chest'),
+    ],
+
+    // RIBS
+    'left_ribs': [
+      SymptomModel(id: 'left_ribs_s1', name: 'Rib pain', organId: 'left_ribs'),
+      SymptomModel(id: 'left_ribs_s2', name: 'Pain when breathing', organId: 'left_ribs'),
+      SymptomModel(id: 'left_ribs_s3', name: 'Tenderness', organId: 'left_ribs'),
+      SymptomModel(id: 'left_ribs_s4', name: 'Bruising', organId: 'left_ribs'),
+      SymptomModel(id: 'left_ribs_s5', name: 'Difficulty moving', organId: 'left_ribs'),
+    ],
+    'right_ribs': [
+      SymptomModel(id: 'right_ribs_s1', name: 'Rib pain', organId: 'right_ribs'),
+      SymptomModel(id: 'right_ribs_s2', name: 'Pain when breathing', organId: 'right_ribs'),
+      SymptomModel(id: 'right_ribs_s3', name: 'Tenderness', organId: 'right_ribs'),
+      SymptomModel(id: 'right_ribs_s4', name: 'Bruising', organId: 'right_ribs'),
+      SymptomModel(id: 'right_ribs_s5', name: 'Difficulty moving', organId: 'right_ribs'),
+    ],
+
+    // ABDOMEN
+    'upper_abdomen': [
+      SymptomModel(id: 'upper_abdomen_s1', name: 'Abdominal pain', organId: 'upper_abdomen'),
+      SymptomModel(id: 'upper_abdomen_s2', name: 'Bloating', organId: 'upper_abdomen'),
+      SymptomModel(id: 'upper_abdomen_s3', name: 'Nausea', organId: 'upper_abdomen'),
+      SymptomModel(id: 'upper_abdomen_s4', name: 'Vomiting', organId: 'upper_abdomen'),
+      SymptomModel(id: 'upper_abdomen_s5', name: 'Heartburn', organId: 'upper_abdomen'),
+      SymptomModel(id: 'upper_abdomen_s6', name: 'Loss of appetite', organId: 'upper_abdomen'),
+      SymptomModel(id: 'upper_abdomen_s7', name: 'Indigestion', organId: 'upper_abdomen'),
+    ],
+    'navel': [
+      SymptomModel(id: 'navel_s1', name: 'Abdominal pain', organId: 'navel'),
+      SymptomModel(id: 'navel_s2', name: 'Cramping', organId: 'navel'),
+      SymptomModel(id: 'navel_s3', name: 'Bloating', organId: 'navel'),
+      SymptomModel(id: 'navel_s4', name: 'Gas', organId: 'navel'),
+      SymptomModel(id: 'navel_s5', name: 'Tenderness', organId: 'navel'),
+    ],
+    'lower_abdomen': [
+      SymptomModel(id: 'lower_abdomen_s1', name: 'Lower abdominal pain', organId: 'lower_abdomen'),
+      SymptomModel(id: 'lower_abdomen_s2', name: 'Cramping', organId: 'lower_abdomen'),
+      SymptomModel(id: 'lower_abdomen_s3', name: 'Bloating', organId: 'lower_abdomen'),
+      SymptomModel(id: 'lower_abdomen_s4', name: 'Constipation', organId: 'lower_abdomen'),
+      SymptomModel(id: 'lower_abdomen_s5', name: 'Diarrhea', organId: 'lower_abdomen'),
+      SymptomModel(id: 'lower_abdomen_s6', name: 'Urinary discomfort', organId: 'lower_abdomen'),
+    ],
+
+    // PELVIS & GROIN
+    'left_groin': [
+      SymptomModel(id: 'left_groin_s1', name: 'Groin pain', organId: 'left_groin'),
+      SymptomModel(id: 'left_groin_s2', name: 'Swelling', organId: 'left_groin'),
+      SymptomModel(id: 'left_groin_s3', name: 'Tenderness', organId: 'left_groin'),
+      SymptomModel(id: 'left_groin_s4', name: 'Limited mobility', organId: 'left_groin'),
+    ],
+    'right_groin': [
+      SymptomModel(id: 'right_groin_s1', name: 'Groin pain', organId: 'right_groin'),
+      SymptomModel(id: 'right_groin_s2', name: 'Swelling', organId: 'right_groin'),
+      SymptomModel(id: 'right_groin_s3', name: 'Tenderness', organId: 'right_groin'),
+      SymptomModel(id: 'right_groin_s4', name: 'Limited mobility', organId: 'right_groin'),
+    ],
+
+    // ARMS - LEFT
+    'left_elbow': [
+      SymptomModel(id: 'left_elbow_s1', name: 'Elbow pain', organId: 'left_elbow'),
+      SymptomModel(id: 'left_elbow_s2', name: 'Stiffness', organId: 'left_elbow'),
+      SymptomModel(id: 'left_elbow_s3', name: 'Swelling', organId: 'left_elbow'),
+      SymptomModel(id: 'left_elbow_s4', name: 'Limited mobility', organId: 'left_elbow'),
+      SymptomModel(id: 'left_elbow_s5', name: 'Tingling', organId: 'left_elbow'),
+    ],
+    'left_forearm': [
+      SymptomModel(id: 'left_forearm_s1', name: 'Forearm pain', organId: 'left_forearm'),
+      SymptomModel(id: 'left_forearm_s2', name: 'Weakness', organId: 'left_forearm'),
+      SymptomModel(id: 'left_forearm_s3', name: 'Numbness', organId: 'left_forearm'),
+      SymptomModel(id: 'left_forearm_s4', name: 'Tingling', organId: 'left_forearm'),
+      SymptomModel(id: 'left_forearm_s5', name: 'Swelling', organId: 'left_forearm'),
+    ],
+    'left_wrist': [
+      SymptomModel(id: 'left_wrist_s1', name: 'Wrist pain', organId: 'left_wrist'),
+      SymptomModel(id: 'left_wrist_s2', name: 'Stiffness', organId: 'left_wrist'),
+      SymptomModel(id: 'left_wrist_s3', name: 'Swelling', organId: 'left_wrist'),
+      SymptomModel(id: 'left_wrist_s4', name: 'Limited mobility', organId: 'left_wrist'),
+      SymptomModel(id: 'left_wrist_s5', name: 'Tingling', organId: 'left_wrist'),
+      SymptomModel(id: 'left_wrist_s6', name: 'Numbness', organId: 'left_wrist'),
+    ],
+
+    // ARMS - RIGHT
+    'right_elbow': [
+      SymptomModel(id: 'right_elbow_s1', name: 'Elbow pain', organId: 'right_elbow'),
+      SymptomModel(id: 'right_elbow_s2', name: 'Stiffness', organId: 'right_elbow'),
+      SymptomModel(id: 'right_elbow_s3', name: 'Swelling', organId: 'right_elbow'),
+      SymptomModel(id: 'right_elbow_s4', name: 'Limited mobility', organId: 'right_elbow'),
+      SymptomModel(id: 'right_elbow_s5', name: 'Tingling', organId: 'right_elbow'),
+    ],
+    'right_forearm': [
+      SymptomModel(id: 'right_forearm_s1', name: 'Forearm pain', organId: 'right_forearm'),
+      SymptomModel(id: 'right_forearm_s2', name: 'Weakness', organId: 'right_forearm'),
+      SymptomModel(id: 'right_forearm_s3', name: 'Numbness', organId: 'right_forearm'),
+      SymptomModel(id: 'right_forearm_s4', name: 'Tingling', organId: 'right_forearm'),
+      SymptomModel(id: 'right_forearm_s5', name: 'Swelling', organId: 'right_forearm'),
+    ],
+    'right_wrist': [
+      SymptomModel(id: 'right_wrist_s1', name: 'Wrist pain', organId: 'right_wrist'),
+      SymptomModel(id: 'right_wrist_s2', name: 'Stiffness', organId: 'right_wrist'),
+      SymptomModel(id: 'right_wrist_s3', name: 'Swelling', organId: 'right_wrist'),
+      SymptomModel(id: 'right_wrist_s4', name: 'Limited mobility', organId: 'right_wrist'),
+      SymptomModel(id: 'right_wrist_s5', name: 'Tingling', organId: 'right_wrist'),
+      SymptomModel(id: 'right_wrist_s6', name: 'Numbness', organId: 'right_wrist'),
+    ],
+
+    // LEGS - LEFT
+    'left_thigh': [
+      SymptomModel(id: 'left_thigh_s1', name: 'Thigh pain', organId: 'left_thigh'),
+      SymptomModel(id: 'left_thigh_s2', name: 'Muscle cramps', organId: 'left_thigh'),
+      SymptomModel(id: 'left_thigh_s3', name: 'Weakness', organId: 'left_thigh'),
+      SymptomModel(id: 'left_thigh_s4', name: 'Numbness', organId: 'left_thigh'),
+      SymptomModel(id: 'left_thigh_s5', name: 'Swelling', organId: 'left_thigh'),
+    ],
+    'left_knee': [
+      SymptomModel(id: 'left_knee_s1', name: 'Knee pain', organId: 'left_knee'),
+      SymptomModel(id: 'left_knee_s2', name: 'Stiffness', organId: 'left_knee'),
+      SymptomModel(id: 'left_knee_s3', name: 'Swelling', organId: 'left_knee'),
+      SymptomModel(id: 'left_knee_s4', name: 'Limited mobility', organId: 'left_knee'),
+      SymptomModel(id: 'left_knee_s5', name: 'Clicking sound', organId: 'left_knee'),
+      SymptomModel(id: 'left_knee_s6', name: 'Instability', organId: 'left_knee'),
+    ],
+    'left_shin': [
+      SymptomModel(id: 'left_shin_s1', name: 'Shin pain', organId: 'left_shin'),
+      SymptomModel(id: 'left_shin_s2', name: 'Tenderness', organId: 'left_shin'),
+      SymptomModel(id: 'left_shin_s3', name: 'Swelling', organId: 'left_shin'),
+      SymptomModel(id: 'left_shin_s4', name: 'Numbness', organId: 'left_shin'),
+    ],
+    'left_ankle': [
+      SymptomModel(id: 'left_ankle_s1', name: 'Ankle pain', organId: 'left_ankle'),
+      SymptomModel(id: 'left_ankle_s2', name: 'Stiffness', organId: 'left_ankle'),
+      SymptomModel(id: 'left_ankle_s3', name: 'Swelling', organId: 'left_ankle'),
+      SymptomModel(id: 'left_ankle_s4', name: 'Limited mobility', organId: 'left_ankle'),
+      SymptomModel(id: 'left_ankle_s5', name: 'Instability', organId: 'left_ankle'),
+    ],
+
+    // LEGS - RIGHT
+    'right_thigh': [
+      SymptomModel(id: 'right_thigh_s1', name: 'Thigh pain', organId: 'right_thigh'),
+      SymptomModel(id: 'right_thigh_s2', name: 'Muscle cramps', organId: 'right_thigh'),
+      SymptomModel(id: 'right_thigh_s3', name: 'Weakness', organId: 'right_thigh'),
+      SymptomModel(id: 'right_thigh_s4', name: 'Numbness', organId: 'right_thigh'),
+      SymptomModel(id: 'right_thigh_s5', name: 'Swelling', organId: 'right_thigh'),
+    ],
+    'right_knee': [
+      SymptomModel(id: 'right_knee_s1', name: 'Knee pain', organId: 'right_knee'),
+      SymptomModel(id: 'right_knee_s2', name: 'Stiffness', organId: 'right_knee'),
+      SymptomModel(id: 'right_knee_s3', name: 'Swelling', organId: 'right_knee'),
+      SymptomModel(id: 'right_knee_s4', name: 'Limited mobility', organId: 'right_knee'),
+      SymptomModel(id: 'right_knee_s5', name: 'Clicking sound', organId: 'right_knee'),
+      SymptomModel(id: 'right_knee_s6', name: 'Instability', organId: 'right_knee'),
+    ],
+    'right_shin': [
+      SymptomModel(id: 'right_shin_s1', name: 'Shin pain', organId: 'right_shin'),
+      SymptomModel(id: 'right_shin_s2', name: 'Tenderness', organId: 'right_shin'),
+      SymptomModel(id: 'right_shin_s3', name: 'Swelling', organId: 'right_shin'),
+      SymptomModel(id: 'right_shin_s4', name: 'Numbness', organId: 'right_shin'),
+    ],
+    'right_ankle': [
+      SymptomModel(id: 'right_ankle_s1', name: 'Ankle pain', organId: 'right_ankle'),
+      SymptomModel(id: 'right_ankle_s2', name: 'Stiffness', organId: 'right_ankle'),
+      SymptomModel(id: 'right_ankle_s3', name: 'Swelling', organId: 'right_ankle'),
+      SymptomModel(id: 'right_ankle_s4', name: 'Limited mobility', organId: 'right_ankle'),
+      SymptomModel(id: 'right_ankle_s5', name: 'Instability', organId: 'right_ankle'),
+    ],
+
+    // BACK VIEW ORGANS
+    'back_head': [
+      SymptomModel(id: 'back_head_s1', name: 'Back of head pain', organId: 'back_head'),
+      SymptomModel(id: 'back_head_s2', name: 'Neck stiffness', organId: 'back_head'),
+      SymptomModel(id: 'back_head_s3', name: 'Tension headache', organId: 'back_head'),
+    ],
+    'neck': [
+      SymptomModel(id: 'neck_s1', name: 'Neck pain', organId: 'neck'),
+      SymptomModel(id: 'neck_s2', name: 'Stiffness', organId: 'neck'),
+      SymptomModel(id: 'neck_s3', name: 'Limited mobility', organId: 'neck'),
+      SymptomModel(id: 'neck_s4', name: 'Muscle spasm', organId: 'neck'),
+      SymptomModel(id: 'neck_s5', name: 'Tingling', organId: 'neck'),
+    ],
+    'upper_back': [
+      SymptomModel(id: 'upper_back_s1', name: 'Upper back pain', organId: 'upper_back'),
+      SymptomModel(id: 'upper_back_s2', name: 'Stiffness', organId: 'upper_back'),
+      SymptomModel(id: 'upper_back_s3', name: 'Muscle tension', organId: 'upper_back'),
+      SymptomModel(id: 'upper_back_s4', name: 'Sharp pain', organId: 'upper_back'),
+      SymptomModel(id: 'upper_back_s5', name: 'Difficulty breathing', organId: 'upper_back'),
+    ],
+    'mid_back': [
+      SymptomModel(id: 'mid_back_s1', name: 'Mid back pain', organId: 'mid_back'),
+      SymptomModel(id: 'mid_back_s2', name: 'Stiffness', organId: 'mid_back'),
+      SymptomModel(id: 'mid_back_s3', name: 'Muscle spasm', organId: 'mid_back'),
+      SymptomModel(id: 'mid_back_s4', name: 'Tenderness', organId: 'mid_back'),
+    ],
+    'lower_back': [
+      SymptomModel(id: 'lower_back_s1', name: 'Lower back pain', organId: 'lower_back'),
+      SymptomModel(id: 'lower_back_s2', name: 'Stiffness', organId: 'lower_back'),
+      SymptomModel(id: 'lower_back_s3', name: 'Sharp pain', organId: 'lower_back'),
+      SymptomModel(id: 'lower_back_s4', name: 'Sciatica', organId: 'lower_back'),
+      SymptomModel(id: 'lower_back_s5', name: 'Limited mobility', organId: 'lower_back'),
+      SymptomModel(id: 'lower_back_s6', name: 'Muscle spasm', organId: 'lower_back'),
+    ],
+  };
+
+  /// Get symptoms for a specific organ ID
+  static List getSymptomsForOrgan(String organId) {
+    return organSymptomsMap[organId] ?? [];
+  }
+
+  /// Get symptoms for multiple organ IDs
+  static Map> getSymptomsForOrgans(List organIds) {
+    Map> result = {};
+    for (String organId in organIds) {
+      List symptoms = getSymptomsForOrgan(organId);
+      if (symptoms.isNotEmpty) {
+        result[organId] = symptoms;
+      }
+    }
+    return result;
+  }
+
+  /// Check if an organ has symptoms mapped
+  static bool hasSymptoms(String organId) {
+    return organSymptomsMap.containsKey(organId) && organSymptomsMap[organId]!.isNotEmpty;
+  }
+}
diff --git a/lib/features/symptoms_checker/models/symptom_model.dart b/lib/features/symptoms_checker/models/symptom_model.dart
new file mode 100644
index 0000000..d35b11a
--- /dev/null
+++ b/lib/features/symptoms_checker/models/symptom_model.dart
@@ -0,0 +1,55 @@
+class SymptomModel {
+  final String id;
+  final String name;
+  final String organId;
+
+  const SymptomModel({
+    required this.id,
+    required this.name,
+    required this.organId,
+  });
+
+  SymptomModel copyWith({
+    String? id,
+    String? name,
+    String? organId,
+  }) {
+    return SymptomModel(
+      id: id ?? this.id,
+      name: name ?? this.name,
+      organId: organId ?? this.organId,
+    );
+  }
+}
+
+class OrganSymptomsGroup {
+  final String organId;
+  final String organName;
+  final List symptoms;
+  final Set selectedSymptomIds;
+
+  OrganSymptomsGroup({
+    required this.organId,
+    required this.organName,
+    required this.symptoms,
+    Set? selectedSymptomIds,
+  }) : selectedSymptomIds = selectedSymptomIds ?? {};
+
+  bool get hasSelectedSymptoms => selectedSymptomIds.isNotEmpty;
+
+  int get selectedCount => selectedSymptomIds.length;
+
+  OrganSymptomsGroup copyWith({
+    String? organId,
+    String? organName,
+    List? symptoms,
+    Set? selectedSymptomIds,
+  }) {
+    return OrganSymptomsGroup(
+      organId: organId ?? this.organId,
+      organName: organName ?? this.organName,
+      symptoms: symptoms ?? this.symptoms,
+      selectedSymptomIds: selectedSymptomIds ?? this.selectedSymptomIds,
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/organ_selector_screen.dart b/lib/presentation/symptoms_checker/organ_selector_screen.dart
index 738adff..e47032c 100644
--- a/lib/presentation/symptoms_checker/organ_selector_screen.dart
+++ b/lib/presentation/symptoms_checker/organ_selector_screen.dart
@@ -42,13 +42,7 @@ class _OrganSelectorPageState extends State {
       return;
     }
 
-    ScaffoldMessenger.of(context).showSnackBar(
-      SnackBar(
-        content: Text('Selected organs:\n\n ${viewModel.getSelectedOrganIds()}'),
-        backgroundColor: AppColors.successColor,
-      ),
-    );
-    context.navigateWithName(AppRoutes.triageProgressScreen);
+    context.navigateWithName(AppRoutes.symptomsCheckerScreen);
   }
 
   @override
diff --git a/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart b/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
index e162b67..9d42dc7 100644
--- a/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
+++ b/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
@@ -2,7 +2,9 @@ import 'dart:async';
 
 import 'package:flutter/cupertino.dart';
 import 'package:hmg_patient_app_new/core/enums.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/data/symptoms_mapping_data.dart';
 import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/symptom_model.dart';
 import 'package:hmg_patient_app_new/features/symptoms_checker/organ_mapping_data.dart';
 
 class SymptomsCheckerViewModel extends ChangeNotifier {
@@ -12,6 +14,9 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   final Set _selectedOrganIds = {};
   bool _isBottomSheetExpanded = false;
 
+  // Symptom selection state
+  final Map _organSymptomsGroups = {};
+
   // Tooltip state
   String? _tooltipOrganId;
   Timer? _tooltipTimer;
@@ -46,6 +51,21 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   /// Get count of selected organs
   int get selectedOrgansCount => _selectedOrganIds.length;
 
+  /// Get organ symptoms groups for selected organs
+  List get organSymptomsGroups {
+    return _organSymptomsGroups.values.toList();
+  }
+
+  /// Get total selected symptoms count across all organs
+  int get totalSelectedSymptomsCount {
+    return _organSymptomsGroups.values.fold(0, (sum, group) => sum + group.selectedCount);
+  }
+
+  /// Check if at least one symptom is selected
+  bool get hasSelectedSymptoms {
+    return _organSymptomsGroups.values.any((group) => group.hasSelectedSymptoms);
+  }
+
   // Methods
 
   /// Toggle between front and back body view
@@ -135,10 +155,76 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     return selectedOrgans.map((organ) => organ.name).toList();
   }
 
+  /// Initialize symptom groups based on selected organs
+  void initializeSymptomGroups() {
+    _organSymptomsGroups.clear();
+
+    for (String organId in _selectedOrganIds) {
+      List symptoms = SymptomsMappingData.getSymptomsForOrgan(organId);
+      if (symptoms.isNotEmpty) {
+        // Find organ name from selectedOrgans
+        String organName = selectedOrgans
+            .firstWhere((organ) => organ.id == organId, orElse: () => OrganModel(id: organId, name: organId, bodyView: BodyView.front, position: OrganPosition(x: 0, y: 0)))
+            .name;
+
+        _organSymptomsGroups[organId] = OrganSymptomsGroup(
+          organId: organId,
+          organName: organName,
+          symptoms: symptoms,
+        );
+      }
+    }
+    notifyListeners();
+  }
+
+  /// Toggle symptom selection for a specific organ
+  void toggleSymptomSelection(String organId, String symptomId) {
+    if (_organSymptomsGroups.containsKey(organId)) {
+      final group = _organSymptomsGroups[organId]!;
+      final selectedIds = Set.from(group.selectedSymptomIds);
+
+      if (selectedIds.contains(symptomId)) {
+        selectedIds.remove(symptomId);
+      } else {
+        selectedIds.add(symptomId);
+      }
+
+      _organSymptomsGroups[organId] = group.copyWith(selectedSymptomIds: selectedIds);
+      notifyListeners();
+    }
+  }
+
+  /// Check if a symptom is selected
+  bool isSymptomSelected(String organId, String symptomId) {
+    return _organSymptomsGroups[organId]?.selectedSymptomIds.contains(symptomId) ?? false;
+  }
+
+  /// Get all selected symptoms across all organs
+  List getAllSelectedSymptoms() {
+    List allSymptoms = [];
+    for (var group in _organSymptomsGroups.values) {
+      for (var symptom in group.symptoms) {
+        if (group.selectedSymptomIds.contains(symptom.id)) {
+          allSymptoms.add(symptom);
+        }
+      }
+    }
+    return allSymptoms;
+  }
+
+  /// Clear all symptom selections
+  void clearAllSymptomSelections() {
+    for (var organId in _organSymptomsGroups.keys) {
+      _organSymptomsGroups[organId] = _organSymptomsGroups[organId]!.copyWith(selectedSymptomIds: {});
+    }
+    notifyListeners();
+  }
+
   /// Reset the view model to initial state
   void reset() {
     _currentView = BodyView.front;
     _selectedOrganIds.clear();
+    _organSymptomsGroups.clear();
     _isBottomSheetExpanded = false;
     _tooltipTimer?.cancel();
     _tooltipOrganId = null;
diff --git a/lib/presentation/symptoms_checker/symptoms_selector_screen.dart b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
new file mode 100644
index 0000000..b1c3234
--- /dev/null
+++ b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
@@ -0,0 +1,224 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.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/symptoms_checker/models/symptom_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_checker_view_model.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/chip/custom_selectable_chip.dart';
+import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
+import 'package:provider/provider.dart';
+
+class SymptomsSelectorScreen extends StatefulWidget {
+  const SymptomsSelectorScreen({super.key});
+
+  @override
+  State createState() => _SymptomsSelectorScreenState();
+}
+
+class _SymptomsSelectorScreenState extends State {
+  @override
+  void initState() {
+    super.initState();
+    // Initialize symptom groups based on selected organs
+    WidgetsBinding.instance.addPostFrameCallback((_) {
+      final viewModel = context.read();
+      viewModel.initializeSymptomGroups();
+    });
+  }
+
+  void _onNextPressed(SymptomsCheckerViewModel viewModel) {
+    if (viewModel.hasSelectedSymptoms) {
+      // Navigate to triage screen
+      context.navigateWithName(AppRoutes.triageScreen);
+    } else {
+      ScaffoldMessenger.of(context).showSnackBar(
+        SnackBar(
+          content: Text('Please select at least one symptom before proceeding'.needTranslation),
+          backgroundColor: AppColors.errorColor,
+        ),
+      );
+    }
+  }
+
+  void _onPreviousPressed() {
+    context.pop();
+  }
+
+  _buildConfirmationBottomSheet({required BuildContext context, required VoidCallback onConfirm}) {
+    return showCommonBottomSheetWithoutHeight(
+      title: LocaleKeys.notice.tr(context: context),
+      context,
+      child: Utils.getWarningWidget(
+        loadingText: "Are you sure you want to restart the organ selection?".needTranslation,
+        isShowActionButtons: true,
+        onCancelTap: () => Navigator.pop(context),
+        onConfirmTap: () => onConfirm(),
+      ),
+      callBackFunc: () {},
+      isFullScreen: false,
+      isCloseButtonVisible: true,
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      backgroundColor: AppColors.bgScaffoldColor,
+      body: Consumer(
+        builder: (context, viewModel, _) {
+          return Column(
+            children: [
+              Expanded(
+                child: CollapsingListView(
+                  title: "Symptoms Selector".needTranslation,
+                  onLeadingTapped: () => _buildConfirmationBottomSheet(
+                      context: context,
+                      onConfirm: () => {
+                            context.pop(),
+                            context.pop(),
+                          }),
+                  child: viewModel.organSymptomsGroups.isEmpty
+                      ? _buildEmptyState()
+                      : Column(
+                          crossAxisAlignment: CrossAxisAlignment.start,
+                          children: [
+                            SizedBox(height: 16.h),
+                            ...viewModel.organSymptomsGroups.map((group) {
+                              return Padding(
+                                padding: EdgeInsets.only(bottom: 16.h),
+                                child: _buildSymptomsSelectionCard(viewModel, group),
+                              );
+                            }),
+                          ],
+                        ),
+                ),
+              ),
+              _buildStickyBottomCard(context, viewModel),
+            ],
+          );
+        },
+      ),
+    );
+  }
+
+  Widget _buildSymptomsSelectionCard(SymptomsCheckerViewModel viewModel, OrganSymptomsGroup group) {
+    return Container(
+      width: double.infinity,
+      margin: EdgeInsets.symmetric(horizontal: 24.w),
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+      padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          Row(
+            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+            children: [
+              Expanded(
+                child: Text(
+                  'Possible symptoms related to "${group.organName}"',
+                  style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
+                ),
+              ),
+            ],
+          ),
+          SizedBox(height: 24.h),
+          Wrap(
+            runSpacing: 12.h,
+            spacing: 8.w,
+            children: group.symptoms.map((symptom) {
+              bool isSelected = viewModel.isSymptomSelected(group.organId, symptom.id);
+              return GestureDetector(
+                onTap: () => viewModel.toggleSymptomSelection(group.organId, symptom.id),
+                child: CustomSelectableChip(
+                  label: symptom.name,
+                  selected: isSelected,
+                  activeColor: AppColors.primaryRedBorderColor,
+                  activeTextColor: AppColors.primaryRedBorderColor,
+                  inactiveBorderColor: AppColors.bottomNAVBorder,
+                  inactiveTextColor: AppColors.textColor,
+                ),
+              );
+            }).toList(),
+          ),
+        ],
+      ),
+    );
+  }
+
+  Widget _buildEmptyState() {
+    return Center(
+      child: Padding(
+        padding: EdgeInsets.all(24.h),
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.center,
+          children: [
+            Icon(Icons.info_outline, size: 64.h, color: AppColors.greyTextColor),
+            SizedBox(height: 16.h),
+            Text(
+              'No organs selected'.needTranslation,
+              style: TextStyle(
+                fontSize: 18.f,
+                fontWeight: FontWeight.w600,
+                color: AppColors.textColor,
+              ),
+            ),
+            SizedBox(height: 8.h),
+            Text(
+              'Please go back and select organs first'.needTranslation,
+              textAlign: TextAlign.center,
+              style: TextStyle(
+                fontSize: 14.f,
+                color: AppColors.greyTextColor,
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  Widget _buildStickyBottomCard(BuildContext context, SymptomsCheckerViewModel viewModel) {
+    return Container(
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+      child: Column(
+        mainAxisSize: MainAxisSize.min,
+        children: [
+          SizedBox(height: 16.h),
+          Row(
+            children: [
+              Expanded(
+                child: CustomButton(
+                  text: "Previous".needTranslation,
+                  onPressed: _onPreviousPressed,
+                  backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
+                  borderColor: Colors.transparent,
+                  textColor: AppColors.primaryRedColor,
+                  fontSize: 16.f,
+                ),
+              ),
+              SizedBox(width: 12.w),
+              Expanded(
+                child: CustomButton(
+                  text: "Next".needTranslation,
+                  onPressed: () => _onNextPressed(viewModel),
+                  backgroundColor: AppColors.primaryRedColor,
+                  borderColor: AppColors.primaryRedColor,
+                  textColor: AppColors.whiteColor,
+                  fontSize: 16.f,
+                ),
+              ),
+            ],
+          ),
+          SizedBox(height: 24.h),
+        ],
+      ).paddingSymmetrical(24.w, 0),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/triage_progress_screen.dart b/lib/presentation/symptoms_checker/triage_screen.dart
similarity index 94%
rename from lib/presentation/symptoms_checker/triage_progress_screen.dart
rename to lib/presentation/symptoms_checker/triage_screen.dart
index a3d0c1a..4dbe0ca 100644
--- a/lib/presentation/symptoms_checker/triage_progress_screen.dart
+++ b/lib/presentation/symptoms_checker/triage_screen.dart
@@ -14,14 +14,14 @@ 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';
 
-class TriageProgressScreen extends StatefulWidget {
-  const TriageProgressScreen({super.key});
+class TriageScreen extends StatefulWidget {
+  const TriageScreen({super.key});
 
   @override
-  State createState() => _TriageProgressScreenState();
+  State createState() => _TriageScreenState();
 }
 
-class _TriageProgressScreenState extends State {
+class _TriageScreenState extends State {
   late List triageQuestions;
   int currentQuestionIndex = 0;
 
@@ -96,12 +96,14 @@ class _TriageProgressScreenState extends State {
           Expanded(
             child: CollapsingListView(
               title: "Triage".needTranslation,
-              onLeadingTapped: () => _buildConfirmationBottomSheet(
-                  context: context,
-                  onConfirm: () => {
-                        context.pop(),
-                        context.pop(),
-                      }),
+              // onLeadingTapped: () => _buildConfirmationBottomSheet(
+              //     context: context,
+              //     onConfirm: () => {
+              //           context.pop(),
+              //           context.pop(),
+              //         }),
+
+              onLeadingTapped: () => context.pop(),
               child: Column(
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
@@ -176,8 +178,8 @@ class _TriageProgressScreenState extends State {
               height: 24.w,
               decoration: BoxDecoration(
                 color: selected ? AppColors.primaryRedColor : Colors.transparent,
-                borderRadius: BorderRadius.circular(8.r),
-                border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.borderGrayColor, width: 2.w),
+                borderRadius: BorderRadius.circular(5.r),
+                border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.borderGrayColor, width: 1.w),
               ),
               child: selected ? Icon(Icons.check, size: 16.f, color: AppColors.whiteColor) : null,
             ),
diff --git a/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart b/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
index 4c41ddd..34cc049 100644
--- a/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
+++ b/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
@@ -114,15 +114,13 @@ class _InteractiveBodyWidgetState extends State {
 
                       // Tooltip
                       if (widget.tooltipOrganId != null)
-                        ...widget.organs.where((organ) => organ.id == widget.tooltipOrganId).map((organ) {
-                          final centerX = organ.position.x * imageConstraints.maxWidth;
-                          final centerY = organ.position.y * imageConstraints.maxHeight;
-
-                          return OrganTooltipWidget(
-                            organName: organ.name,
-                            position: Offset(centerX, centerY),
-                          );
-                        }),
+                        ...widget.organs.where((organ) => organ.id == widget.tooltipOrganId).map(
+                          (organ) {
+                            final centerX = organ.position.x * imageConstraints.maxWidth;
+                            final centerY = organ.position.y * imageConstraints.maxHeight;
+                            return OrganTooltipWidget(organName: organ.name, position: Offset(centerX, centerY));
+                          },
+                        ),
                     ],
                   );
                 },
diff --git a/lib/presentation/symptoms_checker/widgets/organ_tooltip_widget.dart b/lib/presentation/symptoms_checker/widgets/organ_tooltip_widget.dart
index 77e8319..6c2625b 100644
--- a/lib/presentation/symptoms_checker/widgets/organ_tooltip_widget.dart
+++ b/lib/presentation/symptoms_checker/widgets/organ_tooltip_widget.dart
@@ -18,11 +18,15 @@ class OrganTooltipWidget extends StatelessWidget {
         translation: const Offset(-0.5, -1.2), // Center horizontally, position above the dot
         child: Container(
           padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h),
-          decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.scaffoldBgColor, borderRadius: 8.h),
+          decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+            color: AppColors.scaffoldBgColor,
+            borderRadius: 8.h,
+            hasShadow: true,
+          ),
           child: Text(
             organName,
             style: TextStyle(
-              color: AppColors.primaryRedColor,
+              color: AppColors.textColor,
               fontSize: 12.f,
               fontWeight: FontWeight.w500,
             ),
diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart
index 0e6ec4d..36869f6 100644
--- a/lib/routes/app_routes.dart
+++ b/lib/routes/app_routes.dart
@@ -9,7 +9,8 @@ import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures
 import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/organ_selector_screen.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/possible_conditions_screen.dart';
-import 'package:hmg_patient_app_new/presentation/symptoms_checker/triage_progress_screen.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_selector_screen.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/triage_screen.dart';
 import 'package:hmg_patient_app_new/splashPage.dart';
 
 class AppRoutes {
@@ -25,8 +26,9 @@ class AppRoutes {
 
   // Symptoms Checker
   static const String organSelectorPage = '/organSelectorPage';
+  static const String symptomsCheckerScreen = '/symptomsCheckerScreen';
   static const String possibleConditionsScreen = '/possibleConditionsScreen';
-  static const String triageProgressScreen = '/triageProgressScreen';
+  static const String triageScreen = '/triageProgressScreen';
 
   static Map get routes => {
         initialRoute: (context) => SplashPage(),
@@ -39,7 +41,8 @@ class AppRoutes {
         comprehensiveCheckupPage: (context) => ComprehensiveCheckupPage(),
         homeHealthCarePage: (context) => HhcProceduresPage(),
         organSelectorPage: (context) => OrganSelectorPage(),
+        symptomsCheckerScreen: (context) => SymptomsSelectorScreen(),
         possibleConditionsScreen: (context) => PossibleConditionsScreen(),
-        triageProgressScreen: (context) => TriageProgressScreen()
+        triageScreen: (context) => TriageScreen()
       };
 }
diff --git a/lib/widgets/chip/custom_chip_widget.dart b/lib/widgets/chip/custom_chip_widget.dart
index 5dee4f0..b60db57 100644
--- a/lib/widgets/chip/custom_chip_widget.dart
+++ b/lib/widgets/chip/custom_chip_widget.dart
@@ -67,7 +67,12 @@ class CustomChipWidget extends StatelessWidget {
                 Utils.buildSvgWithAssets(icon: iconAsset!),
                 SizedBox(width: 4.h),
               ],
-              chipText.toText10(isBold: true, color: isSelected ? Colors.white : textColor ?? chipType.color, maxlines: 1, weight: FontWeight.w500, letterSpacing: -0.5),
+              chipText.toText10(
+                  isBold: true,
+                  color: isSelected ? Colors.white : textColor ?? chipType.color,
+                  maxlines: 1,
+                  weight: FontWeight.w500,
+                  letterSpacing: -0.5),
             ],
           ),
         ),
diff --git a/lib/widgets/chip/custom_selectable_chip.dart b/lib/widgets/chip/custom_selectable_chip.dart
new file mode 100644
index 0000000..be42bfd
--- /dev/null
+++ b/lib/widgets/chip/custom_selectable_chip.dart
@@ -0,0 +1,55 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+
+class CustomSelectableChip extends StatelessWidget {
+  final String label;
+  final bool selected;
+  final VoidCallback? onTap;
+  final Color activeColor;
+  final Color activeTextColor;
+  final Color inactiveBorderColor;
+  final Color inactiveTextColor;
+
+  const CustomSelectableChip({
+    super.key,
+    required this.label,
+    required this.selected,
+    this.onTap,
+    this.activeColor = const Color(0xFFD03C32), // red accent
+    this.activeTextColor = Colors.white,
+    this.inactiveBorderColor = const Color(0xFFE8E8E8),
+    this.inactiveTextColor = const Color(0xFF222222),
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    final double radius = 8.0;
+    return AnimatedContainer(
+      duration: const Duration(milliseconds: 180),
+      padding: EdgeInsets.symmetric(horizontal: 14.w, vertical: 8.h),
+      decoration: BoxDecoration(
+        color: selected ? activeColor.withValues(alpha: 0.12) : AppColors.whiteColor,
+        borderRadius: BorderRadius.circular(radius),
+        border: Border.all(
+          color: selected ? activeColor : inactiveBorderColor,
+          width: 1,
+        ),
+      ),
+      child: InkWell(
+        borderRadius: BorderRadius.circular(radius),
+        onTap: onTap,
+        child: Text(
+          label,
+          style: TextStyle(
+            fontSize: 12.f,
+            fontWeight: FontWeight.w500,
+            color: selected ? activeTextColor : inactiveTextColor,
+            letterSpacing: -0.02 * 18,
+            height: 1.0,
+          ),
+        ),
+      ),
+    );
+  }
+}

From 2ffd4cc1aec8f9c6a592d2e22f80dca056dda71b Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Tue, 9 Dec 2025 16:14:47 +0300
Subject: [PATCH 07/55] Integrated the API for Symptoms Checker

---
 assets/json/body_symptoms_data.json           | 22117 ++++++++++++++++
 convert_json.dart                             |    73 +
 lib/core/api_consts.dart                      |    16 +-
 lib/core/dependencies.dart                    |    16 +-
 lib/core/utils/calender_utils_new.dart        |    22 +-
 lib/core/utils/utils.dart                     |     4 +-
 .../{ => data}/organ_mapping_data.dart        |   153 +-
 .../symptoms_checker/models/organ_model.dart  |     6 +-
 .../body_symptom_response_model.dart          |   151 +
 .../models/symptom_model.dart                 |    56 +-
 .../symptoms_checker_repo.dart                |    86 +
 .../symptoms_checker_view_model.dart          |   326 +
 lib/main.dart                                 |     2 +-
 .../widgets/appointment_card.dart             |     2 +-
 .../waiting_appointment_payment_page.dart     |    49 +-
 lib/presentation/home/landing_page.dart       |   596 +-
 .../organ_selector_screen.dart                |     4 +-
 .../possible_conditions_screen.dart           |     2 +-
 .../symptoms_checker/risk_factors_screen.dart |   291 +
 .../symptoms_checker/suggestions_screen.dart  |   292 +
 .../symptoms_checker_view_model.dart          |   240 -
 .../symptoms_selector_screen.dart             |   137 +-
 .../widgets/interactive_body_widget.dart      |     2 +-
 .../widgets/selected_organs_section.dart      |     2 +-
 lib/routes/app_routes.dart                    |     9 +-
 25 files changed, 23933 insertions(+), 721 deletions(-)
 create mode 100644 assets/json/body_symptoms_data.json
 create mode 100644 convert_json.dart
 rename lib/features/symptoms_checker/{ => data}/organ_mapping_data.dart (73%)
 create mode 100644 lib/features/symptoms_checker/models/resp_models/body_symptom_response_model.dart
 create mode 100644 lib/features/symptoms_checker/symptoms_checker_repo.dart
 create mode 100644 lib/features/symptoms_checker/symptoms_checker_view_model.dart
 create mode 100644 lib/presentation/symptoms_checker/risk_factors_screen.dart
 create mode 100644 lib/presentation/symptoms_checker/suggestions_screen.dart
 delete mode 100644 lib/presentation/symptoms_checker/symptoms_checker_view_model.dart

diff --git a/assets/json/body_symptoms_data.json b/assets/json/body_symptoms_data.json
new file mode 100644
index 0000000..f38aa96
--- /dev/null
+++ b/assets/json/body_symptoms_data.json
@@ -0,0 +1,22117 @@
+export const BodySymptomsData = {
+  halfneck: {
+    both: [
+      "s_36",
+      "s_363",
+      "s_418",
+      "s_671",
+      "s_758",
+      "s_965",
+      "s_1388",
+      "s_1483",
+      "s_2465",
+      "s_2971",
+      "s_2954",
+      "s_2953",
+      "s_2941",
+      "s_2940",
+      "s_2939",
+      "s_2481",
+      "s_2467",
+      "s_2248",
+      "s_2247",
+      "s_2173",
+      "s_2163",
+      "s_2060"
+    ]
+  },
+  whole_head: {
+    both: [
+      "s_21",
+      "s_22",
+      "s_23",
+      "s_24",
+      "s_25",
+      "s_60",
+      "s_85",
+      "s_191",
+      "s_214",
+      "s_433",
+      "s_541",
+      "s_604",
+      "s_605",
+      "s_625",
+      "s_799",
+      "s_970",
+      "s_1193",
+      "s_1230",
+      "s_1349",
+      "s_1479",
+      "s_1535",
+      "s_1762",
+      "s_2189",
+      "s_2148",
+      "s_1912",
+      "s_1911",
+      "s_1907",
+      "s_1905",
+      "s_1901",
+      "s_1871",
+      "s_1870",
+      "s_1868",
+      "s_1864",
+      "s_1792",
+      "s_1781",
+      "s_1780",
+      "s_2673",
+      "s_2566",
+      "s_2520",
+      "s_2516",
+      "s_2366",
+      "s_2191",
+      "s_2190",
+      "s_2914",
+      "s_3034",
+      "s_2971"
+    ]
+  },
+  thighs: {
+    both: [
+      "s_73",
+      "s_757",
+      "s_734",
+      "s_1893",
+      "s_2238",
+      "s_2267",
+      "s_2552",
+      "s_38"
+    ]
+  },
+  upperleg: {
+    both: [
+      "s_734",
+      "s_313",
+      "s_273",
+      "s_175",
+      "s_2638",
+      "s_2611",
+      "s_2608",
+      "s_2262",
+      "s_2140",
+      "s_1927",
+      "s_1725",
+      "s_1463",
+      "s_1447",
+      "s_1066"
+    ]
+  },
+  breasts: {
+    female: [
+      "s_1480",
+      "s_609",
+      "s_219",
+      "s_1422",
+      "s_547",
+      "s_300",
+      "s_194",
+      "s_343"
+    ],
+    both: [
+      "s_219",
+      "s_300",
+      "s_342",
+      "s_547",
+      "s_609",
+      "s_1480",
+      "s_1509",
+      "s_2234",
+      "s_3144"
+    ]
+  },
+  lowerleg: {
+    both: [
+      "s_175",
+      "s_2840",
+      "s_2696",
+      "s_2647",
+      "s_2638",
+      "s_2611",
+      "s_2262",
+      "s_2140",
+      "s_1927"
+    ]
+  },
+  buttocks: {
+    both: [
+      "s_11",
+      "s_579",
+      "s_1453",
+      "s_38",
+      "s_436",
+      "s_115",
+      "s_351",
+      "s_355",
+      "s_249",
+      "s_112",
+      "s_71"
+    ]
+  },
+  lower_back: {
+    both: [
+      "s_53",
+      "s_1190",
+      "s_159",
+      "s_663",
+      "s_1339",
+      "s_257",
+      "s_186"
+    ]
+  },
+  skin: {
+    both: [
+      "s_43",
+      "s_254",
+      "s_332",
+      "s_9",
+      "s_388",
+      "s_229",
+      "s_437",
+      "s_224",
+      "s_180",
+      "s_393",
+      "s_234",
+      "s_248",
+      "s_362"
+    ]
+  },
+  lower_limb: {
+    both: [
+      "s_1081",
+      "s_232",
+      "s_273",
+      "s_1063",
+      "s_579",
+      "s_1453",
+      "s_581",
+      "s_11",
+      "s_175",
+      "s_117",
+      "s_743",
+      "s_40",
+      "s_1463",
+      "s_173",
+      "s_1343",
+      "s_313"
+    ]
+  },
+  lower_leg: {
+    both: [
+      "s_581",
+      "s_579",
+      "s_1453",
+      "s_11",
+      "s_38",
+      "s_175",
+      "s_173",
+      "s_148",
+      "s_743",
+      "s_766",
+      "s_83",
+      "s_503",
+      "s_1463"
+    ]
+  },
+  forearm: {
+    both: [
+      "s_580",
+      "s_1447",
+      "s_40",
+      "s_650",
+      "s_268",
+      "s_973",
+      "s_83",
+      "s_1452",
+      "s_972",
+      "s_1426",
+      "s_87"
+    ]
+  },
+  neck_or_throat: {
+    both: [
+      "s_20",
+      "s_509",
+      "s_1367",
+      "s_68",
+      "s_88",
+      "s_102",
+      "s_962",
+      "s_220",
+      "s_363",
+      "s_298",
+      "s_1483",
+      "s_418"
+    ]
+  },
+  ears: {
+    both: [
+      "s_47",
+      "s_208",
+      "s_297",
+      "s_276",
+      "s_255",
+      "s_407"
+    ]
+  },
+  back: {
+    both: [
+      "s_1190",
+      "s_1772",
+      "s_159",
+      "s_257",
+      "s_186"
+    ]
+  },
+  head: {
+    both: [
+      "s_21",
+      "s_370",
+      "p_74",
+      "s_121",
+      "s_478",
+      "s_616",
+      "s_177",
+      "s_1435",
+      "s_388",
+      "s_188",
+      "s_316",
+      "s_156",
+      "s_1543",
+      "s_438"
+    ]
+  },
+  oral_cavity: {
+    both: [
+      "s_551",
+      "s_228",
+      "s_19",
+      "s_172",
+      "s_111",
+      "s_607",
+      "s_200",
+      "s_1",
+      "s_65",
+      "s_247",
+      "s_266",
+      "s_102",
+      "s_67",
+      "s_305"
+    ]
+  },
+  eyes: {
+    both: [
+      "s_493",
+      "s_492",
+      "s_72",
+      "s_1563",
+      "s_122",
+      "s_1492",
+      "s_54",
+      "s_320",
+      "s_207",
+      "s_1465",
+      "s_479",
+      "s_497",
+      "s_235",
+      "s_483",
+      "s_591",
+      "s_621",
+      "s_192",
+      "s_489",
+      "s_606"
+    ]
+  },
+  chest: {
+    both: [
+      "s_50",
+      "s_110",
+      "s_261",
+      "s_534",
+      "s_102",
+      "s_88",
+      "s_1462",
+      "s_474",
+      "s_338"
+    ]
+  },
+  thigh: {
+    both: [
+      "s_579",
+      "s_1453",
+      "s_11",
+      "s_38",
+      "s_175",
+      "s_173",
+      "s_148",
+      "s_581",
+      "s_743",
+      "s_83",
+      "s_503"
+    ]
+  },
+  sexual_organs: {
+    both: [
+      "s_215",
+      "s_39",
+      "s_368",
+      "s_611",
+      "s_113",
+      "s_367",
+      "s_369",
+      "s_153",
+      "s_182",
+      "s_28"
+    ],
+    female: [
+      "s_328",
+      "s_152",
+      "s_32",
+      "s_324",
+      "s_253",
+      "s_59",
+      "s_158",
+      "s_1217",
+      "s_1457",
+      "s_1440",
+      "s_151"
+    ],
+    male: [
+      "s_52",
+      "s_176",
+      "s_349",
+      "s_733"
+    ]
+  },
+  upper_arm: {
+    both: [
+      "s_580",
+      "s_1447",
+      "s_40",
+      "s_650",
+      "s_268",
+      "s_973",
+      "s_83",
+      "s_1452",
+      "s_972",
+      "s_1426",
+      "s_1654",
+      "s_87"
+    ]
+  },
+  upper_limb: {
+    both: [
+      "s_1447",
+      "s_268",
+      "s_973",
+      "s_1452",
+      "s_580",
+      "s_1426",
+      "s_313"
+    ]
+  },
+  elbow: {
+    both: [
+      "s_1632",
+      "s_40",
+      "s_575",
+      "s_174",
+      "s_1447",
+      "s_580",
+      "s_1452"
+    ]
+  },
+  problem_concerning_behavior_or_thoughts: {
+    both: [
+      "s_119",
+      "s_540",
+      "s_143",
+      "s_236",
+      "s_421",
+      "s_169",
+      "s_633",
+      "s_646",
+      "s_145",
+      "s_316",
+      "s_631",
+      "s_348",
+      "s_127",
+      "s_4",
+      "s_198",
+      "s_222",
+      "s_120",
+      "s_660",
+      "s_716"
+    ]
+  },
+  knee: {
+    both: [
+      "s_38",
+      "s_170",
+      "s_581",
+      "s_323",
+      "s_1610",
+      "s_1744",
+      "s_1745",
+      "s_2267",
+      "s_2309",
+      "s_2552",
+      "s_2591",
+      "s_2592",
+      "s_2610",
+      "s_3046",
+      "s_3059"
+    ]
+  },
+  nose: {
+    both: [
+      "s_107",
+      "s_331",
+      "s_252",
+      "s_1095",
+      "s_1435",
+      "s_1429",
+      "s_1303",
+      "s_1471",
+      "s_715",
+      "s_67",
+      "s_505",
+      "s_88"
+    ]
+  },
+  hand: {
+    both: [
+      "s_1430",
+      "s_1639",
+      "s_554",
+      "s_1449",
+      "s_557",
+      "s_1464",
+      "s_1431",
+      "s_1311",
+      "s_258",
+      "s_553",
+      "s_405",
+      "s_1125",
+      "s_555",
+      "s_87",
+      "s_86",
+      "s_564"
+    ]
+  },
+  nape_of_neck: {
+    both: [
+      "s_1483",
+      "s_363",
+      "s_298",
+      "s_418",
+      "s_186"
+    ]
+  },
+  foot: {
+    both: [
+      "s_1621",
+      "s_79",
+      "s_578",
+      "s_26",
+      "s_405",
+      "s_125"
+    ]
+  },
+  abdomin: {
+    both: [
+      "s_1922",
+      "s_1860",
+      "s_1859",
+      "s_1856",
+      "s_1855",
+      "s_1193",
+      "s_1853",
+      "s_1851",
+      "s_1848",
+      "s_1840"
+    ]
+  },
+  upper_abdomen: {
+    both: [
+      "s_13",
+      "s_1387",
+      "s_16",
+      "s_57",
+      "s_299",
+      "s_277",
+      "s_1514",
+      "s_309",
+      "s_329",
+      "s_8",
+      "s_156",
+      "s_305",
+      "s_338"
+    ]
+  },
+  mid_abdomen: {
+    both: [
+      "s_13",
+      "s_1532",
+      "s_14",
+      "s_299",
+      "s_277",
+      "s_1514",
+      "s_309",
+      "s_329",
+      "s_8",
+      "s_156",
+      "s_305",
+      "s_71",
+      "s_112"
+    ],
+    female: [
+      "s_17"
+    ]
+  },
+  lower_abdomen: {
+    both: [
+      "s_13",
+      "s_1598",
+      "s_15",
+      "s_299",
+      "s_277",
+      "s_1514",
+      "s_309",
+      "s_329",
+      "s_8",
+      "s_156",
+      "s_305",
+      "s_71",
+      "s_112"
+    ],
+    female: [
+      "s_17"
+    ]
+  },
+  anus: {
+    both: [
+      "s_436",
+      "s_115",
+      "s_351",
+      "s_355",
+      "s_249",
+      "s_112",
+      "s_71"
+    ]
+  },
+  COMBINATIONS: {
+    whole_head: [
+      "head",
+      "eyes",
+      "nose",
+      "ears",
+      "oral_cavity"
+    ]
+  }
+};
+
+export const SymptomsData = [
+{
+id: "s_1",
+type: "symptom",
+name: "Mouth ulcer",
+common_name: "Mouth sores",
+},
+{
+id: "s_3",
+type: "symptom",
+name: "Sexual dysfunction, sexual activity despite adverse outcomes",
+common_name: "Activity related to sex despite negative consequences",
+},
+{
+id: "s_4",
+type: "symptom",
+name: "Apathy",
+common_name: "Lack of interest, enthusiasm, or concern",
+},
+{
+id: "s_6",
+type: "symptom",
+name: "Appetite for salty foods",
+common_name: "Appetite for salty foods",
+},
+{
+id: "s_7",
+type: "symptom",
+name: "Female infertility",
+common_name: "Female infertility",
+},
+{
+id: "s_8",
+type: "symptom",
+name: "Diarrhea",
+common_name: "Diarrhea",
+},
+{
+id: "s_9",
+type: "symptom",
+name: "Skin pallor",
+common_name: "Pale skin",
+},
+{
+id: "s_10",
+type: "symptom",
+name: "Pale and brittle nails",
+common_name: "Pale and brittle nails",
+},
+{
+id: "s_11",
+type: "symptom",
+name: "Joint pain, hip",
+common_name: "Hip pain",
+},
+{
+id: "s_13",
+type: "symptom",
+name: "Abdominal pain",
+common_name: "Stomach pain",
+},
+{
+id: "s_14",
+type: "symptom",
+name: "Abdominal pain, exacerbating on an empty stomach",
+common_name: "Abdominal pain on empty stomach",
+},
+{
+id: "s_15",
+type: "symptom",
+name: "Abdominal pain, exacerbating during coughing or movement",
+common_name: "Abdominal pain worsens when coughing or moving",
+},
+{
+id: "s_16",
+type: "symptom",
+name: "Abdominal pain, postprandial",
+common_name: "Abdominal pain after eating",
+},
+{
+id: "s_17",
+type: "symptom",
+name: "Abdominal pain, premenstrual",
+common_name: "Cramps before period",
+},
+{
+id: "s_19",
+type: "symptom",
+name: "Gum pain",
+common_name: "Gum pain",
+},
+{
+id: "s_20",
+type: "symptom",
+name: "Pharyngeal pain",
+common_name: "Sore throat",
+},
+{
+id: "s_21",
+type: "symptom",
+name: "Headache",
+common_name: "Headache",
+},
+{
+id: "s_22",
+type: "symptom",
+name: "Headache, unilateral",
+common_name: "Headache located on only one side",
+},
+{
+id: "s_23",
+type: "symptom",
+name: "Headache, pressing",
+common_name: "Pressing or squeezing headache",
+},
+{
+id: "s_24",
+type: "symptom",
+name: "Headache, generalized",
+common_name: "Headache located all over head",
+},
+{
+id: "s_25",
+type: "symptom",
+name: "Headache, pulsating",
+common_name: "Pulsing headache",
+},
+{
+id: "s_28",
+type: "symptom",
+name: "Crotch pain",
+common_name: "Pain in groin or genital area",
+},
+{
+id: "s_30",
+type: "symptom",
+name: "Chest pain, exacerbating with deep breath or cough",
+common_name: "Chest pain worsening with deep breath or cough",
+},
+{
+id: "s_31",
+type: "symptom",
+name: "Chest pain, continuing during rest",
+common_name: "Chest pain continuing after rest",
+},
+{
+id: "s_32",
+type: "symptom",
+name: "Painful vaginal intercourse",
+common_name: "Painful sex",
+},
+{
+id: "s_33",
+type: "symptom",
+name: "Painful ejaculation",
+common_name: "Pain when ejaculating",
+},
+{
+id: "s_34",
+type: "symptom",
+name: "Crotch pain, sudden",
+common_name: "Sudden pain in crotch",
+},
+{
+id: "s_35",
+type: "symptom",
+name: "Chest pain, during physical activity",
+common_name: "Chest pain during physical activity",
+},
+{
+id: "s_36",
+type: "symptom",
+name: "Chest pain, radiating to the neck",
+common_name: "Chest pain spreading to the neck",
+},
+{
+id: "s_37",
+type: "symptom",
+name: "Chest pain, radiating between shoulder blades",
+common_name: "Chest pain spreading to between the shoulder blades",
+},
+{
+id: "s_38",
+type: "symptom",
+name: "Back pain, lumbar, radiates to back of the thigh",
+common_name: "Lower back pain spreading to the back of the thigh or knee",
+},
+{
+id: "s_39",
+type: "symptom",
+name: "Painful urination",
+common_name: "Pain when urinating",
+},
+{
+id: "s_41",
+type: "symptom",
+name: "Joint pain, severe, after trauma",
+common_name: "Severe joint pain after an injury",
+},
+{
+id: "s_43",
+type: "symptom",
+name: "Skin pain, severe",
+common_name: "Severe skin pain",
+},
+{
+id: "s_44",
+type: "symptom",
+name: "Joint pain",
+common_name: "Joint pain",
+},
+{
+id: "s_47",
+type: "symptom",
+name: "Earache",
+common_name: "Earache",
+},
+{
+id: "s_50",
+type: "symptom",
+name: "Chest pain",
+common_name: "Chest pain",
+},
+{
+id: "s_51",
+type: "symptom",
+name: "Chest pain, diffuse",
+common_name: "Widespread chest pain",
+},
+{
+id: "s_52",
+type: "symptom",
+name: "Crotch pain, testicular or scrotal",
+common_name: "Pain in scrotum or testicle",
+},
+{
+id: "s_53",
+type: "symptom",
+name: "Back pain, lumbar",
+common_name: "Lower back pain",
+},
+{
+id: "s_54",
+type: "symptom",
+name: "Pain near eye socket",
+common_name: "Pain around or behind eye",
+},
+{
+id: "s_56",
+type: "symptom",
+name: "Toothache, associated with chewing",
+common_name: "Toothache when chewing",
+},
+{
+id: "s_57",
+type: "symptom",
+name: "Abdominal pain, reduced by defecation or relieving flatulence",
+common_name: "Abdominal pain improves after bowel movement or passing gas",
+},
+{
+id: "s_60",
+type: "symptom",
+name: "Crotch pain, glans penis",
+common_name: "Pain in head of penis",
+},
+{
+id: "s_64",
+type: "symptom",
+name: "Vaginal discharge, unpleasant odour",
+common_name: "Vaginal discharge with unpleasant odour",
+},
+{
+id: "s_65",
+type: "symptom",
+name: "Halitosis",
+common_name: "Bad breath",
+},
+{
+id: "s_67",
+type: "symptom",
+name: "Snoring",
+common_name: "Hoarse or harsh sounds when sleeping",
+},
+{
+id: "s_68",
+type: "symptom",
+name: "Dysphonia",
+common_name: "Hoarse voice",
+},
+{
+id: "s_69",
+type: "symptom",
+name: "Preoccupation with food",
+common_name: "Preoccupation with food",
+},
+{
+id: "s_71",
+type: "symptom",
+name: "Black-coloured stool",
+common_name: "Black stool",
+},
+{
+id: "s_72",
+type: "symptom",
+name: "Red and stinging conjunctivae",
+common_name: "Red and stinging eyes",
+},
+{
+id: "s_73",
+type: "symptom",
+name: "Red stretch marks on abdomen, hips, or thighs",
+common_name: "Red stretch marks on stomach, hips, or thighs",
+},
+{
+id: "s_74",
+type: "symptom",
+name: "Sexual dysfunction, unrestrained sexual encounters",
+common_name: "Sexual activity more often or with more partners than intended",
+},
+{
+id: "s_75",
+type: "symptom",
+name: "Polyuria",
+common_name: "Passing more urine than usual in a day",
+},
+{
+id: "s_79",
+type: "symptom",
+name: "Joint pain, hallux",
+common_name: "Big toe pain",
+},
+{
+id: "s_80",
+type: "symptom",
+name: "Sexual dysfunction, irritability due to lack of sexual activity",
+common_name: "Irritability, when unable to engage in sexual activities",
+},
+{
+id: "s_81",
+type: "symptom",
+name: "Chills",
+common_name: "Chills",
+},
+{
+id: "s_84",
+type: "symptom",
+name: "Tremors, subsides after drinking alcohol",
+common_name: "Trembling subsiding after alcohol",
+},
+{
+id: "s_85",
+type: "symptom",
+name: "Tremors, head",
+common_name: "Head tremors",
+},
+{
+id: "s_86",
+type: "symptom",
+name: "Tremors, one hand",
+common_name: "Trembling of one hand",
+},
+{
+id: "s_87",
+type: "symptom",
+name: "Tremors, both hands",
+common_name: "Trembling of both hands",
+},
+{
+id: "s_88",
+type: "symptom",
+name: "Dyspnea",
+common_name: "Shortness of breath",
+},
+{
+id: "s_90",
+type: "symptom",
+name: "Dyspnea, lasting between 1 day and 4 weeks",
+common_name: "Shortness of breath lasting between 1 day and 4 weeks",
+},
+{
+id: "s_92",
+type: "symptom",
+name: "Dyspnea, started less than 1 hour ago",
+common_name: "Shortness of breath started less than 1 hour ago",
+},
+{
+id: "s_93",
+type: "symptom",
+name: "Smoking, large quantities",
+common_name: "Smoking more than 20 cigarettes a day",
+},
+{
+id: "s_95",
+type: "symptom",
+name: "Discomfort while speaking, maxillo-facial",
+common_name: "Discomfort in the lower half of the face or mouth while speaking",
+},
+{
+id: "s_97",
+type: "symptom",
+name: "Deep filling of treated tooth",
+common_name: "Deep filling of treated tooth",
+},
+{
+id: "s_98",
+type: "symptom",
+name: "Fever",
+common_name: "Fever",
+},
+{
+id: "s_99",
+type: "symptom",
+name: "Fever, between 37°C and 38°C or between 98.6°F and 100.4°F",
+common_name: "Body temperature between 37°C and 38°C or 98.6°F and 100.4°F",
+},
+{
+id: "s_100",
+type: "symptom",
+name: "Fever, between 38°C and 40°C or between 100.4°F and 104°F",
+common_name: "Fever between 38°C and 40°C or between 100.4 and 104°F",
+},
+{
+id: "s_101",
+type: "symptom",
+name: "Skin mass, smaller than 1 cm",
+common_name: "Bump smaller than 1 cm",
+},
+{
+id: "s_102",
+type: "symptom",
+name: "Cough",
+common_name: "Cough",
+},
+{
+id: "s_103",
+type: "symptom",
+name: "Cough, lasting less than 3 weeks",
+common_name: "Cough lasting less than 3 weeks",
+},
+{
+id: "s_104",
+type: "symptom",
+name: "Cough, productive",
+common_name: "Coughing up phlegm",
+},
+{
+id: "s_105",
+type: "symptom",
+name: "Cough, dry",
+common_name: "Dry cough",
+},
+{
+id: "s_106",
+type: "symptom",
+name: "Cough, lasting more than 8 weeks",
+common_name: "Cough lasting more than 8 weeks",
+},
+{
+id: "s_107",
+type: "symptom",
+name: "Nasal catarrh",
+common_name: "Runny nose",
+},
+{
+id: "s_108",
+type: "symptom",
+name: "Deepening of periodontal pockets",
+common_name: "Deepened spaces between the gums and the teeth",
+},
+{
+id: "s_109",
+type: "symptom",
+name: "Alcohol consumption, drinking to ease hangover",
+common_name: "Drinking alcohol to ease hangover",
+},
+{
+id: "s_110",
+type: "symptom",
+name: "Palpitations",
+common_name: "Palpitations",
+},
+{
+id: "s_111",
+type: "symptom",
+name: "Bleeding gums",
+common_name: "Bleeding gums",
+},
+{
+id: "s_112",
+type: "symptom",
+name: "Red-coloured stool",
+common_name: "Red stool",
+},
+{
+id: "s_113",
+type: "symptom",
+name: "Red-coloured urine",
+common_name: "Red urine",
+},
+{
+id: "s_115",
+type: "symptom",
+name: "Bleeding from anus",
+common_name: "Bleeding from anus",
+},
+{
+id: "s_116",
+type: "symptom",
+name: "Hemoptysis",
+common_name: "Coughing up blood",
+},
+{
+id: "s_118",
+type: "symptom",
+name: "Cold sensitivity",
+common_name: "Cold sensitivity",
+},
+{
+id: "s_120",
+type: "symptom",
+name: "Anxiety",
+common_name: "Anxiety",
+},
+{
+id: "s_121",
+type: "symptom",
+name: "Hair loss",
+common_name: "Hair loss",
+},
+{
+id: "s_122",
+type: "symptom",
+name: "Excessive tear production",
+common_name: "Watery eyes",
+},
+{
+id: "s_123",
+type: "symptom",
+name: "Self-neglect",
+common_name: "Lack of self-care",
+},
+{
+id: "s_124",
+type: "symptom",
+name: "Scotoma",
+common_name: "Black spots in vision",
+},
+{
+id: "s_125",
+type: "symptom",
+name: "Paresthesia, both feet",
+common_name: "Feet tingling or numbness",
+},
+{
+id: "s_126",
+type: "symptom",
+name: "Paresthesia, around the mouth",
+common_name: "Tingling or numbness around the mouth",
+},
+{
+id: "s_127",
+type: "symptom",
+name: "Obsessions",
+common_name: "Obsessive thoughts",
+},
+{
+id: "s_131",
+type: "symptom",
+name: "Sleep attacks",
+common_name: "Falling asleep during the day",
+},
+{
+id: "s_132",
+type: "symptom",
+name: "Excess hair growth",
+common_name: "Excessive hair",
+},
+{
+id: "s_134",
+type: "symptom",
+name: "Smoking, need first cigarette of the day",
+common_name: "Difficulty not smoking first cigarette of the day",
+},
+{
+id: "s_136",
+type: "symptom",
+name: "Sneezing attacks",
+common_name: "Sneezing fits",
+},
+{
+id: "s_137",
+type: "symptom",
+name: "Binge eating",
+common_name: "Binge eating",
+},
+{
+id: "s_139",
+type: "symptom",
+name: "Recurrent tonsils inflammation",
+common_name: "Recurrent tonsils inflammation",
+},
+{
+id: "s_142",
+type: "symptom",
+name: "Recurrent gastric ulcers",
+common_name: "Recurrent gastric ulcers",
+},
+{
+id: "s_146",
+type: "symptom",
+name: "Impaired memory, forgetting names of friends and family",
+common_name: "Forgetting names of friends and family",
+},
+{
+id: "s_147",
+type: "symptom",
+name: "History of anemia",
+common_name: "History of anemia",
+},
+{
+id: "s_150",
+type: "symptom",
+name: "Alcohol consumption, inability to stop drinking",
+common_name: "Inability to stop drinking alcohol",
+},
+{
+id: "s_151",
+type: "symptom",
+name: "Abnormal uterine bleeding or spotting, postmenopausal",
+common_name: "Vaginal bleeding after menopause",
+},
+{
+id: "s_152",
+type: "symptom",
+name: "Vaginal bleeding after intercourse",
+common_name: "Bleeding after intercourse",
+},
+{
+id: "s_153",
+type: "symptom",
+name: "Urinary incontinence",
+common_name: "Leaking urine by accident",
+},
+{
+id: "s_155",
+type: "symptom",
+name: "Low sense of self-worth",
+common_name: "Low self-esteem",
+},
+{
+id: "s_156",
+type: "symptom",
+name: "Nausea",
+common_name: "Feeling sick or queasy",
+},
+{
+id: "s_157",
+type: "symptom",
+name: "Fear of obesity",
+common_name: "Fear of obesity",
+},
+{
+id: "s_159",
+type: "symptom",
+name: "Back pain, exacerbated by physical exertion",
+common_name: "Back pain worsening after physical activity",
+},
+{
+id: "s_161",
+type: "symptom",
+name: "Symptoms regularly appearing a few days before menstrual period",
+common_name: "Symptoms regularly appearing a few days before period",
+},
+{
+id: "s_169",
+type: "symptom",
+name: "Episodes of depressed mood",
+common_name: "Depressed mood",
+},
+{
+id: "s_170",
+type: "symptom",
+name: "Edema, knee joint",
+common_name: "Swollen knee",
+},
+{
+id: "s_171",
+type: "symptom",
+name: "Edema, one ankle",
+common_name: "Swollen ankle",
+},
+{
+id: "s_172",
+type: "symptom",
+name: "Swollen gums",
+common_name: "Swollen gums",
+},
+{
+id: "s_173",
+type: "symptom",
+name: "Edema, one lower limb",
+common_name: "Swollen leg",
+},
+{
+id: "s_175",
+type: "symptom",
+name: "Edema, both lower limbs",
+common_name: "Swollen legs",
+},
+{
+id: "s_176",
+type: "symptom",
+name: "Edema, scrotum",
+common_name: "Swollen scrotum",
+},
+{
+id: "s_177",
+type: "symptom",
+name: "Swollen cheek",
+common_name: "Swollen cheek",
+},
+{
+id: "s_180",
+type: "symptom",
+name: "Hypopigmentation of the skin",
+common_name: "Lightening of the skin",
+},
+{
+id: "s_181",
+type: "symptom",
+name: "Sexual dysfunction, persistent sexual desire",
+common_name: "Constant need for sex",
+},
+{
+id: "s_182",
+type: "symptom",
+name: "Nocturia",
+common_name: "Urinating often at night",
+},
+{
+id: "s_183",
+type: "symptom",
+name: "Urination while coughing, laughing, or during physical exertion",
+common_name: "Urination while coughing, laughing, or during physical activity",
+},
+{
+id: "s_185",
+type: "symptom",
+name: "Oliguria",
+common_name: "Urinating less than usual",
+},
+{
+id: "s_186",
+type: "symptom",
+name: "Restricted mobility, difficulty bending over",
+common_name: "Difficulty bending down",
+},
+{
+id: "s_189",
+type: "symptom",
+name: "Seizures, with loss of consciousness",
+common_name: "Seizures with loss of consciousness",
+},
+{
+id: "s_190",
+type: "symptom",
+name: "Loss of consciousness, with urination or defecation",
+common_name: "Fainting with loss of bladder or bowel control",
+},
+{
+id: "s_191",
+type: "symptom",
+name: "Head drop",
+common_name: "Head drop",
+},
+{
+id: "s_192",
+type: "symptom",
+name: "Blepharoptosis",
+common_name: "Drooping eyelids",
+},
+{
+id: "s_194",
+type: "symptom",
+name: "Ulcer, nipple",
+common_name: "Ulcer on the nipple",
+},
+{
+id: "s_195",
+type: "symptom",
+name: "Current cigarette smoking",
+common_name: "Current cigarette smoking",
+},
+{
+id: "s_196",
+type: "symptom",
+name: "Smoking, during illness",
+common_name: "Smoking even when sick",
+},
+{
+id: "s_200",
+type: "symptom",
+name: "Burning tongue",
+common_name: "Burning sensation on tongue",
+},
+{
+id: "s_201",
+type: "symptom",
+name: "Feeling of sand under eyelids",
+common_name: "Feeling of sand under eyelids",
+},
+{
+id: "s_202",
+type: "symptom",
+name: "Erythema migrans",
+common_name: "Expanding red spot with regular skin or clearing in the middle",
+},
+{
+id: "s_203",
+type: "symptom",
+name: "Dental plaque",
+common_name: "Fuzzy teeth",
+},
+{
+id: "s_204",
+type: "symptom",
+name: "Forward-leaning posture",
+common_name: "Forward-leaning posture",
+},
+{
+id: "s_205",
+type: "symptom",
+name: "Feeling of guilt",
+common_name: "Feeling of guilt",
+},
+{
+id: "s_207",
+type: "symptom",
+name: "Diplopia",
+common_name: "Double vision",
+},
+{
+id: "s_208",
+type: "symptom",
+name: "Decreased hearing",
+common_name: "Decreased hearing",
+},
+{
+id: "s_213",
+type: "symptom",
+name: "Sexual dysfunction, spending much time on erotic activities",
+common_name: "Spending a lot of time on sex-related activity",
+},
+{
+id: "s_214",
+type: "symptom",
+name: "Sweating on painful side of forehead",
+common_name: "Sweating on painful side of forehead",
+},
+{
+id: "s_215",
+type: "symptom",
+name: "Frequent urination",
+common_name: "Urinating often",
+},
+{
+id: "s_216",
+type: "symptom",
+name: "Excessive sweating",
+common_name: "Heavy sweating",
+},
+{
+id: "s_217",
+type: "symptom",
+name: "Night sweats",
+common_name: "Night sweats",
+},
+{
+id: "s_219",
+type: "symptom",
+name: "Enlarged breasts",
+common_name: "Enlarged breasts",
+},
+{
+id: "s_220",
+type: "symptom",
+name: "Enlarged lymph nodes",
+common_name: "Enlarged lymph nodes",
+},
+{
+id: "s_221",
+type: "symptom",
+name: "Dermatological changes, on genitals resembling cauliflower",
+common_name: "Bumps on genitals resembling a cauliflower",
+},
+{
+id: "s_223",
+type: "symptom",
+name: "Inability to stop flow of urine",
+common_name: "Inability to stop flow of urine",
+},
+{
+id: "s_225",
+type: "symptom",
+name: "Premature graying",
+common_name: "Premature graying",
+},
+{
+id: "s_226",
+type: "symptom",
+name: "Weight gain",
+common_name: "Weight gain",
+},
+{
+id: "s_227",
+type: "symptom",
+name: "Tachypnea",
+common_name: "Rapid breathing",
+},
+{
+id: "s_228",
+type: "symptom",
+name: "Loose tooth unrelated to a tooth exchange",
+common_name: "Loose teeth",
+},
+{
+id: "s_229",
+type: "symptom",
+name: "Erythema",
+common_name: "Redness of skin",
+},
+{
+id: "s_230",
+type: "symptom",
+name: "Erythema, facial, butterfly-shaped",
+common_name: "Redness only on the cheeks and nose",
+},
+{
+id: "s_231",
+type: "symptom",
+name: "Toothache, associated with heat",
+common_name: "Toothache associated with heat",
+},
+{
+id: "s_232",
+type: "symptom",
+name: "Calf pain, severe while walking",
+common_name: "Severe pain in calf while walking",
+},
+{
+id: "s_233",
+type: "symptom",
+name: "Toothache, severe",
+common_name: "Severe toothache",
+},
+{
+id: "s_234",
+type: "symptom",
+name: "Easy bruising",
+common_name: "Easy bruising",
+},
+{
+id: "s_235",
+type: "symptom",
+name: "Eyelid twitching",
+common_name: "Trembling eyelids",
+},
+{
+id: "s_236",
+type: "symptom",
+name: "Decreased libido",
+common_name: "Loss of interest in sex",
+},
+{
+id: "s_237",
+type: "symptom",
+name: "Weight loss, without loss of appetite",
+common_name: "Weight loss without loss of appetite",
+},
+{
+id: "s_238",
+type: "symptom",
+name: "Slower gait",
+common_name: "Slower walk",
+},
+{
+id: "s_241",
+type: "symptom",
+name: "Dermatological changes",
+common_name: "Skin changes",
+},
+{
+id: "s_243",
+type: "symptom",
+name: "Unhealthy weight loss practices",
+common_name: "Unhealthy weight loss practices",
+},
+{
+id: "s_244",
+type: "symptom",
+name: "Fear of specific object, situation, or action",
+common_name: "Specific fear",
+},
+{
+id: "s_245",
+type: "symptom",
+name: "Dermatological changes, scabs",
+common_name: "Scab or crust",
+},
+{
+id: "s_247",
+type: "symptom",
+name: "Dry mouth",
+common_name: "Dry mouth",
+},
+{
+id: "s_249",
+type: "symptom",
+name: "Itching around anus",
+common_name: "Itchy anus",
+},
+{
+id: "s_250",
+type: "symptom",
+name: "Pruritus, most intense at night",
+common_name: "Itching most intense at night",
+},
+{
+id: "s_251",
+type: "symptom",
+name: "Pruritus, aggravated by change in temperature, sweating, or wearing wool",
+common_name: "Itching aggravated by changes in temperature, sweat or wearing wool",
+},
+{
+id: "s_252",
+type: "symptom",
+name: "Itching nose or throat",
+common_name: "Itchy nose or throat",
+},
+{
+id: "s_253",
+type: "symptom",
+name: "Genital itch",
+common_name: "Itching in crotch",
+},
+{
+id: "s_254",
+type: "symptom",
+name: "Pruritus",
+common_name: "Itching",
+},
+{
+id: "s_255",
+type: "symptom",
+name: "Itching inside ear",
+common_name: "Itchy inner ear",
+},
+{
+id: "s_256",
+type: "symptom",
+name: "Trismus",
+common_name: "Difficulty in opening mouth",
+},
+{
+id: "s_257",
+type: "symptom",
+name: "Spine stiffness in the morning",
+common_name: "Stiff spine in the morning",
+},
+{
+id: "s_258",
+type: "symptom",
+name: "Joint stiffness, hand stiffness in the morning",
+common_name: "Stiff hands in the morning",
+},
+{
+id: "s_259",
+type: "symptom",
+name: "Joint stiffness, subsides after exercising",
+common_name: "Joint stiffness disappears after exercise",
+},
+{
+id: "s_261",
+type: "symptom",
+name: "Tachycardia",
+common_name: "Fast heart rate",
+},
+{
+id: "s_263",
+type: "symptom",
+name: "Phimosis",
+common_name: "Difficulty retracting foreskin",
+},
+{
+id: "s_265",
+type: "symptom",
+name: "Smoking, in non-smoking areas",
+common_name: "Smoking in non-smoking areas",
+},
+{
+id: "s_266",
+type: "symptom",
+name: "Difficulty biting and chewing",
+common_name: "Difficulty biting and chewing",
+},
+{
+id: "s_267",
+type: "symptom",
+name: "Toothache, difficulty determining which tooth hurts",
+common_name: "Difficulty identifying which tooth hurts",
+},
+{
+id: "s_269",
+type: "symptom",
+name: "Difficulty acquiring new information",
+common_name: "Difficulty learning new things",
+},
+{
+id: "s_270",
+type: "symptom",
+name: "Creaking joints during movement",
+common_name: "Creaking joints during movement",
+},
+{
+id: "s_271",
+type: "symptom",
+name: "Smooth face without wrinkles",
+common_name: "Smooth face without wrinkles",
+},
+{
+id: "s_272",
+type: "symptom",
+name: "Enamel lesions, caries",
+common_name: "Cavities",
+},
+{
+id: "s_273",
+type: "symptom",
+name: "Heavy legs at the end of the day",
+common_name: "Heavy legs at the end of the day",
+},
+{
+id: "s_274",
+type: "symptom",
+name: "Feeling hot",
+common_name: "Feeling hot",
+},
+{
+id: "s_276",
+type: "symptom",
+name: "Clogged ear",
+common_name: "Clogged ear",
+},
+{
+id: "s_277",
+type: "symptom",
+name: "Increased abdominal girth",
+common_name: "Increased abdominal size",
+},
+{
+id: "s_279",
+type: "symptom",
+name: "Feeling pressure or pulsation inside the tooth",
+common_name: "Feeling pressure or pulsation inside the tooth",
+},
+{
+id: "s_280",
+type: "symptom",
+name: "Hot flashes",
+common_name: "Hot flashes",
+},
+{
+id: "s_284",
+type: "symptom",
+name: "Diminished appetite",
+common_name: "Diminished appetite",
+},
+{
+id: "s_285",
+type: "symptom",
+name: "Weight loss",
+common_name: "Weight loss",
+},
+{
+id: "s_287",
+type: "symptom",
+name: "Anhedonia, lasting at least 2 weeks",
+common_name: "Inability to feel pleasure for 2 weeks or more",
+},
+{
+id: "s_289",
+type: "symptom",
+name: "Malocclusions",
+common_name: "Malocclusions",
+},
+{
+id: "s_291",
+type: "symptom",
+name: "Ear canal swelling",
+common_name: "Swelling inside the ear",
+},
+{
+id: "s_297",
+type: "symptom",
+name: "Discharge from ear",
+common_name: "Discharge from ear",
+},
+{
+id: "s_299",
+type: "symptom",
+name: "Abdominal mass",
+common_name: "Lump in stomach",
+},
+{
+id: "s_300",
+type: "symptom",
+name: "Nodule located in breast",
+common_name: "Lump in the breast",
+},
+{
+id: "s_301",
+type: "symptom",
+name: "Discharge under foreskin",
+common_name: "Discharge under foreskin",
+},
+{
+id: "s_302",
+type: "symptom",
+name: "Discharge from periodontal pockets",
+common_name: "Discharge from spaces between the gums and teeth",
+},
+{
+id: "s_303",
+type: "symptom",
+name: "Compulsions",
+common_name: "Compulsive behavior",
+},
+{
+id: "s_305",
+type: "symptom",
+name: "Vomiting",
+common_name: "Vomiting",
+},
+{
+id: "s_306",
+type: "symptom",
+name: "Hematemesis",
+common_name: "Vomiting blood",
+},
+{
+id: "s_308",
+type: "symptom",
+name: "Smoking, mostly in the morning",
+common_name: "Smoking mostly in the morning",
+},
+{
+id: "s_309",
+type: "symptom",
+name: "Bloating",
+common_name: "Bloating",
+},
+{
+id: "s_310",
+type: "symptom",
+name: "Increased thirst",
+common_name: "More thirsty than usual",
+},
+{
+id: "s_311",
+type: "symptom",
+name: "Increased appetite",
+common_name: "More hungry than usual",
+},
+{
+id: "s_313",
+type: "symptom",
+name: "Sensory loss in one limb",
+common_name: "Loss of feeling in one arm or leg",
+},
+{
+id: "s_316",
+type: "symptom",
+name: "Impaired memory",
+common_name: "Impaired memory",
+},
+{
+id: "s_317",
+type: "symptom",
+name: "Impaired balance while walking",
+common_name: "Stumbling or losing balance while walking",
+},
+{
+id: "s_319",
+type: "symptom",
+name: "Sleep disorder",
+common_name: "Changes and difficulties in sleeping pattern or habit",
+},
+{
+id: "s_320",
+type: "symptom",
+name: "Impaired vision",
+common_name: "Visual impairment",
+},
+{
+id: "s_322",
+type: "symptom",
+name: "Gum erythema",
+common_name: "Red gums",
+},
+{
+id: "s_323",
+type: "symptom",
+name: "Erythema, joint",
+common_name: "Redness of skin over joint",
+},
+{
+id: "s_325",
+type: "symptom",
+name: "Erythema, limb",
+common_name: "Red skin on arms or legs",
+},
+{
+id: "s_326",
+type: "symptom",
+name: "Sexual dysfunction, prioritizing sex over duties and hobbies",
+common_name: "Neglecting family  work or hobbies due to sex",
+},
+{
+id: "s_327",
+type: "symptom",
+name: "Smoking, need when waking up",
+common_name: "Smoking as soon as waking up",
+},
+{
+id: "s_328",
+type: "symptom",
+name: "Abnormal vaginal discharge",
+common_name: "Abnormal vaginal discharge",
+},
+{
+id: "s_329",
+type: "symptom",
+name: "Constipation",
+common_name: "Constipation",
+},
+{
+id: "s_330",
+type: "symptom",
+name: "Regurgitation",
+common_name: "Food coming back up into the mouth",
+},
+{
+id: "s_331",
+type: "symptom",
+name: "Nasal congestion",
+common_name: "Blocked nose",
+},
+{
+id: "s_332",
+type: "symptom",
+name: "Jaundice",
+common_name: "Jaundice",
+},
+{
+id: "s_334",
+type: "symptom",
+name: "Jaundice, stress-related",
+common_name: "Yellow skin or eyes during times of increased stress",
+},
+{
+id: "s_335",
+type: "symptom",
+name: "Jaundice, following intense physical exertion",
+common_name: "Yellow skin or eyes after physical activity",
+},
+{
+id: "s_336",
+type: "symptom",
+name: "Jaundice, during infectious disease",
+common_name: "Yellow skin or eyes during infectious disease",
+},
+{
+id: "s_338",
+type: "symptom",
+name: "Heartburn",
+common_name: "Heartburn",
+},
+{
+id: "s_341",
+type: "symptom",
+name: "Illusion of surroundings being bigger or smaller than they actually are",
+common_name: "Illusion of surroundings being bigger or smaller than they actually are",
+},
+{
+id: "s_342",
+type: "symptom",
+name: "Wrinkling or dimpling of skin on breast",
+common_name: "Wrinkling or dimpling of skin on breast",
+},
+{
+id: "s_343",
+type: "symptom",
+name: "Retraction or indentation of nipple",
+common_name: "Change in the nipple",
+},
+{
+id: "s_345",
+type: "symptom",
+name: "Change in handwriting",
+common_name: "Change in handwriting",
+},
+{
+id: "s_346",
+type: "symptom",
+name: "Change in colour of a tooth",
+common_name: "Change in colour of a tooth",
+},
+{
+id: "s_348",
+type: "symptom",
+name: "Personality changes",
+common_name: "Personality changes",
+},
+{
+id: "s_350",
+type: "symptom",
+name: "Dermatological changes, forming a line",
+common_name: "Skin changes forming a line",
+},
+{
+id: "s_351",
+type: "symptom",
+name: "Ulcer, sore, or abscess near the anus",
+common_name: "Ulcer, sore, or abscess near the anus",
+},
+{
+id: "s_352",
+type: "symptom",
+name: "Dermatological changes, in direct contact with buttons, fasteners, or cosmetics",
+common_name: "Skin changes in direct contact with buttons, fasteners, jewelry, or cosmetics",
+},
+{
+id: "s_358",
+type: "symptom",
+name: "Intermittent urine flow",
+common_name: "Intermittent urine flow",
+},
+{
+id: "s_359",
+type: "symptom",
+name: "Joint deformity, non-traumatic",
+common_name: "Joint deformity not associated with recent trauma",
+},
+{
+id: "s_360",
+type: "symptom",
+name: "Microstomia",
+common_name: "Narrow mouth",
+},
+{
+id: "s_361",
+type: "symptom",
+name: "Sexual dysfunction, increased longing for stimulation",
+common_name: "Increased need in sexual experiences or sensations to attain desired effect",
+},
+{
+id: "s_362",
+type: "symptom",
+name: "Oily skin",
+common_name: "Greasy or oily skin",
+},
+{
+id: "s_363",
+type: "symptom",
+name: "Edema, neck",
+common_name: "Swollen neck",
+},
+{
+id: "s_369",
+type: "symptom",
+name: "Discharge from urethra",
+common_name: "Discharge from urethra",
+},
+{
+id: "s_370",
+type: "symptom",
+name: "Dizziness",
+common_name: "Dizzy",
+},
+{
+id: "s_371",
+type: "symptom",
+name: "Overworked",
+common_name: "Overworked",
+},
+{
+id: "s_373",
+type: "symptom",
+name: "Honey-coloured crust on the skin",
+common_name: "Honey-coloured scabs on the skin",
+},
+{
+id: "s_376",
+type: "symptom",
+name: "Skin phototype I or II",
+common_name: "Light or fair skin that easily burns",
+},
+{
+id: "s_377",
+type: "symptom",
+name: "Numerous nevi",
+common_name: "Many moles or birthmarks",
+},
+{
+id: "s_380",
+type: "symptom",
+name: "Suspicious mole or birthmark, asymmetrical",
+common_name: "Asymmetric mole or birthmark",
+},
+{
+id: "s_381",
+type: "symptom",
+name: "Suspicious mole or birthmark, irregular border",
+common_name: "Mole or birthmark with irregular border",
+},
+{
+id: "s_382",
+type: "symptom",
+name: "Suspicious mole or birthmark, larger than 6 mm",
+common_name: "Mole or birthmark larger than 6 mm",
+},
+{
+id: "s_383",
+type: "symptom",
+name: "Suspicious mole or birthmark",
+common_name: "Suspicious mole or birthmark",
+},
+{
+id: "s_384",
+type: "symptom",
+name: "Red macules with silver-white, flaky scales",
+common_name: "Red skin patches with silver-white, flaky scales",
+},
+{
+id: "s_385",
+type: "symptom",
+name: "Dry, cracked skin, bleeding occasionally",
+common_name: "Dry, cracked skin, bleeding occasionally",
+},
+{
+id: "s_386",
+type: "symptom",
+name: "Thickened nails, with pits or grooves",
+common_name: "Thickened nails with pits or grooves",
+},
+{
+id: "s_388",
+type: "symptom",
+name: "Pustule",
+common_name: "Small bumps less than 1 cm filled with pus",
+},
+{
+id: "s_389",
+type: "symptom",
+name: "Open comedones",
+common_name: "Blackheads",
+},
+{
+id: "s_393",
+type: "symptom",
+name: "Urticaria",
+common_name: "Hives",
+},
+{
+id: "s_398",
+type: "symptom",
+name: "Dermatological changes, entire body",
+common_name: "Skin changes all over the body",
+},
+{
+id: "s_400",
+type: "symptom",
+name: "Dermatological changes, preceded by pain or itching",
+common_name: "Skin changes preceded by pain or itching",
+},
+{
+id: "s_402",
+type: "symptom",
+name: "Dermatological changes, recurring during infections or menstrual period",
+common_name: "Skin changes recurring during period or infections",
+},
+{
+id: "s_404",
+type: "symptom",
+name: "Dermatological changes, rough and irregular surface",
+common_name: "Skin changes with rough, irregular surface",
+},
+{
+id: "s_407",
+type: "symptom",
+name: "Tinnitus",
+common_name: "Ringing in ears",
+},
+{
+id: "s_408",
+type: "symptom",
+name: "Cold feet and toes",
+common_name: "Cold feet and toes",
+},
+{
+id: "s_410",
+type: "symptom",
+name: "Reduced body temperature",
+common_name: "Reduced body temperature",
+},
+{
+id: "s_412",
+type: "symptom",
+name: "Diarrhea, foamy",
+common_name: "Foamy diarrhea",
+},
+{
+id: "s_418",
+type: "symptom",
+name: "Stiff neck",
+common_name: "Stiff neck",
+},
+{
+id: "s_419",
+type: "symptom",
+name: "Feeling overweight despite normal to low weight",
+common_name: "Feeling overweight despite normal to low weight",
+},
+{
+id: "s_420",
+type: "symptom",
+name: "Lying about eating or hiding food",
+common_name: "Lying about eating or hiding food",
+},
+{
+id: "s_421",
+type: "symptom",
+name: "Increased libido",
+common_name: "Increased sex drive",
+},
+{
+id: "s_422",
+type: "symptom",
+name: "Deepening of voice",
+common_name: "Deepened voice",
+},
+{
+id: "s_423",
+type: "symptom",
+name: "Sense of self-worth dependent on weight",
+common_name: "Self-worth based on weight",
+},
+{
+id: "s_424",
+type: "symptom",
+name: "Facial pain, unilateral",
+common_name: "Face pain on one side",
+},
+{
+id: "s_425",
+type: "symptom",
+name: "Facial pain, stabbing",
+common_name: "Stabbing face pain",
+},
+{
+id: "s_426",
+type: "symptom",
+name: "Facial pain, triggered by eating, or touching or brushing teeth",
+common_name: "Face pain triggered by eating, or touching or brushing teeth",
+},
+{
+id: "s_427",
+type: "symptom",
+name: "Facial pain, periodic",
+common_name: "Periodic face pain",
+},
+{
+id: "s_429",
+type: "symptom",
+name: "Clicking or cracking in the jaw when opening or closing the mouth",
+common_name: "Clicking or cracking in the jaw when opening or closing the mouth",
+},
+{
+id: "s_430",
+type: "symptom",
+name: "Pain in temporomandibular joint during movement",
+common_name: "Pain in jaw during movement",
+},
+{
+id: "s_433",
+type: "symptom",
+name: "Erythema, foreskin or head of the penis",
+common_name: "Reddened foreskin or head of the penis",
+},
+{
+id: "s_435",
+type: "symptom",
+name: "Feeling of incomplete evacuation of the bladder",
+common_name: "Bladder not emptying completely",
+},
+{
+id: "s_436",
+type: "symptom",
+name: "Anorectal pain",
+common_name: "Anorectal pain",
+},
+{
+id: "s_437",
+type: "symptom",
+name: "Cyanosis",
+common_name: "Bluish-grey coloured skin",
+},
+{
+id: "s_471",
+type: "symptom",
+name: "Abdominal pain, radiating to right shoulder or shoulder blade",
+common_name: "Abdominal pain spreading to the right shoulder area",
+},
+{
+id: "s_474",
+type: "symptom",
+name: "Audible wheezing",
+common_name: "Whistling sound made while breathing",
+},
+{
+id: "s_476",
+type: "symptom",
+name: "Earache, tenderness around the ear",
+common_name: "Pain when pressing area around the ear",
+},
+{
+id: "s_477",
+type: "symptom",
+name: "Aphonia",
+common_name: "Loss of voice",
+},
+{
+id: "s_478",
+type: "symptom",
+name: "Facial pain",
+common_name: "Face pain",
+},
+{
+id: "s_479",
+type: "symptom",
+name: "Nystagmus",
+common_name: "Nystagmus",
+},
+{
+id: "s_480",
+type: "symptom",
+name: "Enlargement of hands, feet, or face",
+common_name: "Enlargement of hands, feet, or face",
+},
+{
+id: "s_483",
+type: "symptom",
+name: "Dermatological changes, eyelid",
+common_name: "Skin changes on eyelid",
+},
+{
+id: "s_484",
+type: "symptom",
+name: "Eyelid lesion, red lump with yellow tip",
+common_name: "Red lump with yellow tip on eyelid",
+},
+{
+id: "s_485",
+type: "symptom",
+name: "Eyelid lesion, painful",
+common_name: "Painful skin changes on eyelid",
+},
+{
+id: "s_486",
+type: "symptom",
+name: "Eyelid lesion, red and warm",
+common_name: "Red and warm skin changes on eyelid",
+},
+{
+id: "s_488",
+type: "symptom",
+name: "Eyes sensitive to light",
+common_name: "Light sensitivity",
+},
+{
+id: "s_489",
+type: "symptom",
+name: "Dry discharge on eyelids",
+common_name: "Dry discharge on eyelids",
+},
+{
+id: "s_492",
+type: "symptom",
+name: "Red eye",
+common_name: "Red eye",
+},
+{
+id: "s_493",
+type: "symptom",
+name: "Eye pain",
+common_name: "Eye pain",
+},
+{
+id: "s_494",
+type: "symptom",
+name: "Visual field narrowing",
+common_name: "Tunnel vision",
+},
+{
+id: "s_497",
+type: "symptom",
+name: "Anisocoria",
+common_name: "Asymmetric pupils",
+},
+{
+id: "s_501",
+type: "symptom",
+name: "Distance misjudgment",
+common_name: "Problems judging distances",
+},
+{
+id: "s_503",
+type: "symptom",
+name: "Muscle cramps",
+common_name: "Muscle cramps",
+},
+{
+id: "s_504",
+type: "symptom",
+name: "Foamy urine",
+common_name: "Foamy urine",
+},
+{
+id: "s_505",
+type: "symptom",
+name: "Frequent infections",
+common_name: "Frequent infections",
+},
+{
+id: "s_506",
+type: "symptom",
+name: "Skin mark from insect or bug bite",
+common_name: "Insect bite",
+},
+{
+id: "s_507",
+type: "symptom",
+name: "Loss of will to live",
+common_name: "Loss of will to live",
+},
+{
+id: "s_508",
+type: "symptom",
+name: "Anhedonia",
+common_name: "Inability to feel pleasure",
+},
+{
+id: "s_509",
+type: "symptom",
+name: "Odynophagia",
+common_name: "Painful swallowing",
+},
+{
+id: "s_510",
+type: "symptom",
+name: "Urethral discharge when pressing the penis",
+common_name: "Discharge when pressing penis",
+},
+{
+id: "s_513",
+type: "symptom",
+name: "Globus sensation",
+common_name: "Feeling of lump in throat",
+},
+{
+id: "s_514",
+type: "symptom",
+name: "Derealization",
+common_name: "Feeling detached from onessurroundings",
+},
+{
+id: "s_518",
+type: "symptom",
+name: "Paresthesia",
+common_name: "Tingling or numbness",
+},
+{
+id: "s_524",
+type: "symptom",
+name: "Nasal polyps",
+common_name: "Polyps in nose",
+},
+{
+id: "s_525",
+type: "symptom",
+name: "Foul-smelling stools",
+common_name: "Foul-smelling stools",
+},
+{
+id: "s_526",
+type: "symptom",
+name: "Cough, productive with yellow or green sputum",
+common_name: "Coughing up thick, yellow or green phlegm",
+},
+{
+id: "s_528",
+type: "symptom",
+name: "Alcohol consumption, less than 24 hours ago",
+common_name: "Drinking alcohol less than 24 hours ago",
+},
+{
+id: "s_529",
+type: "symptom",
+name: "Parotid swelling",
+common_name: "Parotid swelling",
+},
+{
+id: "s_530",
+type: "symptom",
+name: "Sudden increase in blood pressure",
+common_name: "Sudden increase in blood pressure",
+},
+{
+id: "s_531",
+type: "symptom",
+name: "Frequent infections, upper respiratory tract",
+common_name: "Frequent runny nose, cough",
+},
+{
+id: "s_532",
+type: "symptom",
+name: "Frequent infections, lower respiratory tract",
+common_name: "Frequent bronchitis",
+},
+{
+id: "s_533",
+type: "symptom",
+name: "Hypotension",
+common_name: "Low blood pressure",
+},
+{
+id: "s_534",
+type: "symptom",
+name: "Bradycardia",
+common_name: "Slow heart rate",
+},
+{
+id: "s_535",
+type: "symptom",
+name: "Decreased pupillary light reflex",
+common_name: "Decreased pupillary light reflex",
+},
+{
+id: "s_536",
+type: "symptom",
+name: "Mydriasis",
+common_name: "Dilated pupils",
+},
+{
+id: "s_537",
+type: "symptom",
+name: "Miosis",
+common_name: "Constricted pupils",
+},
+{
+id: "s_538",
+type: "symptom",
+name: "Tremors",
+common_name: "Muscles trembling",
+},
+{
+id: "s_539",
+type: "symptom",
+name: "Seizures, without loss of consciousness",
+common_name: "Seizures without loss of consciousness",
+},
+{
+id: "s_540",
+type: "symptom",
+name: "Irritability",
+common_name: "Irritability",
+},
+{
+id: "s_541",
+type: "symptom",
+name: "Orthostatic hypotension",
+common_name: "Dizzy or lightheaded after standing up",
+},
+{
+id: "s_542",
+type: "symptom",
+name: "Dry skin",
+common_name: "Dry skin",
+},
+{
+id: "s_543",
+type: "symptom",
+name: "Blood pressure, elevated",
+common_name: "High blood pressure",
+},
+{
+id: "s_545",
+type: "symptom",
+name: "Telangiectasias",
+common_name: "Spider veins",
+},
+{
+id: "s_547",
+type: "symptom",
+name: "Galactorrhea in women",
+common_name: "Milky discharge from the nipple outside of breastfeeding period",
+},
+{
+id: "s_550",
+type: "symptom",
+name: "Lens clouding",
+common_name: "Cloudy appearance of either eye",
+},
+{
+id: "s_551",
+type: "symptom",
+name: "Toothache",
+common_name: "Toothache",
+},
+{
+id: "s_553",
+type: "symptom",
+name: "Cyanosis, fingers",
+common_name: "Grayish-blue fingers",
+},
+{
+id: "s_554",
+type: "symptom",
+name: "Pain in upper limb, hand or fingers",
+common_name: "Pain in hand or fingers",
+},
+{
+id: "s_555",
+type: "symptom",
+name: "Tingling fingers",
+common_name: "Tingling fingers",
+},
+{
+id: "s_556",
+type: "symptom",
+name: "Cold hands or fingers",
+common_name: "Cold hands or fingers",
+},
+{
+id: "s_557",
+type: "symptom",
+name: "Erythema, hands",
+common_name: "Red hand",
+},
+{
+id: "s_558",
+type: "symptom",
+name: "Symptoms exacerbated by low temperature",
+common_name: "Symptoms worse in the cold",
+},
+{
+id: "s_561",
+type: "symptom",
+name: "Belching",
+common_name: "Burping",
+},
+{
+id: "s_562",
+type: "symptom",
+name: "Edema, pitting",
+common_name: "Pitting edema",
+},
+{
+id: "s_563",
+type: "symptom",
+name: "Dyspnea, orthopnea",
+common_name: "Shortness of breath when lying down",
+},
+{
+id: "s_564",
+type: "symptom",
+name: "Loss of muscle mass, hands",
+common_name: "Loss of muscles in hands",
+},
+{
+id: "s_567",
+type: "symptom",
+name: "Murphyssign",
+common_name: "Stomach pain on deep inhalation and simultaneous pressing right upper part of abdomen",
+},
+{
+id: "s_568",
+type: "symptom",
+name: "Binge eating, followed by self-disgust",
+common_name: "Self-disgust after binge eating",
+},
+{
+id: "s_569",
+type: "symptom",
+name: "Pale or clay-colored stool",
+common_name: "Pale stool",
+},
+{
+id: "s_570",
+type: "symptom",
+name: "Hypopyon",
+common_name: "Collection of pus in front of the eye",
+},
+{
+id: "s_571",
+type: "symptom",
+name: "Spasticity",
+common_name: "Tight and spasming muscles",
+},
+{
+id: "s_572",
+type: "symptom",
+name: "Reduced degree of facial expression",
+common_name: "Face lacking expression or animation",
+},
+{
+id: "s_575",
+type: "symptom",
+name: "Joint stiffness",
+common_name: "Stiff joints",
+},
+{
+id: "s_576",
+type: "symptom",
+name: "Joint pain, aggravated by cold or damp weather",
+common_name: "Joint pain aggravated by cold or damp weather",
+},
+{
+id: "s_578",
+type: "symptom",
+name: "Foot pain",
+common_name: "Pain in one foot",
+},
+{
+id: "s_579",
+type: "symptom",
+name: "Pain in lower limb",
+common_name: "Pain in lower limb",
+},
+{
+id: "s_580",
+type: "symptom",
+name: "Pain in upper limb",
+common_name: "Pain in upper limb",
+},
+{
+id: "s_581",
+type: "symptom",
+name: "Joint pain, one knee",
+common_name: "Pain in one knee",
+},
+{
+id: "s_582",
+type: "symptom",
+name: "Anxiety attack",
+common_name: "Anxiety attack",
+},
+{
+id: "s_583",
+type: "symptom",
+name: "General anxiety",
+common_name: "General anxiety",
+},
+{
+id: "s_584",
+type: "symptom",
+name: "Suspicious mole or birthmark, change in shape",
+common_name: "Change in shape of mole or birthmark",
+},
+{
+id: "s_585",
+type: "symptom",
+name: "Suspicious mole or birthmark, change in colour",
+common_name: "Change in colour of mole or birthmark",
+},
+{
+id: "s_586",
+type: "symptom",
+name: "Gynecomastia",
+common_name: "Breast enlargement in man",
+},
+{
+id: "s_588",
+type: "symptom",
+name: "Alcohol consumption, increasing tolerance",
+common_name: "Alcohol tolerance",
+},
+{
+id: "s_590",
+type: "symptom",
+name: "Tremors, tongue",
+common_name: "Trembling of tongue",
+},
+{
+id: "s_593",
+type: "symptom",
+name: "Prolonged bleeding time",
+common_name: "Prolonged bleeding time",
+},
+{
+id: "s_594",
+type: "symptom",
+name: "Petechiae",
+common_name: "Red or purple spots not fading under pressure smaller than 3 mm",
+},
+{
+id: "s_598",
+type: "symptom",
+name: "Abscess",
+common_name: "Reddened, swollen and painful skin change",
+},
+{
+id: "s_603",
+type: "symptom",
+name: "Nail clubbing",
+common_name: "Enlarged fingertips and nails",
+},
+{
+id: "s_604",
+type: "symptom",
+name: "Headache, lancinating",
+common_name: "Stabbing headache",
+},
+{
+id: "s_605",
+type: "symptom",
+name: "Headache, series over a period of time",
+common_name: "Series of headaches",
+},
+{
+id: "s_606",
+type: "symptom",
+name: "Eye flashes",
+common_name: "Eye flashes",
+},
+{
+id: "s_607",
+type: "symptom",
+name: "Tongue erythema",
+common_name: "Unusually red tongue",
+},
+{
+id: "s_608",
+type: "symptom",
+name: "Angular cheilitis",
+common_name: "Cracked corners of lips",
+},
+{
+id: "s_609",
+type: "symptom",
+name: "Breast pain or tenderness, unilateral",
+common_name: "Pain or tenderness in only one breast",
+},
+{
+id: "s_610",
+type: "symptom",
+name: "Coated tonsils",
+common_name: "White spots on tonsils",
+},
+{
+id: "s_611",
+type: "symptom",
+name: "Dark urine",
+common_name: "Dark urine",
+},
+{
+id: "s_612",
+type: "symptom",
+name: "Bone pain",
+common_name: "Bone pain",
+},
+{
+id: "s_613",
+type: "symptom",
+name: "Xanthelasma",
+common_name: "Yellowish deposits on eyelids",
+},
+{
+id: "s_614",
+type: "symptom",
+name: "Itching after a hot shower or bath",
+common_name: "Itchy skin after a hot shower or bath",
+},
+{
+id: "s_616",
+type: "symptom",
+name: "Edema, face",
+common_name: "Swollen face",
+},
+{
+id: "s_618",
+type: "symptom",
+name: "Hairy leukoplakia",
+common_name: "Hairy leukoplakia",
+},
+{
+id: "s_622",
+type: "symptom",
+name: "Loss of muscle mass",
+common_name: "Loss of muscles",
+},
+{
+id: "s_623",
+type: "symptom",
+name: "Edema, both ankles",
+common_name: "Swollen ankles",
+},
+{
+id: "s_625",
+type: "symptom",
+name: "Headache, exacerbated by tilting head forwards",
+common_name: "Headache worsened by tilting head forward",
+},
+{
+id: "s_629",
+type: "symptom",
+name: "Feeling of helplessness",
+common_name: "Feeling of helplessness",
+},
+{
+id: "s_630",
+type: "symptom",
+name: "Vulvovaginal itching",
+common_name: "Vulvovaginal itching",
+},
+{
+id: "s_631",
+type: "symptom",
+name: "Impaired concentration",
+common_name: "Poor concentration",
+},
+{
+id: "s_632",
+type: "symptom",
+name: "Feeling of hopelessness",
+common_name: "Feeling of hopelessness",
+},
+{
+id: "s_633",
+type: "symptom",
+name: "Episode of elevated mood",
+common_name: "Elevated mood",
+},
+{
+id: "s_634",
+type: "symptom",
+name: "Decreased need for sleep",
+common_name: "Decreased need for sleep",
+},
+{
+id: "s_635",
+type: "symptom",
+name: "Contentiousness",
+common_name: "Argumentative behaviour",
+},
+{
+id: "s_636",
+type: "symptom",
+name: "Financial recklessness",
+common_name: "Financial recklessness",
+},
+{
+id: "s_637",
+type: "symptom",
+name: "Quickening of thoughts and speech",
+common_name: "Quickening of thoughts and speech",
+},
+{
+id: "s_640",
+type: "symptom",
+name: "Tenesmus",
+common_name: "Feeling of incomplete defecation",
+},
+{
+id: "s_641",
+type: "symptom",
+name: "Bowel incontinence",
+common_name: "Loss of bowel control",
+},
+{
+id: "s_642",
+type: "symptom",
+name: "Mucous secretion in stool",
+common_name: "Mucus in stool",
+},
+{
+id: "s_646",
+type: "symptom",
+name: "Mood swings",
+common_name: "Mood swings",
+},
+{
+id: "s_647",
+type: "symptom",
+name: "Simple visual paradelusions",
+common_name: "Simple visual paradelusions",
+},
+{
+id: "s_648",
+type: "symptom",
+name: "Simple auditory paradelusions",
+common_name: "Simple auditory paradelusions",
+},
+{
+id: "s_649",
+type: "symptom",
+name: "Psychomotor retardation",
+common_name: "Psychomotor retardation",
+},
+{
+id: "s_650",
+type: "symptom",
+name: "Muscle weakness",
+common_name: "Weak muscles",
+},
+{
+id: "s_651",
+type: "symptom",
+name: "Ataxia",
+common_name: "Problems with coordinating movement",
+},
+{
+id: "s_652",
+type: "symptom",
+name: "Deep tendon reflexes, decreased",
+common_name: "Decreased deep tendon reflexes",
+},
+{
+id: "s_653",
+type: "symptom",
+name: "Pupil dilation variation",
+common_name: "Pupil dilation variation",
+},
+{
+id: "s_659",
+type: "symptom",
+name: "Social isolation",
+common_name: "Social isolation",
+},
+{
+id: "s_660",
+type: "symptom",
+name: "Anger outbursts",
+common_name: "Anger outbursts",
+},
+{
+id: "s_662",
+type: "symptom",
+name: "Cough, productive in the morning",
+common_name: "Coughing up phlegm or mucus in the morning",
+},
+{
+id: "s_663",
+type: "symptom",
+name: "Back pain, lumbar, radiating to the groin",
+common_name: "Lower back pain spreading to the groin",
+},
+{
+id: "s_664",
+type: "symptom",
+name: "Kopliksspots",
+common_name: "Small white spots surrounded by red ring on the insides of cheeks",
+},
+{
+id: "s_665",
+type: "symptom",
+name: "Measles rash",
+common_name: "Measles rash",
+},
+{
+id: "s_666",
+type: "symptom",
+name: "Leopard-like spots on skin",
+common_name: "Brick-coloured spots resembling leopard spots",
+},
+{
+id: "s_668",
+type: "symptom",
+name: "Unilateral enophthalmos",
+common_name: "One sunken eyeball",
+},
+{
+id: "s_669",
+type: "symptom",
+name: "Anhidrosis, face, unilateral",
+common_name: "Lack of sweating on one side of the face",
+},
+{
+id: "s_670",
+type: "symptom",
+name: "Cough, productive with pink, frothy sputum",
+common_name: "Coughing up pink phlegm",
+},
+{
+id: "s_671",
+type: "symptom",
+name: "Neck vein distention",
+common_name: "Swollen neck veins",
+},
+{
+id: "s_673",
+type: "symptom",
+name: "Tongue enlargement",
+common_name: "Swollen tongue",
+},
+{
+id: "s_675",
+type: "symptom",
+name: "Delusions, persecutory",
+common_name: "Belief of being watched, conspired against, or purposely hindered by others",
+},
+{
+id: "s_676",
+type: "symptom",
+name: "Delusions, referential",
+common_name: "Belief of hidden or secret messages meant for onesself",
+},
+{
+id: "s_677",
+type: "symptom",
+name: "Delusions, grandiose",
+common_name: "Belief of being superior to others",
+},
+{
+id: "s_678",
+type: "symptom",
+name: "Delusions, nihilistic",
+common_name: "Belief of being dead, decomposed, or destroyed",
+},
+{
+id: "s_679",
+type: "symptom",
+name: "Delusions, hypochondriacal",
+common_name: "Belief of being sick despite medical proof of the contrary",
+},
+{
+id: "s_680",
+type: "symptom",
+name: "Delusions, of control",
+common_name: "Belief that onesthoughts or actions are controlled by others",
+},
+{
+id: "s_681",
+type: "symptom",
+name: "Hallucinations, visual",
+common_name: "Seeing things that others do not see",
+},
+{
+id: "s_682",
+type: "symptom",
+name: "Hallucinations, auditory",
+common_name: "Hearing voices or sounds others do not hear",
+},
+{
+id: "s_689",
+type: "symptom",
+name: "Urination in small amounts",
+common_name: "Urination in small amounts",
+},
+{
+id: "s_690",
+type: "symptom",
+name: "Urinary urgency",
+common_name: "Urgent need to urinate",
+},
+{
+id: "s_691",
+type: "symptom",
+name: "Trouble beginning urination",
+common_name: "Trouble beginning urination",
+},
+{
+id: "s_692",
+type: "symptom",
+name: "Red and swollen oral mucosa",
+common_name: "Red and swollen inside of mouth",
+},
+{
+id: "s_694",
+type: "symptom",
+name: "Oral lesions",
+common_name: "Changes in the mouth",
+},
+{
+id: "s_696",
+type: "symptom",
+name: "Urinary retention",
+common_name: "Unable to urinate when bladder is full",
+},
+{
+id: "s_697",
+type: "symptom",
+name: "Decreased skin turgor",
+common_name: "Decreased skin elasticity",
+},
+{
+id: "s_698",
+type: "symptom",
+name: "Bilateral enophthalmos",
+common_name: "Both eyes sunken",
+},
+{
+id: "s_699",
+type: "symptom",
+name: "Edema, dependent on the body position",
+common_name: "Swelling dependent on the position of the body",
+},
+{
+id: "s_700",
+type: "symptom",
+name: "Edema",
+common_name: "Swelling",
+},
+{
+id: "s_701",
+type: "symptom",
+name: "Edema, daytime",
+common_name: "Daytime swelling",
+},
+{
+id: "s_711",
+type: "symptom",
+name: "Dissociative amnesia of trauma",
+common_name: "Difficulty remembering traumatic experiences",
+},
+{
+id: "s_715",
+type: "symptom",
+name: "Sneezing",
+common_name: "Sneezing",
+},
+{
+id: "s_716",
+type: "symptom",
+name: "Impaired social functioning",
+common_name: "Difficulty functioning at home, work, or school",
+},
+{
+id: "s_725",
+type: "symptom",
+name: "Excessive worry about the health of a child",
+common_name: "Excessive worry about the health of a child",
+},
+{
+id: "s_727",
+type: "symptom",
+name: "Difficulty bonding with infant",
+common_name: "Difficulty bonding with baby",
+},
+{
+id: "s_728",
+type: "symptom",
+name: "Thoughts of harming oneschild",
+common_name: "Thoughts of harming oneschild",
+},
+{
+id: "s_729",
+type: "symptom",
+name: "Thoughts of killing oneschild",
+common_name: "Thoughts of killing oneschild",
+},
+{
+id: "s_730",
+type: "symptom",
+name: "Mood swings, diurnal",
+common_name: "Mood better in the evening than in the morning",
+},
+{
+id: "s_732",
+type: "symptom",
+name: "Calf pain, severe while walking, intermittent claudication",
+common_name: "Pain in calf during exertion and relieved by rest",
+},
+{
+id: "s_733",
+type: "symptom",
+name: "Erectile dysfunction",
+common_name: "Erectile dysfunction",
+},
+{
+id: "s_734",
+type: "symptom",
+name: "Claudication in upper leg",
+common_name: "Acute thigh or buttock pain appearing during exertion and relieving after short rest",
+},
+{
+id: "s_735",
+type: "symptom",
+name: "Weak pulse in legs",
+common_name: "Weak pulse in legs",
+},
+{
+id: "s_746",
+type: "symptom",
+name: "Loss or impairment of proprioception",
+common_name: "Loss or impairment of proprioception",
+},
+{
+id: "s_747",
+type: "symptom",
+name: "Loss or impairment of temperature sensation",
+common_name: "Loss or impairment of temperature sensation",
+},
+{
+id: "s_750",
+type: "symptom",
+name: "Ocular motility disorder",
+common_name: "Difficulty moving eyes",
+},
+{
+id: "s_756",
+type: "symptom",
+name: "Gottronspapules",
+common_name: "Red, painful, or scaly bumps over hand and finger joints",
+},
+{
+id: "s_757",
+type: "symptom",
+name: "Holster sign",
+common_name: "Redness on hips or sides of thighs",
+},
+{
+id: "s_758",
+type: "symptom",
+name: "Erythema, shoulders and nape of neck",
+common_name: "Redness on the shoulders and the back of the neck",
+},
+{
+id: "s_759",
+type: "symptom",
+name: "Erythema, V-shaped on chest",
+common_name: "V-shaped redness on the chest",
+},
+{
+id: "s_760",
+type: "symptom",
+name: "Hyperkeratosis on hands",
+common_name: "Thickened and cracked skin on hands",
+},
+{
+id: "s_762",
+type: "symptom",
+name: "Purpuric rash",
+common_name: "Red or purple spots not fading under pressure larger than 3 mm",
+},
+{
+id: "s_763",
+type: "symptom",
+name: "Livedo reticularis",
+common_name: "Blotchy, red-purplish marbling of the skin",
+},
+{
+id: "s_768",
+type: "symptom",
+name: "Delusions, self-accusation",
+common_name: "Belief of being evil, guilty, or responsible for a disaster",
+},
+{
+id: "s_769",
+type: "symptom",
+name: "Delusions, bizarre",
+common_name: "Belief in the bizarre or impossible, e.g., alien, cloning, or teleportation",
+},
+{
+id: "s_770",
+type: "symptom",
+name: "Poor personal hygiene",
+common_name: "Poor personal hygiene",
+},
+{
+id: "s_773",
+type: "symptom",
+name: "Social maladjustment",
+common_name: "Social maladjustment",
+},
+{
+id: "s_776",
+type: "symptom",
+name: "Waking up early",
+common_name: "Waking up early",
+},
+{
+id: "s_777",
+type: "symptom",
+name: "Prolonged nighttime sleep",
+common_name: "Prolonged nighttime sleep",
+},
+{
+id: "s_778",
+type: "symptom",
+name: "Lack of boundaries in interpersonal relations",
+common_name: "Lack of boundaries in relationships",
+},
+{
+id: "s_779",
+type: "symptom",
+name: "Rash or impulsive decisions",
+common_name: "Making rash or impulsive decisions",
+},
+{
+id: "s_780",
+type: "symptom",
+name: "Delusions, religious",
+common_name: "Belief of being chosen by a higher power or being a deity",
+},
+{
+id: "s_789",
+type: "symptom",
+name: "Urticaria, triggered by scratching",
+common_name: "Hives after scratching",
+},
+{
+id: "s_790",
+type: "symptom",
+name: "Urticaria, triggered by prolonged pressure on the skin",
+common_name: "Hives appearing after exposure to prolonged pressure on the skin",
+},
+{
+id: "s_791",
+type: "symptom",
+name: "Urticaria, triggered by cold",
+common_name: "Hives appearing after exposure to cold",
+},
+{
+id: "s_793",
+type: "symptom",
+name: "Urticaria, triggered by heat",
+common_name: "Hives appearing after exposure to heat",
+},
+{
+id: "s_795",
+type: "symptom",
+name: "Pencil-thin stools",
+common_name: "Pencil-thin stools",
+},
+{
+id: "s_799",
+type: "symptom",
+name: "Headache, worse in the morning",
+common_name: "Morning headache",
+},
+{
+id: "s_801",
+type: "symptom",
+name: "Vomiting, projectile",
+common_name: "Projectile vomiting",
+},
+{
+id: "s_803",
+type: "symptom",
+name: "Papilledema",
+common_name: "Papilledema",
+},
+{
+id: "s_814",
+type: "symptom",
+name: "Hemianopsia bitemporalis",
+common_name: "Hemianopsia bitemporalis",
+},
+{
+id: "s_817",
+type: "symptom",
+name: "Alcohol consumption, alcohol craving",
+common_name: "Alcohol craving",
+},
+{
+id: "s_818",
+type: "symptom",
+name: "Alcohol consumption, signs of withdrawal",
+common_name: "Alcohol withdrawal syndrome",
+},
+{
+id: "s_820",
+type: "symptom",
+name: "Alcohol consumption, neglecting duties due to alcohol",
+common_name: "Neglecting family, work, or hobbies due to alcohol",
+},
+{
+id: "s_824",
+type: "symptom",
+name: "Alcohol consumption, violating norms under influence",
+common_name: "Violating social norms after drinking alcohol",
+},
+{
+id: "s_825",
+type: "symptom",
+name: "Impaired memory, alcohol-related amnesia",
+common_name: "Alcohol-related amnesia",
+},
+{
+id: "s_828",
+type: "symptom",
+name: "Alcohol consumption, drinking alone",
+common_name: "Drinking alcohol alone",
+},
+{
+id: "s_829",
+type: "symptom",
+name: "Alcohol consumption, secret consumption",
+common_name: "Secret alcohol consumption",
+},
+{
+id: "s_830",
+type: "symptom",
+name: "Impaired memory, short-term",
+common_name: "Impaired short-term memory",
+},
+{
+id: "s_831",
+type: "symptom",
+name: "Confabulation",
+common_name: "Confabulation",
+},
+{
+id: "s_833",
+type: "symptom",
+name: "Agnosia",
+common_name: "Inability to recognize objects, people, sounds, shapes, or smells",
+},
+{
+id: "s_835",
+type: "symptom",
+name: "Episodes of depressed mood, seasonal pattern",
+common_name: "Depressive symptoms occurring at the same time every year",
+},
+{
+id: "s_836",
+type: "symptom",
+name: "Schizophasia",
+common_name: "Schizophasia",
+},
+{
+id: "s_837",
+type: "symptom",
+name: "Alogia",
+common_name: "Poverty of speech",
+},
+{
+id: "s_838",
+type: "symptom",
+name: "Paralogical thinking",
+common_name: "Paralogical thinking",
+},
+{
+id: "s_856",
+type: "symptom",
+name: "Auscultative wheezes over the thorax",
+common_name: "Auscultative wheezes over the thorax",
+},
+{
+id: "s_857",
+type: "symptom",
+name: "Auscultative fine crackles over the thorax",
+common_name: "Auscultative fine crackles over the thorax",
+},
+{
+id: "s_866",
+type: "symptom",
+name: "Trousseau sign of latent tetany",
+common_name: "Trousseau sign of latent tetany",
+},
+{
+id: "s_867",
+type: "symptom",
+name: "Chvostekssign",
+common_name: "Chvostekssign",
+},
+{
+id: "s_868",
+type: "symptom",
+name: "Orbicularis oris muscle spasm",
+common_name: "Orbicularis oris muscle spasm",
+},
+{
+id: "s_869",
+type: "symptom",
+name: "Clubfoot",
+common_name: "Clubfoot",
+},
+{
+id: "s_878",
+type: "symptom",
+name: "Deep tendon reflexes, increased",
+common_name: "Increased deep tendon reflexes",
+},
+{
+id: "s_884",
+type: "symptom",
+name: "Agoraphobia",
+common_name: "Fear of open or crowded places",
+},
+{
+id: "s_917",
+type: "symptom",
+name: "Insomnia",
+common_name: "Insomnia",
+},
+{
+id: "s_935",
+type: "symptom",
+name: "Decreased hearing, variable intensity and duration",
+common_name: "Hearing loss with variable intensity and duration",
+},
+{
+id: "s_936",
+type: "symptom",
+name: "Dizziness, vertigo",
+common_name: "Vertigo",
+},
+{
+id: "s_957",
+type: "symptom",
+name: "Homonymous hemianopsia",
+common_name: "Visual field loss on the same side of both eyes",
+},
+{
+id: "s_959",
+type: "symptom",
+name: "Loss of sensation in the face",
+common_name: "Loss of feeling in face",
+},
+{
+id: "s_962",
+type: "symptom",
+name: "Dysphagia",
+common_name: "Difficulty swallowing",
+},
+{
+id: "s_964",
+type: "symptom",
+name: "Lateropulsion",
+common_name: "Falling or losing gait on one side",
+},
+{
+id: "s_965",
+type: "symptom",
+name: "Neck pain, unilateral",
+common_name: "Neck pain on only one side",
+},
+{
+id: "s_967",
+type: "symptom",
+name: "Decreased visual acuity",
+common_name: "Decreased vision",
+},
+{
+id: "s_970",
+type: "symptom",
+name: "Headache, occipital",
+common_name: "Headache located at back of head",
+},
+{
+id: "s_971",
+type: "symptom",
+name: "Paresthesia, face",
+common_name: "Face tingling or numbness",
+},
+{
+id: "s_972",
+type: "symptom",
+name: "Sensory loss in both arms",
+common_name: "Loss of feeling in both arms",
+},
+{
+id: "s_973",
+type: "symptom",
+name: "Paresthesia, both upper limbs",
+common_name: "Tingling or numbness of both upper limbs",
+},
+{
+id: "s_989",
+type: "symptom",
+name: "Pyramidal signs",
+common_name: "Pyramidal signs",
+},
+{
+id: "s_990",
+type: "symptom",
+name: "Frontal release signs",
+common_name: "Frontal release signs",
+},
+{
+id: "s_991",
+type: "symptom",
+name: "Increased masseter reflex",
+common_name: "Jaw jerk",
+},
+{
+id: "s_995",
+type: "symptom",
+name: "Tongue muscle atrophy",
+common_name: "Shrinkage of tongue",
+},
+{
+id: "s_996",
+type: "symptom",
+name: "Cervical dystonia",
+common_name: "Cervical dystonia",
+},
+{
+id: "s_1006",
+type: "symptom",
+name: "Lack of initiative, motivation, or drive",
+common_name: "Lack of initiative, motivation, or drive",
+},
+{
+id: "s_1007",
+type: "symptom",
+name: "Disinhibition",
+common_name: "Disinhibition",
+},
+{
+id: "s_1010",
+type: "symptom",
+name: "Apraxia",
+common_name: "Apraxia",
+},
+{
+id: "s_1012",
+type: "symptom",
+name: "Agraphia",
+common_name: "Loss of writing ability",
+},
+{
+id: "s_1013",
+type: "symptom",
+name: "Buccofacial or orofacial apraxia",
+common_name: "Buccofacial or orofacial apraxia",
+},
+{
+id: "s_1018",
+type: "symptom",
+name: "Perseveration",
+common_name: "Perseveration",
+},
+{
+id: "s_1021",
+type: "symptom",
+name: "Diminished superficial reflexes",
+common_name: "Diminished superficial reflexes",
+},
+{
+id: "s_1023",
+type: "symptom",
+name: "Babinski sign",
+common_name: "Babinski sign",
+},
+{
+id: "s_1027",
+type: "symptom",
+name: "Loss of vision in the superior quadrant",
+common_name: "Loss of vision in the superior quadrant",
+},
+{
+id: "s_1028",
+type: "symptom",
+name: "Auditory verbal agnosia",
+common_name: "Auditory verbal agnosia",
+},
+{
+id: "s_1032",
+type: "symptom",
+name: "Amusia",
+common_name: "Inability to produce or recognize musical sounds",
+},
+{
+id: "s_1034",
+type: "symptom",
+name: "Visual agnosia",
+common_name: "Visual agnosia",
+},
+{
+id: "s_1035",
+type: "symptom",
+name: "Diminished fear responses",
+common_name: "Diminished fear responses",
+},
+{
+id: "s_1045",
+type: "symptom",
+name: "Splenomegaly",
+common_name: "Enlarged spleen",
+},
+{
+id: "s_1050",
+type: "symptom",
+name: "Tooth loss",
+common_name: "Tooth loss",
+},
+{
+id: "s_1051",
+type: "symptom",
+name: "Hepatomegaly",
+common_name: "Hepatomegaly",
+},
+{
+id: "s_1052",
+type: "symptom",
+name: "Enlarged kidneys",
+common_name: "Enlarged kidneys",
+},
+{
+id: "s_1054",
+type: "symptom",
+name: "Lhermittessign",
+common_name: "Lhermittessign",
+},
+{
+id: "s_1055",
+type: "symptom",
+name: "Retrobulbar neuritis",
+common_name: "Retrobulbar neuritis",
+},
+{
+id: "s_1056",
+type: "symptom",
+name: "Trigeminal neuralgia",
+common_name: "Trigeminal neuralgia",
+},
+{
+id: "s_1057",
+type: "symptom",
+name: "Enlarged salivary glands",
+common_name: "Enlarged salivary glands",
+},
+{
+id: "s_1063",
+type: "symptom",
+name: "Paresthesia, both lower limbs",
+common_name: "Tingling or numbness of both lower limbs",
+},
+{
+id: "s_1066",
+type: "symptom",
+name: "Paresthesia in both upper limbs, glove distribution",
+common_name: "Paresthesia in both upper limbs, glove distribution",
+},
+{
+id: "s_1067",
+type: "symptom",
+name: "Sudden face flushing",
+common_name: "Sudden red flushed face",
+},
+{
+id: "s_1068",
+type: "symptom",
+name: "Paresthesias, symmetrical",
+common_name: "Symmetrical paresthesias",
+},
+{
+id: "s_1069",
+type: "symptom",
+name: "Paresthesia, ascending",
+common_name: "Ascending tingling or numbness",
+},
+{
+id: "s_1070",
+type: "symptom",
+name: "Loss of sense of vibration in distal parts of extremities",
+common_name: "Loss of sense of vibration in distal parts of extremities",
+},
+{
+id: "s_1072",
+type: "symptom",
+name: "Absence of deep reflexes",
+common_name: "Absence of deep reflexes",
+},
+{
+id: "s_1073",
+type: "symptom",
+name: "Bilateral absence of Achilles tendon reflex",
+common_name: "Bilateral absence of Achilles tendon reflex",
+},
+{
+id: "s_1074",
+type: "symptom",
+name: "Trophic changes",
+common_name: "Trophic changes",
+},
+{
+id: "s_1076",
+type: "symptom",
+name: "Trophic ulcer",
+common_name: "Trophic ulcer",
+},
+{
+id: "s_1078",
+type: "symptom",
+name: "Trophic ulcer, plantar side of the foot",
+common_name: "Trophic ulcer on the plantar side of the foot",
+},
+{
+id: "s_1083",
+type: "symptom",
+name: "Interosseous muscles atrophy, hands",
+common_name: "Interosseous muscles atrophy, hands",
+},
+{
+id: "s_1084",
+type: "symptom",
+name: "Interosseous muscles atrophy, feet",
+common_name: "Interosseous muscles atrophy, feet",
+},
+{
+id: "s_1087",
+type: "symptom",
+name: "Fear of going insane",
+common_name: "Fear of going insane",
+},
+{
+id: "s_1088",
+type: "symptom",
+name: "Fear of losing control",
+common_name: "Fear of losing control",
+},
+{
+id: "s_1089",
+type: "symptom",
+name: "Prostate enlargement",
+common_name: "Prostate enlargement",
+},
+{
+id: "s_1090",
+type: "symptom",
+name: "Glassy eyes",
+common_name: "Glassy eyes",
+},
+{
+id: "s_1091",
+type: "symptom",
+name: "Chemosis",
+common_name: "Chemosis",
+},
+{
+id: "s_1092",
+type: "symptom",
+name: "Positive prick or patch skin allergy test",
+common_name: "Positive prick or patch skin allergy test",
+},
+{
+id: "s_1093",
+type: "symptom",
+name: "Positive allergy challenge",
+common_name: "Positive allergy challenge",
+},
+{
+id: "s_1094",
+type: "symptom",
+name: "Clearing the throat",
+common_name: "Clearing the throat",
+},
+{
+id: "s_1095",
+type: "symptom",
+name: "Impaired smell",
+common_name: "Inability to smell properly",
+},
+{
+id: "s_1096",
+type: "symptom",
+name: "Taste disorders",
+common_name: "Abnormal or loss of taste",
+},
+{
+id: "s_1097",
+type: "symptom",
+name: "Swelling of nasal mucosa",
+common_name: "Swelling of nasal mucosa",
+},
+{
+id: "s_1098",
+type: "symptom",
+name: "Swollen blue or bluish-gray nasal mucosa",
+common_name: "Swollen blue or bluish-gray nasal mucosa",
+},
+{
+id: "s_1099",
+type: "symptom",
+name: "Swelling of nasal concha",
+common_name: "Swelling of nasal concha",
+},
+{
+id: "s_1100",
+type: "symptom",
+name: "Transverse furrow on the nose",
+common_name: "Transverse furrow on the nose",
+},
+{
+id: "s_1102",
+type: "symptom",
+name: "Enlargement of palatine tonsils, bilateral",
+common_name: "Swelling on both sides of throat",
+},
+{
+id: "s_1103",
+type: "symptom",
+name: "Enlargement of the lymphoid tissue in the pharynx",
+common_name: "Enlargement of the lymphoid tissue in the pharynx",
+},
+{
+id: "s_1104",
+type: "symptom",
+name: "Mouth breathing",
+common_name: "Mouth breathing",
+},
+{
+id: "s_1105",
+type: "symptom",
+name: "Cyanosis under the eyes",
+common_name: "Dark circles under eyes",
+},
+{
+id: "s_1106",
+type: "symptom",
+name: "Dennie-Morgan fold",
+common_name: "Dennie-Morgan fold",
+},
+{
+id: "s_1107",
+type: "symptom",
+name: "Opacified tympanic membrane",
+common_name: "Opacified tympanic membrane",
+},
+{
+id: "s_1108",
+type: "symptom",
+name: "High-arched palate",
+common_name: "High-arched palate",
+},
+{
+id: "s_1109",
+type: "symptom",
+name: "Discharge in tympanic cavity",
+common_name: "Discharge in tympanic cavity",
+},
+{
+id: "s_1110",
+type: "symptom",
+name: "Overbite",
+common_name: "Overbite",
+},
+{
+id: "s_1111",
+type: "symptom",
+name: "Adenoid face",
+common_name: "Adenoid face",
+},
+{
+id: "s_1112",
+type: "symptom",
+name: "Pain in both lower limbs, stocking distribution",
+common_name: "Pain in both lower limbs with stocking distribution",
+},
+{
+id: "s_1114",
+type: "symptom",
+name: "Terrysnails",
+common_name: "Terrysnails",
+},
+{
+id: "s_1115",
+type: "symptom",
+name: "Loss of body hair",
+common_name: "Loss of body hair",
+},
+{
+id: "s_1116",
+type: "symptom",
+name: "Ascites",
+common_name: "Ascites",
+},
+{
+id: "s_1117",
+type: "symptom",
+name: "Testicular atrophy",
+common_name: "Shrinking or diminishing of both testicles",
+},
+{
+id: "s_1119",
+type: "symptom",
+name: "Bladder sphincter dysfunction",
+common_name: "Bladder sphincter dysfunction",
+},
+{
+id: "s_1123",
+type: "symptom",
+name: "Anhidrosis",
+common_name: "Lack of sweating",
+},
+{
+id: "s_1125",
+type: "symptom",
+name: "Erythema, palmar",
+common_name: "Red skin on palms",
+},
+{
+id: "s_1139",
+type: "symptom",
+name: "Suicidal thoughts",
+common_name: "Suicidal thoughts",
+},
+{
+id: "s_1140",
+type: "symptom",
+name: "Suicidal intent",
+common_name: "Planning or taking steps toward suicide",
+},
+{
+id: "s_1141",
+type: "symptom",
+name: "Russellssign",
+common_name: "Russellssign",
+},
+{
+id: "s_1142",
+type: "symptom",
+name: "Myalgia",
+common_name: "Muscle pain",
+},
+{
+id: "s_1144",
+type: "symptom",
+name: "Swelling of temporal artery",
+common_name: "Swelling of temporal artery",
+},
+{
+id: "s_1145",
+type: "symptom",
+name: "Redness in temporal region",
+common_name: "Redness around the temple",
+},
+{
+id: "s_1146",
+type: "symptom",
+name: "Impaired vision, temple pain on side with vision problem",
+common_name: "Temple pain on side with visual impairment",
+},
+{
+id: "s_1147",
+type: "symptom",
+name: "Oculomotor nerve palsy",
+common_name: "Oculomotor nerve palsy",
+},
+{
+id: "s_1148",
+type: "symptom",
+name: "Numbness of tongue",
+common_name: "Loss of feeling in tongue",
+},
+{
+id: "s_1150",
+type: "symptom",
+name: "Hypersensitivity to sound",
+common_name: "Oversensitivity to sound",
+},
+{
+id: "s_1153",
+type: "symptom",
+name: "Taste disorder, anterior two-thirds of tongue",
+common_name: "Taste disorder in anterior two-thirds of tongue",
+},
+{
+id: "s_1159",
+type: "symptom",
+name: "Loss of sensation in the face, unilateral",
+common_name: "Loss of feeling on only one side of the face",
+},
+{
+id: "s_1162",
+type: "symptom",
+name: "Pretibial myxedema",
+common_name: "Pretibial myxedema",
+},
+{
+id: "s_1163",
+type: "symptom",
+name: "Exophthalmos",
+common_name: "Protruding eye",
+},
+{
+id: "s_1165",
+type: "symptom",
+name: "Burning skin",
+common_name: "Burning sensation on skin",
+},
+{
+id: "s_1166",
+type: "symptom",
+name: "Enamel hypoplasia",
+common_name: "Enamel hypoplasia",
+},
+{
+id: "s_1167",
+type: "symptom",
+name: "Nail dystrophy",
+common_name: "Distortion or discolouration of nail",
+},
+{
+id: "s_1170",
+type: "symptom",
+name: "Hemarthrosis",
+common_name: "Bleeding into joints",
+},
+{
+id: "s_1171",
+type: "symptom",
+name: "Darierssign",
+common_name: "Darierssign",
+},
+{
+id: "s_1173",
+type: "symptom",
+name: "Lump in scrotum",
+common_name: "Lump in scrotum",
+},
+{
+id: "s_1175",
+type: "symptom",
+name: "Feeling of weight in scrotum",
+common_name: "Feeling of weight in scrotum",
+},
+{
+id: "s_1178",
+type: "symptom",
+name: "Chest pain, worsens on palpation",
+common_name: "Chest pain worsening when touching or pressing",
+},
+{
+id: "s_1180",
+type: "symptom",
+name: "Pain behind ear",
+common_name: "Pain behind ear",
+},
+{
+id: "s_1181",
+type: "symptom",
+name: "Redness behind the ear",
+common_name: "Redness behind the ear",
+},
+{
+id: "s_1182",
+type: "symptom",
+name: "Swelling in the mastoid region",
+common_name: "Swelling behind ear",
+},
+{
+id: "s_1183",
+type: "symptom",
+name: "Winterbottomssign",
+common_name: "Winterbottomssign",
+},
+{
+id: "s_1184",
+type: "symptom",
+name: "Coating on tongue",
+common_name: "White tongue",
+},
+{
+id: "s_1185",
+type: "symptom",
+name: "Dyspnea, with flare-ups and remissions",
+common_name: "Shortness of breath that comes and goes",
+},
+{
+id: "s_1189",
+type: "symptom",
+name: "Back pain, recurrent",
+common_name: "Back pain that comes and goes",
+},
+{
+id: "s_1190",
+type: "symptom",
+name: "Back pain",
+common_name: "Back pain",
+},
+{
+id: "s_1191",
+type: "symptom",
+name: "Dermatological changes, with flare-ups and remissions",
+common_name: "Skin changes that come and go",
+},
+{
+id: "s_1192",
+type: "symptom",
+name: "Back pain, severe",
+common_name: "Severe back pain",
+},
+{
+id: "s_1193",
+type: "symptom",
+name: "Headache, severe",
+common_name: "Severe headache",
+},
+{
+id: "s_1194",
+type: "symptom",
+name: "Facial pain, severe",
+common_name: "Severe face pain",
+},
+{
+id: "s_1195",
+type: "symptom",
+name: "Abdominal pain, severe",
+common_name: "Severe abdominal pain",
+},
+{
+id: "s_1197",
+type: "symptom",
+name: "Chest pain, severe",
+common_name: "Severe chest pain",
+},
+{
+id: "s_1198",
+type: "symptom",
+name: "Back pain, sudden",
+common_name: "Sudden back pain",
+},
+{
+id: "s_1200",
+type: "symptom",
+name: "Chest pain, sudden",
+common_name: "Sudden chest pain",
+},
+{
+id: "s_1201",
+type: "symptom",
+name: "Joint pain, sudden",
+common_name: "Sudden joint pain",
+},
+{
+id: "s_1202",
+type: "symptom",
+name: "Abdominal pain, exacerbating during deep breath",
+common_name: "Abdominal pain worsens with deep breath",
+},
+{
+id: "s_1203",
+type: "symptom",
+name: "Facial pain, more than 2 hours",
+common_name: "Face pain lasting more than a couple of hours",
+},
+{
+id: "s_1206",
+type: "symptom",
+name: "Back pain, improves with rest",
+common_name: "Back pain decreases during rest",
+},
+{
+id: "s_1207",
+type: "symptom",
+name: "Abdominal pain, exacerbating after caffeine consumption",
+common_name: "Abdominal pain worsening after caffeine consumption",
+},
+{
+id: "s_1209",
+type: "symptom",
+name: "Skin pallor, sudden",
+common_name: "Sudden paleness of skin",
+},
+{
+id: "s_1210",
+type: "symptom",
+name: "Mucosal pallor",
+common_name: "Pale mouth or eyelids",
+},
+{
+id: "s_1213",
+type: "symptom",
+name: "Mucosal pallor, sudden",
+common_name: "Sudden paleness of mouth or eyelids",
+},
+{
+id: "s_1226",
+type: "symptom",
+name: "Genu varum",
+common_name: "Bowlegs",
+},
+{
+id: "s_1227",
+type: "symptom",
+name: "Impaired lateral eye motion",
+common_name: "Difficulty looking sideways away from the nose",
+},
+{
+id: "s_1228",
+type: "symptom",
+name: "Convergent strabismus",
+common_name: "Crossed eyes",
+},
+{
+id: "s_1229",
+type: "symptom",
+name: "Diplopia with horizontal image dispersion",
+common_name: "Double vision with images appearing side by side",
+},
+{
+id: "s_1230",
+type: "symptom",
+name: "Head tilt in order to avoid diplopia",
+common_name: "Double vision improves while tilting head",
+},
+{
+id: "s_1232",
+type: "symptom",
+name: "Diplopia while looking down and medially",
+common_name: "Double vision while looking down and toward the nose",
+},
+{
+id: "s_1235",
+type: "symptom",
+name: "Diplopia while looking in any direction",
+common_name: "Double vision while looking in any direction",
+},
+{
+id: "s_1236",
+type: "symptom",
+name: "Divergent strabismus",
+common_name: "One or both eyes turning outward",
+},
+{
+id: "s_1237",
+type: "symptom",
+name: "Ocular bulb rotation laterally and downward",
+common_name: "Eye rotation sideways and downward",
+},
+{
+id: "s_1238",
+type: "symptom",
+name: "Pupil or pupils unreactive to accommodation",
+common_name: "Pupil or pupils unreactive to accommodation",
+},
+{
+id: "s_1239",
+type: "symptom",
+name: "Impaired upward eye motion",
+common_name: "Difficulty looking up",
+},
+{
+id: "s_1240",
+type: "symptom",
+name: "Impaired medial eye motion",
+common_name: "Difficulty looking inwards towards the nose",
+},
+{
+id: "s_1241",
+type: "symptom",
+name: "Impaired downward eye motion",
+common_name: "Difficulty looking down",
+},
+{
+id: "s_1250",
+type: "symptom",
+name: "Groin pain, exacerbated by coughing, sneezing, laughing, or exercising",
+common_name: "Pain in groin during coughing, sneezing, laughing, or physical exercises",
+},
+{
+id: "s_1254",
+type: "symptom",
+name: "Gordonssign",
+common_name: "Gordonssign",
+},
+{
+id: "s_1255",
+type: "symptom",
+name: "Rossolimossign",
+common_name: "Rossolimossign",
+},
+{
+id: "s_1256",
+type: "symptom",
+name: "Oppenheimssign",
+common_name: "Oppenheimssign",
+},
+{
+id: "s_1257",
+type: "symptom",
+name: "Bingssign",
+common_name: "Bingssign",
+},
+{
+id: "s_1258",
+type: "symptom",
+name: "Chaddockssign",
+common_name: "Chaddockssign",
+},
+{
+id: "s_1259",
+type: "symptom",
+name: "Schaefferssign",
+common_name: "Schaefferssign",
+},
+{
+id: "s_1260",
+type: "symptom",
+name: "Stranskyssign",
+common_name: "Stranskyssign",
+},
+{
+id: "s_1261",
+type: "symptom",
+name: "Mendel-Bekhterev sign",
+common_name: "Mendel-Bekhterev sign",
+},
+{
+id: "s_1262",
+type: "symptom",
+name: "Tromnerssign",
+common_name: "Tromnerssign",
+},
+{
+id: "s_1263",
+type: "symptom",
+name: "Gonda-Allen sign",
+common_name: "Gonda-Allen sign",
+},
+{
+id: "s_1264",
+type: "symptom",
+name: "Tremors, intention",
+common_name: "Intention tremors",
+},
+{
+id: "s_1265",
+type: "symptom",
+name: "Dissociated sensory loss",
+common_name: "Dissociated sensory loss",
+},
+{
+id: "s_1268",
+type: "symptom",
+name: "Corneal reflex weak or absent",
+common_name: "Corneal reflex weak or absent",
+},
+{
+id: "s_1270",
+type: "symptom",
+name: "Sterlingssign",
+common_name: "Sterlingssign",
+},
+{
+id: "s_1271",
+type: "symptom",
+name: "Jacobsohn sign",
+common_name: "Finger flexion when tapping distal base of radius bone",
+},
+{
+id: "s_1272",
+type: "symptom",
+name: "Allen-Cleckley sign",
+common_name: "Allen-Cleckley sign",
+},
+{
+id: "s_1273",
+type: "symptom",
+name: "Cornellssign",
+common_name: "Cornellssign",
+},
+{
+id: "s_1274",
+type: "symptom",
+name: "Moniz sign",
+common_name: "Moniz sign",
+},
+{
+id: "s_1275",
+type: "symptom",
+name: "Strumpellssign",
+common_name: "Strumpellssign",
+},
+{
+id: "s_1277",
+type: "symptom",
+name: "Decreased tongue motility",
+common_name: "Difficulty moving tongue",
+},
+{
+id: "s_1278",
+type: "symptom",
+name: "Increased palatine reflex",
+common_name: "Increased palatine reflex",
+},
+{
+id: "s_1279",
+type: "symptom",
+name: "Increased pharyngeal reflex",
+common_name: "Increased pharyngeal reflex",
+},
+{
+id: "s_1280",
+type: "symptom",
+name: "Weak or absent pharyngeal reflex",
+common_name: "Weak or absent pharyngeal reflex",
+},
+{
+id: "s_1281",
+type: "symptom",
+name: "Clasp-knife spasticity",
+common_name: "Clasp-knife spasticity",
+},
+{
+id: "s_1282",
+type: "symptom",
+name: "Lead-pipe rigidity",
+common_name: "Constant muscle stiffness in a limb",
+},
+{
+id: "s_1283",
+type: "symptom",
+name: "Cogwheel muscle rigidity",
+common_name: "Cogwheel muscle rigidity",
+},
+{
+id: "s_1285",
+type: "symptom",
+name: "Sagging of the palate ipsilateral to suspected nerve damage",
+common_name: "Sagging of the palate ipsilateral to suspected nerve damage",
+},
+{
+id: "s_1287",
+type: "symptom",
+name: "Uvula deviation towards unaffected side",
+common_name: "Uvula deviation towards unaffected side",
+},
+{
+id: "s_1289",
+type: "symptom",
+name: "Ovarian enlargement",
+common_name: "Ovarian enlargement",
+},
+{
+id: "s_1291",
+type: "symptom",
+name: "Bilateral muscle paralysis",
+common_name: "Bilateral muscle paralysis",
+},
+{
+id: "s_1295",
+type: "symptom",
+name: "Hiccups",
+common_name: "Hiccups",
+},
+{
+id: "s_1297",
+type: "symptom",
+name: "Motor retardation",
+common_name: "Slowed movements",
+},
+{
+id: "s_1298",
+type: "symptom",
+name: "Dystonia",
+common_name: "Dystonia",
+},
+{
+id: "s_1302",
+type: "symptom",
+name: "Goldflamssign",
+common_name: "Goldflamssign",
+},
+{
+id: "s_1303",
+type: "symptom",
+name: "Nasal speech",
+common_name: "Nasal voice",
+},
+{
+id: "s_1304",
+type: "symptom",
+name: "Excessive saliva production",
+common_name: "Excessive salivation",
+},
+{
+id: "s_1310",
+type: "symptom",
+name: "Brown nail discolouration",
+common_name: "Brown nail discolouration",
+},
+{
+id: "s_1311",
+type: "symptom",
+name: "Edema, finger",
+common_name: "Swollen finger",
+},
+{
+id: "s_1312",
+type: "symptom",
+name: "Perionychial pain",
+common_name: "Pain of the skin around the nail",
+},
+{
+id: "s_1313",
+type: "symptom",
+name: "Pain in upper limb, one finger",
+common_name: "Pain in one finger",
+},
+{
+id: "s_1314",
+type: "symptom",
+name: "Erythema, finger",
+common_name: "Red finger",
+},
+{
+id: "s_1315",
+type: "symptom",
+name: "Pus under the skin of the finger",
+common_name: "Pus under the skin of the finger",
+},
+{
+id: "s_1316",
+type: "symptom",
+name: "Auscultative rhonchi over the thorax",
+common_name: "Auscultative rhonchi over the thorax",
+},
+{
+id: "s_1317",
+type: "symptom",
+name: "Dyspnea, paroxysmal nocturnal",
+common_name: "Shortness of breath while sleeping",
+},
+{
+id: "s_1322",
+type: "symptom",
+name: "Axillary or inguinal freckles",
+common_name: "Freckles in the groins or armpits",
+},
+{
+id: "s_1323",
+type: "symptom",
+name: "Presence of neurofibromas",
+common_name: "Presence of neurofibromas",
+},
+{
+id: "s_1324",
+type: "symptom",
+name: "Lisch nodules",
+common_name: "Lisch nodules",
+},
+{
+id: "s_1328",
+type: "symptom",
+name: "Colour vision deficiency",
+common_name: "Colour blind",
+},
+{
+id: "s_1329",
+type: "symptom",
+name: "Optic nerve disc pallor",
+common_name: "Optic nerve disc pallor",
+},
+{
+id: "s_1330",
+type: "symptom",
+name: "Café au lait macules",
+common_name: "At least 6 light brown marks on skin",
+},
+{
+id: "s_1332",
+type: "symptom",
+name: "Fatigue, weakness after exercise",
+common_name: "Weakness worsening after exercise",
+},
+{
+id: "s_1338",
+type: "symptom",
+name: "Damage to two separate areas of innervation",
+common_name: "Damage to two separate areas of innervation",
+},
+{
+id: "s_1340",
+type: "symptom",
+name: "Westphals sign",
+common_name: "Westphals sign",
+},
+{
+id: "s_1342",
+type: "symptom",
+name: "Transilluminable scrotum",
+common_name: "Transilluminable scrotum",
+},
+{
+id: "s_1344",
+type: "symptom",
+name: "Retinal hemorrhage",
+common_name: "Retinal hemorrhage",
+},
+{
+id: "s_1345",
+type: "symptom",
+name: "Confusion, after trauma",
+common_name: "Confusion after an injury",
+},
+{
+id: "s_1346",
+type: "symptom",
+name: "Hard retinal exudates",
+common_name: "Hard retinal exudates",
+},
+{
+id: "s_1347",
+type: "symptom",
+name: "Soft retinal exudates",
+common_name: "Soft retinal exudates",
+},
+{
+id: "s_1348",
+type: "symptom",
+name: "Weak peripheral pulses",
+common_name: "Weak peripheral pulses",
+},
+{
+id: "s_1349",
+type: "symptom",
+name: "Headache, forehead",
+common_name: "Headache located near the forehead",
+},
+{
+id: "s_1365",
+type: "symptom",
+name: "Vomiting, more often in the morning",
+common_name: "Vomiting more often in the morning",
+},
+{
+id: "s_1367",
+type: "symptom",
+name: "Pharyngeal erythema",
+common_name: "Red throat",
+},
+{
+id: "s_1369",
+type: "symptom",
+name: "Abdominal pain, sharp and stabbing",
+common_name: "Sharp and stabbing abdominal pain",
+},
+{
+id: "s_1371",
+type: "symptom",
+name: "Palatine petechiae",
+common_name: "Pinpoint-size red dots on soft part of roof of mouth",
+},
+{
+id: "s_1376",
+type: "symptom",
+name: "Diarrhea, rice water",
+common_name: "Diarrhea that looks like rice water",
+},
+{
+id: "s_1377",
+type: "symptom",
+name: "Rose spots on lower chest and abdomen",
+common_name: "Rose spots on lower chest and abdomen",
+},
+{
+id: "s_1378",
+type: "symptom",
+name: "Levines sign",
+common_name: "Levines sign",
+},
+{
+id: "s_1379",
+type: "symptom",
+name: "Tremors, pill-rolling",
+common_name: "Pill-rolling tremors",
+},
+{
+id: "s_1380",
+type: "symptom",
+name: "Pericardial friction rub",
+common_name: "Pericardial friction rub",
+},
+{
+id: "s_1381",
+type: "symptom",
+name: "Sternal rub",
+common_name: "Sternal rub",
+},
+{
+id: "s_1382",
+type: "symptom",
+name: "Pain caused by firm pressure on tibia",
+common_name: "Pain caused by firm pressure on tibia",
+},
+{
+id: "s_1383",
+type: "symptom",
+name: "Intense, non-committal relationships",
+common_name: "Intense, non-committal relationships",
+},
+{
+id: "s_1386",
+type: "symptom",
+name: "Bleeding into muscles",
+common_name: "Bleeding into muscles",
+},
+{
+id: "s_1387",
+type: "symptom",
+name: "Abdominal pain, epigastric",
+common_name: "Upper central abdominal pain",
+},
+{
+id: "s_1388",
+type: "symptom",
+name: "Neck asymmetry",
+common_name: "Asymmetrical neck",
+},
+{
+id: "s_1390",
+type: "symptom",
+name: "Enlargement of palatine tonsil, unilateral",
+common_name: "Swollen throat on one side",
+},
+{
+id: "s_1392",
+type: "symptom",
+name: "Abdominal tenderness, right upper quadrant",
+common_name: "Pain when pressing upper-right part of the abdomen",
+},
+{
+id: "s_1393",
+type: "symptom",
+name: "Painful defecation",
+common_name: "Pain when passing stool",
+},
+{
+id: "s_1394",
+type: "symptom",
+name: "Loss of the lingual papillae",
+common_name: "Smooth tongue",
+},
+{
+id: "s_1395",
+type: "symptom",
+name: "Decreased intensity of breath sounds, right basilar lung zones",
+common_name: "Decreased intensity of breath sounds, right basilar lung zones",
+},
+{
+id: "s_1396",
+type: "symptom",
+name: "Pleural friction rub",
+common_name: "Pleural friction rub",
+},
+{
+id: "s_1397",
+type: "symptom",
+name: "Priapism",
+common_name: "Prolonged erection",
+},
+{
+id: "s_1398",
+type: "symptom",
+name: "Vitreous hemorrhage",
+common_name: "Vitreous hemorrhage",
+},
+{
+id: "s_1399",
+type: "symptom",
+name: "Shafers sign",
+common_name: "Shafers sign",
+},
+{
+id: "s_1400",
+type: "symptom",
+name: "Abdominal tenderness, hypogastric region",
+common_name: "Pain when pressing lower part of the abdomen",
+},
+{
+id: "s_1402",
+type: "symptom",
+name: "Weiss ring",
+common_name: "Weiss ring",
+},
+{
+id: "s_1403",
+type: "symptom",
+name: "Marcus Gunn pupil",
+common_name: "Marcus Gunn pupil",
+},
+{
+id: "s_1404",
+type: "symptom",
+name: "Low intraocular pressure, 4 to 5 mmHg difference in affected eye compared to the other eye",
+common_name: "Low intraocular pressure, 4 to 5 mmHg difference in affected eye compared to the other eye",
+},
+{
+id: "s_1405",
+type: "symptom",
+name: "Local elevation of retina",
+common_name: "Local elevation of retina",
+},
+{
+id: "s_1406",
+type: "symptom",
+name: "Local grey discolouration of retina",
+common_name: "Local grey discolouration of retina",
+},
+{
+id: "s_1407",
+type: "symptom",
+name: "Local dark retinal blood vessels that lie in folds",
+common_name: "Local dark retinal blood vessels that lie in folds",
+},
+{
+id: "s_1408",
+type: "symptom",
+name: "Local retinal undulation",
+common_name: "Local retinal undulation",
+},
+{
+id: "s_1409",
+type: "symptom",
+name: "Demarcation of retinal detachment (pigmented or nonpigmented)",
+common_name: "Demarcation of retinal detachment (pigmented or nonpigmented)",
+},
+{
+id: "s_1410",
+type: "symptom",
+name: "Optic disc neovascularization",
+common_name: "Optic disc neovascularization",
+},
+{
+id: "s_1411",
+type: "symptom",
+name: "Iris neovascularization",
+common_name: "Iris neovascularization",
+},
+{
+id: "s_1412",
+type: "symptom",
+name: "Retinal microaneurysms",
+common_name: "Retinal microaneurysms",
+},
+{
+id: "s_1413",
+type: "symptom",
+name: "Cystoid macular edema",
+common_name: "Cystoid macular edema",
+},
+{
+id: "s_1414",
+type: "symptom",
+name: "Retinal swelling",
+common_name: "Retinal swelling",
+},
+{
+id: "s_1415",
+type: "symptom",
+name: "Retinal neovascularization elsewhere",
+common_name: "Retinal neovascularization elsewhere",
+},
+{
+id: "s_1416",
+type: "symptom",
+name: "Intraretinal microvascular abnormalities",
+common_name: "Intraretinal microvascular abnormalities",
+},
+{
+id: "s_1417",
+type: "symptom",
+name: "Dark-red spots in optic disc vessels",
+common_name: "Dark-red spots in optic disc vessels",
+},
+{
+id: "s_1418",
+type: "symptom",
+name: "Retinal artery occlusions",
+common_name: "Retinal artery occlusions",
+},
+{
+id: "s_1421",
+type: "symptom",
+name: "Tremors, flapping",
+common_name: "Flapping tremors",
+},
+{
+id: "s_1422",
+type: "symptom",
+name: "Nipple discharge, other than milk",
+common_name: "Leaking from the nipple discharge that is not milk",
+},
+{
+id: "s_1425",
+type: "symptom",
+name: "Facial muscle spasms",
+common_name: "Facial muscle spasms",
+},
+{
+id: "s_1426",
+type: "symptom",
+name: "Spasms in upper extremities",
+common_name: "Spasms in arms or hands",
+},
+{
+id: "s_1429",
+type: "symptom",
+name: "Nosebleed",
+common_name: "Bleeding from nose",
+},
+{
+id: "s_1430",
+type: "symptom",
+name: "Joint pain, wrist",
+common_name: "Wrist pain",
+},
+{
+id: "s_1431",
+type: "symptom",
+name: "Edema, wrist joint",
+common_name: "Swollen wrist",
+},
+{
+id: "s_1432",
+type: "symptom",
+name: "Dyspepsia",
+common_name: "Indigestion",
+},
+{
+id: "s_1433",
+type: "symptom",
+name: "Edema, lip",
+common_name: "Swollen lips",
+},
+{
+id: "s_1434",
+type: "symptom",
+name: "Steatorrhea",
+common_name: "Fatty stools",
+},
+{
+id: "s_1436",
+type: "symptom",
+name: "Facial pain, paranasal sinus",
+common_name: "Sinus pain or pressure",
+},
+{
+id: "s_1437",
+type: "symptom",
+name: "Pleural effusion",
+common_name: "Pleural effusion",
+},
+{
+id: "s_1442",
+type: "symptom",
+name: "Edema, periorbital, both eyes",
+common_name: "Swelling around both eyes",
+},
+{
+id: "s_1447",
+type: "symptom",
+name: "Edema, upper limb",
+common_name: "Swelling of the upper limb",
+},
+{
+id: "s_1449",
+type: "symptom",
+name: "Paresthesia, one upper limb",
+common_name: "Tingling or numbness of one upper limb",
+},
+{
+id: "s_1451",
+type: "symptom",
+name: "Kussmaul breathing",
+common_name: "Abnormally deep, laboured, and gasping breathing",
+},
+{
+id: "s_1452",
+type: "symptom",
+name: "Pain in both upper limbs",
+common_name: "Pain in both upper limbs",
+},
+{
+id: "s_1453",
+type: "symptom",
+name: "Pain in both lower limbs",
+common_name: "Pain in both lower limbs",
+},
+{
+id: "s_1454",
+type: "symptom",
+name: "Tremors, kinetic",
+common_name: "Trembling during movement",
+},
+{
+id: "s_1455",
+type: "symptom",
+name: "Tremors, resting",
+common_name: "Trembling at rest",
+},
+{
+id: "s_1456",
+type: "symptom",
+name: "Chorea",
+common_name: "Chorea",
+},
+{
+id: "s_1458",
+type: "symptom",
+name: "Amenorrhea, primary",
+common_name: "Absence of first menstrual period at age 16",
+},
+{
+id: "s_1462",
+type: "symptom",
+name: "Shallow breathing",
+common_name: "Shallow breathing",
+},
+{
+id: "s_1463",
+type: "symptom",
+name: "Restless legs, nocturnal",
+common_name: "Nighttime restless legs",
+},
+{
+id: "s_1464",
+type: "symptom",
+name: "Edema, one hand",
+common_name: "Swollen hand",
+},
+{
+id: "s_1465",
+type: "symptom",
+name: "Temporary blindness",
+common_name: "Temporary blindness",
+},
+{
+id: "s_1466",
+type: "symptom",
+name: "Tinnitus, pulsatile",
+common_name: "Pulsing sound in ears",
+},
+{
+id: "s_1467",
+type: "symptom",
+name: "Strawberry tongue",
+common_name: "Strawberry tongue",
+},
+{
+id: "s_1468",
+type: "symptom",
+name: "Erythema, facial",
+common_name: "Red skin on face",
+},
+{
+id: "s_1469",
+type: "symptom",
+name: "Erythema, large portion of body",
+common_name: "Redness and scaling on almost the entire body",
+},
+{
+id: "s_1470",
+type: "symptom",
+name: "Skin desquamation",
+common_name: "Skin shedding",
+},
+{
+id: "s_1471",
+type: "symptom",
+name: "Postnasal drip",
+common_name: "Mucus dripping at the back of the throat",
+},
+{
+id: "s_1472",
+type: "symptom",
+name: "Kayser-Fleischer ring",
+common_name: "Dark rings appearing around the iris of the eye",
+},
+{
+id: "s_1474",
+type: "symptom",
+name: "Skull lesions",
+common_name: "Skull lesions",
+},
+{
+id: "s_1476",
+type: "symptom",
+name: "Myringitis",
+common_name: "Myringitis",
+},
+{
+id: "s_1479",
+type: "symptom",
+name: "Dizziness, head rotation",
+common_name: "Dizziness while turning the head",
+},
+{
+id: "s_1480",
+type: "symptom",
+name: "Breast pain or tenderness, bilateral",
+common_name: "Pain or tenderness in both breasts",
+},
+{
+id: "s_1481",
+type: "symptom",
+name: "Hyperalgesia",
+common_name: "Hyperalgesia",
+},
+{
+id: "s_1483",
+type: "symptom",
+name: "Neck pain",
+common_name: "Pain in the neck",
+},
+{
+id: "s_1484",
+type: "symptom",
+name: "Decreased hearing, progressive hearing loss",
+common_name: "Progressive hearing loss without fluctuation",
+},
+{
+id: "s_1486",
+type: "symptom",
+name: "Paraspinal muscle tenderness",
+common_name: "Paraspinal muscle tenderness",
+},
+{
+id: "s_1488",
+type: "symptom",
+name: "Increased expiratory phase",
+common_name: "Increased expiratory phase",
+},
+{
+id: "s_1492",
+type: "symptom",
+name: "Scleral icterus",
+common_name: "Yellow eyes",
+},
+{
+id: "s_1494",
+type: "symptom",
+name: "Rebound tenderness",
+common_name: "Rebound tenderness",
+},
+{
+id: "s_1496",
+type: "symptom",
+name: "Paranasal sinuses tenderness",
+common_name: "Paranasal sinuses tender to palpation",
+},
+{
+id: "s_1498",
+type: "symptom",
+name: "Erythematous tonsils",
+common_name: "Unusually red tonsils",
+},
+{
+id: "s_1502",
+type: "symptom",
+name: "Achilles tendon hyperreflexia",
+common_name: "Achilles tendon hyperreflexia",
+},
+{
+id: "s_1508",
+type: "symptom",
+name: "Prolonged capillary refill time",
+common_name: "Prolonged capillary refill time",
+},
+{
+id: "s_1509",
+type: "symptom",
+name: "Chest pain, substernal",
+common_name: "Chest pain behind breastbone",
+},
+{
+id: "s_1510",
+type: "symptom",
+name: "Dermatological changes, hot to the touch",
+common_name: "Skin change hot to the touch",
+},
+{
+id: "s_1514",
+type: "symptom",
+name: "Abdominal tenderness",
+common_name: "Pain when pressing the abdomen",
+},
+{
+id: "s_1528",
+type: "symptom",
+name: "Abdominal pain, right upper quadrant",
+common_name: "Upper right side abdominal pain",
+},
+{
+id: "s_1531",
+type: "symptom",
+name: "Abdominal pain, right lower quadrant",
+common_name: "Lower right side abdominal pain",
+},
+{
+id: "s_1532",
+type: "symptom",
+name: "Abdominal pain, periumbilical",
+common_name: "Central abdominal pain",
+},
+{
+id: "s_1533",
+type: "symptom",
+name: "Rhinitis triggered by environment",
+common_name: "Runny or stuffy nose triggered by environment",
+},
+{
+id: "s_1534",
+type: "symptom",
+name: "Tonsil stones",
+common_name: "White or yellow formations in tonsils",
+},
+{
+id: "s_1535",
+type: "symptom",
+name: "Headache, chronic",
+common_name: "Headaches for 3 months or more",
+},
+{
+id: "s_1536",
+type: "symptom",
+name: "Spine asymmetry",
+common_name: "Spine asymmetry",
+},
+{
+id: "s_1538",
+type: "symptom",
+name: "Decreased hearing, sudden hearing loss",
+common_name: "Sudden hearing loss without obvious cause",
+},
+{
+id: "s_1543",
+type: "symptom",
+name: "Loss of consciousness",
+common_name: "Loss of consciousness",
+},
+{
+id: "s_1544",
+type: "symptom",
+name: "Scarlatiniform rash",
+common_name: "Scarlatiniform rash",
+},
+{
+id: "s_1546",
+type: "symptom",
+name: "Cheyne-Stokes respiration",
+common_name: "Cheyne-Stokes respiration",
+},
+{
+id: "s_1547",
+type: "symptom",
+name: "Fatigue, more than 6 months",
+common_name: "Fatigue lasting more than 6 months",
+},
+{
+id: "s_1548",
+type: "symptom",
+name: "Pseudomembrane in nose or throat",
+common_name: "Thick grey layer in nose or throat",
+},
+{
+id: "s_1551",
+type: "symptom",
+name: "Inability to pass flatus",
+common_name: "Inability to pass gas",
+},
+{
+id: "s_1552",
+type: "symptom",
+name: "Bowel sounds, hyperactive, high-pitched",
+common_name: "Excessive bowel sounds",
+},
+{
+id: "s_1553",
+type: "symptom",
+name: "Bowel sounds, decreased",
+common_name: "Decreased bowel sounds",
+},
+{
+id: "s_1555",
+type: "symptom",
+name: "Dances sign",
+common_name: "Dances sign",
+},
+{
+id: "s_1557",
+type: "symptom",
+name: "Abdominal pain, diffuse",
+common_name: "Widespread abdominal pain",
+},
+{
+id: "s_1558",
+type: "symptom",
+name: "Abdominal guarding",
+common_name: "Abdominal guarding",
+},
+{
+id: "s_1561",
+type: "symptom",
+name: "Xanthoma",
+common_name: "Yellowish deposits under skin",
+},
+{
+id: "s_1562",
+type: "symptom",
+name: "Wheezing, stridor",
+common_name: "Stridor",
+},
+{
+id: "s_1563",
+type: "symptom",
+name: "Itching eye",
+common_name: "Itchy eye",
+},
+{
+id: "s_1565",
+type: "symptom",
+name: "Feeling of rectal fullness",
+common_name: "Feeling of rectal fullness",
+},
+{
+id: "s_1569",
+type: "symptom",
+name: "Vaginal discharge, white and clumpy",
+common_name: "White and clumpy vaginal discharge",
+},
+{
+id: "s_1570",
+type: "symptom",
+name: "Gastric symptoms, after lactose ingestion",
+common_name: "Abdominal symptoms after eating or drinking foods containing lactose",
+},
+{
+id: "s_1571",
+type: "symptom",
+name: "Dermatological changes, painful",
+common_name: "Painful skin changes",
+},
+{
+id: "s_1574",
+type: "symptom",
+name: "Difficulty achieving orgasm",
+common_name: "Difficulty achieving orgasm",
+},
+{
+id: "s_1576",
+type: "symptom",
+name: "Carotid bruit",
+common_name: "Cervical artery murmur",
+},
+{
+id: "s_1577",
+type: "symptom",
+name: "Discharge from ear, bloody",
+common_name: "Bleeding from ear",
+},
+{
+id: "s_1580",
+type: "symptom",
+name: "Chest pain, worsens on palpation of costochondral joints",
+common_name: "Chest pain worsening on palpation of costochondral joints",
+},
+{
+id: "s_1581",
+type: "symptom",
+name: "Edema, costochondral junctions",
+common_name: "Swelling in the middle of the chest",
+},
+{
+id: "s_1586",
+type: "symptom",
+name: "Unilateral vulval swelling",
+common_name: "Vulval swelling on one side",
+},
+{
+id: "s_1587",
+type: "symptom",
+name: "Depersonalization",
+common_name: "Feeling detached from own body",
+},
+{
+id: "s_1589",
+type: "symptom",
+name: "Abdominal tenderness, left upper quadrant",
+common_name: "Pain when pressing upper-left part of the abdomen",
+},
+{
+id: "s_1591",
+type: "symptom",
+name: "Abdominal pain, left upper quadrant",
+common_name: "Upper left side abdominal pain",
+},
+{
+id: "s_1598",
+type: "symptom",
+name: "Abdominal pain, below navel",
+common_name: "Lower abdominal pain",
+},
+{
+id: "s_1601",
+type: "symptom",
+name: "Chest pain, stabbing",
+common_name: "Stabbing chest pain",
+},
+{
+id: "s_1602",
+type: "symptom",
+name: "Dermatological changes, located in genital area, chancre",
+common_name: "Painless genital ulcer",
+},
+{
+id: "s_1603",
+type: "symptom",
+name: "Delayed language development",
+common_name: "Delayed language development",
+},
+{
+id: "s_1605",
+type: "symptom",
+name: "Nose pain",
+common_name: "Painful nose",
+},
+{
+id: "s_1610",
+type: "symptom",
+name: "Joint pain, knee, during movement",
+common_name: "Pain when moving knee",
+},
+{
+id: "s_1616",
+type: "symptom",
+name: "Dandruff",
+common_name: "Dandruff",
+},
+{
+id: "s_1617",
+type: "symptom",
+name: "Pruritus, scalp",
+common_name: "Itchy scalp",
+},
+{
+id: "s_1618",
+type: "symptom",
+name: "Lower limb tenderness",
+common_name: "Pain when pressing lower limb",
+},
+{
+id: "s_1619",
+type: "symptom",
+name: "Upper limb tenderness",
+common_name: "Pain when pressing upper limb",
+},
+{
+id: "s_1620",
+type: "symptom",
+name: "Pain in lower limb, calf",
+common_name: "Pain in calf",
+},
+{
+id: "s_1621",
+type: "symptom",
+name: "Joint pain, ankle",
+common_name: "Ankle pain",
+},
+{
+id: "s_1622",
+type: "symptom",
+name: "Lower limb tenderness, calf",
+common_name: "Pain when pressing calf",
+},
+{
+id: "s_1623",
+type: "symptom",
+name: "Joint pain, during ankle movement",
+common_name: "Pain when moving ankle",
+},
+{
+id: "s_1625",
+type: "symptom",
+name: "Dyspnea, lasting more than 4 weeks",
+common_name: "Shortness of breath lasting more than 4 weeks",
+},
+{
+id: "s_1632",
+type: "symptom",
+name: "Joint pain, elbow",
+common_name: "Elbow pain",
+},
+{
+id: "s_1634",
+type: "symptom",
+name: "Joint pain, during elbow movement",
+common_name: "Pain when moving elbow",
+},
+{
+id: "s_1635",
+type: "symptom",
+name: "Edema, elbow joint",
+common_name: "Swollen elbow",
+},
+{
+id: "s_1636",
+type: "symptom",
+name: "Joint pain, during wrist movement",
+common_name: "Pain when moving wrist",
+},
+{
+id: "s_1639",
+type: "symptom",
+name: "Joint pain, thumb",
+common_name: "Thumb pain",
+},
+{
+id: "s_1641",
+type: "symptom",
+name: "Joint pain, during thumb movement",
+common_name: "Pain when moving thumb",
+},
+{
+id: "s_1645",
+type: "symptom",
+name: "Foot pain, pain in back of foot during single-leg heel raise",
+common_name: "Pain in the back of foot while standing on toes",
+},
+{
+id: "s_1647",
+type: "symptom",
+name: "Annular skin lesions",
+common_name: "Ring-shaped skin changes",
+},
+{
+id: "s_1650",
+type: "symptom",
+name: "Skin thickening",
+common_name: "Skin thickening",
+},
+{
+id: "s_1652",
+type: "symptom",
+name: "Edema, hip joint",
+common_name: "Hip swelling",
+},
+{
+id: "s_1654",
+type: "symptom",
+name: "Joint pain, shoulder",
+common_name: "Shoulder pain",
+},
+{
+id: "s_1655",
+type: "symptom",
+name: "Edema, shoulder joint",
+common_name: "Swollen shoulder",
+},
+{
+id: "s_1656",
+type: "symptom",
+name: "Joint pain, tenderness",
+common_name: "Pain when pressing joint",
+},
+{
+id: "s_1665",
+type: "symptom",
+name: "Hair loss, generalized",
+common_name: "Generalized hair volume loss",
+},
+{
+id: "s_1671",
+type: "symptom",
+name: "Broken hair",
+common_name: "Broken hair",
+},
+{
+id: "s_1673",
+type: "symptom",
+name: "Oral lesions, white plaques",
+common_name: "White patches inside the mouth",
+},
+{
+id: "s_1674",
+type: "symptom",
+name: "Skin pain",
+common_name: "Skin pain",
+},
+{
+id: "s_1676",
+type: "symptom",
+name: "Corn or callus",
+common_name: "Corn or callus",
+},
+{
+id: "s_1680",
+type: "symptom",
+name: "Dermatological changes, hyperpigmentation of the skin",
+common_name: "Dark skin changes",
+},
+{
+id: "s_1682",
+type: "symptom",
+name: "Rhinophyma",
+common_name: "Ruddy bulbous nose",
+},
+{
+id: "s_1684",
+type: "symptom",
+name: "Burning skin, face",
+common_name: "Burning sensation on face",
+},
+{
+id: "s_1685",
+type: "symptom",
+name: "Telangiectasias, face",
+common_name: "Spider veins on the face",
+},
+{
+id: "s_1689",
+type: "symptom",
+name: "Kernigs sign",
+common_name: "Kernigs sign",
+},
+{
+id: "s_1690",
+type: "symptom",
+name: "Brudzinskis sign",
+common_name: "Brudzinskis sign",
+},
+{
+id: "s_1692",
+type: "symptom",
+name: "Dermatological changes, exacerbated by alcohol consumption",
+common_name: "Skin changes worsening after alcohol consumption",
+},
+{
+id: "s_1693",
+type: "symptom",
+name: "Decreased intensity of breath sounds",
+common_name: "Decreased intensity of breath sounds",
+},
+{
+id: "s_1695",
+type: "symptom",
+name: "Interpersonal relationship difficulties",
+common_name: "Interpersonal relationship difficulties",
+},
+{
+id: "s_1696",
+type: "symptom",
+name: "Echolalia",
+common_name: "Unsolicitedly repeating words or phrases",
+},
+{
+id: "s_1697",
+type: "symptom",
+name: "Restricted interests",
+common_name: "Having strong, limited, or unusual interests",
+},
+{
+id: "s_1698",
+type: "symptom",
+name: "Lack of eye contact",
+common_name: "Avoiding eye contact",
+},
+{
+id: "s_1713",
+type: "symptom",
+name: "Reduced range of joint motion",
+common_name: "Joint hard to move",
+},
+{
+id: "s_1715",
+type: "symptom",
+name: "Pathologic fractures",
+common_name: "Broken bone not caused by trauma",
+},
+{
+id: "s_1716",
+type: "symptom",
+name: "Feeling of vaginal fullness",
+common_name: "Vaginal fullness",
+},
+{
+id: "s_1717",
+type: "symptom",
+name: "Bulge protruding through vaginal opening",
+common_name: "Vaginal bulge",
+},
+{
+id: "s_1719",
+type: "symptom",
+name: "Osler nodes",
+common_name: "Osler nodes",
+},
+{
+id: "s_1720",
+type: "symptom",
+name: "Cardiac murmurs",
+common_name: "Cardiac murmurs",
+},
+{
+id: "s_1721",
+type: "symptom",
+name: "Nystagmus, horizontal",
+common_name: "Horizontal nystagmus",
+},
+{
+id: "s_1725",
+type: "symptom",
+name: "Lower limb pallor",
+common_name: "Pale leg",
+},
+{
+id: "s_1729",
+type: "symptom",
+name: "Abdominal pain, left lower quadrant",
+common_name: "Lower left side abdominal pain",
+},
+{
+id: "s_1731",
+type: "symptom",
+name: "Dix-Hallpike maneuver, rotatory nystagmus",
+common_name: "Dix-Hallpike maneuver, rotatory nystagmus",
+},
+{
+id: "s_1732",
+type: "symptom",
+name: "Rovsings sign",
+common_name: "Rovsings sign",
+},
+{
+id: "s_1733",
+type: "symptom",
+name: "Lymph node pain",
+common_name: "Painful lymph nodes",
+},
+{
+id: "s_1738",
+type: "symptom",
+name: "Rombergs sign",
+common_name: "Rombergs sign",
+},
+{
+id: "s_1744",
+type: "symptom",
+name: "Audible popping in knee during injury",
+common_name: "Audible popping in knee during injury",
+},
+{
+id: "s_1745",
+type: "symptom",
+name: "Knee instability",
+common_name: "Unstable knee",
+},
+{
+id: "s_1761",
+type: "symptom",
+name: "Dermatological changes, aggravated by stress",
+common_name: "Skin changes worsening under stress",
+},
+{
+id: "s_1762",
+type: "symptom",
+name: "Headache, exacerbated by increased stress",
+common_name: "Headache worsened by stress",
+},
+{
+id: "s_1763",
+type: "symptom",
+name: "Chest pain, exacerbated by stress",
+common_name: "Chest pain worsened by stress",
+},
+{
+id: "s_1765",
+type: "symptom",
+name: "Tremors, stress-related",
+common_name: "Trembling worsening under stress",
+},
+{
+id: "s_1766",
+type: "symptom",
+name: "Myalgia, exacerbated by stress",
+common_name: "Muscle pain triggered by stress",
+},
+{
+id: "s_1767",
+type: "symptom",
+name: "Gastric symptoms, stress-related",
+common_name: "Stress-related gastric symptoms",
+},
+{
+id: "s_1768",
+type: "symptom",
+name: "Mental disturbances exacerbated by stress",
+common_name: "Mental disturbances exacerbated by stress",
+},
+{
+id: "s_1772",
+type: "symptom",
+name: "Back pain, thoracic",
+common_name: "Middle or upper back pain",
+},
+{
+id: "s_1776",
+type: "symptom",
+name: "Dysphagia, oropharyngeal",
+common_name: "Difficulty initiating a swallow",
+},
+{
+id: "s_1779",
+type: "symptom",
+name: "Dysphagia, esophageal",
+common_name: "Feeling of food getting stuck several seconds after swallowing",
+},
+{
+id: "s_1780",
+type: "symptom",
+name: "Headache, mild",
+common_name: "Mild headache",
+},
+{
+id: "s_1781",
+type: "symptom",
+name: "Headache, moderate",
+common_name: "Moderate headache",
+},
+{
+id: "s_1782",
+type: "symptom",
+name: "Abdominal pain, mild",
+common_name: "Mild abdominal pain",
+},
+{
+id: "s_1783",
+type: "symptom",
+name: "Abdominal pain, moderate",
+common_name: "Moderate abdominal pain",
+},
+{
+id: "s_1788",
+type: "symptom",
+name: "White nail discolouration",
+common_name: "White spots on nail",
+},
+{
+id: "s_1789",
+type: "symptom",
+name: "Yellow nail discolouration",
+common_name: "Yellow nails",
+},
+{
+id: "s_1790",
+type: "symptom",
+name: "Thickened nails",
+common_name: "Thickened nails",
+},
+{
+id: "s_1791",
+type: "symptom",
+name: "Erythema, scalp",
+common_name: "Red patches on scalp",
+},
+{
+id: "s_1792",
+type: "symptom",
+name: "Visible head lice on scalp or brush",
+common_name: "Visible head lice on scalp or brush",
+},
+{
+id: "s_1793",
+type: "symptom",
+name: "Lice eggs or nits on hair shafts",
+common_name: "Lice eggs or nits",
+},
+{
+id: "s_1795",
+type: "symptom",
+name: "White-gray burrows in the skin",
+common_name: "White-gray burrows in the skin",
+},
+{
+id: "s_1796",
+type: "symptom",
+name: "White patch on cornea",
+common_name: "White spot on cornea",
+},
+{
+id: "s_1798",
+type: "symptom",
+name: "Difference in size of testicles",
+common_name: "Difference in size of testicles",
+},
+{
+id: "s_1799",
+type: "symptom",
+name: "Pain in upper limb, forearm",
+common_name: "Pain in forearm",
+},
+{
+id: "s_1800",
+type: "symptom",
+name: "Past appendectomy",
+common_name: "Appendix removal in the past",
+},
+{
+id: "s_1802",
+type: "symptom",
+name: "Abdominal pain, burning or gnawing",
+common_name: "Burning or gnawing stomach pain",
+},
+{
+id: "s_1805",
+type: "symptom",
+name: "Joint pain, during shoulder movement",
+common_name: "Pain when moving shoulder",
+},
+{
+id: "s_1808",
+type: "symptom",
+name: "Dermatological changes, located on the face",
+common_name: "Skin changes on the face",
+},
+{
+id: "s_1810",
+type: "symptom",
+name: "Dermatological changes, located in the genital area",
+common_name: "Skin changes on or around genitals",
+},
+{
+id: "s_1811",
+type: "symptom",
+name: "Vaginal dryness",
+common_name: "Vaginal dryness",
+},
+{
+id: "s_1812",
+type: "symptom",
+name: "Nasal congestion, chronic",
+common_name: "Blocked nose lasting more than 3 months",
+},
+{
+id: "s_1819",
+type: "symptom",
+name: "Impaired vision, one eye",
+common_name: "Visual impairment in one eye",
+},
+{
+id: "s_1820",
+type: "symptom",
+name: "Fever, temperature not measured",
+common_name: "Fever not measured",
+},
+{
+id: "s_1823",
+type: "symptom",
+name: "Joint pain, during hip movement",
+common_name: "Pain when moving hip",
+},
+{
+id: "s_1826",
+type: "symptom",
+name: "Pharyngeal pain, unilateral",
+common_name: "One-sided sore throat",
+},
+{
+id: "s_1829",
+type: "symptom",
+name: "Crotch pain, vulvovaginal",
+common_name: "Pain in vagina or vulva",
+},
+{
+id: "s_1830",
+type: "symptom",
+name: "Skin mass, larger than 1 cm",
+common_name: "Lump larger than 1 cm",
+},
+{
+id: "s_1831",
+type: "symptom",
+name: "Skin mass",
+common_name: "Lumps or bumps",
+},
+{
+id: "s_1833",
+type: "symptom",
+name: "Toe pain",
+common_name: "Toe pain",
+},
+{
+id: "s_1835",
+type: "symptom",
+name: "Body aches",
+common_name: "Body aches",
+},
+{
+id: "s_1840",
+type: "symptom",
+name: "Abdominal pain, lasting less than 2 days",
+common_name: "Abdominal pain lasting less than 2 days",
+},
+{
+id: "s_1842",
+type: "symptom",
+name: "Abdominal pain, lasting more than 2 weeks",
+common_name: "Abdominal pain lasting more than 2 weeks",
+},
+{
+id: "s_1843",
+type: "symptom",
+name: "Abdominal pain, sudden onset",
+common_name: "Sudden abdominal pain",
+},
+{
+id: "s_1844",
+type: "symptom",
+name: "Abdominal pain, gradual onset",
+common_name: "Slow and gradual abdominal pain",
+},
+{
+id: "s_1845",
+type: "symptom",
+name: "Abdominal pain, radiating to left shoulder or shoulder blade",
+common_name: "Abdominal pain spreading to the left shoulder area",
+},
+{
+id: "s_1846",
+type: "symptom",
+name: "Abdominal pain, radiating to lower or middle part of the back",
+common_name: "Abdominal pain spreading to the lower or middle back",
+},
+{
+id: "s_1847",
+type: "symptom",
+name: "Abdominal pain, recurrent",
+common_name: "Recurrent abdominal pain",
+},
+{
+id: "s_1848",
+type: "symptom",
+name: "Abdominal pain, colicky",
+common_name: "Colic abdominal pain",
+},
+{
+id: "s_1851",
+type: "symptom",
+name: "Abdominal pain, migrating to the right lower quadrant",
+common_name: "Stomach pain, moved to the lower right side",
+},
+{
+id: "s_1852",
+type: "symptom",
+name: "Abdominal pain, lasting 2 to 7 days",
+common_name: "Abdominal pain lasting 2 to 7 days",
+},
+{
+id: "s_1853",
+type: "symptom",
+name: "Abdominal pain, lasting 8 to 14 days",
+common_name: "Abdominal pain lasting 8 to 14 days",
+},
+{
+id: "s_1193",
+type: "symptom",
+name: "Abdominal pain, left side",
+common_name: "Left side stomach pain",
+},
+{
+id: "s_1855",
+type: "symptom",
+name: "Abdominal pain, right side",
+common_name: "Right side stomach pain",
+},
+{
+id: "s_1856",
+type: "symptom",
+name: "Abdominal tenderness, right lower quadrant",
+common_name: "Pain when pressing lower-right part of the abdomen",
+},
+{
+id: "s_1858",
+type: "symptom",
+name: "Cough, lasting 3 to 8 weeks",
+common_name: "Cough lasting 3 to 8 weeks",
+},
+{
+id: "s_1859",
+type: "symptom",
+name: "Abdominal pain, midcycle",
+common_name: "Painful ovulation",
+},
+{
+id: "s_1860",
+type: "symptom",
+name: "Abdominal pain, crampy",
+common_name: "Crampy abdominal pain",
+},
+{
+id: "s_1864",
+type: "symptom",
+name: "Headache, excruciating",
+common_name: "Worst headache ever",
+},
+{
+id: "s_1868",
+type: "symptom",
+name: "Headache, chronic, lasting 5 minutes to 4 hours",
+common_name: "Headache lasting between 5 minutes and 4 hours",
+},
+{
+id: "s_1870",
+type: "symptom",
+name: "Headache, chronic, lasting 4 to 72 hours",
+common_name: "Headache attack lasting 4 to 72 hours",
+},
+{
+id: "s_1871",
+type: "symptom",
+name: "Headache, exacerbated by physical activity",
+common_name: "Headache worsened by physical activity",
+},
+{
+id: "s_1875",
+type: "symptom",
+name: "Vulvovaginal burning",
+common_name: "Vulvovaginal burning",
+},
+{
+id: "s_1878",
+type: "symptom",
+name: "Calf pain, above the heel",
+common_name: "Pain in calf just above the heel",
+},
+{
+id: "s_1891",
+type: "symptom",
+name: "Hypersensitivity to smells",
+common_name: "Oversensitivity to smells",
+},
+{
+id: "s_1893",
+type: "symptom",
+name: "Pain in lower limb, thigh",
+common_name: "Thigh pain",
+},
+{
+id: "s_1899",
+type: "symptom",
+name: "Tingling fingers, first three digits",
+common_name: "Tingling in the thumb, index and middle finger",
+},
+{
+id: "s_1900",
+type: "symptom",
+name: "Tingling fingers, fourth and fifth digits",
+common_name: "Tingling in the ring and little finger",
+},
+{
+id: "s_1901",
+type: "symptom",
+name: "Headache, chronic, lasting 3 to 7 days",
+common_name: "Headache attacks lasting 3 to 7 days",
+},
+{
+id: "s_1903",
+type: "symptom",
+name: "Reduced range of joint motion, passive",
+common_name: "Reduced range of passive joint motion",
+},
+{
+id: "s_1905",
+type: "symptom",
+name: "Headache, sudden onset",
+common_name: "Sudden headache",
+},
+{
+id: "s_1907",
+type: "symptom",
+name: "Headache, chronic, lasting less than 5 minutes",
+common_name: "Headache lasting less than 5 minutes",
+},
+{
+id: "s_1909",
+type: "symptom",
+name: "Foot drop",
+common_name: "Dropping the front of the foot",
+},
+{
+id: "s_1910",
+type: "symptom",
+name: "Wrist drop",
+common_name: "Dropping hand",
+},
+{
+id: "s_1911",
+type: "symptom",
+name: "Headache, temporal region",
+common_name: "Headache located over the temples",
+},
+{
+id: "s_1912",
+type: "symptom",
+name: "Headache, recent",
+common_name: "Headaches history shorter than 3 months",
+},
+{
+id: "s_1915",
+type: "symptom",
+name: "Purpuric rash, palpable",
+common_name: "Red or purple spots larger than 3 mm that can be felt",
+},
+{
+id: "s_1918",
+type: "symptom",
+name: "Buttocks pain",
+common_name: "Buttocks pain",
+},
+{
+id: "s_1921",
+type: "symptom",
+name: "Dermatological changes, exacerbated by sunlight exposure",
+common_name: "Skin changes appearing or worsening after exposure to sunlight",
+},
+{
+id: "s_1922",
+type: "symptom",
+name: "Heel drop test",
+common_name: "Abdominal pain after dropping hard on heels",
+},
+{
+id: "s_1923",
+type: "symptom",
+name: "Dermatological changes, feet",
+common_name: "Skin changes on feet",
+},
+{
+id: "s_1924",
+type: "symptom",
+name: "Cough, paroxysmal",
+common_name: "Severe and sudden coughing attacks",
+},
+{
+id: "s_1925",
+type: "symptom",
+name: "Chest pain, pressure",
+common_name: "Pressing chest pain",
+},
+{
+id: "s_1926",
+type: "symptom",
+name: "Cold and clammy skin",
+common_name: "Cold and clammy skin",
+},
+{
+id: "s_1927",
+type: "symptom",
+name: "Pain in lower limb, limping due to pain",
+common_name: "Limping due to leg pain",
+},
+{
+id: "s_1929",
+type: "symptom",
+name: "Abdominal pain, unbearable",
+common_name: "Unbearable stomach pain",
+},
+{
+id: "s_1930",
+type: "symptom",
+name: "Pain in lower limb, severe",
+common_name: "Severe pain in lower limb",
+},
+{
+id: "s_1931",
+type: "symptom",
+name: "Skin mass, bleeding",
+common_name: "Bleeding lump or bump",
+},
+{
+id: "s_1932",
+type: "symptom",
+name: "Paresthesia, sudden onset",
+common_name: "Sudden onset of tingling or numbness",
+},
+{
+id: "s_1933",
+type: "symptom",
+name: "Blood pressure, more than 180 mmHg",
+common_name: "Very high blood pressure",
+},
+{
+id: "s_1935",
+type: "symptom",
+name: "Pain in upper limb, severe",
+common_name: "Severe pain in upper limb",
+},
+{
+id: "s_1937",
+type: "symptom",
+name: "Worms in stool",
+common_name: "Worms in stool or around anus",
+},
+{
+id: "s_1943",
+type: "symptom",
+name: "Sunburn",
+common_name: "Sunburn",
+},
+{
+id: "s_1949",
+type: "symptom",
+name: "Vomiting, every time after meal",
+common_name: "Vomiting after every meal",
+},
+{
+id: "s_1952",
+type: "symptom",
+name: "Chest pain, recurrent",
+common_name: "Recurrent chest pain",
+},
+{
+id: "s_1955",
+type: "symptom",
+name: "Erythema, around both eyes",
+common_name: "Redness around both eyes",
+},
+{
+id: "s_1957",
+type: "symptom",
+name: "Destructive thoughts towards other people or things",
+common_name: "Destructive thoughts towards other people or things",
+},
+{
+id: "s_1958",
+type: "symptom",
+name: "Dysphonia, more than 2 weeks",
+common_name: "Hoarseness lasting more than 2 weeks",
+},
+{
+id: "s_1960",
+type: "symptom",
+name: "Bruising after trauma",
+common_name: "Bruise after an injury",
+},
+{
+id: "s_1961",
+type: "symptom",
+name: "Jaw pain",
+common_name: "Jaw pain",
+},
+{
+id: "s_1973",
+type: "symptom",
+name: "Skin wound, active bleeding",
+common_name: "Actively bleeding wound",
+},
+{
+id: "s_1979",
+type: "symptom",
+name: "Diarrhea, more than 6 stools a day",
+common_name: "Diarrhea with more than 6 stools a day",
+},
+{
+id: "s_1982",
+type: "symptom",
+name: "Dermatological changes, hands",
+common_name: "Skin changes on hands",
+},
+{
+id: "s_1983",
+type: "symptom",
+name: "Eyelid lesion, itching",
+common_name: "Itchy skin changes on eyelid",
+},
+{
+id: "s_1985",
+type: "symptom",
+name: "Cough, nocturnal",
+common_name: "Nighttime cough",
+},
+{
+id: "s_1988",
+type: "symptom",
+name: "Dermatological changes, spreading",
+common_name: "Enlarging or spreading skin changes",
+},
+{
+id: "s_1994",
+type: "symptom",
+name: "Discharge from ear, purulent",
+common_name: "Yellow or green discharge from ear",
+},
+{
+id: "s_1995",
+type: "symptom",
+name: "Edema, both feet",
+common_name: "Swollen feet",
+},
+{
+id: "s_1996",
+type: "symptom",
+name: "Edema, nose",
+common_name: "Swollen nose",
+},
+{
+id: "s_1997",
+type: "symptom",
+name: "Edema, toe",
+common_name: "Swollen toe",
+},
+{
+id: "s_1999",
+type: "symptom",
+name: "Erythema, vulva",
+common_name: "Reddened vulva",
+},
+{
+id: "s_2000",
+type: "symptom",
+name: "Fever, higher than 104°F or 40°C",
+common_name: "Fever higher than 104°F or 40°C",
+},
+{
+id: "s_2001",
+type: "symptom",
+name: "Paresthesia, one lower limb",
+common_name: "Tingling or numbness in one lower limb",
+},
+{
+id: "s_2002",
+type: "symptom",
+name: "Palpitations, lasting more than 5 minutes",
+common_name: "Palpitations lasting more than 5 minutes",
+},
+{
+id: "s_2003",
+type: "symptom",
+name: "Erythema, toe",
+common_name: "Red toe",
+},
+{
+id: "s_2004",
+type: "symptom",
+name: "Palpitations, recurrent",
+common_name: "Recurrent palpitations",
+},
+{
+id: "s_2005",
+type: "symptom",
+name: "Nail pain",
+common_name: "Sore nail",
+},
+{
+id: "s_2006",
+type: "symptom",
+name: "Chest pain, exacerbating when lying down",
+common_name: "Chest pain worsening when lying down",
+},
+{
+id: "s_2008",
+type: "symptom",
+name: "Regular uterine contractions",
+common_name: "Regular uterine contractions",
+},
+{
+id: "s_2010",
+type: "symptom",
+name: "Fetal membranes rupture",
+common_name: "Water breaking",
+},
+{
+id: "s_2011",
+type: "symptom",
+name: "Blood glucose level, between 54 and 70 mg/dl or between 3 and 3.9 mmol/l",
+common_name: "Low blood sugar level, between 54 and 70 mg/dl or between 3 and 3.9 mmol/l",
+},
+{
+id: "s_2014",
+type: "symptom",
+name: "Blood glucose level, not measured",
+common_name: "Blood sugar level not measured",
+},
+{
+id: "s_2016",
+type: "symptom",
+name: "Nosebleed, single episode",
+common_name: "One episode of bleeding from nose",
+},
+{
+id: "s_2017",
+type: "symptom",
+name: "Nosebleed, recurrent",
+common_name: "Recurrent bleeding from nose",
+},
+{
+id: "s_2018",
+type: "symptom",
+name: "Chest pain, lasting less than 30 minutes",
+common_name: "Chest pain lasting less than 30 minutes",
+},
+{
+id: "s_2019",
+type: "symptom",
+name: "Chest pain, lasting between 30 minutes and 8 hours",
+common_name: "Chest pain lasting between 30 minutes and 8 hours",
+},
+{
+id: "s_2022",
+type: "symptom",
+name: "Chest pain, lasting more than 8 hours",
+common_name: "Chest pain lasting more than 8 hours",
+},
+{
+id: "s_2023",
+type: "symptom",
+name: "Dizziness, recurrent",
+common_name: "Recurrent dizziness",
+},
+{
+id: "s_2024",
+type: "symptom",
+name: "Gambling, pathological",
+common_name: "Excessive gambling",
+},
+{
+id: "s_2029",
+type: "symptom",
+name: "Gambling, lying about extent",
+common_name: "Lying about the extent of gambling",
+},
+{
+id: "s_2032",
+type: "symptom",
+name: "Gambling",
+common_name: "Gambling",
+},
+{
+id: "s_2033",
+type: "symptom",
+name: "Pruritus, foot",
+common_name: "Itchy foot",
+},
+{
+id: "s_2034",
+type: "symptom",
+name: "Consciousness disturbances",
+common_name: "Confusion or disorientation",
+},
+{
+id: "s_2041",
+type: "symptom",
+name: "Halos around lights",
+common_name: "Halos around lights",
+},
+{
+id: "s_2043",
+type: "symptom",
+name: "Male genital itching",
+common_name: "Itchy penis",
+},
+{
+id: "s_2045",
+type: "symptom",
+name: "Seizures",
+common_name: "Seizures",
+},
+{
+id: "s_2047",
+type: "symptom",
+name: "Absence seizure",
+common_name: "Blanking out",
+},
+{
+id: "s_2048",
+type: "symptom",
+name: "Bedwetting",
+common_name: "Bedwetting",
+},
+{
+id: "s_2051",
+type: "symptom",
+name: "Chest pain, exacerbated by chest wall movement",
+common_name: "Chest pain worsening during chest wall movement",
+},
+{
+id: "s_2052",
+type: "symptom",
+name: "Male infertility",
+common_name: "Male infertility",
+},
+{
+id: "s_2053",
+type: "symptom",
+name: "Currant jelly stool",
+common_name: "Redcurrant jelly stool",
+},
+{
+id: "s_2055",
+type: "symptom",
+name: "Vomiting, bilious",
+common_name: "Greenish-yellow vomit",
+},
+{
+id: "s_2056",
+type: "symptom",
+name: "Vomiting, less than 7 days",
+common_name: "Vomiting for less than a week",
+},
+{
+id: "s_2057",
+type: "symptom",
+name: "Vomiting, 7 days or more",
+common_name: "Vomiting for a week or more",
+},
+{
+id: "s_2058",
+type: "symptom",
+name: "Dermatological changes, flexural surfaces",
+common_name: "Skin changes on the inside of joints",
+},
+{
+id: "s_2059",
+type: "symptom",
+name: "Dermatological changes, scalp",
+common_name: "Skin changes on the scalp",
+},
+{
+id: "s_2060",
+type: "symptom",
+name: "Dermatological changes, trunk",
+common_name: "Skin changes on the neck, chest, belly or back",
+},
+{
+id: "s_2063",
+type: "symptom",
+name: "Fever, unresponsive to treatment",
+common_name: "Fever unresponsive to treatment",
+},
+{
+id: "s_2064",
+type: "symptom",
+name: "Foul-smelling urine",
+common_name: "Smelly urine",
+},
+{
+id: "s_2065",
+type: "symptom",
+name: "Mouth pain",
+common_name: "Pain in mouth",
+},
+{
+id: "s_2066",
+type: "symptom",
+name: "Limb length discrepancy",
+common_name: "Uneven limbs",
+},
+{
+id: "s_2068",
+type: "symptom",
+name: "Upper limb pallor",
+common_name: "Pale upper limb",
+},
+{
+id: "s_2070",
+type: "symptom",
+name: "Bone pain, lasting less than a week",
+common_name: "Bone pain lasting less than a week",
+},
+{
+id: "s_2071",
+type: "symptom",
+name: "Bone pain, 1 week or more",
+common_name: "Bone pain lasting 1 week or more",
+},
+{
+id: "s_2072",
+type: "symptom",
+name: "Consciousness disturbances, acute",
+common_name: "Disorientation or confusion starting recently",
+},
+{
+id: "s_2073",
+type: "symptom",
+name: "Consciousness disturbances, chronic",
+common_name: "Disorientation or confusion lasting more than a week",
+},
+{
+id: "s_2074",
+type: "symptom",
+name: "Chest pain, radiating to left upper limb",
+common_name: "Chest pain, spreading  to the left upper limb",
+},
+{
+id: "s_2076",
+type: "symptom",
+name: "Respiratory distress, after trauma",
+common_name: "Breathing problems after an injury",
+},
+{
+id: "s_2077",
+type: "symptom",
+name: "Skin wound, major bleeding",
+common_name: "Major bleeding",
+},
+{
+id: "s_2078",
+type: "symptom",
+name: "Skin wound, minor uncontrollable bleeding",
+common_name: "Skin wound with minor uncontrollable bleeding",
+},
+{
+id: "s_2079",
+type: "symptom",
+name: "Recent injury without bleeding",
+common_name: "Recent injury without bleeding",
+},
+{
+id: "s_2081",
+type: "symptom",
+name: "Severe pain, after trauma",
+common_name: "Severe pain after an injury",
+},
+{
+id: "s_2084",
+type: "symptom",
+name: "Periorbital ecchymosis",
+common_name: "Bruising around the eyes",
+},
+{
+id: "s_2085",
+type: "symptom",
+name: "Back pain, worsens on palpation",
+common_name: "Back pain worsens by touching or pressing the affected area",
+},
+{
+id: "s_2086",
+type: "symptom",
+name: "Inability to bear weight, after trauma",
+common_name: "Inability to stand on either foot after injury",
+},
+{
+id: "s_2087",
+type: "symptom",
+name: "Joint deformity, post-traumatic",
+common_name: "Deformed joints after an injury",
+},
+{
+id: "s_2088",
+type: "symptom",
+name: "Physical injury",
+common_name: "Injury",
+},
+{
+id: "s_2091",
+type: "symptom",
+name: "Pain in both upper limbs, both hands",
+common_name: "Pain in both hands",
+},
+{
+id: "s_2092",
+type: "symptom",
+name: "Pain in both lower limbs, both feet",
+common_name: "Pain in both feet",
+},
+{
+id: "s_2093",
+type: "symptom",
+name: "Edema, both hands",
+common_name: "Swollen hands",
+},
+{
+id: "s_2094",
+type: "symptom",
+name: "Dry eyes",
+common_name: "Dry eyes",
+},
+{
+id: "s_2096",
+type: "symptom",
+name: "Chest pain, burning",
+common_name: "Burning chest pain",
+},
+{
+id: "s_2097",
+type: "symptom",
+name: "Re-experiencing trauma, intrusive symptoms",
+common_name: "Re-experiencing trauma through flashbacks, memories, or dreams",
+},
+{
+id: "s_2100",
+type: "symptom",
+name: "Fatigue",
+common_name: "Fatigue",
+},
+{
+id: "s_2103",
+type: "symptom",
+name: "Edema, one foot",
+common_name: "Swollen foot",
+},
+{
+id: "s_2105",
+type: "symptom",
+name: "Re-experiencing trauma, distressing symptoms",
+common_name: "Physical and mental distress related to re-experiencing trauma",
+},
+{
+id: "s_2107",
+type: "symptom",
+name: "Waking up during the night",
+common_name: "Middle-of-the-night insomnia",
+},
+{
+id: "s_2108",
+type: "symptom",
+name: "Cognitive disturbances",
+common_name: "Cognitive disturbances",
+},
+{
+id: "s_2109",
+type: "symptom",
+name: "Coma",
+common_name: "Coma",
+},
+{
+id: "s_2110",
+type: "symptom",
+name: "Dermatological changes, female genital area",
+common_name: "Skin changes on or around female genital area",
+},
+{
+id: "s_2111",
+type: "symptom",
+name: "Dermatological changes, male genital area",
+common_name: "Skin changes on or around male genital area",
+},
+{
+id: "s_2112",
+type: "symptom",
+name: "Pleuritic chest pain, after trauma",
+common_name: "Sudden and sharp chest pain after an injury",
+},
+{
+id: "s_2115",
+type: "symptom",
+name: "Abnormal uterine bleeding, pregnancy",
+common_name: "Vaginal bleeding during pregnancy",
+},
+{
+id: "s_2116",
+type: "symptom",
+name: "Abnormal uterine spotting, pregnancy",
+common_name: "Vaginal spotting during pregnancy",
+},
+{
+id: "s_2118",
+type: "symptom",
+name: "Dizziness, unbearable",
+common_name: "Unbearable dizziness",
+},
+{
+id: "s_2119",
+type: "symptom",
+name: "Ulcer, completely painless",
+common_name: "Painless ulcer",
+},
+{
+id: "s_2121",
+type: "symptom",
+name: "Acid reflux",
+common_name: "Acidic taste in mouth",
+},
+{
+id: "s_2122",
+type: "symptom",
+name: "Rectal mucosal prolapse",
+common_name: "Rectal prolapse",
+},
+{
+id: "s_2124",
+type: "symptom",
+name: "Noisy breathing",
+common_name: "Noisy breathing",
+},
+{
+id: "s_2125",
+type: "symptom",
+name: "Fetal membranes rupture, purulent or malodorous amniotic fluid",
+common_name: "Smelly or coloured waters",
+},
+{
+id: "s_2126",
+type: "symptom",
+name: "Diarrhea, lasting less than 48 hours",
+common_name: "Diarrhea lasting less than 48 hours",
+},
+{
+id: "s_2129",
+type: "symptom",
+name: "Somnambulism",
+common_name: "Sleepwalking",
+},
+{
+id: "s_2132",
+type: "symptom",
+name: "Bleeding from the umbilical cord stump",
+common_name: "Bleeding from the umbilical cord stump",
+},
+{
+id: "s_2133",
+type: "symptom",
+name: "Bulging fontanelle",
+common_name: "Bulging soft spot",
+},
+{
+id: "s_2134",
+type: "symptom",
+name: "Chest retractions",
+common_name: "Chest retractions",
+},
+{
+id: "s_2135",
+type: "symptom",
+name: "Circumoral pallor",
+common_name: "White and light skin around the mouth",
+},
+{
+id: "s_2138",
+type: "symptom",
+name: "Crying without tears",
+common_name: "Crying without tears",
+},
+{
+id: "s_2139",
+type: "symptom",
+name: "Dermatological changes, intertriginous",
+common_name: "Skin changes between skin folds",
+},
+{
+id: "s_2140",
+type: "symptom",
+name: "Drawing up legs",
+common_name: "Drawing up legs",
+},
+{
+id: "s_2141",
+type: "symptom",
+name: "Eye discharge",
+common_name: "Eye discharge",
+},
+{
+id: "s_2142",
+type: "symptom",
+name: "Weight faltering",
+common_name: "Slow rate of weight gain",
+},
+{
+id: "s_2143",
+type: "symptom",
+name: "Expiratory grunting",
+common_name: "Grunting with every breath",
+},
+{
+id: "s_2144",
+type: "symptom",
+name: "Ill appearance",
+common_name: "Ill appearance",
+},
+{
+id: "s_2145",
+type: "symptom",
+name: "Ill appearance, serious and strong concern",
+common_name: "Ill appearance causing strong concern",
+},
+{
+id: "s_2148",
+type: "symptom",
+name: "Increased head circumference",
+common_name: "Increased head circumference",
+},
+{
+id: "s_2149",
+type: "symptom",
+name: "Irritability, lasting more than 3 days",
+common_name: "Fussy for more than 3 days",
+},
+{
+id: "s_2150",
+type: "symptom",
+name: "Laboured breathing, nocturnal",
+common_name: "Difficulty breathing at night",
+},
+{
+id: "s_2151",
+type: "symptom",
+name: "Lack of eye fixation",
+common_name: "Trouble focusing eyes",
+},
+{
+id: "s_2153",
+type: "symptom",
+name: "Nasal catarrh, mucoid",
+common_name: "Clear or white nasal discharge",
+},
+{
+id: "s_2154",
+type: "symptom",
+name: "Nasal catarrh, purulent",
+common_name: "Yellow or green nasal discharge",
+},
+{
+id: "s_2155",
+type: "symptom",
+name: "Nasal flaring",
+common_name: "Nasal flaring",
+},
+{
+id: "s_2156",
+type: "symptom",
+name: "Posttussive vomiting",
+common_name: "Coughing followed by vomiting",
+},
+{
+id: "s_2157",
+type: "symptom",
+name: "Presence of the umbilical cord",
+common_name: "Presence of the umbilical cord",
+},
+{
+id: "s_2159",
+type: "symptom",
+name: "Sunken fontanelle",
+common_name: "Sunken soft spot on infants head",
+},
+{
+id: "s_2160",
+type: "symptom",
+name: "Teething",
+common_name: "Teething",
+},
+{
+id: "s_2162",
+type: "symptom",
+name: "Constipation, lasting 3 months or more",
+common_name: "Constipation for 3 months or more",
+},
+{
+id: "s_2163",
+type: "symptom",
+name: "Twisted neck",
+common_name: "Twisted neck",
+},
+{
+id: "s_2164",
+type: "symptom",
+name: "Consumption of expired food or drink",
+common_name: "Spoiled food or drink consumption",
+},
+{
+id: "s_2165",
+type: "symptom",
+name: "Cough, barking",
+common_name: "Barking cough",
+},
+{
+id: "s_2166",
+type: "symptom",
+name: "Wheezing, acute",
+common_name: "Sudden wheezing",
+},
+{
+id: "s_2168",
+type: "symptom",
+name: "Normal body temperature",
+common_name: "Normal body temperature",
+},
+{
+id: "s_2169",
+type: "symptom",
+name: "Normal heart rate",
+common_name: "Normal pulse",
+},
+{
+id: "s_2170",
+type: "symptom",
+name: "Anicteric presentation",
+common_name: "Anicteric presentation",
+},
+{
+id: "s_2171",
+type: "symptom",
+name: "Normal lung sounds on auscultation",
+common_name: "Normal lung sounds on auscultation",
+},
+{
+id: "s_2172",
+type: "symptom",
+name: "No signs of upper respiratory infection",
+common_name: "No signs of upper respiratory infection",
+},
+{
+id: "s_2173",
+type: "symptom",
+name: "Neck pain, during head movement",
+common_name: "Neck pain when moving the head",
+},
+{
+id: "s_2174",
+type: "symptom",
+name: "Normal vital signs",
+common_name: "Normal vital signs",
+},
+{
+id: "s_2175",
+type: "symptom",
+name: "Possible rabies exposure",
+common_name: "Possible rabies exposure",
+},
+{
+id: "s_2176",
+type: "symptom",
+name: "Dyspnea, lasting 1 to 24 hours",
+common_name: "Shortness of breath lasting 1 to 24 hours",
+},
+{
+id: "s_2177",
+type: "symptom",
+name: "Dermatological changes, bright red or purple",
+common_name: "Bright red or purple skin changes",
+},
+{
+id: "s_2178",
+type: "symptom",
+name: "Wheezing, subacute",
+common_name: "Wheezing since a couple days to weeks",
+},
+{
+id: "s_2180",
+type: "symptom",
+name: "Bone deformity, non-traumatic",
+common_name: "Bone deformity not associated with a recent trauma",
+},
+{
+id: "s_2181",
+type: "symptom",
+name: "Bone deformity, post-traumatic",
+common_name: "Bone deformity after a recent injury",
+},
+{
+id: "s_2182",
+type: "symptom",
+name: "Flank pain",
+common_name: "Pain on the sides of the body",
+},
+{
+id: "s_2188",
+type: "symptom",
+name: "Eye discharge, purulent",
+common_name: "Purulent eye discharge",
+},
+{
+id: "s_2189",
+type: "symptom",
+name: "Headache, recent, lasting less than 1 hour",
+common_name: "Headache lasting less than 1 hour",
+},
+{
+id: "s_2190",
+type: "symptom",
+name: "Headache, recent, lasting 1 to 24 hours",
+common_name: "Headache lasting between 1 hour and 1 day",
+},
+{
+id: "s_2191",
+type: "symptom",
+name: "Headache, recent, lasting more than 1 day",
+common_name: "Headache lasting for more than 1 day",
+},
+{
+id: "s_2193",
+type: "symptom",
+name: "Ear rubbing",
+common_name: "Ear pulling or tugging",
+},
+{
+id: "s_2194",
+type: "symptom",
+name: "Diarrhea, lasting 2 to 14 days",
+common_name: "Diarrhea lasting 2 to 14 days",
+},
+{
+id: "s_2196",
+type: "symptom",
+name: "Cold feet and toes, unilateral",
+common_name: "Cold foot",
+},
+{
+id: "s_2200",
+type: "symptom",
+name: "Diplopia, lasting less than 24 hours",
+common_name: "Double vision lasting less than 24 hours",
+},
+{
+id: "s_2201",
+type: "symptom",
+name: "Diplopia, lasting 24 hours or more",
+common_name: "Double vision lasting 24 hours or more",
+},
+{
+id: "s_2203",
+type: "symptom",
+name: "Dyspnea, after a few minutes of walking",
+common_name: "Shortness of breath after a few minutes of walking",
+},
+{
+id: "s_2204",
+type: "symptom",
+name: "Dyspnea, on exertion",
+common_name: "Shortness of breath on effort",
+},
+{
+id: "s_2206",
+type: "symptom",
+name: "Paraphimosis",
+common_name: "Retracted and stuck foreskin",
+},
+{
+id: "s_2207",
+type: "symptom",
+name: "Edema, penis",
+common_name: "Swollen penis",
+},
+{
+id: "s_2208",
+type: "symptom",
+name: "Ulcer, not healing within 6 weeks",
+common_name: "Non-healing ulcers",
+},
+{
+id: "s_2209",
+type: "symptom",
+name: "Seizures, recurrent",
+common_name: "Recurrent seizures",
+},
+{
+id: "s_2211",
+type: "symptom",
+name: "Urticaria, lasting more than 6 weeks",
+common_name: "Hives lasting more than 6 weeks",
+},
+{
+id: "s_2212",
+type: "symptom",
+name: "Purulent vaginal discharge",
+common_name: "Purulent vaginal discharge",
+},
+{
+id: "s_2213",
+type: "symptom",
+name: "Self-injurious thoughts or behaviours",
+common_name: "Self-injurious thoughts or behaviours",
+},
+{
+id: "s_2222",
+type: "symptom",
+name: "Wound, lip",
+common_name: "Wound on the lip",
+},
+{
+id: "s_2226",
+type: "symptom",
+name: "Nasal congestion, worsens after briefly improving",
+common_name: "Stuffy nose worsening after brief improvement",
+},
+{
+id: "s_2228",
+type: "symptom",
+name: "Recent self-injurious behaviour",
+common_name: "Recent self-inflicted injury",
+},
+{
+id: "s_2230",
+type: "symptom",
+name: "Recent self-injurious behaviour, severe",
+common_name: "Recent severe self-inflicted injury",
+},
+{
+id: "s_2231",
+type: "symptom",
+name: "Dyspnea, unknown severity",
+common_name: "Shortness of breath of unknown severity",
+},
+{
+id: "s_2234",
+type: "symptom",
+name: "Breast asymmetry in size or shape",
+common_name: "Asymmetrical breasts",
+},
+{
+id: "s_2236",
+type: "symptom",
+name: "Erythema, scrotum",
+common_name: "Reddened scrotum",
+},
+{
+id: "s_2238",
+type: "symptom",
+name: "Asymmetrical thigh creases",
+common_name: "Asymmetry of thigh folds",
+},
+{
+id: "s_2241",
+type: "symptom",
+name: "Umbilical discharge",
+common_name: "Belly button discharge",
+},
+{
+id: "s_2242",
+type: "symptom",
+name: "Eye pain, unbearable",
+common_name: "Unbearable eye pain",
+},
+{
+id: "s_2245",
+type: "symptom",
+name: "Genital injury in male",
+common_name: "Genital injury in male",
+},
+{
+id: "s_2246",
+type: "symptom",
+name: "Genital injury in female",
+common_name: "Genital injury in female",
+},
+{
+id: "s_2247",
+type: "symptom",
+name: "Enlarged front of neck",
+common_name: "Swollen front of neck",
+},
+{
+id: "s_2248",
+type: "symptom",
+name: "Enlarged cervical lymph nodes",
+common_name: "Enlarged lymph glands in the neck",
+},
+{
+id: "s_2251",
+type: "symptom",
+name: "Unknown heart rate",
+common_name: "Unknown pulse",
+},
+{
+id: "s_2252",
+type: "symptom",
+name: "Abdominal tenderness, left lower quadrant",
+common_name: "Pain when pressing lower-left part of the abdomen",
+},
+{
+id: "s_2253",
+type: "symptom",
+name: "Flat foot",
+common_name: "Flat foot",
+},
+{
+id: "s_2259",
+type: "symptom",
+name: "Seizures, reflex",
+common_name: "Reflex seizures",
+},
+{
+id: "s_2260",
+type: "symptom",
+name: "Gingival recession",
+common_name: "Receding gums",
+},
+{
+id: "s_2261",
+type: "symptom",
+name: "Calf hypertrophy",
+common_name: "Enlarged calves",
+},
+{
+id: "s_2262",
+type: "symptom",
+name: "Gowers sign",
+common_name: "Standing up with help of hands 'walking' up legs",
+},
+{
+id: "s_2263",
+type: "symptom",
+name: "Tet spells",
+common_name: "Tet spells",
+},
+{
+id: "s_2264",
+type: "symptom",
+name: "Fatigue, during feeding",
+common_name: "Fatigue during feeding",
+},
+{
+id: "s_2266",
+type: "symptom",
+name: "Dermatological changes, upper extremities excluding hands",
+common_name: "Skin changes on the shoulder, arm, forearm, elbow, or wrist",
+},
+{
+id: "s_2267",
+type: "symptom",
+name: "Dermatological changes, lower extremities excluding feet",
+common_name: "Skin changes on the hip, thigh, knee, calf, or ankle",
+},
+{
+id: "s_2268",
+type: "symptom",
+name: "Cough, alternating productivity",
+common_name: "Wet and dry cough appearing alternately",
+},
+{
+id: "s_2269",
+type: "symptom",
+name: "Vesicular exanthema of lips or perioral skin",
+common_name: "Blisters on the lips or around the mouth",
+},
+{
+id: "s_2270",
+type: "symptom",
+name: "Vesicular exanthema of ear",
+common_name: "Blisters on ear",
+},
+{
+id: "s_2271",
+type: "symptom",
+name: "Gastric symptoms, after gluten ingestion",
+common_name: "Abdominal symptoms after eating foods containing gluten",
+},
+{
+id: "s_2272",
+type: "symptom",
+name: "Blood pressure, normal or prehypertension",
+common_name: "Normal blood pressure",
+},
+{
+id: "s_2273",
+type: "symptom",
+name: "Blood pressure, not measured",
+common_name: "Blood pressure not measured",
+},
+{
+id: "s_2274",
+type: "symptom",
+name: "Short stature",
+common_name: "Decreased growth",
+},
+{
+id: "s_2275",
+type: "symptom",
+name: "Abdominal pain, localized",
+common_name: "Localized abdominal pain",
+},
+{
+id: "s_2276",
+type: "symptom",
+name: "Bleeding from anus, light",
+common_name: "Light bleeding from anus",
+},
+{
+id: "s_2277",
+type: "symptom",
+name: "Bleeding from anus, heavy",
+common_name: "Heavy bleeding from anus",
+},
+{
+id: "s_2278",
+type: "symptom",
+name: "Ataxia, acute",
+common_name: "Recent coordination problems",
+},
+{
+id: "s_2279",
+type: "symptom",
+name: "Ataxia, subacute",
+common_name: "Coordination problems since several days, weeks, or months ago",
+},
+{
+id: "s_2280",
+type: "symptom",
+name: "Ataxia, chronic",
+common_name: "Coordination problems for more than 1 year",
+},
+{
+id: "s_2281",
+type: "symptom",
+name: "Abdominal pain, unspecified location",
+common_name: "Abdominal pain, unspecified location",
+},
+{
+id: "s_2282",
+type: "symptom",
+name: "Pale skin, fingers",
+common_name: "Pale fingers",
+},
+{
+id: "s_2283",
+type: "symptom",
+name: "Bruxism",
+common_name: "Teeth grinding",
+},
+{
+id: "s_2284",
+type: "symptom",
+name: "Back pain, nocturnal",
+common_name: "Nighttime back pain",
+},
+{
+id: "s_2285",
+type: "symptom",
+name: "Skin mass, natal cleft",
+common_name: "Lump or bump in groove between buttocks",
+},
+{
+id: "s_2288",
+type: "symptom",
+name: "Abdominal pain, unknown character",
+common_name: "Abdominal pain of unspecific character",
+},
+{
+id: "s_2289",
+type: "symptom",
+name: "Excessive fear of separation",
+common_name: "Excessive fear of separation",
+},
+{
+id: "s_2290",
+type: "symptom",
+name: "Speech and language impairment, rapid onset",
+common_name: "Rapid onset of speech and language impairment",
+},
+{
+id: "s_2291",
+type: "symptom",
+name: "Subungual splinter hemorrhages",
+common_name: "Small red spots or lines under the nail",
+},
+{
+id: "s_2292",
+type: "symptom",
+name: "Enlarged axillary lymph nodes",
+common_name: "Enlarged lymph nodes in the armpit",
+},
+{
+id: "s_2294",
+type: "symptom",
+name: "Absence seizures, reflex",
+common_name: "Reflex absence seizures",
+},
+{
+id: "s_2296",
+type: "symptom",
+name: "Choking",
+common_name: "Choking",
+},
+{
+id: "s_2298",
+type: "symptom",
+name: "Joint pain, mechanical",
+common_name: "Joint pain worsened by movement and improved with rest",
+},
+{
+id: "s_2299",
+type: "symptom",
+name: "Joint pain, inflammatory",
+common_name: "Joint pain worsened by immobility",
+},
+{
+id: "s_2300",
+type: "symptom",
+name: "Swallowed foreign body",
+common_name: "Swallowed object",
+},
+{
+id: "s_2302",
+type: "symptom",
+name: "Loss of consciousness, transient",
+common_name: "Fainting",
+},
+{
+id: "s_2303",
+type: "symptom",
+name: "Loss of consciousness, more than 1 minute",
+common_name: "Loss of consciousness, more than 1 minute",
+},
+{
+id: "s_2304",
+type: "symptom",
+name: "Paresthesia, upper limbs",
+common_name: "Tingling and numbness of upper limbs",
+},
+{
+id: "s_2306",
+type: "symptom",
+name: "Paresthesia, lower limbs",
+common_name: "Tingling and numbness of lower limbs",
+},
+{
+id: "s_2307",
+type: "symptom",
+name: "Nasal congestion, acute",
+common_name: "Stuffy nose lasting less than 10 days",
+},
+{
+id: "s_2308",
+type: "symptom",
+name: "Nasal congestion, subacute",
+common_name: "Stuffy nose lasting between 10 days and 3 months",
+},
+{
+id: "s_2309",
+type: "symptom",
+name: "Lump in popliteal region",
+common_name: "Lump behind knee",
+},
+{
+id: "s_2311",
+type: "symptom",
+name: "Abdominal pain, not associated with menstrual cycle",
+common_name: "Stable abdominal pain unrelated to menstrual cycle",
+},
+{
+id: "s_2314",
+type: "symptom",
+name: "Back pain, lumbar, unknown radiating direction",
+common_name: "Lower back pain unknown spreading direction",
+},
+{
+id: "s_2315",
+type: "symptom",
+name: "Paresthesia, one foot",
+common_name: "Foot tingling or numbness",
+},
+{
+id: "s_2316",
+type: "symptom",
+name: "Diarrhea, unknown character",
+common_name: "Diarrhea, unknown character",
+},
+{
+id: "s_2319",
+type: "symptom",
+name: "Fever, lasting less than 3 days",
+common_name: "Fever lasting less than 3 days",
+},
+{
+id: "s_2320",
+type: "symptom",
+name: "Fever, lasting 3 to 7 days",
+common_name: "Fever lasting 3 to 7 days",
+},
+{
+id: "s_2322",
+type: "symptom",
+name: "Diarrhea, lasting more than 4 weeks",
+common_name: "Diarrhea lasting more than 4 weeks",
+},
+{
+id: "s_2328",
+type: "symptom",
+name: "Diarrhea, lasting 2 to 4 weeks",
+common_name: "Diarrhea lasting 2 to 4 weeks",
+},
+{
+id: "s_2329",
+type: "symptom",
+name: "Eye discharge, thick and clear",
+common_name: "Non-purulent eye discharge",
+},
+{
+id: "s_2330",
+type: "symptom",
+name: "Muscle weakness, general",
+common_name: "General muscle weakness",
+},
+{
+id: "s_2335",
+type: "symptom",
+name: "Pain in lower limb, shin",
+common_name: "Shin pain",
+},
+{
+id: "s_2336",
+type: "symptom",
+name: "Galactorrhea in men",
+common_name: "Milky discharge from the nipple",
+},
+{
+id: "s_2338",
+type: "symptom",
+name: "Vaginal discharge, grey",
+common_name: "Grey vaginal discharge",
+},
+{
+id: "s_2341",
+type: "symptom",
+name: "Bruise",
+common_name: "Bruise",
+},
+{
+id: "s_2344",
+type: "symptom",
+name: "Writing difficulties",
+common_name: "Writing difficulties",
+},
+{
+id: "s_2351",
+type: "symptom",
+name: "Reading difficulties",
+common_name: "Reading difficulties",
+},
+{
+id: "s_2352",
+type: "symptom",
+name: "Mathematics difficulties",
+common_name: "Mathematics difficulties",
+},
+{
+id: "s_2354",
+type: "symptom",
+name: "Oral lesions, located in posterior pharynx",
+common_name: "Oral lesions located in posterior pharynx",
+},
+{
+id: "s_2356",
+type: "symptom",
+name: "Single red area, larger than 1 cm",
+common_name: "Single red area larger than 1 cm",
+},
+{
+id: "s_2357",
+type: "symptom",
+name: "Multiple red areas, larger than 1 cm",
+common_name: "Multiple red areas larger than 1 cm",
+},
+{
+id: "s_2358",
+type: "symptom",
+name: "Single red spot, smaller than 1 cm",
+common_name: "Single red spot smaller than 1 cm",
+},
+{
+id: "s_2359",
+type: "symptom",
+name: "Multiple red spots, smaller than 1 cm",
+common_name: "Multiple red spots smaller than 1 cm",
+},
+{
+id: "s_2360",
+type: "symptom",
+name: "Scalp hematoma",
+common_name: "Bruise on scalp",
+},
+{
+id: "s_2361",
+type: "symptom",
+name: "Bone pain, nocturnal",
+common_name: "Nighttime bone pain",
+},
+{
+id: "s_2362",
+type: "symptom",
+name: "Battles sign",
+common_name: "Bruise behind ear",
+},
+{
+id: "s_2363",
+type: "symptom",
+name: "Rhinorrhea, after trauma",
+common_name: "Nasal discharge after trauma",
+},
+{
+id: "s_2364",
+type: "symptom",
+name: "Otorrhea, after trauma",
+common_name: "Ear discharge after trauma",
+},
+{
+id: "s_2365",
+type: "symptom",
+name: "Delayed closure of the anterior fontanelle",
+common_name: "Delayed closure of the soft spot",
+},
+{
+id: "s_2366",
+type: "symptom",
+name: "Frontal bossing",
+common_name: "Protruding forehead",
+},
+{
+id: "s_2367",
+type: "symptom",
+name: "Craniotabes",
+common_name: "Soft skull bones",
+},
+{
+id: "s_2369",
+type: "symptom",
+name: "Abnormal wound drainage",
+common_name: "Abnormal wound drainage",
+},
+{
+id: "s_2370",
+type: "symptom",
+name: "Multiple red changes, different sizes",
+common_name: "Multiple red changes of different sizes",
+},
+{
+id: "s_2371",
+type: "symptom",
+name: "Erythema, unspecified",
+common_name: "Unspecified redness of the skin",
+},
+{
+id: "s_2373",
+type: "symptom",
+name: "Decreased head circumference",
+common_name: "Abnormally small head",
+},
+{
+id: "s_2374",
+type: "symptom",
+name: "Schematic play",
+common_name: "Schematic play",
+},
+{
+id: "s_2375",
+type: "symptom",
+name: "Blood oxygen saturation, not measured",
+common_name: "Blood oxygen level not measured",
+},
+{
+id: "s_2376",
+type: "symptom",
+name: "Blood oxygen saturation, normal",
+common_name: "Normal blood oxygen level",
+},
+{
+id: "s_2377",
+type: "symptom",
+name: "Skin wound",
+common_name: "Skin wound",
+},
+{
+id: "s_2378",
+type: "symptom",
+name: "Skin wound, trauma-related",
+common_name: "Skin wound after injury",
+},
+{
+id: "s_2379",
+type: "symptom",
+name: "Skin wound, non-traumatic",
+common_name: "Wound unrelated to an injury",
+},
+{
+id: "s_2381",
+type: "symptom",
+name: "Enamel lesions",
+common_name: "Tooth lesion",
+},
+{
+id: "s_2382",
+type: "symptom",
+name: "Dermatological changes, localised",
+common_name: "Skin changes on specific part of body",
+},
+{
+id: "s_2383",
+type: "symptom",
+name: "Enamel hypomineralization",
+common_name: "Enamel hypomineralization",
+},
+{
+id: "s_2384",
+type: "symptom",
+name: "Enamel lesions, symmetrical",
+common_name: "Symmetrical tooth lesions",
+},
+{
+id: "s_2387",
+type: "symptom",
+name: "Blood oxygen saturation, between 90% and 94%",
+common_name: "Blood oxygen level between 90% and 94%",
+},
+{
+id: "s_2388",
+type: "symptom",
+name: "Blood oxygen saturation, between 80% and 89%",
+common_name: "Blood oxygen level between 80 and 89%",
+},
+{
+id: "s_2389",
+type: "symptom",
+name: "Blood oxygen saturation, lower than 80%",
+common_name: "Blood oxygen level lower than 80%",
+},
+{
+id: "s_2390",
+type: "symptom",
+name: "Blood oxygen saturation, sudden worsening",
+common_name: "Sudden worsening of blood oxygen saturation",
+},
+{
+id: "s_2391",
+type: "symptom",
+name: "Enamel lesions, spots",
+common_name: "Spots on tooth",
+},
+{
+id: "s_2393",
+type: "symptom",
+name: "Change in colour of a tooth, white",
+common_name: "Change in colour of a tooth, white",
+},
+{
+id: "s_2396",
+type: "symptom",
+name: "Change in colour of a tooth, brown",
+common_name: "Change in colour of a tooth, brown",
+},
+{
+id: "s_2398",
+type: "symptom",
+name: "Skin wound, after surgery",
+common_name: "Surgical wound",
+},
+{
+id: "s_2399",
+type: "symptom",
+name: "Skin wound, self-inflicted",
+common_name: "Self-inflicted wound",
+},
+{
+id: "s_2402",
+type: "symptom",
+name: "Pain in front of ear",
+common_name: "Pain in front of ear",
+},
+{
+id: "s_2403",
+type: "symptom",
+name: "Mandibular deviation when opening mouth",
+common_name: "Jaw shifts to the side when opening mouth",
+},
+{
+id: "s_2405",
+type: "symptom",
+name: "Tremors, disappears when holding limb or during suckling",
+common_name: "Trembling disappears when holding limb or during suckling",
+},
+{
+id: "s_2407",
+type: "symptom",
+name: "Suspicion of intoxication or poisoning",
+common_name: "Possible intoxication or poisoning",
+},
+{
+id: "s_2408",
+type: "symptom",
+name: "Blood pressure, between 140 and 179 mmHg",
+common_name: "Blood pressure between 140 mmHg and 179 mmHg",
+},
+{
+id: "s_2409",
+type: "symptom",
+name: "Catastrophising",
+common_name: "Pessimism",
+},
+{
+id: "s_2410",
+type: "symptom",
+name: "Tenderness in the scrotum",
+common_name: "Pain when pressing scrotum",
+},
+{
+id: "s_2412",
+type: "symptom",
+name: "Dermatological changes, tongue",
+common_name: "Dermatological changes on the tongue",
+},
+{
+id: "s_2413",
+type: "symptom",
+name: "Oral lesions, well demarcated borders",
+common_name: "Oral lesions with clearly defined borders",
+},
+{
+id: "s_2414",
+type: "symptom",
+name: "Oral lesions, multiple",
+common_name: "Multiple lesions in the mouth",
+},
+{
+id: "s_2416",
+type: "symptom",
+name: "Oral lesions, red",
+common_name: "Red lesions in the mouth",
+},
+{
+id: "s_2417",
+type: "symptom",
+name: "Oral lesions, larger than 1 cm",
+common_name: "Lesion in the mouth larger than 1 cm",
+},
+{
+id: "s_2421",
+type: "symptom",
+name: "Mouth pain, after eating spicy or acidic food",
+common_name: "Pain in mouth after eating spicy or acidic food",
+},
+{
+id: "s_2422",
+type: "symptom",
+name: "Oral lesions, changes in the location, size, or shape",
+common_name: "Change in location, size, or shape of lesions in the mouth",
+},
+{
+id: "s_2424",
+type: "symptom",
+name: "Oral lesions, recurrent",
+common_name: "Recurrent lesions in the mouth",
+},
+{
+id: "s_2428",
+type: "symptom",
+name: "Toothache, moderate",
+common_name: "Moderate toothache",
+},
+{
+id: "s_2429",
+type: "symptom",
+name: "Toothache, mild",
+common_name: "Mild toothache",
+},
+{
+id: "s_2430",
+type: "symptom",
+name: "Toothache, provoked",
+common_name: "Provoked toothache",
+},
+{
+id: "s_2431",
+type: "symptom",
+name: "Toothache, spontaneous",
+common_name: "Spontaneous toothache",
+},
+{
+id: "s_2432",
+type: "symptom",
+name: "Toothache, associated with cold",
+common_name: "Toothache associated with cold",
+},
+{
+id: "s_2433",
+type: "symptom",
+name: "Toothache, transient",
+common_name: "Transient toothache",
+},
+{
+id: "s_2438",
+type: "symptom",
+name: "Toothache, dull",
+common_name: "Dull toothache",
+},
+{
+id: "s_2440",
+type: "symptom",
+name: "Toothache, sharp",
+common_name: "Sharp toothache",
+},
+{
+id: "s_2441",
+type: "symptom",
+name: "Toothache, multiple teeth",
+common_name: "Pain in multiple teeth",
+},
+{
+id: "s_2442",
+type: "symptom",
+name: "Toothache, one tooth",
+common_name: "Pain in one tooth",
+},
+{
+id: "s_2443",
+type: "symptom",
+name: "Toothache, pulsating",
+common_name: "Pulsating toothache",
+},
+{
+id: "s_2446",
+type: "symptom",
+name: "Toothache, radiating",
+common_name: "Spreading toothache",
+},
+{
+id: "s_2449",
+type: "symptom",
+name: "Toothache, persistent",
+common_name: "Constant toothache",
+},
+{
+id: "s_2450",
+type: "symptom",
+name: "Toothache, lasting 48 hours or more",
+common_name: "Toothache lasting 48 hours or more",
+},
+{
+id: "s_2451",
+type: "symptom",
+name: "Toothache, associated with lying down",
+common_name: "Toothache when lying down",
+},
+{
+id: "s_2452",
+type: "symptom",
+name: "Toothache, associated with sweet or acidic foods or drinks",
+common_name: "Toothache associated with sweet or acidic foods or drinks",
+},
+{
+id: "s_2453",
+type: "symptom",
+name: "Loose dental filling",
+common_name: "Loose dental filling",
+},
+{
+id: "s_2454",
+type: "symptom",
+name: "Insertion of foreign body, dangerous object",
+common_name: "Insertion of a dangerous object",
+},
+{
+id: "s_2455",
+type: "symptom",
+name: "Myalgia, following intense physical exertion",
+common_name: "Muscle pain after intense physical activity",
+},
+{
+id: "s_2456",
+type: "symptom",
+name: "Toothache, lasting less than 48 hours",
+common_name: "Toothache lasting less than 48 hours",
+},
+{
+id: "s_2461",
+type: "symptom",
+name: "Pharyngeal swelling",
+common_name: "Throat swelling",
+},
+{
+id: "s_2462",
+type: "symptom",
+name: "No history of inflammatory bowel disease",
+common_name: "No history of inflammatory bowel disease",
+},
+{
+id: "s_2463",
+type: "symptom",
+name: "Abdominal tenderness, epigastric region",
+common_name: "Pain when pressing upper-middle part of the abdomen",
+},
+{
+id: "s_2464",
+type: "symptom",
+name: "Impaired vision, bilateral",
+common_name: "Visual impairment in both eyes",
+},
+{
+id: "s_2465",
+type: "symptom",
+name: "Enlarged side of neck",
+common_name: "Swollen side of neck",
+},
+{
+id: "s_2467",
+type: "symptom",
+name: "Enlarged whole neck",
+common_name: "Swollen whole neck",
+},
+{
+id: "s_2468",
+type: "symptom",
+name: "Loss of consciousness, during prolonged standing",
+common_name: "Fainting during prolonged standing",
+},
+{
+id: "s_2469",
+type: "symptom",
+name: "Ceasing or limiting opioid intake",
+common_name: "Limiting or stopping opioid use",
+},
+{
+id: "s_2470",
+type: "symptom",
+name: "Fear of ageing",
+common_name: "Fear of growing older or ageing",
+},
+{
+id: "s_2471",
+type: "symptom",
+name: "Loss of consciousness, in a sitting or lying position",
+common_name: "Fainting while sitting or lying down",
+},
+{
+id: "s_2472",
+type: "symptom",
+name: "Loss of consciousness, during exercise",
+common_name: "Fainting during exercise",
+},
+{
+id: "s_2473",
+type: "symptom",
+name: "Drive for muscularity",
+common_name: "Desire to be highly muscular",
+},
+{
+id: "s_2474",
+type: "symptom",
+name: "Loss of consciousness, in a warm place",
+common_name: "Fainting in a warm place",
+},
+{
+id: "s_2475",
+type: "symptom",
+name: "Loss of consciousness, under stress",
+common_name: "Fainting during stress",
+},
+{
+id: "s_2477",
+type: "symptom",
+name: "Erythema, limbs, symmetrical",
+common_name: "Symmetrical redness of the limbs",
+},
+{
+id: "s_2481",
+type: "symptom",
+name: "Erythema, neck",
+common_name: "Redness of the neck",
+},
+{
+id: "s_2484",
+type: "symptom",
+name: "Erythema, chest",
+common_name: "Redness of the chest",
+},
+{
+id: "s_2485",
+type: "symptom",
+name: "Toothache, associated with touch",
+common_name: "Toothache associated with touch",
+},
+{
+id: "s_2487",
+type: "symptom",
+name: "Blood glucose level, less than 54 mg/dl or 3 mmol/l",
+common_name: "Very low blood sugar level, less than 54 mg/dl or 3 mmol/l",
+},
+{
+id: "s_2489",
+type: "symptom",
+name: "Impaired memory, developed within 24 hours",
+common_name: "Memory problems developing in the last 24 hours",
+},
+{
+id: "s_2490",
+type: "symptom",
+name: "Impaired memory, developed more than 24 hours ago",
+common_name: "Memory problems developing over a few days or months",
+},
+{
+id: "s_2491",
+type: "symptom",
+name: "Toothache, difficulty determining how many teeth hurt",
+common_name: "Difficulty identifying how many teeth hurt",
+},
+{
+id: "s_2494",
+type: "symptom",
+name: "Muscle cramps, nocturnal",
+common_name: "Nocturnal muscle cramps",
+},
+{
+id: "s_2495",
+type: "symptom",
+name: "Crenated tongue",
+common_name: "Scalloped tongue",
+},
+{
+id: "s_2496",
+type: "symptom",
+name: "Excessive loss of dental hard tissue",
+common_name: "Excessive tooth wear",
+},
+{
+id: "s_2498",
+type: "symptom",
+name: "Jaw pain, worse in the morning",
+common_name: "Morning jaw pain",
+},
+{
+id: "s_2499",
+type: "symptom",
+name: "Facial pain, bilateral",
+common_name: "Face pain on both sides",
+},
+{
+id: "s_2501",
+type: "symptom",
+name: "Jaw pain, associated with touch",
+common_name: "Jaw pain associated with touch",
+},
+{
+id: "s_2506",
+type: "symptom",
+name: "Muscle cramps, hypnagogic",
+common_name: "Muscle cramps at sleep onset",
+},
+{
+id: "s_2507",
+type: "symptom",
+name: "Hypnagogic hallucinations",
+common_name: "Sleep onset hallucinations",
+},
+{
+id: "s_2508",
+type: "symptom",
+name: "Blepharoptosis, acute",
+common_name: "Dropping eyelids for less than 1 week",
+},
+{
+id: "s_2510",
+type: "symptom",
+name: "Interdental papilla loss",
+common_name: "Black triangles between teeth",
+},
+{
+id: "s_2511",
+type: "symptom",
+name: "Blepharoptosis, chronic",
+common_name: "Dropping eyelids for 7 days or more",
+},
+{
+id: "s_2512",
+type: "symptom",
+name: "Nausea, triggered by movement",
+common_name: "Nausea while moving",
+},
+{
+id: "s_2514",
+type: "symptom",
+name: "Tooth migration",
+common_name: "Teeth changing position",
+},
+{
+id: "s_2516",
+type: "symptom",
+name: "Headache, waking up from sleep",
+common_name: "Waking up because of headache",
+},
+{
+id: "s_2517",
+type: "symptom",
+name: "Exaggerated mouthing behaviour",
+common_name: "Mouthing hands or items",
+},
+{
+id: "s_2518",
+type: "symptom",
+name: "Transitional stools of newborn",
+common_name: "Frequent loose or seedy stools of the infant",
+},
+{
+id: "s_2519",
+type: "symptom",
+name: "Yellow- or green-coloured stool",
+common_name: "Yellow or green stool",
+},
+{
+id: "s_2520",
+type: "symptom",
+name: "Hair loss, androgenetic",
+common_name: "Hair loss on the temples or at the top of the head",
+},
+{
+id: "s_2521",
+type: "symptom",
+name: "Brown-coloured stool",
+common_name: "Brown stool",
+},
+{
+id: "s_2523",
+type: "symptom",
+name: "Black-coloured stool, related to diet or medicine intake",
+common_name: "Black stool related to diet or medicine intake",
+},
+{
+id: "s_2524",
+type: "symptom",
+name: "Red eye, bilateral",
+common_name: "Bloodshot eyes",
+},
+{
+id: "s_2532",
+type: "symptom",
+name: "Oral lesions, single",
+common_name: "Single oral lesion",
+},
+{
+id: "s_2533",
+type: "symptom",
+name: "Oral lesions, smaller than 1 cm",
+common_name: "Oral lesion smaller than 1 cm",
+},
+{
+id: "s_2535",
+type: "symptom",
+name: "Oral lesions, painful",
+common_name: "Painful lesions in the mouth",
+},
+{
+id: "s_2537",
+type: "symptom",
+name: "Oral lesions, lasting less than 3 weeks",
+common_name: "Oral lesions present for less than 3 weeks",
+},
+{
+id: "s_2538",
+type: "symptom",
+name: "Oral lesions, lasting 3 or more weeks",
+common_name: "Oral lesions present for 3 weeks or more",
+},
+{
+id: "s_2541",
+type: "symptom",
+name: "Nocturnal emission",
+common_name: "Ejaculation during sleep",
+},
+{
+id: "s_2543",
+type: "symptom",
+name: "Facial pain, unprovoked",
+common_name: "Spontaneous face pain",
+},
+{
+id: "s_2544",
+type: "symptom",
+name: "Facial pain, constant",
+common_name: "Constant face pain",
+},
+{
+id: "s_2545",
+type: "symptom",
+name: "Toothache, sensitivity to percussion",
+common_name: "Pain associated with tapping a tooth",
+},
+{
+id: "s_2546",
+type: "symptom",
+name: "Heterochromic irides",
+common_name: "Different eye colours",
+},
+{
+id: "s_2547",
+type: "symptom",
+name: "Lack of testicle in the scrotum",
+common_name: "Lack of testicle in the scrotum",
+},
+{
+id: "s_2548",
+type: "symptom",
+name: "Testicular retraction",
+common_name: "Testicular retraction",
+},
+{
+id: "s_2551",
+type: "symptom",
+name: "Erythema, upper extremities excluding hands",
+common_name: "Red skin on the shoulder, arm, forearm, elbow, or wrist",
+},
+{
+id: "s_2552",
+type: "symptom",
+name: "Erythema, lower extremities excluding feet",
+common_name: "Red skin on the hip, thigh, knee, calf, or ankle",
+},
+{
+id: "s_2553",
+type: "symptom",
+name: "Oral lesions, trauma-related",
+common_name: "Mouth lesion associated with trauma",
+},
+{
+id: "s_2557",
+type: "symptom",
+name: "Dermatological changes, ears",
+common_name: "Skin changes on ears",
+},
+{
+id: "s_2558",
+type: "symptom",
+name: "Abdominal pain, unknown onset",
+common_name: "Unknown onset of abdominal pain",
+},
+{
+id: "s_2559",
+type: "symptom",
+name: "Erythema, feet",
+common_name: "Red skin on foot",
+},
+{
+id: "s_2563",
+type: "symptom",
+name: "Jaundice, recurrent",
+common_name: "Recurrent jaundice",
+},
+{
+id: "s_2565",
+type: "symptom",
+name: "Toothache, due to trauma",
+common_name: "Toothache caused by trauma",
+},
+{
+id: "s_2566",
+type: "symptom",
+name: "Headache, localised",
+common_name: "Headache in a specific area of the head",
+},
+{
+id: "s_2567",
+type: "symptom",
+name: "Headache, unspecified location",
+common_name: "Headache location unknown",
+},
+{
+id: "s_2568",
+type: "symptom",
+name: "Headache, parietal",
+common_name: "Headache located on top of the head",
+},
+{
+id: "s_2569",
+type: "symptom",
+name: "Jaundice, cutaneous",
+common_name: "Yellowing of the skin",
+},
+{
+id: "s_2571",
+type: "symptom",
+name: "Dysphagia, severe",
+common_name: "Severe swallowing difficulties",
+},
+{
+id: "s_2572",
+type: "symptom",
+name: "Eye injury",
+common_name: "Eye injury",
+},
+{
+id: "s_2574",
+type: "symptom",
+name: "History of hypoglycemic episodes",
+common_name: "History of hypoglycemic episodes",
+},
+{
+id: "s_2575",
+type: "symptom",
+name: "Ability to manage hypoglycemia",
+common_name: "Ability to manage hypoglycemia",
+},
+{
+id: "s_2577",
+type: "symptom",
+name: "Red eye, unilateral",
+common_name: "Bloodshot eye",
+},
+{
+id: "s_2579",
+type: "symptom",
+name: "Enlarged vein of lower limb",
+common_name: "Enlarged vein of lower limb",
+},
+{
+id: "s_2580",
+type: "symptom",
+name: "Enlarged vein in the abdomen",
+common_name: "Enlarged vein in the abdomen",
+},
+{
+id: "s_2581",
+type: "symptom",
+name: "Lump in scrotum, enlarged vein",
+common_name: "Enlarged vein of scrotum",
+},
+{
+id: "s_2582",
+type: "symptom",
+name: "Groin pain",
+common_name: "Pain in groin",
+},
+{
+id: "s_2584",
+type: "symptom",
+name: "Snake bite wound",
+common_name: "Snake bite wound",
+},
+{
+id: "s_2586",
+type: "symptom",
+name: "Anuria",
+common_name: "Lack of urine",
+},
+{
+id: "s_2588",
+type: "symptom",
+name: "Spider bite, unknown type",
+common_name: "Unknown venomosity of spider bite",
+},
+{
+id: "s_2590",
+type: "symptom",
+name: "Normal urine colour",
+common_name: "Normal urine colour",
+},
+{
+id: "s_2591",
+type: "symptom",
+name: "Joint pain, both knees",
+common_name: "Both knees pain",
+},
+{
+id: "s_2592",
+type: "symptom",
+name: "Joint pain, both knees, during movement",
+common_name: "Pain when moving both knees",
+},
+{
+id: "s_2593",
+type: "symptom",
+name: "Spider bite, possibly venomous",
+common_name: "Possibly venomous spider bite",
+},
+{
+id: "s_2594",
+type: "symptom",
+name: "Spider bite, nonvenomous",
+common_name: "Nonvenomous spider bite",
+},
+{
+id: "s_2598",
+type: "symptom",
+name: "Oral blisters",
+common_name: "Blisters in the mouth",
+},
+{
+id: "s_2599",
+type: "symptom",
+name: "Skin wound, controllable bleeding",
+common_name: "Controllable bleeding wound",
+},
+{
+id: "s_2600",
+type: "symptom",
+name: "Enlarged vein of chest",
+common_name: "Enlarged veins on chest",
+},
+{
+id: "s_2604",
+type: "symptom",
+name: "Unknown urine colour",
+common_name: "Unknown urine colour",
+},
+{
+id: "s_2605",
+type: "symptom",
+name: "Dermatological changes, located on or around lips",
+common_name: "Skin changes on or around the lips",
+},
+{
+id: "s_2606",
+type: "symptom",
+name: "Tenderness of spine",
+common_name: "Pain when pressing the spine",
+},
+{
+id: "s_2608",
+type: "symptom",
+name: "Tremors, both legs",
+common_name: "Trembling of both legs",
+},
+{
+id: "s_2609",
+type: "symptom",
+name: "Positive tongue blade bite test",
+common_name: "Spatula test confirming mandibular fracture",
+},
+{
+id: "s_2610",
+type: "symptom",
+name: "Joint pain, either knee",
+common_name: "Joint pain in either knee",
+},
+{
+id: "s_2611",
+type: "symptom",
+name: "Tremors, one leg",
+common_name: "Trembling of one leg",
+},
+{
+id: "s_2612",
+type: "symptom",
+name: "Avoiding going home",
+common_name: "Avoiding going home",
+},
+{
+id: "s_2614",
+type: "symptom",
+name: "Sublingual hematoma",
+common_name: "Hematoma under the tongue",
+},
+{
+id: "s_2615",
+type: "symptom",
+name: "Fear of a particular person",
+common_name: "Fear of a particular person or group",
+},
+{
+id: "s_2619",
+type: "symptom",
+name: "Skin pain, associated with swimming in the sea or ocean",
+common_name: "Skin pain while swimming in the sea or ocean",
+},
+{
+id: "s_2622",
+type: "symptom",
+name: "Decreased fluid intake",
+common_name: "Poor fluid intake",
+},
+{
+id: "s_2624",
+type: "symptom",
+name: "Pain in upper limb, lasting less than 24 hours",
+common_name: "Pain in upper limb lasting less than 24 hours",
+},
+{
+id: "s_2625",
+type: "symptom",
+name: "Pain in upper limb, lasting more than 3 months",
+common_name: "Pain in upper limb lasting more than 3 months",
+},
+{
+id: "s_2626",
+type: "symptom",
+name: "Constipation, lasting a month or more",
+common_name: "Constipation for a month or more",
+},
+{
+id: "s_2627",
+type: "symptom",
+name: "Edema, periorbital, one eye",
+common_name: "Swelling around only one eye",
+},
+{
+id: "s_2630",
+type: "symptom",
+name: "Erythema, around one eye",
+common_name: "Redness around only one eye",
+},
+{
+id: "s_2633",
+type: "symptom",
+name: "Erythema, around either eye",
+common_name: "Redness around either eye",
+},
+{
+id: "s_2634",
+type: "symptom",
+name: "Loss of joint motion",
+common_name: "Blocked joint",
+},
+{
+id: "s_2635",
+type: "symptom",
+name: "Acute weight loss",
+common_name: "Acute weight loss",
+},
+{
+id: "s_2636",
+type: "symptom",
+name: "Pain in upper limb, lasting 1 to 7 days",
+common_name: "Pain in upper limb lasting 1 to 7 days",
+},
+{
+id: "s_2637",
+type: "symptom",
+name: "Pain in upper limb, lasting between 1 week and 3 months",
+common_name: "Pain in upper limb lasting between 1 week and 3 months",
+},
+{
+id: "s_2638",
+type: "symptom",
+name: "Muscle cramps, lower limb",
+common_name: "Leg cramps",
+},
+{
+id: "s_2639",
+type: "symptom",
+name: "Edema, periorbital, eyes",
+common_name: "Swelling around eyes",
+},
+{
+id: "s_2641",
+type: "symptom",
+name: "Well appearance",
+common_name: "Well appearance",
+},
+{
+id: "s_2643",
+type: "symptom",
+name: "Sexual activity",
+common_name: "Person who had sex",
+},
+{
+id: "s_2645",
+type: "symptom",
+name: "Fatigue, worsening exercise tolerance",
+common_name: "Worsening exercise tolerance",
+},
+{
+id: "s_2646",
+type: "symptom",
+name: "Tremors, either hand",
+common_name: "Trembling of either hand",
+},
+{
+id: "s_2647",
+type: "symptom",
+name: "Tremors, either leg",
+common_name: "Trembling of either leg",
+},
+{
+id: "s_2648",
+type: "symptom",
+name: "Allodynia",
+common_name: "Pain sensation disorder",
+},
+{
+id: "s_2650",
+type: "symptom",
+name: "Frequent physical hetero-aggressivity",
+common_name: "Frequent physical aggression towards others",
+},
+{
+id: "s_2651",
+type: "symptom",
+name: "Hemoptysis, massive",
+common_name: "Coughing up huge amount of blood",
+},
+{
+id: "s_2652",
+type: "symptom",
+name: "Consent to a sexual interview",
+common_name: "Agree to answer questions about sex",
+},
+{
+id: "s_2658",
+type: "symptom",
+name: "Vomiting, food",
+common_name: "Vomiting, food",
+},
+{
+id: "s_2661",
+type: "symptom",
+name: "Skin mass, with central punctum",
+common_name: "Lump on the skin with a central punctum",
+},
+{
+id: "s_2663",
+type: "symptom",
+name: "Episodes of depressed mood, lasting less than 2 weeks",
+common_name: "Depressed mood lasting less than 2 weeks",
+},
+{
+id: "s_2664",
+type: "symptom",
+name: "Episodes of depressed mood, lasting more than 2 years",
+common_name: "Depressed mood lasting more than 2 years",
+},
+{
+id: "s_2665",
+type: "symptom",
+name: "Episode of depressed mood, peripartum onset",
+common_name: "Depressed mood related to childbirth",
+},
+{
+id: "s_2666",
+type: "symptom",
+name: "Episodes of depressed mood, lasting between 2 weeks and 1 year",
+common_name: "Depressed mood lasting between 2 weeks and 1 year",
+},
+{
+id: "s_2667",
+type: "symptom",
+name: "Episodes of depressed mood, lasting 1 to 2 years",
+common_name: "Depressed mood lasting 1 to 2 years",
+},
+{
+id: "s_2668",
+type: "symptom",
+name: "Skin mass, transilluminable",
+common_name: "Transilluminable skin mass",
+},
+{
+id: "s_2669",
+type: "symptom",
+name: "Episode of elevated mood, lasting 3 days or less",
+common_name: "Elevated mood lasting 3 days or less",
+},
+{
+id: "s_2670",
+type: "symptom",
+name: "Episode of elevated mood, lasting 4 to 6 days",
+common_name: "Elevated mood lasting 4 to 6 days",
+},
+{
+id: "s_2671",
+type: "symptom",
+name: "Episode of elevated mood, lasting 7 days or more",
+common_name: "Elevated mood lasting 7 days or more",
+},
+{
+id: "s_2672",
+type: "symptom",
+name: "Episode of elevated mood, substance induced",
+common_name: "Elevated mood related to substance use",
+},
+{
+id: "s_2673",
+type: "symptom",
+name: "Dermatological changes, head",
+common_name: "Skin changes on the head",
+},
+{
+id: "s_2674",
+type: "symptom",
+name: "Dermatological changes, preceded by fever or other symptoms of respiratory tract infection",
+common_name: "Skin changes preceded by fever or other cold symptoms",
+},
+{
+id: "s_2675",
+type: "symptom",
+name: "Mood swings, more than 2 years",
+common_name: "Mood swings present for more than 2 years",
+},
+{
+id: "s_2676",
+type: "symptom",
+name: "Mood swings, less than 1 year",
+common_name: "Mood swings present for less than 1 year",
+},
+{
+id: "s_2677",
+type: "symptom",
+name: "Episode of depressed mood, substance induced",
+common_name: "Depressed mood related to substance use",
+},
+{
+id: "s_2678",
+type: "symptom",
+name: "Toothache, unknown cause",
+common_name: "Toothache of unknown reason",
+},
+{
+id: "s_2680",
+type: "symptom",
+name: "Current mood, elevated",
+common_name: "Currently elevated mood",
+},
+{
+id: "s_2681",
+type: "symptom",
+name: "Current mood, depressed",
+common_name: "Currently depressed mood",
+},
+{
+id: "s_2682",
+type: "symptom",
+name: "Current mood, normal",
+common_name: "Currently normal mood",
+},
+{
+id: "s_2684",
+type: "symptom",
+name: "Skin mass, located on the wrist",
+common_name: "Skin mass located on the wrist",
+},
+{
+id: "s_2686",
+type: "symptom",
+name: "Mood swings, 1 to 2 years",
+common_name: "Mood swings present for 1 to 2 years",
+},
+{
+id: "s_2687",
+type: "symptom",
+name: "Mood swings, extreme rapid pattern",
+common_name: "Rapid mood swings",
+},
+{
+id: "s_2692",
+type: "symptom",
+name: "Circumferential burn",
+common_name: "Circumferential burn",
+},
+{
+id: "s_2696",
+type: "symptom",
+name: "Sensory loss in one limb, lasting less than 24 hours",
+common_name: "Loss of feeling in one arm or leg lasting less than 24 hours",
+},
+{
+id: "s_2702",
+type: "symptom",
+name: "Sensory loss in one limb, lasting between 24 hours and 4 weeks",
+common_name: "Loss of feeling in one arm or leg lasting between 24 hours and 4 weeks",
+},
+{
+id: "s_2703",
+type: "symptom",
+name: "Sensory loss in one limb, lasting more than 4 weeks",
+common_name: "Loss of feeling in one arm or leg lasting more than 4 weeks",
+},
+{
+id: "s_2705",
+type: "symptom",
+name: "Avoidance behavior related to trauma",
+common_name: "Avoidance behavior  related to traumatic event",
+},
+{
+id: "s_2706",
+type: "symptom",
+name: "History of being at risk of a death",
+common_name: "History of being at risk of a death",
+},
+{
+id: "s_2707",
+type: "symptom",
+name: "History of experiencing or witnessing a natural disaster",
+common_name: "Witnessed or experienced a natural disaster",
+},
+{
+id: "s_2708",
+type: "symptom",
+name: "History of experiencing or witnessing a serious traffic accident",
+common_name: "History of experiencing or witnessing a serious traffic accident",
+},
+{
+id: "s_2709",
+type: "symptom",
+name: "History of traumatic situation",
+common_name: "History of traumatic situation",
+},
+{
+id: "s_2710",
+type: "symptom",
+name: "History of an unexpected death of a loved one",
+common_name: "Unexpected death of a loved one",
+},
+{
+id: "s_2711",
+type: "symptom",
+name: "Seizure, first episode",
+common_name: "First seizure",
+},
+{
+id: "s_2712",
+type: "symptom",
+name: "Seizure, unspecified number of episodes",
+common_name: "Uncertainty about how many previous seizures",
+},
+{
+id: "s_2713",
+type: "symptom",
+name: "Trauma or stressor related disturbances",
+common_name: "Trauma or stressor related disturbances",
+},
+{
+id: "s_2714",
+type: "symptom",
+name: "History of a stressful situation",
+common_name: "History of stressful situation",
+},
+{
+id: "s_2715",
+type: "symptom",
+name: "Recent physical hetero-aggressivity, health or life-threatening",
+common_name: "Recent physical aggression towards others posing a threat to health or life",
+},
+{
+id: "s_2717",
+type: "symptom",
+name: "Pus under the skin of the toe",
+common_name: "Pus under the skin of the toe",
+},
+{
+id: "s_2718",
+type: "symptom",
+name: "Edema, entire face",
+common_name: "Swollen entire face",
+},
+{
+id: "s_2727",
+type: "symptom",
+name: "Hypervigilance",
+common_name: "State of feeling constantly on guard",
+},
+{
+id: "s_2729",
+type: "symptom",
+name: "Cloudy urine",
+common_name: "Milky urine",
+},
+{
+id: "s_2730",
+type: "symptom",
+name: "Dermatological changes, buttocks",
+common_name: "Skin changes on buttocks",
+},
+{
+id: "s_2731",
+type: "symptom",
+name: "Bunion",
+common_name: "Bunion",
+},
+{
+id: "s_2733",
+type: "symptom",
+name: "Manic behaviour",
+common_name: "Manic behaviour",
+},
+{
+id: "s_2734",
+type: "symptom",
+name: "Manic behaviour, reckless spending",
+common_name: "Excessive spending during mood disturbances",
+},
+{
+id: "s_2735",
+type: "symptom",
+name: "Manic behaviour, frequent loans",
+common_name: "Taking loans during mood disturbances",
+},
+{
+id: "s_2737",
+type: "symptom",
+name: "Exaggerated startle response",
+common_name: "Jumpiness",
+},
+{
+id: "s_2738",
+type: "symptom",
+name: "Delusion, less than a month",
+common_name: "Delusions lasting less than 1 month",
+},
+{
+id: "s_2739",
+type: "symptom",
+name: "Delusion, 1 to 3 months",
+common_name: "Delusions lasting 1 to 3 months",
+},
+{
+id: "s_2740",
+type: "symptom",
+name: "Delusion, 4 months or more",
+common_name: "Delusions lasting more than 4 months",
+},
+{
+id: "s_2741",
+type: "symptom",
+name: "Hallucinations, less than a month",
+common_name: "Hallucinations lasting less than 1 month",
+},
+{
+id: "s_2742",
+type: "symptom",
+name: "Hallucinations, 1 to 3 months",
+common_name: "Hallucinations lasting 1 to 3 months",
+},
+{
+id: "s_2743",
+type: "symptom",
+name: "Hallucinations, 4 months or more",
+common_name: "Hallucinations lasting 4 months or more",
+},
+{
+id: "s_2744",
+type: "symptom",
+name: "Delusions, theft",
+common_name: "Belief of being robbed despite proof of the contrary",
+},
+{
+id: "s_2746",
+type: "symptom",
+name: "Diarrhea, bloody",
+common_name: "Bloody diarrhea",
+},
+{
+id: "s_2749",
+type: "symptom",
+name: "Inability to manage hypoglycemia",
+common_name: "Inability to manage hypoglycemia",
+},
+{
+id: "s_2752",
+type: "symptom",
+name: "Exhaustion related to studying or work",
+common_name: "Exhaustion due to studying or work",
+},
+{
+id: "s_2753",
+type: "symptom",
+name: "Psychological distancing from ones studying or job",
+common_name: "Mental distancing from studying or work",
+},
+{
+id: "s_2754",
+type: "symptom",
+name: "Speech and language impairment",
+common_name: "Speaking difficulties",
+},
+{
+id: "s_2755",
+type: "symptom",
+name: "Sense of ineffectiveness",
+common_name: "Sense of unproductiveness",
+},
+{
+id: "s_2758",
+type: "symptom",
+name: "Excessive motor activity",
+common_name: "Excessive motor activity",
+},
+{
+id: "s_2759",
+type: "symptom",
+name: "Excessive motor activity, 3 days or less",
+common_name: "Excessive moving or fidgeting lasting 3 days or less",
+},
+{
+id: "s_2760",
+type: "symptom",
+name: "Difficulty organizing objects",
+common_name: "Losing or misplacing objects",
+},
+{
+id: "s_2761",
+type: "symptom",
+name: "Excessive motor activity, 4 to 6 days",
+common_name: "Excessive moving or fidgeting lasting 4 to 6 days",
+},
+{
+id: "s_2762",
+type: "symptom",
+name: "Excessive motor activity, 7 days to 6 months",
+common_name: "Excessive moving or fidgeting lasting between 7 days to 6 months",
+},
+{
+id: "s_2763",
+type: "symptom",
+name: "Excessive motor activity, 6 months or more",
+common_name: "Excessive moving or fidgeting lasting 6 months or more",
+},
+{
+id: "s_2764",
+type: "symptom",
+name: "Restlessness",
+common_name: "Restlessness",
+},
+{
+id: "s_2766",
+type: "symptom",
+name: "Restlessness, 3 days or less",
+common_name: "Restlessness lasting 3 days or less",
+},
+{
+id: "s_2767",
+type: "symptom",
+name: "Restlessness, 4 to 6 days",
+common_name: "Restlessness lasting 4 to 6 days",
+},
+{
+id: "s_2768",
+type: "symptom",
+name: "Restlessness, between 7 days and 6 months",
+common_name: "Restlessness lasting between 7 days and 6 months",
+},
+{
+id: "s_2769",
+type: "symptom",
+name: "Restlessness, 6 months or more",
+common_name: "Restlessness lasting 6 months or more",
+},
+{
+id: "s_2771",
+type: "symptom",
+name: "Difficulty organizing objects, 3 days or less",
+common_name: "Losing or misplacing objects lasting 3 days or less",
+},
+{
+id: "s_2772",
+type: "symptom",
+name: "Difficulty organizing objects, 4 to 6 days",
+common_name: "Losing or misplacing objects lasting 4 to 6 days",
+},
+{
+id: "s_2773",
+type: "symptom",
+name: "Difficulty organizing objects, between 7 days and 6 months",
+common_name: "Losing or misplacing objects lasting between 7 days and 6 months",
+},
+{
+id: "s_2774",
+type: "symptom",
+name: "Difficulty organizing objects, 6 months or more",
+common_name: "Losing or misplacing objects lasting 6 months or more",
+},
+{
+id: "s_2775",
+type: "symptom",
+name: "Difficulty organizing tasks or activities",
+common_name: "Trouble completing tasks",
+},
+{
+id: "s_2778",
+type: "symptom",
+name: "Difficulty organizing tasks or activities, 3 days or less",
+common_name: "Trouble completing tasks lasting 3 days or less",
+},
+{
+id: "s_2779",
+type: "symptom",
+name: "Difficulty organizing tasks or activities, 4 to 6 days",
+common_name: "Trouble completing tasks lasting 4 to 6 days",
+},
+{
+id: "s_2780",
+type: "symptom",
+name: "Difficulty organizing tasks or activities, between 7 days and 6 months",
+common_name: "Trouble completing tasks lasting between 7 days and 6 months",
+},
+{
+id: "s_2781",
+type: "symptom",
+name: "Difficulty organizing tasks or activities, 6 months or more",
+common_name: "Trouble completing tasks lasting more than 6 months",
+},
+{
+id: "s_2783",
+type: "symptom",
+name: "Lack of attention to detail",
+common_name: "Difficulty with paying attention to detail",
+},
+{
+id: "s_2784",
+type: "symptom",
+name: "Difficulty waiting turns",
+common_name: "Lack of patience",
+},
+{
+id: "s_2785",
+type: "symptom",
+name: "Skin wound, animal bite",
+common_name: "Animal bite wound",
+},
+{
+id: "s_2786",
+type: "symptom",
+name: "Mood swings, longstanding pattern",
+common_name: "Mood swings, longstanding pattern",
+},
+{
+id: "s_2787",
+type: "symptom",
+name: "Toothache, unbearable",
+common_name: "Unbearable toothache",
+},
+{
+id: "s_2789",
+type: "symptom",
+name: "Excessive verbosity",
+common_name: "Excessively talkative",
+},
+{
+id: "s_2790",
+type: "symptom",
+name: "Edema, clavicle",
+common_name: "Swollen collarbone",
+},
+{
+id: "s_2791",
+type: "symptom",
+name: "Clavicle tenderness",
+common_name: "Pain when pressing collarbone",
+},
+{
+id: "s_2793",
+type: "symptom",
+name: "Rebellious behaviour",
+common_name: "Rulebreaking",
+},
+{
+id: "s_2794",
+type: "symptom",
+name: "Involuntary repetitive behaviours, motor",
+common_name: "Involuntary repetitive motor behaviours",
+},
+{
+id: "s_2795",
+type: "symptom",
+name: "Deceiving",
+common_name: "Lying a lot",
+},
+{
+id: "s_2796",
+type: "symptom",
+name: "Involuntary repetitive behaviours",
+common_name: "Involuntary repetitive behaviours",
+},
+{
+id: "s_2797",
+type: "symptom",
+name: "Involuntary repetitive behaviours, vocal",
+common_name: "Involuntary repetitive vocal behaviours",
+},
+{
+id: "s_2806",
+type: "symptom",
+name: "Breaking the law",
+common_name: "Breaking the law",
+},
+{
+id: "s_2812",
+type: "symptom",
+name: "Miscarriage",
+common_name: "Pregnancy loss",
+},
+{
+id: "s_2816",
+type: "symptom",
+name: "Weight faltering of newborns",
+common_name: "Slow rate of weight gain in newborns",
+},
+{
+id: "s_2818",
+type: "symptom",
+name: "Red-coloured stool, mild bleeding",
+common_name: "Red stool with mild bleeding",
+},
+{
+id: "s_2819",
+type: "symptom",
+name: "Red-coloured stool, heavy bleeding",
+common_name: "Red stool with heavy bleeding",
+},
+{
+id: "s_2820",
+type: "symptom",
+name: "Back pain, acute",
+common_name: "Acute back pain",
+},
+{
+id: "s_2821",
+type: "symptom",
+name: "Back pain, subacute",
+common_name: "Subacute back pain",
+},
+{
+id: "s_2822",
+type: "symptom",
+name: "Back pain, chronic",
+common_name: "Chronic back pain",
+},
+{
+id: "s_2825",
+type: "symptom",
+name: "Electric shock",
+common_name: "Electric shock",
+},
+{
+id: "s_2826",
+type: "symptom",
+name: "Chest pain, resolves with rest",
+common_name: "Chest pain going away with rest",
+},
+{
+id: "s_2827",
+type: "symptom",
+name: "Bruise, scrotum",
+common_name: "Bruise on scrotum",
+},
+{
+id: "s_2828",
+type: "symptom",
+name: "Firm testicle",
+common_name: "One testicle harder than the other",
+},
+{
+id: "s_2830",
+type: "symptom",
+name: "Cough, not improving with time",
+common_name: "Cough not improving over time",
+},
+{
+id: "s_2831",
+type: "symptom",
+name: "Fear or avoidance of eating in someone else presence",
+common_name: "Fear or avoidance of eating in someone else presence",
+},
+{
+id: "s_2832",
+type: "symptom",
+name: "Fear of social interactions",
+common_name: "Fear of social interactions",
+},
+{
+id: "s_2833",
+type: "symptom",
+name: "Cough, whooping",
+common_name: "Whooping cough",
+},
+{
+id: "s_2834",
+type: "symptom",
+name: "Dyspnea, lasting more than 4 weeks, sudden worsening",
+common_name: "Sudden worsening of shortness of breath lasting more than 4 weeks",
+},
+{
+id: "s_2835",
+type: "symptom",
+name: "Dyspnea, lasting between 1 day and 4 weeks, sudden worsening",
+common_name: "Sudden worsening of shortness of breath lasting between 1 day and 4 weeks",
+},
+{
+id: "s_2836",
+type: "symptom",
+name: "Cough, improving with time",
+common_name: "Cough improving over time",
+},
+{
+id: "s_2837",
+type: "symptom",
+name: "Edema, one lower limb, acute",
+common_name: "Swollen leg lasting less than 3 days",
+},
+{
+id: "s_2838",
+type: "symptom",
+name: "Edema, one lower limb, chronic",
+common_name: "Swollen leg lasting 3 days or more",
+},
+{
+id: "s_2839",
+type: "symptom",
+name: "Edema, both lower limbs, acute",
+common_name: "Swollen legs lasting less than 3 days",
+},
+{
+id: "s_2840",
+type: "symptom",
+name: "Edema, both lower limbs, chronic",
+common_name: "Swollen legs lasting 3 days or more",
+},
+{
+id: "s_2843",
+type: "symptom",
+name: "Chest pain, during physical activity, vigorous",
+common_name: "Chest pain during vigorous exercise",
+},
+{
+id: "s_2845",
+type: "symptom",
+name: "Nasal catarrh, acute",
+common_name: "Acute runny nose",
+},
+{
+id: "s_2846",
+type: "symptom",
+name: "Nasal catarrh, chronic",
+common_name: "Chronic runny nose",
+},
+{
+id: "s_2847",
+type: "symptom",
+name: "Chest pain, during physical activity, light",
+common_name: "Chest pain during light physical activity",
+},
+{
+id: "s_2849",
+type: "symptom",
+name: "Edema, vulva",
+common_name: "Vulval swelling",
+},
+{
+id: "s_2850",
+type: "symptom",
+name: "Pain in lower limb, lasting less than 24 hours",
+common_name: "Pain in lower limb lasting less than 24 hours",
+},
+{
+id: "s_2851",
+type: "symptom",
+name: "Pain in lower limb, lasting between 1 and 7 days",
+common_name: "Pain in lower limb lasting between 1 day and 7 days",
+},
+{
+id: "s_2852",
+type: "symptom",
+name: "Pain in lower limb, lasting between 1 week and 3 months",
+common_name: "Pain in lower limb lasting between 1 week and 3 months",
+},
+{
+id: "s_2853",
+type: "symptom",
+name: "Pain in lower limb, lasting more than 3 months",
+common_name: "Pain in lower limb lasting more than 3 months",
+},
+{
+id: "s_2854",
+type: "symptom",
+name: "Fever, lasting more than 14 days",
+common_name: "Fever lasting more than 14 days",
+},
+{
+id: "s_2855",
+type: "symptom",
+name: "Fever, lasting 8 to 14 days",
+common_name: "Fever lasting 8 to 14 days",
+},
+{
+id: "s_2856",
+type: "symptom",
+name: "Blisters of skin",
+common_name: "Blisters on the skin",
+},
+{
+id: "s_2857",
+type: "symptom",
+name: "Blisters of skin, bulla",
+common_name: "Blisters on the skin larger than 0.5 cm",
+},
+{
+id: "s_2858",
+type: "symptom",
+name: "Blisters of skin, vesicle",
+common_name: "Blisters on the skin smaller than 0.5 cm",
+},
+{
+id: "s_2860",
+type: "symptom",
+name: "Fever, fully responsive to treatment",
+common_name: "Fever fully responsive to treatment",
+},
+{
+id: "s_2861",
+type: "symptom",
+name: "Menstrual period late",
+common_name: "Late period",
+},
+{
+id: "s_2862",
+type: "symptom",
+name: "Menstrual period late, 1 to 3 weeks",
+common_name: "Period 1 to 3 weeks late",
+},
+{
+id: "s_2863",
+type: "symptom",
+name: "Menstrual period late, between 3 weeks and 3 months",
+common_name: "Period between 3 weeks and 3 months late",
+},
+{
+id: "s_2864",
+type: "symptom",
+name: "Menstrual period late, 3 to 12 months",
+common_name: "Period 3 to 12 months late",
+},
+{
+id: "s_2865",
+type: "symptom",
+name: "Menstrual period late, more than 12 months",
+common_name: "Period more than 12 months late",
+},
+{
+id: "s_2866",
+type: "symptom",
+name: "Fever, partially responsive to treatment",
+common_name: "Fever partially responsive to treatment",
+},
+{
+id: "s_2867",
+type: "symptom",
+name: "Edema, either lower limb",
+common_name: "Swelling of either lower limb",
+},
+{
+id: "s_2871",
+type: "symptom",
+name: "Decreased fetal movement in the third trimester",
+common_name: "Low fetal movement in the third trimester",
+},
+{
+id: "s_2872",
+type: "symptom",
+name: "Menstrual period late, less than 1 week",
+common_name: "Period less than 1 week late",
+},
+{
+id: "s_2876",
+type: "symptom",
+name: "Fever, use of antipyretic drug",
+common_name: "Use of antipyretic to reduce fever",
+},
+{
+id: "s_2877",
+type: "symptom",
+name: "Tremors, triggered by touch, cold or loud sounds",
+common_name: "Trembling triggered by touch, cold or loud sounds",
+},
+{
+id: "s_2878",
+type: "symptom",
+name: "Sudden onset speech and language impairment",
+common_name: "Sudden onset speech and language impairment",
+},
+{
+id: "s_2879",
+type: "symptom",
+name: "Fever, continuous",
+common_name: "Continuous fever",
+},
+{
+id: "s_2880",
+type: "symptom",
+name: "Status epilepticus",
+common_name: "Prolonged seizure for more than 5 minutes",
+},
+{
+id: "s_2881",
+type: "symptom",
+name: "Foreign body insertion, head area",
+common_name: "Insertion of foreign body in head area",
+},
+{
+id: "s_2883",
+type: "symptom",
+name: "Foreign body insertion, stuck in vagina",
+common_name: "Object stuck in vagina",
+},
+{
+id: "s_2884",
+type: "symptom",
+name: "Foreign body insertion, stuck in anus",
+common_name: "Object stuck in anus",
+},
+{
+id: "s_2888",
+type: "symptom",
+name: "Fever, periodic, days or weeks",
+common_name: "Periodic fever every few days or weeks",
+},
+{
+id: "s_2889",
+type: "symptom",
+name: "Skin pallor, transient",
+common_name: "Transient skin pallor",
+},
+{
+id: "s_2890",
+type: "symptom",
+name: "Fever, relapsing after 24 hours",
+common_name: "Fever relapsing after 24 hours",
+},
+{
+id: "s_2891",
+type: "symptom",
+name: "Fever, intermittent",
+common_name: "Fever dropping every day",
+},
+{
+id: "s_2892",
+type: "symptom",
+name: "Fetal membranes rupture, between 22nd and 37th weeks of gestation",
+common_name: "Water breaking between 22nd and 37th weeks of pregnancy",
+},
+{
+id: "s_2893",
+type: "symptom",
+name: "Regular uterine contractions, before the 37th week of gestation",
+common_name: "Regular uterine contractions before the 37th week of pregnancy",
+},
+{
+id: "s_2894",
+type: "symptom",
+name: "Postpartum vaginal bleeding, increasing intensity",
+common_name: "Increased postpartum vaginal bleeding",
+},
+{
+id: "s_2895",
+type: "symptom",
+name: "Rigidity and intolerance to change",
+common_name: "Rigidity and intolerance to change",
+},
+{
+id: "s_2898",
+type: "symptom",
+name: "Tetanus-prone wound",
+common_name: "Tetanus-prone wound",
+},
+{
+id: "s_2904",
+type: "symptom",
+name: "Active suicide attempt",
+common_name: "Active suicide attempt",
+},
+{
+id: "s_2905",
+type: "symptom",
+name: "Fetal membranes rupture, before 22 weeks of gestation",
+common_name: "Water breaking before 22nd week of pregnancy",
+},
+{
+id: "s_2906",
+type: "symptom",
+name: "Fetal membranes rupture, after 37 weeks of gestation",
+common_name: "Water breaking after 37th week of pregnancy",
+},
+{
+id: "s_2907",
+type: "symptom",
+name: "Fever, absent now but present in the past 72 hours",
+common_name: "Fever in the past 72 hours that is already finished",
+},
+{
+id: "s_2908",
+type: "symptom",
+name: "Abnormal uterine bleeding, nonmenstrual",
+common_name: "Vaginal bleeding other than period",
+},
+{
+id: "s_2909",
+type: "symptom",
+name: "Abnormal uterine spotting, nonmenstrual",
+common_name: "Vaginal spotting different than period",
+},
+{
+id: "s_2913",
+type: "symptom",
+name: "No abnormal uterine bleeding or spotting, nonmenstrual",
+common_name: "No abnormal uterine bleeding or spotting, nonmenstrual",
+},
+{
+id: "s_2914",
+type: "symptom",
+name: "Physical injury, head",
+common_name: "Head injury",
+},
+{
+id: "s_2915",
+type: "symptom",
+name: "Physical injury, trunk",
+common_name: "Trunk injury",
+},
+{
+id: "s_2916",
+type: "symptom",
+name: "Physical injury, upper limb",
+common_name: "Upper limb injury",
+},
+{
+id: "s_2917",
+type: "symptom",
+name: "Physical injury, lower limb",
+common_name: "Lower limb injury",
+},
+{
+id: "s_2918",
+type: "symptom",
+name: "Radicular pain",
+common_name: "Radiating pain from the spine",
+},
+{
+id: "s_2919",
+type: "symptom",
+name: "Injury location question",
+common_name: "Injury location question",
+},
+{
+id: "s_2920",
+type: "symptom",
+name: "Symptoms related to recent injury",
+common_name: "Symptoms related to recent injury",
+},
+{
+id: "s_2924",
+type: "symptom",
+name: "Limping",
+common_name: "Limping",
+},
+{
+id: "s_2927",
+type: "symptom",
+name: "Oral lesions, located in the anterior part",
+common_name: "Oral lesions located in anterior part",
+},
+{
+id: "s_2928",
+type: "symptom",
+name: "Fall from a height",
+common_name: "Fall from a height",
+},
+{
+id: "s_2929",
+type: "symptom",
+name: "Injury in a motorcycle crash",
+common_name: "Injury in a motorcycle crash",
+},
+{
+id: "s_2930",
+type: "symptom",
+name: "Pedestrian or cyclist hit by a car",
+common_name: "Pedestrian or cyclist hit by a car",
+},
+{
+id: "s_2931",
+type: "symptom",
+name: "Injury in a serious car accident",
+common_name: "Injury in a serious car accident",
+},
+{
+id: "s_2932",
+type: "symptom",
+name: "No major force injury",
+common_name: "No major force injury",
+},
+{
+id: "s_2935",
+type: "symptom",
+name: "Visual impairment, after trauma",
+common_name: "Vision problems after an injury",
+},
+{
+id: "s_2936",
+type: "symptom",
+name: "New neurological deficit, after trauma",
+common_name: "New neurological changes after an injury",
+},
+{
+id: "s_2937",
+type: "symptom",
+name: "Sudden drop in blood pressure",
+common_name: "Sudden drop in blood pressure",
+},
+{
+id: "s_2938",
+type: "symptom",
+name: "Dermatological changes, perianal region",
+common_name: "Skin changes near anus",
+},
+{
+id: "s_2939",
+type: "symptom",
+name: "Neck pain, acute",
+common_name: "Acute neck pain",
+},
+{
+id: "s_2940",
+type: "symptom",
+name: "Neck pain, subacute",
+common_name: "Subacute neck pain",
+},
+{
+id: "s_2941",
+type: "symptom",
+name: "Neck pain, chronic",
+common_name: "Chronic neck pain",
+},
+{
+id: "s_2942",
+type: "symptom",
+name: "Resolved choking",
+common_name: "Stopped choking",
+},
+{
+id: "s_2945",
+type: "symptom",
+name: "History of a tick bite, in the past 3 weeks, Europe",
+common_name: "History of a tick bite, in the past 3 weeks, Europe",
+},
+{
+id: "s_2946",
+type: "symptom",
+name: "No history of a tick bite",
+common_name: "No history of a tick bite",
+},
+{
+id: "s_2947",
+type: "symptom",
+name: "History of a tick bite, in the past 3 weeks, North America",
+common_name: "History of a tick bite, in the past 3 weeks, North America",
+},
+{
+id: "s_2948",
+type: "symptom",
+name: "History of a tick bite, in the past 3 weeks, Northern Asia",
+common_name: "History of a tick bite, in the past 3 weeks, Northern Asia",
+},
+{
+id: "s_2949",
+type: "symptom",
+name: "History of a tick bite, in the past 3 weeks, Southeast Asia",
+common_name: "History of a tick bite, in the past 3 weeks, Southeast Asia",
+},
+{
+id: "s_2950",
+type: "symptom",
+name: "No abnormal uterine bleeding or spotting, pregnancy",
+common_name: "No abnormal uterine bleeding or spotting, pregnancy",
+},
+{
+id: "s_2953",
+type: "symptom",
+name: "Neck pain, sudden onset",
+common_name: "Sudden neck pain",
+},
+{
+id: "s_2954",
+type: "symptom",
+name: "Limited neck rotation",
+common_name: "Limited neck rotation",
+},
+{
+id: "s_2955",
+type: "symptom",
+name: "Burned skin",
+common_name: "Burned skin",
+},
+{
+id: "s_2956",
+type: "symptom",
+name: "Burned skin, thermal",
+common_name: "Thermal skin burn",
+},
+{
+id: "s_2957",
+type: "symptom",
+name: "Burned skin, chemical",
+common_name: "Chemical skin burn",
+},
+{
+id: "s_2958",
+type: "symptom",
+name: "Burned skin, electrical",
+common_name: "Electrical skin burn",
+},
+{
+id: "s_2959",
+type: "symptom",
+name: "Burned skin, another cause",
+common_name: "Another cause of burn",
+},
+{
+id: "s_2960",
+type: "symptom",
+name: "Severe pain during limb movements, after trauma",
+common_name: "Inability to move limb after trauma due to pain",
+},
+{
+id: "s_2961",
+type: "symptom",
+name: "History of falls from a standing height",
+common_name: "Sudden spontaneous fall",
+},
+{
+id: "s_2962",
+type: "symptom",
+name: "Burned skin, superficial",
+common_name: "Superficial skin burn",
+},
+{
+id: "s_2963",
+type: "symptom",
+name: "Burned skin, partial-thickness",
+common_name: "Partial-thickness skin burn",
+},
+{
+id: "s_2964",
+type: "symptom",
+name: "Burned skin, full-thickness",
+common_name: "Full-thickness skin burn",
+},
+{
+id: "s_2965",
+type: "symptom",
+name: "Burned skin, deep tissues",
+common_name: "Deep tissues skin burn",
+},
+{
+id: "s_2966",
+type: "symptom",
+name: "Burned skin, covering between 1 to 10% of body surface",
+common_name: "Skin burn covering between 1 to 10% of body surface",
+},
+{
+id: "s_2967",
+type: "symptom",
+name: "Limb paresis, after trauma",
+common_name: "Limb paresis after trauma",
+},
+{
+id: "s_2968",
+type: "symptom",
+name: "Reduced range of joint motion, after trauma",
+common_name: "Reduced range of joint motion, after trauma",
+},
+{
+id: "s_2969",
+type: "symptom",
+name: "Bearable pain during limb movements, after trauma",
+common_name: "Bearable pain during limb movements after trauma",
+},
+{
+id: "s_2970",
+type: "symptom",
+name: "No pain or restrictions during limb movements, after trauma",
+common_name: "No pain or restrictions during limb movements, after trauma",
+},
+{
+id: "s_2971",
+type: "symptom",
+name: "Burned skin, head or neck area",
+common_name: "Skin burn of head or neck area",
+},
+{
+id: "s_2972",
+type: "symptom",
+name: "Burned skin, hand",
+common_name: "Skin burn of hand",
+},
+{
+id: "s_2973",
+type: "symptom",
+name: "Burned skin, foot",
+common_name: "Skin burn of foot",
+},
+{
+id: "s_2974",
+type: "symptom",
+name: "Burned skin, genitalia or perineum",
+common_name: "Burned skin of genital region",
+},
+{
+id: "s_2975",
+type: "symptom",
+name: "Burned skin, major joint",
+common_name: "Skin burn of major joint",
+},
+{
+id: "s_2976",
+type: "symptom",
+name: "Burned skin, another location",
+common_name: "Other location of skin burn",
+},
+{
+id: "s_2977",
+type: "symptom",
+name: "Trouble with urination, after trauma",
+common_name: "Trouble with urination after injury",
+},
+{
+id: "s_2980",
+type: "symptom",
+name: "Burned skin, covering between 10 to 20% of body surface",
+common_name: "Skin burn covering between 10 to 20% of body surface",
+},
+{
+id: "s_2981",
+type: "symptom",
+name: "Burned skin, covering more than 20% of body surface",
+common_name: "Skin burn covering more than 20% of body surface",
+},
+{
+id: "s_2982",
+type: "symptom",
+name: "Trouble with defecation, after trauma",
+common_name: "Trouble with defecation after injury",
+},
+{
+id: "s_2984",
+type: "symptom",
+name: "Inability to bear weight",
+common_name: "Inability to stand on either foot",
+},
+{
+id: "s_2985",
+type: "symptom",
+name: "No problem with walking",
+common_name: "Normal walking",
+},
+{
+id: "s_2986",
+type: "symptom",
+name: "Recent miscarriage",
+common_name: "Recent miscarriage",
+},
+{
+id: "s_2987",
+type: "symptom",
+name: "Eye pain, unilateral",
+common_name: "Pain in one eye",
+},
+{
+id: "s_2988",
+type: "symptom",
+name: "Eye pain, bilateral",
+common_name: "Pain in both eyes",
+},
+{
+id: "s_2991",
+type: "symptom",
+name: "Tenderness of spinous processes",
+common_name: "Pain when pressing the spinous processes",
+},
+{
+id: "s_2992",
+type: "symptom",
+name: "Inability to bear weight, non-traumatic",
+common_name: "Inability to stand on either foot unrelated to injury",
+},
+{
+id: "s_2999",
+type: "symptom",
+name: "Skin mass, inguinal region",
+common_name: "Skin mass in the groin",
+},
+{
+id: "s_3000",
+type: "symptom",
+name: "Skin mass, reducible",
+common_name: "Reducible skin mass",
+},
+{
+id: "s_3001",
+type: "symptom",
+name: "Skin mass, irreducible",
+common_name: "Irreducible skin mass",
+},
+{
+id: "s_3002",
+type: "symptom",
+name: "Skin mass, umbilical region",
+common_name: "Skin mass in the umbilical region",
+},
+{
+id: "s_3003",
+type: "symptom",
+name: "Skin mass, soft",
+common_name: "Soft skin mass",
+},
+{
+id: "s_3004",
+type: "symptom",
+name: "Eye burn",
+common_name: "Eye burn",
+},
+{
+id: "s_3005",
+type: "symptom",
+name: "Skin mass, dark or bluish",
+common_name: "Dark or bluish skin mass",
+},
+{
+id: "s_3006",
+type: "symptom",
+name: "Skin mass, umbilicated",
+common_name: "Skin bumps with a dimple in the center",
+},
+{
+id: "s_3007",
+type: "symptom",
+name: "Skin mass, firm",
+common_name: "Firm skin mass",
+},
+{
+id: "s_3008",
+type: "symptom",
+name: "Skin mass, unknown consistency",
+common_name: "Skin mass of unknown consistency",
+},
+{
+id: "s_3009",
+type: "symptom",
+name: "Skin mass, painful",
+common_name: "Painful skin mass",
+},
+{
+id: "s_3012",
+type: "symptom",
+name: "Burned skin, covering less than 1% of body surface",
+common_name: "Skin burn covering less than 1% of body surface",
+},
+{
+id: "s_3013",
+type: "symptom",
+name: "Skin wound, clean",
+common_name: "Clean wound",
+},
+{
+id: "s_3014",
+type: "symptom",
+name: "Skin wound, contaminated",
+common_name: "Contaminated wound",
+},
+{
+id: "s_3015",
+type: "symptom",
+name: "Skin wound, acute",
+common_name: "Acute wound",
+},
+{
+id: "s_3016",
+type: "symptom",
+name: "Skin wound, chronic",
+common_name: "Chronic wound",
+},
+{
+id: "s_3017",
+type: "symptom",
+name: "Skin wound, laceration",
+common_name: "Skin tear",
+},
+{
+id: "s_3018",
+type: "symptom",
+name: "Skin wound, puncture",
+common_name: "Puncture wound",
+},
+{
+id: "s_3019",
+type: "symptom",
+name: "Skin wound, incision",
+common_name: "Cut",
+},
+{
+id: "s_3020",
+type: "symptom",
+name: "Skin wound, abrasion",
+common_name: "Scratch wound",
+},
+{
+id: "s_3021",
+type: "symptom",
+name: "Skin wound, crush",
+common_name: "Crush wound",
+},
+{
+id: "s_3022",
+type: "symptom",
+name: "Skin wound, gunshot",
+common_name: "Gunshot wound",
+},
+{
+id: "s_3025",
+type: "symptom",
+name: "Skin wound, superficial",
+common_name: "Superficial skin wound",
+},
+{
+id: "s_3026",
+type: "symptom",
+name: "Skin wound, partial-thickness",
+common_name: "Partial-thickness skin wound",
+},
+{
+id: "s_3027",
+type: "symptom",
+name: "Skin wound, full-thickness",
+common_name: "Full-thickness skin wound",
+},
+{
+id: "s_3028",
+type: "symptom",
+name: "Skin wound, deep tissues",
+common_name: "Deep tissues skin wound",
+},
+{
+id: "s_3030",
+type: "symptom",
+name: "Dermatological changes, single",
+common_name: "Single skin change",
+},
+{
+id: "s_3031",
+type: "symptom",
+name: "Dermatological changes, multiple",
+common_name: "Multiple skin changes",
+},
+{
+id: "s_3034",
+type: "symptom",
+name: "Headache, sudden worsening",
+common_name: "Suddenly worsening headache",
+},
+{
+id: "s_3037",
+type: "symptom",
+name: "Delusional thinking",
+common_name: "Unshakable belief in something thats untrue",
+},
+{
+id: "s_3038",
+type: "symptom",
+name: "Hallucinatory experiences",
+common_name: "Experiences of sensing things that do not exist",
+},
+{
+id: "s_3039",
+type: "symptom",
+name: "Unknown tetanus vaccination status",
+common_name: "Unknown tetanus vaccination status",
+},
+{
+id: "s_3042",
+type: "symptom",
+name: "Alcohol consumption",
+common_name: "Alcohol consumption",
+},
+{
+id: "s_3045",
+type: "symptom",
+name: "Inhalation burn",
+common_name: "Airway burn",
+},
+{
+id: "s_3046",
+type: "symptom",
+name: "Knee injury, twisting",
+common_name: "Twisting knee injury",
+},
+{
+id: "s_3047",
+type: "symptom",
+name: "Nipple discharge, bloody",
+common_name: "Bloody discharge from nipple",
+},
+{
+id: "s_3048",
+type: "symptom",
+name: "Cracked nipple",
+common_name: "Damaged nipple",
+},
+{
+id: "s_3049",
+type: "symptom",
+name: "Nipple discharge, purulent",
+common_name: "Purulent discharge from nipple",
+},
+{
+id: "s_3051",
+type: "symptom",
+name: "Nipple discharge, watery or serous",
+common_name: "Watery or serous discharge from nipple",
+},
+{
+id: "s_3052",
+type: "symptom",
+name: "Blood glucose level, between 71 and 180 mg/dl or between 4 and 9.9 mmol/l",
+common_name: "Blood sugar between 71 and 180 mg/dl or between 4 and 9.9 mmol/l",
+},
+{
+id: "s_3053",
+type: "symptom",
+name: "Blood glucose level, between 181 and 250 mg/dl or between 10 and 13.9 mmol/l",
+common_name: "High blood sugar, between 181 and 250 mg/dl or between 10 and 13.9 mmol/l",
+},
+{
+id: "s_3054",
+type: "symptom",
+name: "Blood glucose level, between 251 and 350 mg/dl or between 14 and 19.4 mmol/l",
+common_name: "Very high blood sugar, between 251 and 350 mg/dl or between 14 and 19.4 mmol/l",
+},
+{
+id: "s_3055",
+type: "symptom",
+name: "Blood glucose level, more than 350 mg/dl or 19.4 mmol/l",
+common_name: "Extremely high blood sugar, over 350 mg/dl or 19.4 mmol/l",
+},
+{
+id: "s_3056",
+type: "symptom",
+name: "Blood glucose level in the last 6 hours, more than 250 mg/dl or 13.9 mmol/l",
+common_name: "Blood sugar level remaining over 250 mg/dl or 13.9 mmol/l for the past 6 hours",
+},
+{
+id: "s_3057",
+type: "symptom",
+name: "Foreign body insertion, anus",
+common_name: "Foreign body insertion, anus",
+},
+{
+id: "s_3058",
+type: "symptom",
+name: "Foreign body insertion, vagina",
+common_name: "Foreign body insertion, vagina",
+},
+{
+id: "s_3059",
+type: "symptom",
+name: "Direct trauma to the anterior knee",
+common_name: "Direct injury to the front of the knee",
+},
+{
+id: "s_3062",
+type: "symptom",
+name: "Abnormal menstruation, irregular",
+common_name: "Irregular periods",
+},
+{
+id: "s_3063",
+type: "symptom",
+name: "Abnormal menstruation, prolonged menstruation",
+common_name: "Menstrual bleeding lasting more than 8 days",
+},
+{
+id: "s_3064",
+type: "symptom",
+name: "Abnormal menstruation, menorrhagia",
+common_name: "Heavy menstrual bleeding",
+},
+{
+id: "s_3065",
+type: "symptom",
+name: "Abnormal menstruation, hypomenorrhea",
+common_name: "Light menstrual bleeding",
+},
+{
+id: "s_3066",
+type: "symptom",
+name: "Abnormal menstruation, dysmenorrhea",
+common_name: "Painful menstrual bleeding",
+},
+{
+id: "s_3067",
+type: "symptom",
+name: "Abnormal menstruation, polymenorrhea",
+common_name: "Frequent menstrual bleeding",
+},
+{
+id: "s_3068",
+type: "symptom",
+name: "Abnormal menstruation, oligomenorrhea",
+common_name: "Rare menstrual bleeding",
+},
+{
+id: "s_3069",
+type: "symptom",
+name: "Abnormal menstruation",
+common_name: "Abnormal menstruation",
+},
+{
+id: "s_3070",
+type: "symptom",
+name: "Dermatological changes, unilateral",
+common_name: "Skin changes localized on only one side",
+},
+{
+id: "s_3071",
+type: "symptom",
+name: "Inconsolable crying",
+common_name: "Unsoothed crying",
+},
+{
+id: "s_3072",
+type: "symptom",
+name: "Recurrent inconsolable crying of unknown cause",
+common_name: "Recurrent inconsolable crying of unknown cause",
+},
+{
+id: "s_3078",
+type: "symptom",
+name: "Muscle weakness, non-paresis",
+common_name: "Weak muscles with full ability to move",
+},
+{
+id: "s_3079",
+type: "symptom",
+name: "Muscle weakness, paresis",
+common_name: "Weak muscles with less ability to move",
+},
+{
+id: "s_3080",
+type: "symptom",
+name: "Muscle weakness, paralysis",
+common_name: "Weak muscles with no ability to move",
+},
+{
+id: "s_3083",
+type: "symptom",
+name: "Flank pain, abdomen",
+common_name: "Pain on the side of the abdomen",
+},
+{
+id: "s_3084",
+type: "symptom",
+name: "Flank pain, back",
+common_name: "Pain on the side of the back",
+},
+{
+id: "s_3085",
+type: "symptom",
+name: "Flank pain, side",
+common_name: "Flank pain, side",
+},
+{
+id: "s_3087",
+type: "symptom",
+name: "Protrusion of the auricle",
+common_name: "Protruding ear",
+},
+{
+id: "s_3089",
+type: "symptom",
+name: "Dyspnea, severe at rest",
+common_name: "Severe shortness of breath at rest",
+},
+{
+id: "s_3090",
+type: "symptom",
+name: "Dyspnea, severe",
+common_name: "Severe shortness of breath",
+},
+{
+id: "s_3091",
+type: "symptom",
+name: "Current injury",
+common_name: "Current injury",
+},
+{
+id: "s_3092",
+type: "symptom",
+name: "Additional injury",
+common_name: "Additional injury",
+},
+{
+id: "s_3093",
+type: "symptom",
+name: "No additional injury",
+common_name: "No additional injury",
+},
+{
+id: "s_3094",
+type: "symptom",
+name: "Carbon monoxide exposure for burn cases",
+common_name: "Carbon monoxide exposure for burn cases",
+},
+{
+id: "s_3096",
+type: "symptom",
+name: "Muscle weakness, localized",
+common_name: "Muscle weakness in a specific part of the body",
+},
+{
+id: "s_3097",
+type: "symptom",
+name: "Muscle weakness, limbs",
+common_name: "Limb weakness",
+},
+{
+id: "s_3098",
+type: "symptom",
+name: "Muscle weakness, face",
+common_name: "Facial muscle weakness",
+},
+{
+id: "s_3099",
+type: "symptom",
+name: "Eye closure difficulties, one eye",
+common_name: "Difficulty completely closing one eye",
+},
+{
+id: "s_3100",
+type: "symptom",
+name: "Muscle weakness, drooping mouth corner on one side",
+common_name: "One mouth corner drooping",
+},
+{
+id: "s_3101",
+type: "symptom",
+name: "Muscle weakness, one side of the face",
+common_name: "Facial muscle weakness on one side",
+},
+{
+id: "s_3104",
+type: "symptom",
+name: "Muscle weakness, both upper limbs",
+common_name: "Weakness in both upper limbs",
+},
+{
+id: "s_3105",
+type: "symptom",
+name: "Muscle weakness, one upper limb",
+common_name: "Weakness in one upper limb",
+},
+{
+id: "s_3106",
+type: "symptom",
+name: "Muscle weakness, lasting less than 24 hours",
+common_name: "Muscle weakness lasting less than 24 hours",
+},
+{
+id: "s_3107",
+type: "symptom",
+name: "Muscle weakness, one lower limb",
+common_name: "Weakness in one lower limb",
+},
+{
+id: "s_3108",
+type: "symptom",
+name: "Muscle weakness, both lower limbs",
+common_name: "Weakness in both lower limbs",
+},
+{
+id: "s_3109",
+type: "symptom",
+name: "Muscle weakness, tetraparesis",
+common_name: "Weakness of all limbs",
+},
+{
+id: "s_3110",
+type: "symptom",
+name: "Muscle weakness, hemiparesis",
+common_name: "Weakness on one side of the body",
+},
+{
+id: "s_3111",
+type: "symptom",
+name: "Muscle weakness, limbs, other",
+common_name: "Muscle weakness, limbs, other",
+},
+{
+id: "s_3112",
+type: "symptom",
+name: "Muscle weakness, ascending",
+common_name: "Ascending muscle weakness",
+},
+{
+id: "s_3113",
+type: "symptom",
+name: "Muscle weakness, lasting between 24 hours and 1 week",
+common_name: "Muscle weakness lasting between 24 hours and 1 week",
+},
+{
+id: "s_3115",
+type: "symptom",
+name: "Fever, unknown reaction to antipyretics",
+common_name: "Fever with unknown reaction to antipyretics",
+},
+{
+id: "s_3116",
+type: "symptom",
+name: "Injury, no information",
+common_name: "Injury, no information",
+},
+{
+id: "s_3117",
+type: "symptom",
+name: "Muscle weakness, lasting between 1 and 4 weeks",
+common_name: "Muscle weakness lasting between 1 and 4 weeks",
+},
+{
+id: "s_3118",
+type: "symptom",
+name: "Muscle weakness, lasting more than 4 weeks",
+common_name: "Muscle weakness lasting more than 4 weeks",
+},
+{
+id: "s_3120",
+type: "symptom",
+name: "Nipple pain or tenderness",
+common_name: "Nipple pain or tenderness",
+},
+{
+id: "s_3121",
+type: "symptom",
+name: "Suicide attempt in the past",
+common_name: "Suicide attempt in the past",
+},
+{
+id: "s_3122",
+type: "symptom",
+name: "Eye closure difficulties, both eyes",
+common_name: "Difficulty completely closing both eyes",
+},
+{
+id: "s_3123",
+type: "symptom",
+name: "Muscle weakness, drooping mouth corner on both sides",
+common_name: "Both mouth corners dropping",
+},
+{
+id: "s_3124",
+type: "symptom",
+name: "Muscle weakness, face, other",
+common_name: "Muscle weakness, face, other",
+},
+{
+id: "s_3125",
+type: "symptom",
+name: "Alcohol consumption, less than 24 hours ago, large amount",
+common_name: "Alcohol consumption, less than 24 hours ago, large amount",
+},
+{
+id: "s_3126",
+type: "symptom",
+name: "Alcohol consumption, less than 24 hours ago, small amount",
+common_name: "Alcohol consumption, less than 24 hours ago, small amount",
+},
+{
+id: "s_3127",
+type: "symptom",
+name: "Alcohol consumption, less than 24 hours ago, amount unknown",
+common_name: "Alcohol consumption, less than 24 hours ago, amount unknown",
+},
+{
+id: "s_3128",
+type: "symptom",
+name: "Alcohol consumption, less than 24 hours ago, large amount in man",
+common_name: "Alcohol consumption, less than 24 hours ago, large amount in man",
+},
+{
+id: "s_3129",
+type: "symptom",
+name: "Alcohol consumption, less than 24 hours ago, large amount in woman",
+common_name: "Alcohol consumption, less than 24 hours ago, large amount in woman",
+},
+{
+id: "s_3130",
+type: "symptom",
+name: "Alcohol consumption, less than 24 hours ago, small amount in man",
+common_name: "Alcohol consumption, less than 24 hours ago, small amount in man",
+},
+{
+id: "s_3131",
+type: "symptom",
+name: "Alcohol consumption, less than 24 hours ago, small amount in woman",
+common_name: "Alcohol consumption, less than 24 hours ago, small amount in woman",
+},
+{
+id: "s_3133",
+type: "symptom",
+name: "Alcohol consumption, more than 24 hours ago, risky drinking in men",
+common_name: "Alcohol consumption, more than 24 hours ago, risky drinking in men",
+},
+{
+id: "s_3134",
+type: "symptom",
+name: "Alcohol consumption, more than 24 hours ago, risky drinking in women",
+common_name: "Alcohol consumption, more than 24 hours ago, risky drinking in women",
+},
+{
+id: "s_3135",
+type: "symptom",
+name: "Alcohol consumption, more than 24 hours ago, risky drinking",
+common_name: "Alcohol consumption, more than 24 hours ago, risky drinking",
+},
+{
+id: "s_3136",
+type: "symptom",
+name: "Alcohol consumption, more than 24 hours ago, heavy drinking",
+common_name: "Alcohol consumption, more than 24 hours ago, heavy drinking",
+},
+{
+id: "s_3137",
+type: "symptom",
+name: "Alcohol consumption, more than 24 hours ago, heavy drinking in men",
+common_name: "Alcohol consumption, more than 24 hours ago, heavy drinking in men",
+},
+{
+id: "s_3138",
+type: "symptom",
+name: "Alcohol consumption, more than 24 hours ago, heavy drinking in women",
+common_name: "Alcohol consumption, more than 24 hours ago, heavy drinking in women",
+},
+{
+id: "s_3139",
+type: "symptom",
+name: "Alcohol consumption, more than 24 hours ago, binge drinking",
+common_name: "Alcohol consumption, more than 24 hours ago, binge drinking",
+},
+{
+id: "s_3140",
+type: "symptom",
+name: "Alcohol consumption, more than 24 hours ago, binge drinking in men",
+common_name: "Alcohol consumption, more than 24 hours ago, binge drinking in men",
+},
+{
+id: "s_3141",
+type: "symptom",
+name: "Alcohol consumption, more than 24 hours ago, binge drinking in women",
+common_name: "Alcohol consumption, more than 24 hours ago, binge drinking in women",
+},
+{
+id: "s_3144",
+type: "symptom",
+name: "Breast pain or tenderness, either breast",
+common_name: "Breast pain or tenderness in either breast",
+},
+{
+id: "s_3145",
+type: "symptom",
+name: "No eye injury",
+common_name: "Lack of eye injury",
+},
+{
+id: "s_3146",
+type: "symptom",
+name: "Jaundice, less than 72 hours",
+common_name: "Jaundice for less than 3 days",
+},
+{
+id: "s_3147",
+type: "symptom",
+name: "Jaundice, lasting between 3 days and 3 weeks",
+common_name: "Jaundice, lasting between 3 days and 3 weeks",
+},
+{
+id: "s_3148",
+type: "symptom",
+name: "Jaundice, lasting between 3 weeks and 3 months",
+common_name: "Jaundice, lasting between 3 weeks and 3 months",
+},
+{
+id: "s_3149",
+type: "symptom",
+name: "Jaundice, lasting more than 3 months",
+common_name: "Jaundice for more than 3 months",
+},
+{
+id: "s_3150",
+type: "symptom",
+name: "Jaundice, onset within 24 hours after birth",
+common_name: "Jaundice less than 24 hours after birth",
+},
+{
+id: "s_3151",
+type: "symptom",
+name: "Erythema, well demarcated borders",
+common_name: "Well demarcated erythema",
+},
+{
+id: "s_3154",
+type: "symptom",
+name: "Skin necrosis",
+common_name: "Skin necrosis",
+},
+{
+id: "s_3156",
+type: "symptom",
+name: "Swallowed foreign body, battery",
+common_name: "Swallowed battery",
+},
+{
+id: "s_3157",
+type: "symptom",
+name: "Swallowed foreign body, chemical substances",
+common_name: "Swallowed chemical substance",
+},
+{
+id: "s_3158",
+type: "symptom",
+name: "Swallowed foreign body, dangerous",
+common_name: "Swallowed dangerous foreign body",
+},
+{
+id: "s_3159",
+type: "symptom",
+name: "Swallowed foreign body, little and blunt",
+common_name: "Swallowed little and blunt foreign body",
+},
+{
+id: "s_3162",
+type: "symptom",
+name: "Skin wound, burn",
+common_name: "Burn wound",
+},
+{
+id: "s_3166",
+type: "symptom",
+name: "Alcohol consumption, signs of withdrawal at present",
+common_name: "Alcohol consumption, signs of withdrawal at present",
+},
+{
+id: "s_3167",
+type: "symptom",
+name: "Skin wound, inflamed",
+common_name: "Inflamed wound",
+},
+{
+id: "s_3168",
+type: "symptom",
+name: "Skin wound, not inflamed",
+common_name: "Skin wound, not inflamed",
+},
+{
+id: "s_3171",
+type: "symptom",
+name: "Vascular compromise, limb, related to trauma",
+common_name: "Limited blood flow past the injured limb",
+},
+{
+id: "s_3173",
+type: "symptom",
+name: "Skin wound, animal scratch",
+common_name: "Skin scratch caused by animal",
+},
+{
+id: "s_3174",
+type: "symptom",
+name: "Blood pressure, elevated in children",
+common_name: "High blood pressure in children",
+},
+{
+id: "s_3176",
+type: "symptom",
+name: "Hypotension in children",
+common_name: "Low blood pressure in children",
+},
+{
+id: "s_3178",
+type: "symptom",
+name: "Alcohol misuse",
+common_name: "Alcohol misuse",
+},
+{
+id: "s_3179",
+type: "symptom",
+name: "Swallowed foreign body, unknown",
+common_name: "Swallowed unknown foreign body",
+},
+{
+id: "s_3188",
+type: "symptom",
+name: "Dizziness, sudden and severe",
+common_name: "Sudden and severe dizziness",
+},
+{
+id: "s_3189",
+type: "symptom",
+name: "Impaired vision, loss of part of visual field",
+common_name: "Loss of part of visual field",
+},
+{
+id: "s_3190",
+type: "symptom",
+name: "Impaired vision, sudden onset",
+common_name: "Sudden vision impairment",
+},
+{
+id: "s_3193",
+type: "symptom",
+name: "Anisocoria, lasting less than 3 days",
+common_name: "Anisocoria with sudden onset",
+},
+{
+id: "s_3194",
+type: "symptom",
+name: "Anisocoria, lasting 3 days or more",
+common_name: "Anisocoria lasting more 3 days",
+},
+{
+id: "s_3195",
+type: "symptom",
+name: "The setting-sun phenomenon",
+common_name: "The setting-sun phenomenon",
+},
+{
+id: "s_3197",
+type: "symptom",
+name: "Loss of consciousness, after trauma",
+common_name: "Loss of consciousness after an injury",
+},
+{
+id: "s_3199",
+type: "symptom",
+name: "Impaired vision, gradual",
+common_name: "Progressive vision loss",
+},
+{
+id: "s_3200",
+type: "symptom",
+name: "Impaired vision, subjective visual disturbance",
+common_name: "Vision problems due to unusual visual experiences",
+},
+{
+id: "s_3201",
+type: "symptom",
+name: "Impaired vision, complete blindness",
+common_name: "Complete vision lost",
+},
+{
+id: "s_3205",
+type: "symptom",
+name: "Nosebleed, uncontrollable",
+common_name: "Uncontrollable bleeding from nose",
+},
+{
+id: "s_3206",
+type: "symptom",
+name: "Eye closure difficulties",
+common_name: "Trouble with eye closure",
+},
+{
+id: "s_3208",
+type: "symptom",
+name: "Reduced mobility of body parts",
+common_name: "Trouble moving body parts",
+},
+{
+id: "s_3209",
+type: "symptom",
+name: "Electric shock resulting in respiratory or cardiovascular complications",
+common_name: "Respiratory or cardiovascular complications after electric shock",
+},
+{
+id: "s_3210",
+type: "symptom",
+name: "Pain in limb",
+common_name: "Limb pain",
+},
+{
+id: "s_3212",
+type: "symptom",
+name: "No hormonal contraception, HRT, or IUD usage",
+common_name: "No hormonal contraception, HRT, or IUD usage",
+},
+];
+export const SymptomsArData = [
+{
+id: "s_1",
+type: "symptom",
+name: "قرحة فموية",
+common_name: "قرحات في الفم",
+},
+{
+id: "s_3",
+type: "symptom",
+name: "اضطراب الوظيفة الجنسية، القيام بنشاط جنسي رغم عواقبه السلبية",
+common_name: "القيام بنشاط متعلّق بالجنس بالرغم من نتائجه السلبية",
+},
+{
+id: "s_4",
+type: "symptom",
+name: "لامبالاة",
+common_name: "عدم الاهتمام بشؤون الحياة اليومية",
+},
+{
+id: "s_6",
+type: "symptom",
+name: "اشتهاء الأطعمة المالحة",
+common_name: "اشتهاء الأطعمة المالحة",
+},
+{
+id: "s_7",
+type: "symptom",
+name: "عقم أنثوي",
+common_name: "عقم أنثوي",
+},
+{
+id: "s_8",
+type: "symptom",
+name: "إسهال",
+common_name: "إسهال",
+},
+{
+id: "s_9",
+type: "symptom",
+name: "شحوب الجلد",
+common_name: "جلد شاحب",
+},
+{
+id: "s_10",
+type: "symptom",
+name: "أظافر هشة شاحبة",
+common_name: "أظافر هشة شاحبة",
+},
+{
+id: "s_11",
+type: "symptom",
+name: "ألم مفصلي، في الورك",
+common_name: "ألم في الورك",
+},
+{
+id: "s_13",
+type: "symptom",
+name: "ألم بطني",
+common_name: "ألم في البطن",
+},
+{
+id: "s_14",
+type: "symptom",
+name: "ألم بطني، يشتد عندما تكون المعدة فارغة",
+common_name: "ألم في البطن يزداد عندما تكون المعدة فارغة",
+},
+{
+id: "s_15",
+type: "symptom",
+name: "ألم بطني، يشتد أثناء السعال أو الحركة",
+common_name: "ألم في البطن يزداد عند السعال أو الحركة",
+},
+{
+id: "s_16",
+type: "symptom",
+name: "ألم بطني، يشتد بعد تناول الطعام",
+common_name: "ألم في البطن يزداد بعد تناول الطعام",
+},
+{
+id: "s_17",
+type: "symptom",
+name: "ألم بطني، يسبق الطمث",
+common_name: "ألم تشنجي في البطن يسبق حدوث الحيض",
+},
+{
+id: "s_19",
+type: "symptom",
+name: "ألم في اللثة",
+common_name: "ألم في اللثة",
+},
+{
+id: "s_20",
+type: "symptom",
+name: "ألم في البلعوم",
+common_name: "ألم في الحلق",
+},
+{
+id: "s_21",
+type: "symptom",
+name: "صداع",
+common_name: "ألم في الرأس",
+},
+{
+id: "s_22",
+type: "symptom",
+name: "صداع، أحادي الجانب",
+common_name: "ألم في جهة واحدة من الرأس",
+},
+{
+id: "s_23",
+type: "symptom",
+name: "صداع، ضاغط",
+common_name: "ألم ضاغط أو عاصر على الرأس",
+},
+{
+id: "s_24",
+type: "symptom",
+name: "صداع، معمم",
+common_name: "ألم يشمل كامل الرأس",
+},
+{
+id: "s_25",
+type: "symptom",
+name: "صداع، نابض",
+common_name: "ألم رأس نابض",
+},
+{
+id: "s_28",
+type: "symptom",
+name: "ألم العجان",
+common_name: "ألم في الفرج",
+},
+{
+id: "s_30",
+type: "symptom",
+name: "ألم صدري، يشتد بالشهيق العميق أو السعال",
+common_name: "ألم في الصدر يزداد بالشهيق العميق أو بالسعال",
+},
+{
+id: "s_31",
+type: "symptom",
+name: "ألم صدري، يستمر حتى بعد الراحة",
+common_name: "ألم في الصدر يستمر حتى بعد الراحة",
+},
+{
+id: "s_32",
+type: "symptom",
+name: "عسر الجماع",
+common_name: "ألم أثناء الجماع",
+},
+{
+id: "s_33",
+type: "symptom",
+name: "قذف مؤلم",
+common_name: "ألم أثناء قذف المني",
+},
+{
+id: "s_34",
+type: "symptom",
+name: "ألم في العجان، فجائي",
+common_name: "ألم فرج فجائي",
+},
+{
+id: "s_35",
+type: "symptom",
+name: "ألم صدري، أثناء الجهد",
+common_name: "ألم في الصدر يظهر عند القيام بمجهود جسدي",
+},
+{
+id: "s_36",
+type: "symptom",
+name: "ألم صدري، ينتشر إلى العنق",
+common_name: "ألم في الصدر ينتشر إلى العنق",
+},
+{
+id: "s_37",
+type: "symptom",
+name: "ألم صدري، ينتشر إلى ما بين لوحي الكتف",
+common_name: "ألم في الصدر ينتشر إلى ما بين لوحي الكتف",
+},
+{
+id: "s_38",
+type: "symptom",
+name: "ألم في الظهر، قطني، ينتشر إلى الوجه الخلفي من الفخذ",
+common_name: "ألم في الجزء السفلي من الظهر ينتشر إلى السطح الخلفي من الفخذ أو الركبة",
+},
+{
+id: "s_39",
+type: "symptom",
+name: "تبوُّل مؤلم",
+common_name: "ألم أثناء التبول",
+},
+{
+id: "s_41",
+type: "symptom",
+name: "ألم مفصلي، شديد، ناتج عن رض",
+common_name: "ألم مفصلي شديد بعد أذية أو رض",
+},
+{
+id: "s_43",
+type: "symptom",
+name: "ألم في الجلد، شديد",
+common_name: "ألم شديد في الجلد",
+},
+{
+id: "s_44",
+type: "symptom",
+name: "ألم مفصلي",
+common_name: "ألم في المفصل",
+},
+{
+id: "s_47",
+type: "symptom",
+name: "ألم في الأذن",
+common_name: "ألم في الأذن",
+},
+{
+id: "s_50",
+type: "symptom",
+name: "ألم صدري",
+common_name: "ألم في الصدر",
+},
+{
+id: "s_51",
+type: "symptom",
+name: "ألم صدري، منتشر",
+common_name: "ألم منتشر في كامل الصدر",
+},
+{
+id: "s_52",
+type: "symptom",
+name: "ألم في الصفن",
+common_name: "ألم في كيس الصفن",
+},
+{
+id: "s_53",
+type: "symptom",
+name: "ألم في الظهر، قطني",
+common_name: "ألم في أسفل الظهر",
+},
+{
+id: "s_54",
+type: "symptom",
+name: "ألم قرب جوف الحجاج",
+common_name: "ألم حول العين أو خلفها",
+},
+{
+id: "s_56",
+type: "symptom",
+name: "ألم سني، مترافق مع المضغ",
+common_name: "ألم في الأسنان عند المضغ",
+},
+{
+id: "s_57",
+type: "symptom",
+name: "ألم بطني، يخف بعد التغوُّط أو إخراج الغازات",
+common_name: "ألم في البطن يخف بعد التبرّز أو إخراج الغازات",
+},
+{
+id: "s_60",
+type: "symptom",
+name: "ألم في العجان، في حشفة القضيب",
+common_name: "ألم في رأس القضيب",
+},
+{
+id: "s_64",
+type: "symptom",
+name: "مفرزات مهبلية، ذات رائحة كريهة",
+common_name: "إفرازات كريهة الرائحة من المهبل",
+},
+{
+id: "s_65",
+type: "symptom",
+name: "البخر الفموي",
+common_name: "رائحة كريهة من الفم",
+},
+{
+id: "s_67",
+type: "symptom",
+name: "شخير",
+common_name: "شخير",
+},
+{
+id: "s_68",
+type: "symptom",
+name: "عسر التصويت",
+common_name: "صوت أجش",
+},
+{
+id: "s_69",
+type: "symptom",
+name: "الانشغال بالطعام",
+common_name: "الانشغال بالطعام",
+},
+{
+id: "s_71",
+type: "symptom",
+name: "براز أسود",
+common_name: "خروج أسود",
+},
+{
+id: "s_72",
+type: "symptom",
+name: "احمرار وحرقة في الملتحمة",
+common_name: "عينين محمرتين ولاذعتين",
+},
+{
+id: "s_73",
+type: "symptom",
+name: "فُزر جلدية في البطن أو الوركين أو الفخذين",
+common_name: "علامات تمدد جلدي أو تشققات جلدية في البطن أو الردفين أو الفخذين",
+},
+{
+id: "s_74",
+type: "symptom",
+name: "اضطراب الوظيفة الجنسية، ممارسات جنسية غير مضبوطة",
+common_name: "نشاط جنسي متكرر أو مع شركاء جنسيين أكثر من المراد",
+},
+{
+id: "s_75",
+type: "symptom",
+name: "بوال",
+common_name: "تبول كمية كبيرة في اليوم الواحد بالمقارنة مع المعتاد",
+},
+{
+id: "s_79",
+type: "symptom",
+name: "ألم مفصلي، في إبهام القدم",
+common_name: "ألم في إصبع القدم الكبير",
+},
+{
+id: "s_80",
+type: "symptom",
+name: "اضطراب الوظيفة الجنسية، التهيج عند عدم القدرة على ممارسة نشاط يتعلّق بالجنس",
+common_name: "العصبية عند عدم القدرة على ممارسة الجنس",
+},
+{
+id: "s_81",
+type: "symptom",
+name: "قشعريرة",
+common_name: "رجفة",
+},
+{
+id: "s_84",
+type: "symptom",
+name: "رجفان يخف بعد شرب الكحول",
+common_name: "ارتعاش يخف بعد تناول الكحول",
+},
+{
+id: "s_85",
+type: "symptom",
+name: "رجفان، في الرأس",
+common_name: "رجفة في الرأس",
+},
+{
+id: "s_86",
+type: "symptom",
+name: "رجفان، في يد واحدة",
+common_name: "رجفة في يد واحدة",
+},
+{
+id: "s_87",
+type: "symptom",
+name: "رجفان، في كلتا اليدين",
+common_name: "رجفة في كلتا اليدين",
+},
+{
+id: "s_88",
+type: "symptom",
+name: "زلة تنفسية",
+common_name: "ضيق في التنفس",
+},
+{
+id: "s_90",
+type: "symptom",
+name: "زلة تنفسية تدوم بين يوم و4 أسابيع",
+common_name: "ضيق تنفس يستمر فترة تتراوح بين يوم و4 أسابيع",
+},
+{
+id: "s_92",
+type: "symptom",
+name: "زلة تنفسية، بدأت منذ أقل من ساعة",
+common_name: "ضيق تنفس ظهر منذ أقل من ساعة",
+},
+{
+id: "s_93",
+type: "symptom",
+name: "تدخين عدد كبير من السجائر",
+common_name: "تدخين أكثر من 20 سيجارة في اليوم الواحد",
+},
+{
+id: "s_95",
+type: "symptom",
+name: "انزعاج أثناء التكلم، في الوجه والفكين",
+common_name: "الشعور بانزعاج في الجزء السفلي من الوجه أو الفم أثناء التكلم",
+},
+{
+id: "s_97",
+type: "symptom",
+name: "حشوة عميقة لسن تمت معالجته",
+common_name: "حشوة عميقة لسن تمت معالجته",
+},
+{
+id: "s_98",
+type: "symptom",
+name: "حمى",
+common_name: "ارتفاع درجة حرارة الجسم",
+},
+{
+id: "s_99",
+type: "symptom",
+name: "حمى تتراوح بين 37 و38° درجة مئوية، أي بين 98.6 و100.4° درجة فهرنهايتية",
+common_name: "ارتفاع درجة حرارة الجسم بين 37 و38° درجة مئوية، أي بين 98.6 و100.4° درجة فهرنهايتية",
+},
+{
+id: "s_100",
+type: "symptom",
+name: "حمى تتراوح بين 38 و40° درجة مئوية (أو ما بين 100.4 و104° درجة فهرنهايتية)",
+common_name: "ارتفاع درجة حرارة الجسم بين 38 و40° درجة مئوية (أو ما بين 100.4 و104° درجة فهرنهايتية)",
+},
+{
+id: "s_101",
+type: "symptom",
+name: "كتلة جلدية، قطرها أصغر من 1 سم",
+common_name: "نتوءات على الجلد بقطر أقل من 1 سم",
+},
+{
+id: "s_102",
+type: "symptom",
+name: "سعال",
+common_name: "سعال",
+},
+{
+id: "s_103",
+type: "symptom",
+name: "سعال، يدوم أقل من ثلاثة أسابيع",
+common_name: "سعال يستمر أقل من ثلاثة أسابيع",
+},
+{
+id: "s_104",
+type: "symptom",
+name: "سعال، مُنتج",
+common_name: "سعال منتج للبلغم",
+},
+{
+id: "s_105",
+type: "symptom",
+name: "سعال، جاف",
+common_name: "سعال جاف",
+},
+{
+id: "s_106",
+type: "symptom",
+name: "سعال، يدوم لأكثر من ثمانية أسابيع",
+common_name: "سعال يستمر لأكثر من ثمانية أسابيع",
+},
+{
+id: "s_107",
+type: "symptom",
+name: "سيلان أنفي",
+common_name: "سيلان من الأنف",
+},
+{
+id: "s_108",
+type: "symptom",
+name: "زيادة عمق الجيوب حول السنية",
+common_name: "فراغات عميقة بين اللثة والأسنان",
+},
+{
+id: "s_109",
+type: "symptom",
+name: "شرب الكحول، الشرب لتخفيف آثار الثمالة",
+common_name: "شرب الكحول لتخفيف آثار الثمالة",
+},
+{
+id: "s_110",
+type: "symptom",
+name: "الخفقان",
+common_name: "خفقان القلب",
+},
+{
+id: "s_111",
+type: "symptom",
+name: "نزف من اللثة",
+common_name: "نزف من اللثة",
+},
+{
+id: "s_112",
+type: "symptom",
+name: "براز أحمر اللون",
+common_name: "براز أحمر",
+},
+{
+id: "s_113",
+type: "symptom",
+name: "بول أحمر اللون",
+common_name: "بول أحمر",
+},
+{
+id: "s_115",
+type: "symptom",
+name: "نزيف من الشرج",
+common_name: "نزيف من الشرج",
+},
+{
+id: "s_116",
+type: "symptom",
+name: "نفث الدم",
+common_name: "بصق الدم",
+},
+{
+id: "s_118",
+type: "symptom",
+name: "حساسية تجاه البرد",
+common_name: "حساسية تجاه البرد",
+},
+{
+id: "s_120",
+type: "symptom",
+name: "قلق",
+common_name: "قلق",
+},
+{
+id: "s_121",
+type: "symptom",
+name: "فقدان الشعر",
+common_name: "تساقط الشعر",
+},
+{
+id: "s_122",
+type: "symptom",
+name: "دُماع",
+common_name: "زيادة إفراز الدمع",
+},
+{
+id: "s_123",
+type: "symptom",
+name: "إهمال الذات",
+common_name: "نقص الاهتمام بالذات",
+},
+{
+id: "s_124",
+type: "symptom",
+name: "عتمة، أجسام طافية أمام العينين",
+common_name: "رؤية بقع سوداء",
+},
+{
+id: "s_125",
+type: "symptom",
+name: "خدر، في كلا القدمين",
+common_name: "تنميل في القدمين",
+},
+{
+id: "s_126",
+type: "symptom",
+name: "خدر حول الفم",
+common_name: "تنميل حول الفم",
+},
+{
+id: "s_127",
+type: "symptom",
+name: "وساوس",
+common_name: "أفكار وسواسية",
+},
+{
+id: "s_131",
+type: "symptom",
+name: "نوبات النوم",
+common_name: "النوم فجأة خلال النهار",
+},
+{
+id: "s_132",
+type: "symptom",
+name: "شعرانية",
+common_name: "زيادة نمو الأشعار",
+},
+{
+id: "s_134",
+type: "symptom",
+name: "التدخين، الحاجة لتدخين سيجارة أول اليوم",
+common_name: "صعوبة التخلي عن سيجارة أول اليوم",
+},
+{
+id: "s_136",
+type: "symptom",
+name: "نوبات من العطاس",
+common_name: "نوبات من العطاس",
+},
+{
+id: "s_137",
+type: "symptom",
+name: "تناول الطعام المفرط",
+common_name: "الإفراط في تناول الطعام",
+},
+{
+id: "s_139",
+type: "symptom",
+name: "التهاب لوزتين ناكس",
+common_name: "التهاب لوزتين ناكس",
+},
+{
+id: "s_142",
+type: "symptom",
+name: "قرحات معدية ناكسة",
+common_name: "قرحات معدية ناكسة",
+},
+{
+id: "s_146",
+type: "symptom",
+name: "فقدان في الذاكرة، عدم تذكر أسماء العائلة والأصدقاء",
+common_name: "نسيان أسماء العائلة والأصدقاء",
+},
+{
+id: "s_147",
+type: "symptom",
+name: "فقر دم",
+common_name: "فقر دم",
+},
+{
+id: "s_150",
+type: "symptom",
+name: "شرب الكحول، عدم القدرة على التوقف عن الشرب",
+common_name: "عدم القدرة على التوقف عن شرب الكحول",
+},
+{
+id: "s_151",
+type: "symptom",
+name: "نزيف أو تمشيح تناسلي غير طبيعي بعد سن اليأس",
+common_name: "نزف أو تمشيح من المهبل بعد تجاوز سن اليأس",
+},
+{
+id: "s_152",
+type: "symptom",
+name: "نزف مهبلي بعد الجماع",
+common_name: "نزف من المهبل بعد الجماع",
+},
+{
+id: "s_153",
+type: "symptom",
+name: "سلس بولي",
+common_name: "سلس البول",
+},
+{
+id: "s_155",
+type: "symptom",
+name: "انخفاض الثقة بالنفس",
+common_name: "انخفاض احترام الذات",
+},
+{
+id: "s_156",
+type: "symptom",
+name: "غثيان",
+common_name: "الشعور برغبة في التقيؤ",
+},
+{
+id: "s_157",
+type: "symptom",
+name: "رهاب السمنة",
+common_name: "الخوف من البدانة",
+},
+{
+id: "s_159",
+type: "symptom",
+name: "ألم في الظهر، يشتد عند القيام بمجهود فيزيائي",
+common_name: "ألم في الظهر يزداد بعد القيام بمجهود جسدي",
+},
+{
+id: "s_161",
+type: "symptom",
+name: "تظهر الأعراض بانتظام قبل عدة أيام من الدورة الشهرية",
+common_name: "تظهر الأعراض بانتظام قبل عدة أيام من الحيض",
+},
+{
+id: "s_169",
+type: "symptom",
+name: "نوبات مزاج اكتئابي",
+common_name: "مزاج اكتئابي",
+},
+{
+id: "s_170",
+type: "symptom",
+name: "وذمة، في مفصل الركبة",
+common_name: "تورم في الركبة",
+},
+{
+id: "s_171",
+type: "symptom",
+name: "وذمة، في مفصل الكاحل في جانب واحد",
+common_name: "تورم في أحد الكاحلين",
+},
+{
+id: "s_172",
+type: "symptom",
+name: "تورم في اللثة",
+common_name: "تورم في اللثة",
+},
+{
+id: "s_173",
+type: "symptom",
+name: "وذمة، في طرف سفلي واحد",
+common_name: "تورم في الساق",
+},
+{
+id: "s_175",
+type: "symptom",
+name: "وذمة، في كلا الطرفين السفليين",
+common_name: "تورم في كلا الساقين",
+},
+{
+id: "s_176",
+type: "symptom",
+name: "وذمة، في كيس الصفن",
+common_name: "تورم في كيس الصفن",
+},
+{
+id: "s_177",
+type: "symptom",
+name: "توذّم الوجنة",
+common_name: "تورم الخد",
+},
+{
+id: "s_180",
+type: "symptom",
+name: "نقص تصبّغ الجلد",
+common_name: "بهوت لون الجلد",
+},
+{
+id: "s_181",
+type: "symptom",
+name: "اضطراب الوظيفة الجنسية، رغبة جنسية مستمرة",
+common_name: "الشعور بحاجة مستمرة لممارسة الجنس",
+},
+{
+id: "s_182",
+type: "symptom",
+name: "بوال ليلي",
+common_name: "تكرر التبول في الليل",
+},
+{
+id: "s_183",
+type: "symptom",
+name: "التبول أثناء السعال أو الضحك أو عند القيام بمجهود بدني",
+common_name: "التبول أثناء السعال أو الضحك أو عند القيام بمجهود بدني",
+},
+{
+id: "s_185",
+type: "symptom",
+name: "قلة البول",
+common_name: "تبول كمية أقل من المعتاد",
+},
+{
+id: "s_186",
+type: "symptom",
+name: "تحدد الحركة، صعوبة في الانحناء",
+common_name: "صعوبة في الانحناء",
+},
+{
+id: "s_189",
+type: "symptom",
+name: "نوبات صرع، مع فقدان وعي",
+common_name: "نوبات اختلاج مع غياب عن الوعي",
+},
+{
+id: "s_190",
+type: "symptom",
+name: "فقدان للوعي مع تبول أو تغوط",
+common_name: "غياب عن الوعي مع فقدان القدرة على ضبط عملية التبول أو التغوط",
+},
+{
+id: "s_191",
+type: "symptom",
+name: "تدلي الرأس",
+common_name: "هبوط الرأس",
+},
+{
+id: "s_192",
+type: "symptom",
+name: "إطراق جفني",
+common_name: "هبوط الأجفان",
+},
+{
+id: "s_194",
+type: "symptom",
+name: "قرحة، في حلمة الثدي",
+common_name: "قرحة في حلمة الثدي",
+},
+{
+id: "s_195",
+type: "symptom",
+name: "تدخين حالي للسجائر",
+common_name: "تدخين حالي للسجائر",
+},
+{
+id: "s_196",
+type: "symptom",
+name: "تدخين السجائر أثناء المرض",
+common_name: "التدخين حتى أثناء المرض",
+},
+{
+id: "s_200",
+type: "symptom",
+name: "حرقة في اللسان",
+common_name: "شعور بالحرق في اللسان",
+},
+{
+id: "s_201",
+type: "symptom",
+name: "الشعور بوجود رمل أسفل الأجفان",
+common_name: "الشعور بوجود رمل أسفل الأجفان",
+},
+{
+id: "s_202",
+type: "symptom",
+name: "حمامى هاجرة",
+common_name: "بقعة حمراء متوسّعة في مركزها جلد طبيعي سليم",
+},
+{
+id: "s_203",
+type: "symptom",
+name: "قلح",
+common_name: "جير الأسنان",
+},
+{
+id: "s_204",
+type: "symptom",
+name: "انحناء الجسم للأمام",
+common_name: "انحناء الجسم للأمام",
+},
+{
+id: "s_205",
+type: "symptom",
+name: "الشعور بالذنب",
+common_name: "الشعور بالذنب",
+},
+{
+id: "s_207",
+type: "symptom",
+name: "الشفع",
+common_name: "ازدواج الرؤية",
+},
+{
+id: "s_208",
+type: "symptom",
+name: "ضعف حاسة السمع",
+common_name: "ضعف حاسة السمع",
+},
+{
+id: "s_213",
+type: "symptom",
+name: "اضطراب الوظيفة الجنسية، قضاء وقت طويل في ممارسات متعلقة بالجنس",
+common_name: "قضاء وقت طويل في أنشطة متعلقة بالجنس",
+},
+{
+id: "s_214",
+type: "symptom",
+name: "تعرق في الجبهة في الجانب المؤلم",
+common_name: "تعرق في الجبهة في الجانب المؤلم",
+},
+{
+id: "s_215",
+type: "symptom",
+name: "كثرة عدد مرات التبول",
+common_name: "كثرة عدد مرات التبول",
+},
+{
+id: "s_216",
+type: "symptom",
+name: "تعرق مفرط",
+common_name: "كثرة التعرق",
+},
+{
+id: "s_217",
+type: "symptom",
+name: "تعرق ليلي",
+common_name: "تعرق في الليل",
+},
+{
+id: "s_219",
+type: "symptom",
+name: "تضخم الثديين",
+common_name: "تضخم الثديين",
+},
+{
+id: "s_220",
+type: "symptom",
+name: "تضخم في العقد اللمفاوية",
+common_name: "تضخم في العقد اللمفاوية",
+},
+{
+id: "s_221",
+type: "symptom",
+name: "آفات جلدية على الأعضاء التناسلية تشبه القرنبيط",
+common_name: "بروزات على الأعضاء التناسلية تشبه القرنبيط",
+},
+{
+id: "s_223",
+type: "symptom",
+name: "عدم القدرة على إيقاف التبوّل",
+common_name: "عدم القدرة على إيقاف التبوّل",
+},
+{
+id: "s_225",
+type: "symptom",
+name: "الشيب المبكر",
+common_name: "الشيب المبكر",
+},
+{
+id: "s_226",
+type: "symptom",
+name: "زيادة الوزن",
+common_name: "زيادة الوزن",
+},
+{
+id: "s_227",
+type: "symptom",
+name: "تسرع التنفس",
+common_name: "تنفّس سريع",
+},
+{
+id: "s_228",
+type: "symptom",
+name: "أسنان متقلقلة",
+common_name: "أسنان متحركة",
+},
+{
+id: "s_229",
+type: "symptom",
+name: "حمامى",
+common_name: "احمرار الجلد",
+},
+{
+id: "s_230",
+type: "symptom",
+name: "حمامى، على الوجه بشكل فراشة",
+common_name: "احمرار على الوجه يشمل الخدين والأنف فقط",
+},
+{
+id: "s_231",
+type: "symptom",
+name: "ألم سني، مترافق مع الحرارة",
+common_name: "ألم في سن يزداد بالحرارة",
+},
+{
+id: "s_232",
+type: "symptom",
+name: "ألم في الطرف السفلي، في الربلة، شديد أثناء المشي",
+common_name: "ألم شديد في بطة الساق أثناء المشي",
+},
+{
+id: "s_233",
+type: "symptom",
+name: "ألم سني، شديد",
+common_name: "ألم شديد في سن",
+},
+{
+id: "s_234",
+type: "symptom",
+name: "كدمات سهلة الظهور",
+common_name: "كدمات سهلة الظهور",
+},
+{
+id: "s_235",
+type: "symptom",
+name: "نفضات في الأجفان",
+common_name: "تقلصات في الأجفان",
+},
+{
+id: "s_236",
+type: "symptom",
+name: "انخفاض الشبق",
+common_name: "فقدان الرغبة الجنسية",
+},
+{
+id: "s_237",
+type: "symptom",
+name: "نقص في الوزن، دون انخفاض الشهية",
+common_name: "نقص في الوزن دون انخفاض في الشهية",
+},
+{
+id: "s_238",
+type: "symptom",
+name: "مشية بطيئة",
+common_name: "بطء المشي",
+},
+{
+id: "s_241",
+type: "symptom",
+name: "تغيرات جلدية",
+common_name: "تغيرات في الجلد",
+},
+{
+id: "s_243",
+type: "symptom",
+name: "استخدام وسائل غير صحية لإنقاص الوزن",
+common_name: "استخدام وسائل غير صحية لإنقاص الوزن",
+},
+{
+id: "s_244",
+type: "symptom",
+name: "الخوف من أشياء أو مواقف أو تصرفات معينة",
+common_name: "خوف من أشياء محددة",
+},
+{
+id: "s_245",
+type: "symptom",
+name: "تغيرات جلدية، توسفية",
+common_name: "قشور جلدية",
+},
+{
+id: "s_247",
+type: "symptom",
+name: "جفاف الفم",
+common_name: "جفاف الفم",
+},
+{
+id: "s_249",
+type: "symptom",
+name: "حكة حول الشرج",
+common_name: "حكة في الشرج",
+},
+{
+id: "s_250",
+type: "symptom",
+name: "حكة جلدية، تشتد في الليل",
+common_name: "حكة جلدية تزداد في الليل",
+},
+{
+id: "s_251",
+type: "symptom",
+name: "حكة جلدية، تتحرّض بتغيرات درجة الحرارة أو التعرّق أو لبس الصوف",
+common_name: "حكة في الجلد تتحرض بتغيرات درجة الحرارة أو التعرق أو لبس الصوف",
+},
+{
+id: "s_252",
+type: "symptom",
+name: "حكة في الأنف أو الحلق",
+common_name: "شعور بالحكة في الأنف أو الحلق",
+},
+{
+id: "s_253",
+type: "symptom",
+name: "حكة في المغبن",
+common_name: "حكة في المنطقة التناسلية",
+},
+{
+id: "s_254",
+type: "symptom",
+name: "حكة جلدية",
+common_name: "جلد حاك",
+},
+{
+id: "s_255",
+type: "symptom",
+name: "حكة في الأذن",
+common_name: "حكة في الأذن",
+},
+{
+id: "s_256",
+type: "symptom",
+name: "الضزز",
+common_name: "صعوبة في فتح الفم",
+},
+{
+id: "s_257",
+type: "symptom",
+name: "تيبس العمود الفقري صباحاً",
+common_name: "تصلب العمود الفقري صباحاً",
+},
+{
+id: "s_258",
+type: "symptom",
+name: "تيبس صباحي لمفاصل اليد",
+common_name: "تيبس في مفاصل اليد صباحاً",
+},
+{
+id: "s_259",
+type: "symptom",
+name: "تيبس مفصلي، يزول بعد تحريك المفصل",
+common_name: "تيبس في مفصل يزول بعد ممارسة التمارين",
+},
+{
+id: "s_261",
+type: "symptom",
+name: "تسرع القلب",
+common_name: "تسارع نبضات القلب",
+},
+{
+id: "s_263",
+type: "symptom",
+name: "تضيق القلفة",
+common_name: "صعوبة في إرجاع القلفة",
+},
+{
+id: "s_265",
+type: "symptom",
+name: "التدخين في الأماكن الغير مسموح فيها بذلك",
+common_name: "التدخين في الأماكن الغير مسموح فيها بذلك",
+},
+{
+id: "s_266",
+type: "symptom",
+name: "صعوبة في القضم والمضغ",
+common_name: "صعوبة في القضم والمضغ",
+},
+{
+id: "s_267",
+type: "symptom",
+name: "ألم سني، صعوبة في تحديد السن الذي يسبب الألم",
+common_name: "صعوبة في تحديد السن الذي يسبب الألم",
+},
+{
+id: "s_269",
+type: "symptom",
+name: "صعوبة التعلم",
+common_name: "صعوبة في تعلم الأشياء الجديدة",
+},
+{
+id: "s_270",
+type: "symptom",
+name: "صرير مفصلي أثناء الحركة",
+common_name: "صدور صوت صرير من مفصل عند تحريكه",
+},
+{
+id: "s_271",
+type: "symptom",
+name: "وجه أملس بدون تجاعيد",
+common_name: "وجه أملس بدون تجاعيد",
+},
+{
+id: "s_272",
+type: "symptom",
+name: "آفات في الميناء، نخر سني",
+common_name: "نخور في الأسنان",
+},
+{
+id: "s_273",
+type: "symptom",
+name: "الشعور بثقل في الساقين في نهاية اليوم",
+common_name: "الشعور بثقل في الساقين في نهاية اليوم",
+},
+{
+id: "s_274",
+type: "symptom",
+name: "الشعور بالحر",
+common_name: "الشعور بالحر",
+},
+{
+id: "s_276",
+type: "symptom",
+name: "انسداد في الأذن",
+common_name: "أذن مسدودة",
+},
+{
+id: "s_277",
+type: "symptom",
+name: "زيادة محيط البطن",
+common_name: "زيادة حجم البطن",
+},
+{
+id: "s_279",
+type: "symptom",
+name: "الشعور بضغط أو خفقان داخل السن",
+common_name: "الشعور بضغط أو خفقان داخل السن",
+},
+{
+id: "s_280",
+type: "symptom",
+name: "هبات ساخنة",
+common_name: "هبات ساخنة",
+},
+{
+id: "s_284",
+type: "symptom",
+name: "نقص الشهية",
+common_name: "نقص الشهية",
+},
+{
+id: "s_285",
+type: "symptom",
+name: "نقص الوزن",
+common_name: "نقص الوزن",
+},
+{
+id: "s_287",
+type: "symptom",
+name: "فقدان لذة الحياة، يدوم أسبوعين على الأقل",
+common_name: "نقص الاهتمام بالأنشطة التي كانت ممتعة سابقاً بحيث استمر ذلك أسبوعين على الأقل",
+},
+{
+id: "s_289",
+type: "symptom",
+name: "سوء الإطباق",
+common_name: "سوء الإطباق",
+},
+{
+id: "s_291",
+type: "symptom",
+name: "توذم في مجرى السمع الخارجي",
+common_name: "تورم القناة السمعية داخل الأذن",
+},
+{
+id: "s_297",
+type: "symptom",
+name: "سيلان من الأذن",
+common_name: "خروج مفرزات من الأذن",
+},
+{
+id: "s_299",
+type: "symptom",
+name: "كتلة بطنيّة",
+common_name: "كتلة في البطن",
+},
+{
+id: "s_300",
+type: "symptom",
+name: "عقيدة في الثدي",
+common_name: "كتلة في الثدي",
+},
+{
+id: "s_301",
+type: "symptom",
+name: "إفرازات تحت القلفة",
+common_name: "إفرازات تحت القلفة",
+},
+{
+id: "s_302",
+type: "symptom",
+name: "خروج مفرزات من الجيوب اللثوية",
+common_name: "خروج مفرزات من الجيوب حول السنية بين اللثة والأسنان",
+},
+{
+id: "s_303",
+type: "symptom",
+name: "سلوك قهري",
+common_name: "سلوك قهري",
+},
+{
+id: "s_305",
+type: "symptom",
+name: "إقياء",
+common_name: "تقيؤ",
+},
+{
+id: "s_306",
+type: "symptom",
+name: "إقياء مدمى",
+common_name: "تقيؤ مصحوب بدم",
+},
+{
+id: "s_308",
+type: "symptom",
+name: "تدخين العدد الأكبر من السجائر في اليوم صباحاً",
+common_name: "تدخين العدد الأكبر من السجائر في اليوم صباحاً",
+},
+{
+id: "s_309",
+type: "symptom",
+name: "نفخة",
+common_name: "نفخة",
+},
+{
+id: "s_310",
+type: "symptom",
+name: "زيادة العطش",
+common_name: "الشعور بعطش زائد عن المعتاد",
+},
+{
+id: "s_311",
+type: "symptom",
+name: "زيادة الشهية",
+common_name: "الشعور بجوعٍ زائد عن المعتاد",
+},
+{
+id: "s_313",
+type: "symptom",
+name: "فقدان الحس في طرف واحد",
+common_name: "غياب الحس في ذراع أو ساق واحدة",
+},
+{
+id: "s_316",
+type: "symptom",
+name: "ضعف الذاكرة",
+common_name: "ضعف الذاكرة",
+},
+{
+id: "s_317",
+type: "symptom",
+name: "ضعف التوازن أثناء المشي",
+common_name: "التعثر أو فقدان التوازن أثناء المشي",
+},
+{
+id: "s_319",
+type: "symptom",
+name: "اضطراب النوم",
+common_name: "تغيّر في أنماط النوم أو عاداته أو صعوبة النوم",
+},
+{
+id: "s_320",
+type: "symptom",
+name: "ضعف بصري",
+common_name: "ضعف الرؤية",
+},
+{
+id: "s_322",
+type: "symptom",
+name: "حمامى لثوية",
+common_name: "لثة حمراء",
+},
+{
+id: "s_323",
+type: "symptom",
+name: "حمامى، في الجلد الواقع فوق مفصل",
+common_name: "احمرار في مفصل",
+},
+{
+id: "s_325",
+type: "symptom",
+name: "حمامى، على الأطراف",
+common_name: "احمرار في جلد اليد أو الساق",
+},
+{
+id: "s_326",
+type: "symptom",
+name: "اضطراب الوظيفة الجنسية، إعطاء الجنس الأولوية على حساب المسؤوليات والهوايات",
+common_name: "إهمال الالتزامات كالعمل أو الدراسة أو العائلة بسبب الجنس",
+},
+{
+id: "s_327",
+type: "symptom",
+name: "الحاجة لتدخين سيجارة عند الاستيقاظ من النوم",
+common_name: "التدخين فور الاستيقاظ",
+},
+{
+id: "s_328",
+type: "symptom",
+name: "ضائعات مهبلية غير طبيعية",
+common_name: "ضائعات مهبلية غير طبيعية",
+},
+{
+id: "s_329",
+type: "symptom",
+name: "إمساك",
+common_name: "إمساك",
+},
+{
+id: "s_330",
+type: "symptom",
+name: "قلس",
+common_name: "عودة الطعام المبتلع إلى الفم",
+},
+{
+id: "s_331",
+type: "symptom",
+name: "احتقان أنفي",
+common_name: "انسداد الأنف",
+},
+{
+id: "s_332",
+type: "symptom",
+name: "يرقان",
+common_name: "يرقان",
+},
+{
+id: "s_334",
+type: "symptom",
+name: "يرقان يظهر أثناء التوتر",
+common_name: "اصفرار في الجلد يحدث أثناء التوتر أو الضغط النفسي",
+},
+{
+id: "s_335",
+type: "symptom",
+name: "يرقان يظهر بعد القيام بمجهود فيزيائي شديد",
+common_name: "اصفرار في الجلد أو العينين بعد القيام بمجهود بدني",
+},
+{
+id: "s_336",
+type: "symptom",
+name: "يرقان يظهر عند الإصابة بالأمراض الخمجية",
+common_name: "اصفرار في الجلد أو العينين يظهر أثناء الأمراض المُعدية",
+},
+{
+id: "s_338",
+type: "symptom",
+name: "حرقة الفؤاد",
+common_name: "حرقة بمنطقة الصدر",
+},
+{
+id: "s_341",
+type: "symptom",
+name: "تخيل أن الأشياء المحيطة أكبر أو أصغر مما هي في الواقع",
+common_name: "تخيل أن الأشياء المحيطة أكبر أو أصغر مما هي في الواقع",
+},
+{
+id: "s_342",
+type: "symptom",
+name: "تجاعيد أو تنقّر في جلد الثدي",
+common_name: "تجاعيد أو تنقّر في جلد الثدي",
+},
+{
+id: "s_343",
+type: "symptom",
+name: "غؤور في الحلمة أو تغير في شكلها",
+common_name: "تغير شكل الحلمة",
+},
+{
+id: "s_345",
+type: "symptom",
+name: "تغير في خط اليد",
+common_name: "تغير في خط اليد",
+},
+{
+id: "s_346",
+type: "symptom",
+name: "تغير في لون سن",
+common_name: "تغير في لون سن",
+},
+{
+id: "s_348",
+type: "symptom",
+name: "تغيرات الشخصيّة",
+common_name: "تغيرات الشخصيّة",
+},
+{
+id: "s_350",
+type: "symptom",
+name: "تغيرات جلدية، تتوضع بشكل خطي",
+common_name: "تغيرات جلدية تأخذ شكل خط",
+},
+{
+id: "s_351",
+type: "symptom",
+name: "تَقَرُّح أو خراج قرب فتحة الشرج",
+common_name: "تَقَرُّح أو خراج قرب فتحة الشرج",
+},
+{
+id: "s_352",
+type: "symptom",
+name: "تغيرات جلدية، في مكان التماس مع الأزرار أو الأحزمة أو مستحضرات التجميل",
+common_name: "تغيرات في الجلد المماس للأزرار أو الأحزمة أو المجوهرات أو مستحضرات التجميل",
+},
+{
+id: "s_358",
+type: "symptom",
+name: "تدفّق متقطع للبول",
+common_name: "تقطع تدفق البول",
+},
+{
+id: "s_359",
+type: "symptom",
+name: "تشوه مفصلي، غير رضي",
+common_name: "تشوّه مفصل لا يترافق مع أي إصابة حديثة",
+},
+{
+id: "s_360",
+type: "symptom",
+name: "صغر الفم",
+common_name: "تضيق الفم أو صعوبة في فتحه",
+},
+{
+id: "s_361",
+type: "symptom",
+name: "اضطراب الوظيفة الجنسية، زيادة الحاجة للمنبهات الجنسية للوصول إلى التأثير المرغوب",
+common_name: "زيادة الحاجة للممارسات والتجارب الجنسية للوصول إلى التأثير المرغوب",
+},
+{
+id: "s_362",
+type: "symptom",
+name: "بشرة دهنية",
+common_name: "بشرة دهنية",
+},
+{
+id: "s_363",
+type: "symptom",
+name: "توذّم، في الرقبة",
+common_name: "تورم في العنق",
+},
+{
+id: "s_369",
+type: "symptom",
+name: "سيلان من الإحليل",
+common_name: "خروج مفرزات من الإحليل",
+},
+{
+id: "s_370",
+type: "symptom",
+name: "دوخة",
+common_name: "دوخة",
+},
+{
+id: "s_371",
+type: "symptom",
+name: "العمل الزائد",
+common_name: "العمل الزائد",
+},
+{
+id: "s_373",
+type: "symptom",
+name: "قشور عسلية اللون على الجلد",
+common_name: "قشور عسلية اللون على الجلد",
+},
+{
+id: "s_376",
+type: "symptom",
+name: "جلد من النمط I أو II",
+common_name: "جلد من النمط الأول أو الثاني",
+},
+{
+id: "s_377",
+type: "symptom",
+name: "عدد كبير من الشامات",
+common_name: "عدد كبير من وحمات الولادة",
+},
+{
+id: "s_380",
+type: "symptom",
+name: "شامة أو وحمة غريبة ومشبوهة، غير متناظرة",
+common_name: "عدم تناظر وحمة الولادة أو شامة جلديّة",
+},
+{
+id: "s_381",
+type: "symptom",
+name: "شامة أو وحمة غريبة ومشبوهة، غير منتظمة الحواف",
+common_name: "شامة أو وحمة ولادة غير منتظمة الحواف",
+},
+{
+id: "s_382",
+type: "symptom",
+name: "شامة أو وحمة غريبة ومشبوهة، قطرها أكبر من 6 مم",
+common_name: "شامة أو وحمة ولادة بقطر أكبر من 6 مم",
+},
+{
+id: "s_383",
+type: "symptom",
+name: "شامة أو وحمة غريبة ومشبوهة",
+common_name: "شامة أو وحمة مشبوهة المنظر",
+},
+{
+id: "s_384",
+type: "symptom",
+name: "بقع حمراء بقشور بيضاء فضية",
+common_name: "بقع حمراء مع وسوف قشرية بيضاء فضية",
+},
+{
+id: "s_385",
+type: "symptom",
+name: "جلد جاف متشقق وينزف أحياناً",
+common_name: "جلد جاف متشقق وينزف أحياناً",
+},
+{
+id: "s_386",
+type: "symptom",
+name: "أظافر سميكة بحفر أو أثلام",
+common_name: "أظافر سميكة مع حفر وأثلام على سطحها",
+},
+{
+id: "s_388",
+type: "symptom",
+name: "بثرة",
+common_name: "حويصلات مليئة بالقيح قطر أحدها لا يتجاوز الـ1 سم",
+},
+{
+id: "s_389",
+type: "symptom",
+name: "رؤوس سوداء",
+common_name: "رؤوس سوداء",
+},
+{
+id: "s_393",
+type: "symptom",
+name: "شرى",
+common_name: "طفح جلدي حاك",
+},
+{
+id: "s_398",
+type: "symptom",
+name: "تغيرات جلدية، تشمل الجسم كله",
+common_name: "تغيرات في كامل جلد الجسم",
+},
+{
+id: "s_400",
+type: "symptom",
+name: "تغيرات جلدية، تُسبق بألم أو حكّة",
+common_name: "ألم وحكة يليها ظهور تغيرات جلدية",
+},
+{
+id: "s_402",
+type: "symptom",
+name: "تغيرات جلدية، تنكس خلال الأخماج أو الدورة الطمثية",
+common_name: "تغيرات جلدية تتكرر أثناء العدوى الجرثومية أو الدورة الشهرية",
+},
+{
+id: "s_404",
+type: "symptom",
+name: "تغيرات جلدية، ذات سطح خشن وغير منتظم",
+common_name: "تغيرات جلدية بسطح خشن وغير منتظم",
+},
+{
+id: "s_407",
+type: "symptom",
+name: "طنين",
+common_name: "طنين في الأذن",
+},
+{
+id: "s_408",
+type: "symptom",
+name: "برودة في القدم وأصابعها",
+common_name: "برودة في القدم وأصابعها",
+},
+{
+id: "s_410",
+type: "symptom",
+name: "انخفاض حرارة الجسم",
+common_name: "انخفاض حرارة الجسم",
+},
+{
+id: "s_412",
+type: "symptom",
+name: "إسهال، رغوي",
+common_name: "إسهال رغوي",
+},
+{
+id: "s_418",
+type: "symptom",
+name: "تيبس العنق",
+common_name: "تصلب العنق",
+},
+{
+id: "s_419",
+type: "symptom",
+name: "الشعور بزيادة في الوزن رغم أنه منخفض",
+common_name: "الشعور بزيادة في الوزن رغم أنه منخفض",
+},
+{
+id: "s_420",
+type: "symptom",
+name: "الكذب بشأن تناول الطعام أو إخفاء الطعام",
+common_name: "الكذب بشأن تناول الطعام أو إخفاء الطعام",
+},
+{
+id: "s_421",
+type: "symptom",
+name: "زيادة الشهوة الجنسية",
+common_name: "زيادة الشهوة الجنسية",
+},
+{
+id: "s_422",
+type: "symptom",
+name: "صوت رخيم",
+common_name: "صوت عميق",
+},
+{
+id: "s_423",
+type: "symptom",
+name: "تعلّق شعور تقدير الذات بالوزن",
+common_name: "تقدير الذات يعتمد على الوزن",
+},
+{
+id: "s_424",
+type: "symptom",
+name: "ألم وجهي، في جانب واحد",
+common_name: "ألم في جانب واحد من الوجه",
+},
+{
+id: "s_425",
+type: "symptom",
+name: "ألم وجهي، طاعن واخز",
+common_name: "ألم طاعن في الوجه",
+},
+{
+id: "s_426",
+type: "symptom",
+name: "ألم وجهي، يتحرّض بتناول الطعام أو اللمس أو تنظيف الأسنان",
+common_name: "ألم في الوجه يتحرض بتناول الطعام أو اللمس أو تنظيف الأسنان",
+},
+{
+id: "s_427",
+type: "symptom",
+name: "ألم وجهي، دوري",
+common_name: "ألم وجهي متكرر",
+},
+{
+id: "s_429",
+type: "symptom",
+name: "أصوات فرقعة في المفصل الفكي عند فتح الفم أو إغلاقه",
+common_name: "أصوات فرقعة في المفصل الفكي عند فتح الفم أو إغلاقه",
+},
+{
+id: "s_430",
+type: "symptom",
+name: "ألم في المفصل الصدغي الفكي عند تحريكه",
+common_name: "ألم في الفك أثناء تحريكه",
+},
+{
+id: "s_433",
+type: "symptom",
+name: "حمامى، على القلفة أو الحشفة",
+common_name: "احمرار في جلد القلفة أو رأس القضيب",
+},
+{
+id: "s_435",
+type: "symptom",
+name: "عدم انفراغ المثانة بشكل كامل",
+common_name: "لا تفرغ المثانة كلياً بعد التبوّل",
+},
+{
+id: "s_436",
+type: "symptom",
+name: "ألم شرجي مستقيمي",
+common_name: "ألم شرجي مستقيمي",
+},
+{
+id: "s_437",
+type: "symptom",
+name: "زُرقة",
+common_name: "جلد ذو لون أزرق رمادي",
+},
+{
+id: "s_471",
+type: "symptom",
+name: "ألم بطني، ينتشر إلى الكتف الأيمن أو لوح الكتف الأيمن",
+common_name: "ألم في البطن ينتشر إلى منطقة الكتف الأيمن",
+},
+{
+id: "s_474",
+type: "symptom",
+name: "وزيز مسموع",
+common_name: "صوت صفير يصدر أثناء التنفس",
+},
+{
+id: "s_476",
+type: "symptom",
+name: "مضض حول الأذن",
+common_name: "ألم عند لمس المنطقة المحيطة بالأذن",
+},
+{
+id: "s_477",
+type: "symptom",
+name: "فقد الصوت",
+common_name: "فقدان الصوت",
+},
+{
+id: "s_478",
+type: "symptom",
+name: "ألم وجهي",
+common_name: "ألم في الوجه",
+},
+{
+id: "s_479",
+type: "symptom",
+name: "رأرأة",
+common_name: "رأرأة",
+},
+{
+id: "s_480",
+type: "symptom",
+name: "تصخم في اليدين أو القدمين أو الوجه",
+common_name: "تصخم في اليدين أو القدمين أو الوجه",
+},
+{
+id: "s_483",
+type: "symptom",
+name: "تغيرات جلدية، على الجفن",
+common_name: "تغيرات جلدية متوضعة على الجفن",
+},
+{
+id: "s_484",
+type: "symptom",
+name: "آفات جفنية، تورم أحمر اللون وطرفها أصفر",
+common_name: "كتلة حمراء اللون ذات طرف أصفر اللون",
+},
+{
+id: "s_485",
+type: "symptom",
+name: "آفات على الجفن، مؤلمة",
+common_name: "تغيرات جلديّة مؤلمة على الأجفان",
+},
+{
+id: "s_486",
+type: "symptom",
+name: "آفات على الجفن، حمراء ودافئة",
+common_name: "احمرار ودفئ في جلد الأجفان",
+},
+{
+id: "s_488",
+type: "symptom",
+name: "حساسية العينين للضياء",
+common_name: "حساسية للضوء",
+},
+{
+id: "s_489",
+type: "symptom",
+name: "مفرزات جافة على الأجفان",
+common_name: "مفرزات جافة على أطراف الجفن",
+},
+{
+id: "s_492",
+type: "symptom",
+name: "احمرار في العين",
+common_name: "عين محمرّة",
+},
+{
+id: "s_493",
+type: "symptom",
+name: "ألم عيني",
+common_name: "ألم في العين",
+},
+{
+id: "s_494",
+type: "symptom",
+name: "فقدان الرؤية المحيطية",
+common_name: "الرؤية النفقية",
+},
+{
+id: "s_497",
+type: "symptom",
+name: "حدقتان غير متناظرتان",
+common_name: "حدقتان غير متماثلتان",
+},
+{
+id: "s_501",
+type: "symptom",
+name: "سوء في تقدير المسافات",
+common_name: "خطأ في تقدير المسافات",
+},
+{
+id: "s_503",
+type: "symptom",
+name: "تشنجات عضلية",
+common_name: "تشنجات عضلية",
+},
+{
+id: "s_504",
+type: "symptom",
+name: "بول رغوي",
+common_name: "بول رغوي",
+},
+{
+id: "s_505",
+type: "symptom",
+name: "إنتانات متكررة",
+common_name: "عدوى متكررة",
+},
+{
+id: "s_506",
+type: "symptom",
+name: "علامة جلدية تدل على لدغ حشرة",
+common_name: "لدغة حشرة",
+},
+{
+id: "s_507",
+type: "symptom",
+name: "الشعور بالاستسلام",
+common_name: "عدم الرغبة بالاستمرار في العيش",
+},
+{
+id: "s_508",
+type: "symptom",
+name: "فقدان لذة الحياة",
+common_name: "عدم القدرة على الاستمتاع بالحياة",
+},
+{
+id: "s_509",
+type: "symptom",
+name: "ألم عند البلع",
+common_name: "بلع مؤلم",
+},
+{
+id: "s_510",
+type: "symptom",
+name: "إفرازات إحليلية عند الضغط على القضيب",
+common_name: "خروج مفرزات عند الضغط على القضيب",
+},
+{
+id: "s_513",
+type: "symptom",
+name: "اللقمة الهستيرية",
+common_name: "الشعور بوجود جسم غريب عالق في الحلق",
+},
+{
+id: "s_514",
+type: "symptom",
+name: "تبدد الواقع",
+common_name: "الشعور بالانفصال عن العالم المحيط بالشخص",
+},
+{
+id: "s_518",
+type: "symptom",
+name: "خدر",
+common_name: "تنميل",
+},
+{
+id: "s_524",
+type: "symptom",
+name: "سليلة أنفية",
+common_name: "بوليب أنفي",
+},
+{
+id: "s_525",
+type: "symptom",
+name: "براز كريه الرائحة",
+common_name: "براز كريه الرائحة",
+},
+{
+id: "s_526",
+type: "symptom",
+name: "سعال، منتج لقشع أخضر أو أصفر",
+common_name: "سعال منتج لمخاط سميك أخضر أو أصفر اللون",
+},
+{
+id: "s_528",
+type: "symptom",
+name: "شرب الكحول، منذ أقل من 24 ساعة",
+common_name: "شرب الكحول منذ أقل من 24 ساعة",
+},
+{
+id: "s_529",
+type: "symptom",
+name: "تضخم في الغدة النكفية",
+common_name: "تضخم في الغدة النكفية",
+},
+{
+id: "s_530",
+type: "symptom",
+name: "ارتفاع مفاجئ في ضغط الدم",
+common_name: "ارتفاع مفاجئ في ضغط الدم",
+},
+{
+id: "s_531",
+type: "symptom",
+name: "أخماج متكررة، في السبيل التنفسي العلوي",
+common_name: "سيلان أنف وسعال متكررين",
+},
+{
+id: "s_532",
+type: "symptom",
+name: "أخماج متكررة، في السبيل التنفس السفلي",
+common_name: "التهاب القصبات المتكرر",
+},
+{
+id: "s_533",
+type: "symptom",
+name: "انخفاض ضغط الدم",
+common_name: "ضغط دم منخفض",
+},
+{
+id: "s_534",
+type: "symptom",
+name: "بطء القلب",
+common_name: "انخفاض معدّل ضربات القلب",
+},
+{
+id: "s_535",
+type: "symptom",
+name: "ضعف منعكس الحدقة تجاه الضوء",
+common_name: "ضعف منعكس الحدقة تجاه الضوء",
+},
+{
+id: "s_536",
+type: "symptom",
+name: "توسع الحدقتين",
+common_name: "حدقتين متوسعتين",
+},
+{
+id: "s_537",
+type: "symptom",
+name: "تضيق الحدقتين",
+common_name: "صغر حجم البؤبؤين",
+},
+{
+id: "s_538",
+type: "symptom",
+name: "رجفان",
+common_name: "رجفة في العضلات",
+},
+{
+id: "s_539",
+type: "symptom",
+name: "صرع دون فقدان للوعي",
+common_name: "اختلاج دون فقدان للوعي",
+},
+{
+id: "s_540",
+type: "symptom",
+name: "تهيّج",
+common_name: "سرعة الغضب",
+},
+{
+id: "s_541",
+type: "symptom",
+name: "هبوط الضغط الانتصابي",
+common_name: "الشعور بالدوخة أو الإغماء بعد الوقوف بسرعة",
+},
+{
+id: "s_542",
+type: "symptom",
+name: "جفاف الجلد",
+common_name: "جفاف الجلد",
+},
+{
+id: "s_543",
+type: "symptom",
+name: "ارتفاع التوتر الشرياني",
+common_name: "ارتفاع ضغط الدم",
+},
+{
+id: "s_545",
+type: "symptom",
+name: "توسع الشعريات",
+common_name: "أوعية عنكبوتية",
+},
+{
+id: "s_547",
+type: "symptom",
+name: "ثر للحليب عند امرأة",
+common_name: "سيلان الحليب من الحلمة خارج أوقات الإرضاع",
+},
+{
+id: "s_550",
+type: "symptom",
+name: "ضبابية عدسة العين",
+common_name: "غباشة في إحدى أو كلتا العينين",
+},
+{
+id: "s_551",
+type: "symptom",
+name: "ألم سني",
+common_name: "وجع في سن",
+},
+{
+id: "s_553",
+type: "symptom",
+name: "زرقة، في الأصابع",
+common_name: "أصابع ذات لون أزرق مائل للرمادي",
+},
+{
+id: "s_554",
+type: "symptom",
+name: "ألم في الطرف العلوي، في الأصابع أو اليد",
+common_name: "ألم في اليد أو الأصابع",
+},
+{
+id: "s_555",
+type: "symptom",
+name: "خدر في أصابع اليد",
+common_name: "خدر في أصابع اليد",
+},
+{
+id: "s_556",
+type: "symptom",
+name: "برودة في اليد وأصابعها",
+common_name: "برودة في اليد وأصابعها",
+},
+{
+id: "s_557",
+type: "symptom",
+name: "حمامى، في اليد",
+common_name: "احمرار في اليد",
+},
+{
+id: "s_558",
+type: "symptom",
+name: "تشتد الأعراض بالبرد",
+common_name: "زيادة الأعراض بالبرد",
+},
+{
+id: "s_561",
+type: "symptom",
+name: "تجشؤ",
+common_name: "تجشؤ",
+},
+{
+id: "s_562",
+type: "symptom",
+name: "وذمة، انطباعيّة",
+common_name: "وذمة انطباعية",
+},
+{
+id: "s_563",
+type: "symptom",
+name: "زلة تنفسية، اضطجاعية",
+common_name: "ضيق في التنفس أثناء الاستلقاء",
+},
+{
+id: "s_564",
+type: "symptom",
+name: "ضمور عضلات اليدين",
+common_name: "ضمور في عضلات اليدين",
+},
+{
+id: "s_567",
+type: "symptom",
+name: "علامة مورفي",
+common_name: "ألم في البطن عند الشهيق العميق ويتحرض بالضغط على الجزء العلوي الأيمن من البطن",
+},
+{
+id: "s_568",
+type: "symptom",
+name: "الاشمئزاز من النفس بعد الإفراط في تناول الطعام",
+common_name: "الاشمئزاز من النفس بعد الإفراط في تناول الطعام",
+},
+{
+id: "s_569",
+type: "symptom",
+name: "براز شاحب أو بلون الطين",
+common_name: "براز شاحب",
+},
+{
+id: "s_570",
+type: "symptom",
+name: "قيح عيني",
+common_name: "تجمع للقيح في مقدمة العين",
+},
+{
+id: "s_571",
+type: "symptom",
+name: "صلابة",
+common_name: "فرط توتر العضلات",
+},
+{
+id: "s_572",
+type: "symptom",
+name: "نقص التعابير الوجهية",
+common_name: "وجه جامد بدون تعابير أو حركات",
+},
+{
+id: "s_575",
+type: "symptom",
+name: "تيبس مفصلي",
+common_name: "تيبس في حركة المفاصل",
+},
+{
+id: "s_576",
+type: "symptom",
+name: "ألم مفصلي، يشتد خلال الطقس البارد والرطب",
+common_name: "ألم في المفاصل يزداد في الطقس البارد والرطب",
+},
+{
+id: "s_578",
+type: "symptom",
+name: "ألم في إحدى القدمين",
+common_name: "قدم مؤلمة",
+},
+{
+id: "s_579",
+type: "symptom",
+name: "ألم في الطرف السفلي",
+common_name: "ألم في الطرف السفلي",
+},
+{
+id: "s_580",
+type: "symptom",
+name: "ألم في الطرف العلوي",
+common_name: "ألم في الطرف العلوي",
+},
+{
+id: "s_581",
+type: "symptom",
+name: "ألم مفصلي، في ركبة واحدة",
+common_name: "ألم في ركبة واحدة",
+},
+{
+id: "s_582",
+type: "symptom",
+name: "نوبة قلق‎",
+common_name: "نوبة قلق‎",
+},
+{
+id: "s_583",
+type: "symptom",
+name: "قلق عام",
+common_name: "قلق عام",
+},
+{
+id: "s_584",
+type: "symptom",
+name: "شامة أو وحمة غريبة ومشبوهة، تغير في شكلها",
+common_name: "تغير في شكل شامة أو وحمة الولادة",
+},
+{
+id: "s_585",
+type: "symptom",
+name: "شامة أو وحمة غريبة ومشبوهة، تغير لونها",
+common_name: "تغيّر في لون شامة أو وحمة",
+},
+{
+id: "s_586",
+type: "symptom",
+name: "التثدي",
+common_name: "تضخم الثدي عند رجل",
+},
+{
+id: "s_588",
+type: "symptom",
+name: "شرب الكحول، زيادة تحمُّل الكحول",
+common_name: "الحاجة لشرب كميات أكبر من الكحول للوصول إلى حالة السُكر",
+},
+{
+id: "s_590",
+type: "symptom",
+name: "رجفان في اللسان",
+common_name: "رجفة في اللسان",
+},
+{
+id: "s_593",
+type: "symptom",
+name: "تطاول زمن النزف",
+common_name: "تطاول زمن النزف",
+},
+{
+id: "s_594",
+type: "symptom",
+name: "نمش",
+common_name: "نقاط حمراء على الجلد قطرها أقل من 3 ميليمتر لا تختفي بعد الضغط عليها",
+},
+{
+id: "s_598",
+type: "symptom",
+name: "خرّاج",
+common_name: "تورّم في الجلد مصحوب باحمرار وألم فيه",
+},
+{
+id: "s_603",
+type: "symptom",
+name: "تبقرط الأظافر",
+common_name: "تضخم أطرف الأصابع",
+},
+{
+id: "s_604",
+type: "symptom",
+name: "صداع، واخز",
+common_name: "صداع طاعن",
+},
+{
+id: "s_605",
+type: "symptom",
+name: "نوب من الصداع خلال فترة معينة",
+common_name: "نوب من الصداع",
+},
+{
+id: "s_606",
+type: "symptom",
+name: "رؤية لمعان أمام العين",
+common_name: "ومضات في العين",
+},
+{
+id: "s_607",
+type: "symptom",
+name: "احمرار اللسان",
+common_name: "لسان محمر بشكل غير طبيعي",
+},
+{
+id: "s_608",
+type: "symptom",
+name: "التهاب الشفة الزاوي",
+common_name: "تشقق زوايا الشفتين",
+},
+{
+id: "s_609",
+type: "symptom",
+name: "مضض في الثدي، أحادي الجانب",
+common_name: "ألم في واحد فقط من الثديين عند الضغط عليه",
+},
+{
+id: "s_610",
+type: "symptom",
+name: "غشاء على اللوزتين",
+common_name: "بقع بيضاء على اللوزتين",
+},
+{
+id: "s_611",
+type: "symptom",
+name: "بول داكن",
+common_name: "بول غامق اللون",
+},
+{
+id: "s_612",
+type: "symptom",
+name: "ألم عظمي",
+common_name: "ألم في العظام",
+},
+{
+id: "s_613",
+type: "symptom",
+name: "لويحة صفراء",
+common_name: "آفات جلدية صفراء على الجفنين",
+},
+{
+id: "s_614",
+type: "symptom",
+name: "حكة بعد حمام ساخن",
+common_name: "حكة بعد حمام ساخن",
+},
+{
+id: "s_616",
+type: "symptom",
+name: "وذمة، في الوجه",
+common_name: "تورّم في الوجه",
+},
+{
+id: "s_618",
+type: "symptom",
+name: "الطلوان المشعر",
+common_name: "الصداف",
+},
+{
+id: "s_622",
+type: "symptom",
+name: "ضمور الكتلة العضلية",
+common_name: "ضمور العضلات",
+},
+{
+id: "s_623",
+type: "symptom",
+name: "وذمة، في الكاحلين",
+common_name: "كاحلين متورمين",
+},
+{
+id: "s_625",
+type: "symptom",
+name: "صداع، يشتد بثني الرأس نحو الأمام",
+common_name: "ألم رأس عند إمالة الرأس إلى الإمام",
+},
+{
+id: "s_629",
+type: "symptom",
+name: "الشعور بالعجز",
+common_name: "الشعور بالعجز",
+},
+{
+id: "s_630",
+type: "symptom",
+name: "حكة فرجية مهبلية",
+common_name: "حكة فرجية مهبلية",
+},
+{
+id: "s_631",
+type: "symptom",
+name: "ضعف التركيز",
+common_name: "ضعف الانتباه",
+},
+{
+id: "s_632",
+type: "symptom",
+name: "الشعور باليأس",
+common_name: "الشعور باليأس",
+},
+{
+id: "s_633",
+type: "symptom",
+name: "نوبة مزاج مرتفع",
+common_name: "مزاج مرتفع",
+},
+{
+id: "s_634",
+type: "symptom",
+name: "نقص الحاجة للنوم",
+common_name: "نقص الحاجة للنوم",
+},
+{
+id: "s_635",
+type: "symptom",
+name: "المجادلة",
+common_name: "الرغبة بالجدال والدخول في نزاع ونقاش مع الآخرين",
+},
+{
+id: "s_636",
+type: "symptom",
+name: "تهوّر مالي",
+common_name: "تهوّر مالي",
+},
+{
+id: "s_637",
+type: "symptom",
+name: "تسارع وتيرة التفكير والكلام",
+common_name: "تسارع وتيرة التفكير والكلام",
+},
+{
+id: "s_640",
+type: "symptom",
+name: "زحير",
+common_name: "الشعور بتغوّط غير تام",
+},
+{
+id: "s_641",
+type: "symptom",
+name: "عدم استمساك برازي",
+common_name: "تسرّب غير إرادي للبراز",
+},
+{
+id: "s_642",
+type: "symptom",
+name: "إفرازات مخاطية في البراز",
+common_name: "مخاط في البراز",
+},
+{
+id: "s_646",
+type: "symptom",
+name: "تقلبات المزاج",
+common_name: "تقلبات المزاج",
+},
+{
+id: "s_647",
+type: "symptom",
+name: "توهمات بصرية بسيطة",
+common_name: "توهمات بصرية بسيطة",
+},
+{
+id: "s_648",
+type: "symptom",
+name: "توهمات سمعية بسيطة",
+common_name: "توهمات سمعية بسيطة",
+},
+{
+id: "s_649",
+type: "symptom",
+name: "بطء حركي نفسي",
+common_name: "بطء حركي نفسي",
+},
+{
+id: "s_650",
+type: "symptom",
+name: "ضعف عضلي",
+common_name: "ضعف في العضلات",
+},
+{
+id: "s_651",
+type: "symptom",
+name: "رَنَح",
+common_name: "اضطرابات في التناسق الحركي",
+},
+{
+id: "s_652",
+type: "symptom",
+name: "المُنعكسات الوترِية العميقة، ضعيفة",
+common_name: "ضعف المنعكسات الوترية العميقة",
+},
+{
+id: "s_653",
+type: "symptom",
+name: "تغير في اتساع حدقة العين",
+common_name: "تغير في اتساع حدقة العين",
+},
+{
+id: "s_659",
+type: "symptom",
+name: "العزلة الاجتماعية",
+common_name: "العزلة الاجتماعية",
+},
+{
+id: "s_660",
+type: "symptom",
+name: "نوبات غضب",
+common_name: "نوبات غضب",
+},
+{
+id: "s_662",
+type: "symptom",
+name: "سعال، منتج صباحاً",
+common_name: "سعال منتج لبلغم في الصباح",
+},
+{
+id: "s_663",
+type: "symptom",
+name: "ألم في الظهر، قطني، ينتشر إلى المنطقة الإربيّة",
+common_name: "ألم في أسفل الظهر ينتشر إلى المغبن",
+},
+{
+id: "s_664",
+type: "symptom",
+name: "بقع كوبليك",
+common_name: "بقع بيضاء صغيرة بحواف حمراء في الفم على الوجه الداخلي للخدين",
+},
+{
+id: "s_665",
+type: "symptom",
+name: "طفح الحصبة",
+common_name: "طفح الحصبة",
+},
+{
+id: "s_666",
+type: "symptom",
+name: "بقع مرقطة كالفهد على الجلد",
+common_name: "بقع بلون الطوب تشبه الفهد المرقط",
+},
+{
+id: "s_668",
+type: "symptom",
+name: "خوص وحيد الجانب",
+common_name: "عين غائرة",
+},
+{
+id: "s_669",
+type: "symptom",
+name: "لاتعرّق، في الوجه، أحادي الجانب",
+common_name: "غياب ظاهرة التعرق على أحد جانبي الوجه",
+},
+{
+id: "s_670",
+type: "symptom",
+name: "سعال، منتج لقشع رغوي وردي اللون",
+common_name: "سعال منتج لبلغم زهري اللون",
+},
+{
+id: "s_671",
+type: "symptom",
+name: "توسّع أوردة العنق",
+common_name: "انتفاخ أوردة الرقبة",
+},
+{
+id: "s_673",
+type: "symptom",
+name: "تضخم اللسان",
+common_name: "انتفاخ اللسان",
+},
+{
+id: "s_675",
+type: "symptom",
+name: "وهم الاضطهاد",
+common_name: "الاعتقاد بأن الشخص مراقب أو أن الآخرين يتآمرون عليه أو يحاولون إعاقته ومنعه من الوصول لمبتغاه",
+},
+{
+id: "s_676",
+type: "symptom",
+name: "وهم الإسناد",
+common_name: "الاعتقاد بوجود رسائل سرية خاصة موجهة للشخص",
+},
+{
+id: "s_677",
+type: "symptom",
+name: "توهم العظمة",
+common_name: "جنون العظمة",
+},
+{
+id: "s_678",
+type: "symptom",
+name: "الوهم العدمي",
+common_name: "الاعتقاد بأن الشخص أو جزء منه ميت أو غير موجود كلياً",
+},
+{
+id: "s_679",
+type: "symptom",
+name: "الوهم المَرَضي",
+common_name: "الاعتقاد بالإصابة بمرض رغم نفي الأطباء ذلك",
+},
+{
+id: "s_680",
+type: "symptom",
+name: "وهم التأثير",
+common_name: "الاعتقاد بأن أفكار الشخص أو تصرفاته يتحكم بها شخص أو جهة خارجية",
+},
+{
+id: "s_681",
+type: "symptom",
+name: "هلوسات، بصرية",
+common_name: "رؤية أشياء لا يراها الآخرون",
+},
+{
+id: "s_682",
+type: "symptom",
+name: "هلوسات، سمعية",
+common_name: "سماع كلام أو أصوات لا يسمعها الآخرون",
+},
+{
+id: "s_689",
+type: "symptom",
+name: "التبول بكميات صغيرة",
+common_name: "التبول بكميات صغيرة",
+},
+{
+id: "s_690",
+type: "symptom",
+name: "الإلحاح البولي",
+common_name: "رغبة ملحة بالتبول",
+},
+{
+id: "s_691",
+type: "symptom",
+name: "صعوبة البدء في التبول",
+common_name: "صعوبة البدء في التبول",
+},
+{
+id: "s_692",
+type: "symptom",
+name: "احمرار وتوذّم في مخاطية الفم",
+common_name: "احمرار وتورم داخل الفم",
+},
+{
+id: "s_694",
+type: "symptom",
+name: "آفات فموية",
+common_name: "تغيرات داخل الفم",
+},
+{
+id: "s_696",
+type: "symptom",
+name: "احتباس البول",
+common_name: "عدم القدرة على التبول عندما تكون المثانة ممتلئة",
+},
+{
+id: "s_697",
+type: "symptom",
+name: "مرونة الجلد منخفضة",
+common_name: "انخفاض مرونة الجلد",
+},
+{
+id: "s_698",
+type: "symptom",
+name: "غؤور ثنائي الجانب في العينين",
+common_name: "غؤور كلا العينين",
+},
+{
+id: "s_699",
+type: "symptom",
+name: "وذمة، تتعلّق بوضعية الجسم",
+common_name: "تورم يعتمد على وضعية الجسم",
+},
+{
+id: "s_700",
+type: "symptom",
+name: "وذمة",
+common_name: "تورم",
+},
+{
+id: "s_701",
+type: "symptom",
+name: "وذمة، تشتد أثناء النهار",
+common_name: "تورم يزداد خلال النهار",
+},
+{
+id: "s_711",
+type: "symptom",
+name: "نساوة تفارقية لحادث رضي",
+common_name: "صعوبة تذكّر تفاصيل الحدث الراض",
+},
+{
+id: "s_715",
+type: "symptom",
+name: "عطاس",
+common_name: "عطاس",
+},
+{
+id: "s_716",
+type: "symptom",
+name: "ضعف في الوظائف الاجتماعية",
+common_name: "صعوبة في أداء المهام في المنزل أو العمل أو المدرسة",
+},
+{
+id: "s_725",
+type: "symptom",
+name: "المبالغة في القلق على صحة الطفل",
+common_name: "المبالغة في القلق على صحة الطفل",
+},
+{
+id: "s_727",
+type: "symptom",
+name: "صعوبة في توثيق العلاقة مع رضيع",
+common_name: "صعوبة في توثيق العلاقة مع طفل",
+},
+{
+id: "s_728",
+type: "symptom",
+name: "أفكار تتعلق بإيذاء طفلك",
+common_name: "أفكار تتعلق بإيذاء طفلك",
+},
+{
+id: "s_729",
+type: "symptom",
+name: "أفكار تتعلّق بالرغبة في قتل طفلك",
+common_name: "أفكار تتعلّق بالرغبة في قتل طفلك",
+},
+{
+id: "s_730",
+type: "symptom",
+name: "تقلبات مزاج، ذات نمط نهاري",
+common_name: "نفسية ومزاج أفضل في الليل منه في النهار",
+},
+{
+id: "s_732",
+type: "symptom",
+name: "ألم في الطرف السفلي، في الربلة، شديد أثناء المشي، عرج متقطع",
+common_name: "ألم في الساق أثناء القيام بمجهود ويخف بالراحة",
+},
+{
+id: "s_733",
+type: "symptom",
+name: "اضطراب الانتصاب",
+common_name: "ضعف الانتصاب",
+},
+{
+id: "s_734",
+type: "symptom",
+name: "عرج متقطع في القسم العلوي من الطرف السفلي",
+common_name: "ألم في الأرداف والفخذين يظهر عند القيام بمجهود جسدي ويختفي عند الراحة لفترة قصيرة",
+},
+{
+id: "s_735",
+type: "symptom",
+name: "ضعف النبض في الساقين",
+common_name: "ضعف النبض في الساقين",
+},
+{
+id: "s_746",
+type: "symptom",
+name: "اضطراب أو ضعف الحس العميق",
+common_name: "اضطراب أو ضعف الحس العميق",
+},
+{
+id: "s_747",
+type: "symptom",
+name: "غياب أو اضطراب حس الحرارة",
+common_name: "غياب أو اضطراب حس الحرارة",
+},
+{
+id: "s_750",
+type: "symptom",
+name: "اضطراب في حركة كرة العين",
+common_name: "صعوبة في تحريك العينين",
+},
+{
+id: "s_756",
+type: "symptom",
+name: "حطاطات غوترون",
+common_name: "نتوءات حمراء مؤلمة على الجلد الذي يغطي مفاصل اليد والأصابع",
+},
+{
+id: "s_757",
+type: "symptom",
+name: "علامة هولستر",
+common_name: "احمرار السطح الجانبي للفخذ والوركين",
+},
+{
+id: "s_758",
+type: "symptom",
+name: "حمامى على الكتفين ومؤخرة العنق",
+common_name: "احمرار في الكتفين والوجه الخلفي من الرقبة",
+},
+{
+id: "s_759",
+type: "symptom",
+name: "حمامى بشكل V على الصدر",
+common_name: "احمرار بشكل V على الصدر",
+},
+{
+id: "s_760",
+type: "symptom",
+name: "يد الميكانيكي",
+common_name: "تسمك وتشقق في جلد اليدين",
+},
+{
+id: "s_762",
+type: "symptom",
+name: "طفح فرفري",
+common_name: "طفح بشكل بقع حمراء أو زهرية يزيد قطرها عن 3 مم ولا يزول لونها بالضغط عليها",
+},
+{
+id: "s_763",
+type: "symptom",
+name: "تزرق شبكي",
+common_name: "جلد مبقع",
+},
+{
+id: "s_768",
+type: "symptom",
+name: "وهم الخطيئة",
+common_name: "الاعتقاد بأن الشخص شرير أو مذنب أو أنه مسؤول عن كارثة كبيرة",
+},
+{
+id: "s_769",
+type: "symptom",
+name: "الوهم الغريب",
+common_name: "معتقدات غريبة أو مستحيلة الحدوث، كالاعتقاد بوجود كائنات فضائية أو الاستنساخ أو الانتقال الفوري من مكان لآخر",
+},
+{
+id: "s_770",
+type: "symptom",
+name: "إهمال النظافة الشخصية",
+common_name: "إهمال النظافة الشخصية",
+},
+{
+id: "s_773",
+type: "symptom",
+name: "سوء التوافق الاجتماعي",
+common_name: "سوء التوافق الاجتماعي",
+},
+{
+id: "s_776",
+type: "symptom",
+name: "الاستيقاظ المبكر",
+common_name: "الاستيقاظ المبكر",
+},
+{
+id: "s_777",
+type: "symptom",
+name: "النوم لفترات طويلة",
+common_name: "النوم لفترات طويلة",
+},
+{
+id: "s_778",
+type: "symptom",
+name: "انعدام الاحترام في العلاقات الاجتماعية",
+common_name: "انعدام التكلف في العلاقات الاجتماعية",
+},
+{
+id: "s_779",
+type: "symptom",
+name: "اتخاذ قرارات طائشة أو متهوّرة",
+common_name: "اتخاذ قرارات طائشة أو متهوّرة",
+},
+{
+id: "s_780",
+type: "symptom",
+name: "وهم ديني",
+common_name: "الاعتقاد بأن الشخص نبي مرسل من الله أو أنه إله",
+},
+{
+id: "s_789",
+type: "symptom",
+name: "شرى يتحرّض بالخدش",
+common_name: "طفح جلدي حاك بعد الخدش",
+},
+{
+id: "s_790",
+type: "symptom",
+name: "شرى يتحرض بالضغط المديد على الجلد",
+common_name: "طفح جلدي حاك يظهر بعد الضغط المديد على الجلد",
+},
+{
+id: "s_791",
+type: "symptom",
+name: "شرى يتحرّض بالبرد",
+common_name: "طفح جلدي حاك يظهر بعد التعرض للبرد أو الماء أو الرياح",
+},
+{
+id: "s_793",
+type: "symptom",
+name: "شرى يتحرّض بالحرارة",
+common_name: "طفح جلدي حاك يظهر بعد التعرض للحرارة",
+},
+{
+id: "s_795",
+type: "symptom",
+name: "براز رفيع كالقلم",
+common_name: "براز رفيع كالقلم",
+},
+{
+id: "s_799",
+type: "symptom",
+name: "صداع، يشتد صباحاً",
+common_name: "ألم رأس صباحي",
+},
+{
+id: "s_801",
+type: "symptom",
+name: "إقياء قذفي",
+common_name: "إقياء يقذف بقوة كبيرة",
+},
+{
+id: "s_803",
+type: "symptom",
+name: "وذمة الحليمة البصرية",
+common_name: "وذمة الحليمة البصرية",
+},
+{
+id: "s_814",
+type: "symptom",
+name: "عمى شقي صدغي مزدوج",
+common_name: "عمى شقي صدغي مزدوج",
+},
+{
+id: "s_817",
+type: "symptom",
+name: "شرب الكحول، توق شديد للشرب",
+common_name: "رغبة شديدة ومستمرة بشرب الكحول",
+},
+{
+id: "s_818",
+type: "symptom",
+name: "شرب الكحول، متلازمة السحب",
+common_name: "متلازمة الانسحاب الكحولي",
+},
+{
+id: "s_820",
+type: "symptom",
+name: "شرب الكحول، إهمال الواجبات بسبب الكحول",
+common_name: "إهمال العائلة أو العمل أو الهوايات بسبب الكحول",
+},
+{
+id: "s_824",
+type: "symptom",
+name: "شرب الكحول، انتهاك المعايير الاجتماعية تحت تأثير الكحول",
+common_name: "انتهاك التقاليد الاجتماعية بعد شرب الكحول",
+},
+{
+id: "s_825",
+type: "symptom",
+name: "ضعف الذاكرة، المتعلقة بالكحول",
+common_name: "نساوة متعلقة بالكحول",
+},
+{
+id: "s_828",
+type: "symptom",
+name: "شرب الكحول، وحيداً",
+common_name: "شرب الكحول وحيداً",
+},
+{
+id: "s_829",
+type: "symptom",
+name: "شرب الكحول، سراً",
+common_name: "شرب الكحول سراً",
+},
+{
+id: "s_830",
+type: "symptom",
+name: "ضعف الذاكرة، قصيرة الأمد",
+common_name: "ضعف الذاكرة قصيرة الأمد",
+},
+{
+id: "s_831",
+type: "symptom",
+name: "تخريف",
+common_name: "تخريف",
+},
+{
+id: "s_833",
+type: "symptom",
+name: "عَمَه",
+common_name: "عدم القدرة على التعرف على الأشياء أو الأشخاص أو الأصوات أو الأشكال أو الروائح",
+},
+{
+id: "s_835",
+type: "symptom",
+name: "نوبات مزاج اكتئابي، نمط موسمي",
+common_name: "أعراض اكتئاب تحدث في نفس الوقت كل سنة",
+},
+{
+id: "s_836",
+type: "symptom",
+name: "لجلجة فصامية",
+common_name: "لجلجة فصامية",
+},
+{
+id: "s_837",
+type: "symptom",
+name: "حبسة كلامية",
+common_name: "عسر النطق",
+},
+{
+id: "s_838",
+type: "symptom",
+name: "اضطراب التفكير المنطقي",
+common_name: "اضطراب التفكير المنطقي",
+},
+{
+id: "s_856",
+type: "symptom",
+name: "وزيز بإصغاء الصدر",
+common_name: "وزيز بإصغاء الصدر",
+},
+{
+id: "s_857",
+type: "symptom",
+name: "خراخر ناعمة بإصغاء الصدر",
+common_name: "خراخر ناعمة بإصغاء الصدر",
+},
+{
+id: "s_866",
+type: "symptom",
+name: "علامة تروسو للتكزز الكامن",
+common_name: "علامة تروسو للتكزز الكامن",
+},
+{
+id: "s_867",
+type: "symptom",
+name: "علامة شيفوستيك",
+common_name: "علامة شيفوستيك",
+},
+{
+id: "s_868",
+type: "symptom",
+name: "تشنجات في العضلة الدويرية الفموية",
+common_name: "تشنجات في العضلة الدويرية الفموية",
+},
+{
+id: "s_869",
+type: "symptom",
+name: "القدم القفداء الفحجاء",
+common_name: "القدم القفداء الفحجاء",
+},
+{
+id: "s_878",
+type: "symptom",
+name: "المنعكسات الوترية العميقة، مشتدة",
+common_name: "اشتداد المنعكسات الوترية العميقة",
+},
+{
+id: "s_884",
+type: "symptom",
+name: "رُهاب الخلاء",
+common_name: "رهاب الساح",
+},
+{
+id: "s_917",
+type: "symptom",
+name: "الأرق",
+common_name: "الأرق",
+},
+{
+id: "s_935",
+type: "symptom",
+name: "ضعف حاسة السمع، بشدّة ومُدد متفاوتة",
+common_name: "ضعف حاسة السمع بدرجات متفاوتة في الشدة وفترات زمنيّة متغيّرة",
+},
+{
+id: "s_936",
+type: "symptom",
+name: "دوار، الشعور بدوران المحيط",
+common_name: "الشعور بأن المحيط يدور",
+},
+{
+id: "s_957",
+type: "symptom",
+name: "عمى شقي توافقي",
+common_name: "فقدان الساحة البصرية في نفس الجانب من كلتا العينين",
+},
+{
+id: "s_959",
+type: "symptom",
+name: "فقدان الحس في الوجه",
+common_name: "غياب الإحساس في الوجه",
+},
+{
+id: "s_962",
+type: "symptom",
+name: "عسر البلع",
+common_name: "صعوبة في البلع",
+},
+{
+id: "s_964",
+type: "symptom",
+name: "انحراف الجسم لأحد الجانبين",
+common_name: "السقوط أو ترنّح المشي باتجاه معين",
+},
+{
+id: "s_965",
+type: "symptom",
+name: "ألم في العنق، أحادي الجانب",
+common_name: "ألم أحادي الجانب في الرقبة",
+},
+{
+id: "s_967",
+type: "symptom",
+name: "انخفاض في حدة البصر",
+common_name: "انخفاض في حدة الرؤية",
+},
+{
+id: "s_970",
+type: "symptom",
+name: "صداع، قفوي",
+common_name: "ألم في الرأس في الجزء الخلفي منه",
+},
+{
+id: "s_971",
+type: "symptom",
+name: "خدر، في الوجه",
+common_name: "تنميل في الوجه",
+},
+{
+id: "s_972",
+type: "symptom",
+name: "غياب الحس في كلا الذراعين",
+common_name: "نقص الإحساس في كلا الذراعين",
+},
+{
+id: "s_973",
+type: "symptom",
+name: "خدر، في كلا الطرفين العلويين",
+common_name: "تنميل في كلا الطرفين العلويين",
+},
+{
+id: "s_989",
+type: "symptom",
+name: "علامات هرمية",
+common_name: "علامات هرمية",
+},
+{
+id: "s_990",
+type: "symptom",
+name: "علامات جبهية",
+common_name: "علامات جبهية",
+},
+{
+id: "s_991",
+type: "symptom",
+name: "اشتداد منعكس الفك السفلي",
+common_name: "منعكس رجفاني فكي",
+},
+{
+id: "s_995",
+type: "symptom",
+name: "ضمور عضلة اللسان",
+common_name: "صغر في حجم اللسان",
+},
+{
+id: "s_996",
+type: "symptom",
+name: "خلل المقوية الرقبية",
+common_name: "خلل المقوية الرقبية",
+},
+{
+id: "s_1006",
+type: "symptom",
+name: "غياب الدافع أو المحفز",
+common_name: "غياب الدافع أو المحفز",
+},
+{
+id: "s_1007",
+type: "symptom",
+name: "غياب الوازع",
+common_name: "غياب الوازع",
+},
+{
+id: "s_1010",
+type: "symptom",
+name: "اللاأدائية",
+common_name: "العمه الحركي",
+},
+{
+id: "s_1012",
+type: "symptom",
+name: "اللاكتابيّة",
+common_name: "فقدان القدرة على الكتابة",
+},
+{
+id: "s_1013",
+type: "symptom",
+name: "لاأدائيّة في عضلات الوجه والشدق المحيطة بالفم",
+common_name: "لاأدائيّة في عضلات الوجه والشدق المحيطة بالفم",
+},
+{
+id: "s_1018",
+type: "symptom",
+name: "المداومة",
+common_name: "المداومة",
+},
+{
+id: "s_1021",
+type: "symptom",
+name: "ضعف المنعكسات السطحية",
+common_name: "ضعف المنعكسات السطحية",
+},
+{
+id: "s_1023",
+type: "symptom",
+name: "علامة بابنسكي",
+common_name: "علامة بابنسكي",
+},
+{
+id: "s_1027",
+type: "symptom",
+name: "غياب الرؤية في ربع علوي",
+common_name: "غياب الرؤية في ربع علوي",
+},
+{
+id: "s_1028",
+type: "symptom",
+name: "العمه اللفظي السمعي",
+common_name: "العمه اللفظي السمعي",
+},
+{
+id: "s_1032",
+type: "symptom",
+name: "عمه الموسيقى",
+common_name: "فقدان القدرة على تمييز أو إصدار الأصوات الموسيقية",
+},
+{
+id: "s_1034",
+type: "symptom",
+name: "عمه بصري",
+common_name: "عمه بصري",
+},
+{
+id: "s_1035",
+type: "symptom",
+name: "ضعف الاستجابة بالخوف",
+common_name: "عدم وجود الخوف",
+},
+{
+id: "s_1045",
+type: "symptom",
+name: "تضخم الطحال",
+common_name: "طحال متضخم",
+},
+{
+id: "s_1050",
+type: "symptom",
+name: "سقوط الأسنان",
+common_name: "فقدان أسنان",
+},
+{
+id: "s_1051",
+type: "symptom",
+name: "ضخامة كبدية",
+common_name: "ضخامة كبدية",
+},
+{
+id: "s_1052",
+type: "symptom",
+name: "تضخم الكليتين",
+common_name: "تضخم الكليتين",
+},
+{
+id: "s_1054",
+type: "symptom",
+name: "علامة ليرميت",
+common_name: "علامة ليرميت",
+},
+{
+id: "s_1055",
+type: "symptom",
+name: "التهاب العصب خلف المقلة",
+common_name: "التهاب العصب خلف المقلة",
+},
+{
+id: "s_1056",
+type: "symptom",
+name: "ألم العصب مثلث التوائم",
+common_name: "ألم العصب مثلث التوائم",
+},
+{
+id: "s_1057",
+type: "symptom",
+name: "تضخم في الغدد اللعابية",
+common_name: "تضخم في الغدد اللعابية",
+},
+{
+id: "s_1063",
+type: "symptom",
+name: "خدر، في كلا الطرفين السفليين",
+common_name: "تنميل في كلا الطرفين السفليين",
+},
+{
+id: "s_1066",
+type: "symptom",
+name: "خدر في كلا الطرفين العلويين، بشكل القفاز",
+common_name: "خدر في كلا الطرفين العلويين، بشكل القفاز",
+},
+{
+id: "s_1067",
+type: "symptom",
+name: "احمرار الوجه المفاجىء",
+common_name: "احمرار الوجه بشكل مفاجىء",
+},
+{
+id: "s_1068",
+type: "symptom",
+name: "خدر، متناظر",
+common_name: "تنميل متناظر",
+},
+{
+id: "s_1069",
+type: "symptom",
+name: "خدر صاعد",
+common_name: "تنميل صاعد في الجسم",
+},
+{
+id: "s_1070",
+type: "symptom",
+name: "غياب شعور الاهتزاز في نهايات الأطراف",
+common_name: "غياب شعور الاهتزاز في نهايات الأطراف",
+},
+{
+id: "s_1072",
+type: "symptom",
+name: "غياب المُنعكسات العميقة",
+common_name: "غياب المُنعكسات العميقة",
+},
+{
+id: "s_1073",
+type: "symptom",
+name: "غياب منعكس وتر أشيل في الجهتين",
+common_name: "غياب منعكس وتر أشيل في الجهتين",
+},
+{
+id: "s_1074",
+type: "symptom",
+name: "تغيرات تغذوية",
+common_name: "تغيرات تغذوية",
+},
+{
+id: "s_1076",
+type: "symptom",
+name: "قرحة اغتذائية",
+common_name: "قرحة اغتذائية",
+},
+{
+id: "s_1078",
+type: "symptom",
+name: "قرحة اغتذائية، في أخمص القدم",
+common_name: "قرحة تغذوية عصبية في أخمص القدم",
+},
+{
+id: "s_1083",
+type: "symptom",
+name: "ضمور العضلات بين العظام في اليدين",
+common_name: "ضمور العضلات بين العظام في اليدين",
+},
+{
+id: "s_1084",
+type: "symptom",
+name: "ضمور العضلات بين العظام في القدمين",
+common_name: "ضمور العضلات بين العظام في القدمين",
+},
+{
+id: "s_1087",
+type: "symptom",
+name: "الخوف من الجنون",
+common_name: "الخوف من الجنون",
+},
+{
+id: "s_1088",
+type: "symptom",
+name: "الخوف من فقدان السيطرة على الأمور",
+common_name: "الخوف من فقدان السيطرة على الأمور",
+},
+{
+id: "s_1089",
+type: "symptom",
+name: "تضخم البروستات",
+common_name: "تضخم البروستات",
+},
+{
+id: "s_1090",
+type: "symptom",
+name: "عيون زجاجية",
+common_name: "عيون زجاجية",
+},
+{
+id: "s_1091",
+type: "symptom",
+name: "قضأ الملتحمة",
+common_name: "قضأ الملتحمة",
+},
+{
+id: "s_1092",
+type: "symptom",
+name: "إيجابية اختبارات الحساسية الجلدية (بالوخز أو البقع)",
+common_name: "إيجابية اختبارات الحساسية الجلدية (بالوخز أو البقع)",
+},
+{
+id: "s_1093",
+type: "symptom",
+name: "إيجابية اختبار الحساسية",
+common_name: "إيجابية اختبار الحساسية",
+},
+{
+id: "s_1094",
+type: "symptom",
+name: "تقشع",
+common_name: "تنخم",
+},
+{
+id: "s_1095",
+type: "symptom",
+name: "ضعف حاسة الشم",
+common_name: "نقص حاسة الشم",
+},
+{
+id: "s_1096",
+type: "symptom",
+name: "اضطرابات حاسة الذوق",
+common_name: "اضطراب أو فقدان حاسة التذوق",
+},
+{
+id: "s_1097",
+type: "symptom",
+name: "تورم في الغشاء المخاطي للأنف",
+common_name: "تورم في الغشاء المخاطي للأنف",
+},
+{
+id: "s_1098",
+type: "symptom",
+name: "توذم في الغشاء المخاطي وتلونه بالأزرق أو الأزرق المخضر",
+common_name: "توذم في الغشاء المخاطي وتلونه بالأزرق أو الأزرق المخضر",
+},
+{
+id: "s_1099",
+type: "symptom",
+name: "توذّم القرينات الأنفية",
+common_name: "توذّم القرينات الأنفية",
+},
+{
+id: "s_1100",
+type: "symptom",
+name: "ثلم مستعرض على الأنف",
+common_name: "ثلم مستعرض على الأنف",
+},
+{
+id: "s_1102",
+type: "symptom",
+name: "تضخم العقد اللمفاوية الحنكية، ثنائي الجانب",
+common_name: "تورم في جانبي الحلق",
+},
+{
+id: "s_1103",
+type: "symptom",
+name: "تضخم في النسج اللمفاوية في البلعوم",
+common_name: "تضخم في النسج اللمفاوية في البلعوم",
+},
+{
+id: "s_1104",
+type: "symptom",
+name: "تنفس فموي",
+common_name: "التنفس من الفم",
+},
+{
+id: "s_1105",
+type: "symptom",
+name: "زرقة تحت العينين",
+common_name: "دوائر سوداء تحت العينين",
+},
+{
+id: "s_1106",
+type: "symptom",
+name: "طيّة ديني-مورغان",
+common_name: "طيّة ديني-مورغان",
+},
+{
+id: "s_1107",
+type: "symptom",
+name: "غشاء طبل معتم",
+common_name: "غشاء طبل معتم",
+},
+{
+id: "s_1108",
+type: "symptom",
+name: "تحدّب قبة الحنك",
+common_name: "تحدّب قبة الحنك",
+},
+{
+id: "s_1109",
+type: "symptom",
+name: "مفرزات في الأذن الوسطى",
+common_name: "مفرزات في الأذن الوسطى",
+},
+{
+id: "s_1110",
+type: "symptom",
+name: "عضة عميقة",
+common_name: "عضة عميقة",
+},
+{
+id: "s_1111",
+type: "symptom",
+name: "سحنة غُدانيّة‎",
+common_name: "سحنة غُدانيّة‎",
+},
+{
+id: "s_1112",
+type: "symptom",
+name: "ألم في كلا الطرفين السفليين، بتوزّع الجوارب",
+common_name: "ألم في كلا الطرفين السفليين مكان الجوارب",
+},
+{
+id: "s_1114",
+type: "symptom",
+name: "أظافر تيري",
+common_name: "أظافر تيري",
+},
+{
+id: "s_1115",
+type: "symptom",
+name: "نقص أشعار الجسم",
+common_name: "نقص أشعار الجسم",
+},
+{
+id: "s_1116",
+type: "symptom",
+name: "حَبَن",
+common_name: "تجمع سائل في البطن",
+},
+{
+id: "s_1117",
+type: "symptom",
+name: "ضمور أو صِغَر في كلتا الخصيتين",
+common_name: "خصيتان صغيرتان",
+},
+{
+id: "s_1119",
+type: "symptom",
+name: "ضعف عضلة المثانة العاصرة",
+common_name: "ضعف عضلة المثانة العاصرة",
+},
+{
+id: "s_1123",
+type: "symptom",
+name: "لاتعرّق",
+common_name: "نقص التعرق",
+},
+{
+id: "s_1125",
+type: "symptom",
+name: "حمامى، راحيّة",
+common_name: "احمرار في راحتي اليدين",
+},
+{
+id: "s_1139",
+type: "symptom",
+name: "أفكار انتحارية",
+common_name: "أفكار انتحارية",
+},
+{
+id: "s_1140",
+type: "symptom",
+name: "نية انتحارية",
+common_name: "أفكار وخطوات متبعة نحو الانتحار",
+},
+{
+id: "s_1141",
+type: "symptom",
+name: "علامة روسيل",
+common_name: "علامة روسيل",
+},
+{
+id: "s_1142",
+type: "symptom",
+name: "ألم عضلي",
+common_name: "ألم في العضلات",
+},
+{
+id: "s_1144",
+type: "symptom",
+name: "تورم الشريان الصدغي",
+common_name: "تورم الشريان الصدغي",
+},
+{
+id: "s_1145",
+type: "symptom",
+name: "احمرار في المنطقة الصدغية",
+common_name: "احمرار أعلى الأذن",
+},
+{
+id: "s_1146",
+type: "symptom",
+name: "ضعف الرؤية، مع ألم صدغي في نفس جانب ضعف الرؤية",
+common_name: "ألم في جانب الرأس وضعف في الرؤية في نفس الجانب",
+},
+{
+id: "s_1147",
+type: "symptom",
+name: "شلل العصب محرّك العين",
+common_name: "شلل العصب محرّك العين",
+},
+{
+id: "s_1148",
+type: "symptom",
+name: "خدر في اللسان",
+common_name: "تنميل في اللسان",
+},
+{
+id: "s_1150",
+type: "symptom",
+name: "فرط حساسية للأصوات",
+common_name: "زيادة الحساسية للأصوات",
+},
+{
+id: "s_1153",
+type: "symptom",
+name: "اضطراب حاسة الذوق في الثلثين الأماميين من اللسان",
+common_name: "اضطراب حاسة الذوق في الثلثين الأماميين من اللسان",
+},
+{
+id: "s_1159",
+type: "symptom",
+name: "نقص الحس في نصف الوجه",
+common_name: "نقص الإحساس في جانب واحد من الوجه",
+},
+{
+id: "s_1162",
+type: "symptom",
+name: "وذمة مخاطية أمام الظنبوب",
+common_name: "وذمة مخاطية أمام الظنبوب",
+},
+{
+id: "s_1163",
+type: "symptom",
+name: "جحوظ العين",
+common_name: "بروز إحدى أو كلا العينين",
+},
+{
+id: "s_1165",
+type: "symptom",
+name: "شعور بحرقة جلديّة",
+common_name: "الشعور بحرقة في الجلد",
+},
+{
+id: "s_1166",
+type: "symptom",
+name: "نقص تنسج ميناء الأسنان",
+common_name: "نقص تنسج ميناء الأسنان",
+},
+{
+id: "s_1167",
+type: "symptom",
+name: "ضمور الأظافر",
+common_name: "تشوّه الأظافر أو تغير لونها",
+},
+{
+id: "s_1170",
+type: "symptom",
+name: "انصباب دموي مفصلي",
+common_name: "نزف في المفصل",
+},
+{
+id: "s_1171",
+type: "symptom",
+name: "علامة دارييه",
+common_name: "علامة دارييه",
+},
+{
+id: "s_1173",
+type: "symptom",
+name: "كتلة في كيس الصفن",
+common_name: "كتلة في كيس الصفن",
+},
+{
+id: "s_1175",
+type: "symptom",
+name: "الشعور بثقل في الصفن",
+common_name: "الشعور بثقل في الصفن",
+},
+{
+id: "s_1178",
+type: "symptom",
+name: "ألم صدري، يشتد بالجس",
+common_name: "ألم في الصدر يزداد عند اللمس أو الضغط",
+},
+{
+id: "s_1180",
+type: "symptom",
+name: "ألم خلف الأذن",
+common_name: "ألم خلف الأذن",
+},
+{
+id: "s_1181",
+type: "symptom",
+name: "احمرار خلف الأذن",
+common_name: "احمرار خلف الأذن",
+},
+{
+id: "s_1182",
+type: "symptom",
+name: "تورم الخشاء",
+common_name: "تورم خلف الأذن",
+},
+{
+id: "s_1183",
+type: "symptom",
+name: "علامة وينتربوتوم",
+common_name: "علامة وينتربوتوم",
+},
+{
+id: "s_1184",
+type: "symptom",
+name: "غلاف أو غشاء على اللسان",
+common_name: "لسان أبيض",
+},
+{
+id: "s_1185",
+type: "symptom",
+name: "زلة تنفسية، بفترات اشتداد وهجوع",
+common_name: "ضيق تنفس يزداد تارةً ويتحسّن أخرى",
+},
+{
+id: "s_1189",
+type: "symptom",
+name: "ألم في الظهر، ناكس",
+common_name: "ألم متكرر في الظهر",
+},
+{
+id: "s_1190",
+type: "symptom",
+name: "ألم في الظهر",
+common_name: "ألم في الظهر",
+},
+{
+id: "s_1191",
+type: "symptom",
+name: "تغيرات جلدية، بنوبات هجوع واشتداد",
+common_name: "تغيرات جلدية تشتد تارة وتخف تارة أخرى",
+},
+{
+id: "s_1192",
+type: "symptom",
+name: "ألم في الظهر، شديد",
+common_name: "ألم شديد في الظهر",
+},
+{
+id: "s_1193",
+type: "symptom",
+name: "صداع، شديد",
+common_name: "ألم رأس شديد",
+},
+{
+id: "s_1194",
+type: "symptom",
+name: "ألم وجهي، شديد",
+common_name: "ألم شديد في الوجه",
+},
+{
+id: "s_1195",
+type: "symptom",
+name: "ألم بطني، شديد",
+common_name: "ألم شديد في البطن",
+},
+{
+id: "s_1197",
+type: "symptom",
+name: "ألم صدري، شديد",
+common_name: "ألم شديد في الصدر",
+},
+{
+id: "s_1198",
+type: "symptom",
+name: "ألم في الظهر، مفاجئ",
+common_name: "ألم مفاجئ في الظهر",
+},
+{
+id: "s_1200",
+type: "symptom",
+name: "ألم صدري، مفاجئ",
+common_name: "ألم مفاجئ في الصدر",
+},
+{
+id: "s_1201",
+type: "symptom",
+name: "ألم مفصلي، مفاجئ",
+common_name: "ألم مفاجئ في مفصل",
+},
+{
+id: "s_1202",
+type: "symptom",
+name: "ألم بطني، يشتد عند الشهيق العميق",
+common_name: "ألم في البطن يزداد عند أخذ شهيق عميق",
+},
+{
+id: "s_1203",
+type: "symptom",
+name: "ألم وجهي، يدوم لأكثر من ساعتين",
+common_name: "ألم في الوجه يستمر لأكثر من ساعتين",
+},
+{
+id: "s_1206",
+type: "symptom",
+name: "ألم في الظهر، يتحسّن بالراحة",
+common_name: "ألم في الظهر يخف عند الراحة",
+},
+{
+id: "s_1207",
+type: "symptom",
+name: "ألم بطني، يشتد بعد تناول الكافيين",
+common_name: "ألم في البطن يزداد بعد تناول المشاريب الحاوية على الكافيين",
+},
+{
+id: "s_1209",
+type: "symptom",
+name: "شحوب الجلد، فجائي",
+common_name: "شحوب فجائي للجلد",
+},
+{
+id: "s_1210",
+type: "symptom",
+name: "شحوب في الغشاء المخاطي",
+common_name: "شحوب في الفم أو الأجفان",
+},
+{
+id: "s_1213",
+type: "symptom",
+name: "شحوب في الغشاء المخاطي، فجائي",
+common_name: "شحوب مفاجئ في الأغشية المخاطية",
+},
+{
+id: "s_1226",
+type: "symptom",
+name: "ركبة فحجاء‎",
+common_name: "تقوس الساقين",
+},
+{
+id: "s_1227",
+type: "symptom",
+name: "ضعف تحريك العين نحو الوحشي",
+common_name: "ضعف تحريك العين نحو الخارج",
+},
+{
+id: "s_1228",
+type: "symptom",
+name: "حول أُنسي",
+common_name: "حول",
+},
+{
+id: "s_1229",
+type: "symptom",
+name: "شفع بافتراق أفقي",
+common_name: "رؤية مزدوجة مع افتراق أفقي",
+},
+{
+id: "s_1230",
+type: "symptom",
+name: "إمالة الرأس لتجنب حدوث الشفع",
+common_name: "ازدواجية في الرؤية تزول بإمالة الرأس",
+},
+{
+id: "s_1232",
+type: "symptom",
+name: "شفع أثناء النظر إلى الأسفل والأنسي",
+common_name: "رؤية مزدوجة عند النظر إلى الأسفل والأنسي",
+},
+{
+id: "s_1235",
+type: "symptom",
+name: "شفع عند النظر في كل الاتجاهات",
+common_name: "رؤية مزدوجة عند النظر في كل الاتجاهات",
+},
+{
+id: "s_1236",
+type: "symptom",
+name: "حَوَل خارجي",
+common_name: "حول في عين واحدة أو كلا العينين نحو الخارج",
+},
+{
+id: "s_1237",
+type: "symptom",
+name: "دوران مقلة العين نحو الوحشي والأسفل",
+common_name: "دوران العين إلى الوحشي والأسفل",
+},
+{
+id: "s_1238",
+type: "symptom",
+name: "الحدقة أو الحدقتين غير متفاعلتين مع المطابقة",
+common_name: "الحدقة أو الحدقتين غير متفاعلتين مع المطابقة",
+},
+{
+id: "s_1239",
+type: "symptom",
+name: "ضعف تحريك العين إلى الأعلى",
+common_name: "صعوبة في النظر للأعلى",
+},
+{
+id: "s_1240",
+type: "symptom",
+name: "ضعف تحريك العين للأنسي",
+common_name: "ضعف تحريك العين إلى الداخل",
+},
+{
+id: "s_1241",
+type: "symptom",
+name: "ضعف تحريك العين للأسفل",
+common_name: "صعوبة في النظر للأسفل",
+},
+{
+id: "s_1250",
+type: "symptom",
+name: "ألم في المنطقة الإربية يسوء عند العطاس أو السعال أو الضحك أو القيام بالتمارين الرياضية",
+common_name: "ألم أعلى الفخذ عند العطاس أو السعال أو الضحك أو القيام بالتمارين الرياضية",
+},
+{
+id: "s_1254",
+type: "symptom",
+name: "علامة غوردون",
+common_name: "علامة غوردون",
+},
+{
+id: "s_1255",
+type: "symptom",
+name: "علامة روسوليمو",
+common_name: "علامة روسوليمو",
+},
+{
+id: "s_1256",
+type: "symptom",
+name: "علامة أوبنهايم",
+common_name: "علامة أوبنهايم",
+},
+{
+id: "s_1257",
+type: "symptom",
+name: "علامة بينغ",
+common_name: "علامة بينغ",
+},
+{
+id: "s_1258",
+type: "symptom",
+name: "علامة تشادوك",
+common_name: "علامة تشادوك",
+},
+{
+id: "s_1259",
+type: "symptom",
+name: "علامة شيفير",
+common_name: "علامة شيفير",
+},
+{
+id: "s_1260",
+type: "symptom",
+name: "علامة سترانسكي",
+common_name: "علامة سترانسكي",
+},
+{
+id: "s_1261",
+type: "symptom",
+name: "علامة مندل-بيكتريف",
+common_name: "علامة مندل-بيكتريف",
+},
+{
+id: "s_1262",
+type: "symptom",
+name: "علامة ترومنر",
+common_name: "علامة ترومنر",
+},
+{
+id: "s_1263",
+type: "symptom",
+name: "علامة غوندا-ألين",
+common_name: "علامة غوندا-ألين",
+},
+{
+id: "s_1264",
+type: "symptom",
+name: "رعاش الحركة",
+common_name: "رعاش حركي",
+},
+{
+id: "s_1265",
+type: "symptom",
+name: "غياب الحس المتفارق",
+common_name: "غياب الحس المتفارق",
+},
+{
+id: "s_1268",
+type: "symptom",
+name: "غياب أو ضعف منعكس القرنية",
+common_name: "غياب أو ضعف منعكس القرنية",
+},
+{
+id: "s_1270",
+type: "symptom",
+name: "علامة ستيرلنغ",
+common_name: "علامة ستيرلنغ",
+},
+{
+id: "s_1271",
+type: "symptom",
+name: "علامة جاكوبسون",
+common_name: "عطف لأصابع اليد عند النقر على النهاية البعيدة للكعبرة",
+},
+{
+id: "s_1272",
+type: "symptom",
+name: "علامة ألين-كليكلي",
+common_name: "علامة ألين-كليكلي",
+},
+{
+id: "s_1273",
+type: "symptom",
+name: "علامة كورنيل",
+common_name: "علامة كورنيل",
+},
+{
+id: "s_1274",
+type: "symptom",
+name: "علامة مونيز",
+common_name: "علامة مونيز",
+},
+{
+id: "s_1275",
+type: "symptom",
+name: "علامة سترومبل",
+common_name: "علامة سترومبل",
+},
+{
+id: "s_1277",
+type: "symptom",
+name: "ضعف القدرة على تحريك اللسان",
+common_name: "صعوبة في تحريك اللسان",
+},
+{
+id: "s_1278",
+type: "symptom",
+name: "اشتداد المنعكس الحنكي",
+common_name: "اشتداد المنعكس الحنكي",
+},
+{
+id: "s_1279",
+type: "symptom",
+name: "اشتداد المنعكس البلعومي",
+common_name: "اشتداد المنعكس البلعومي",
+},
+{
+id: "s_1280",
+type: "symptom",
+name: "ضعف أو غياب المنعكس البلعومي",
+common_name: "ضعف أو غياب منعكس التهوع",
+},
+{
+id: "s_1281",
+type: "symptom",
+name: "ظاهرة الموس الكباس",
+common_name: "ظاهرة الموس الكباس",
+},
+{
+id: "s_1282",
+type: "symptom",
+name: "صمل قضيب الرصاص",
+common_name: "تيبس عضلي مستمر وثابت في طرف",
+},
+{
+id: "s_1283",
+type: "symptom",
+name: "صمل الدولاب المسنن",
+common_name: "صمل الدولاب المسنن",
+},
+{
+id: "s_1285",
+type: "symptom",
+name: "ضعف الحنك وترهله في نفس الجهة التي يشتبه فيها بحدوث أذية للعصب",
+common_name: "ضعف الحنك وترهله في نفس الجهة التي يشتبه فيها بحدوث أذية للعصب",
+},
+{
+id: "s_1287",
+type: "symptom",
+name: "انحراف اللهاة نحو الجهة السليمة",
+common_name: "انحراف اللهاة نحو الجهة السليمة",
+},
+{
+id: "s_1289",
+type: "symptom",
+name: "تضخم مبيضي",
+common_name: "تضخم مبيضي",
+},
+{
+id: "s_1291",
+type: "symptom",
+name: "شلل عضلي ثنائي الجانب",
+common_name: "شلل عضلي ثنائي الجانب",
+},
+{
+id: "s_1295",
+type: "symptom",
+name: "فواق",
+common_name: "حازوقة",
+},
+{
+id: "s_1297",
+type: "symptom",
+name: "تباطؤ الحركة",
+common_name: "بطء الحركة",
+},
+{
+id: "s_1298",
+type: "symptom",
+name: "عسر المقوية",
+common_name: "عسر المقوية",
+},
+{
+id: "s_1302",
+type: "symptom",
+name: "علامة غولدفلام",
+common_name: "علامة غولدفلام",
+},
+{
+id: "s_1303",
+type: "symptom",
+name: "الكلام الأنفي",
+common_name: "صوت أنفي",
+},
+{
+id: "s_1304",
+type: "symptom",
+name: "إلعاب",
+common_name: "إنتاج مفرط للعاب",
+},
+{
+id: "s_1310",
+type: "symptom",
+name: "تلون الأظافر بالبني",
+common_name: "تلون الأظافر بالبني",
+},
+{
+id: "s_1311",
+type: "symptom",
+name: "وذمة، في إصبع",
+common_name: "إصبع متورم",
+},
+{
+id: "s_1312",
+type: "symptom",
+name: "ألم في منطقة ما حول الظفر",
+common_name: "ألم في البشرة المحيطة بالظفر",
+},
+{
+id: "s_1313",
+type: "symptom",
+name: "ألم في الطرف العلوي، في إصبع واحد",
+common_name: "ألم في إصبع واحد",
+},
+{
+id: "s_1314",
+type: "symptom",
+name: "حمامى، في إصبع",
+common_name: "احمرار في إصبع",
+},
+{
+id: "s_1315",
+type: "symptom",
+name: "قيح تحت جلد أصابع اليد",
+common_name: "قيح تحت جلد أصابع اليد",
+},
+{
+id: "s_1316",
+type: "symptom",
+name: "خراخر غاططة بإصغاء الصدر",
+common_name: "خراخر غاططة بإصغاء الصدر",
+},
+{
+id: "s_1317",
+type: "symptom",
+name: "زلة تنفسية، انتيابية ليلية",
+common_name: "ضيق تنفس أثناء النوم",
+},
+{
+id: "s_1322",
+type: "symptom",
+name: "نمش إبطي أو إربي",
+common_name: "نمشات في الإبط وأعلى الفخذ",
+},
+{
+id: "s_1323",
+type: "symptom",
+name: "وجود أورام ليفية عصبية",
+common_name: "وجود أورام ليفية عصبية",
+},
+{
+id: "s_1324",
+type: "symptom",
+name: "عقد ليش",
+common_name: "عقد ليش",
+},
+{
+id: "s_1328",
+type: "symptom",
+name: "عمى الألوان",
+common_name: "صعوبة في تمييز الالوان",
+},
+{
+id: "s_1329",
+type: "symptom",
+name: "شحوب القرص البصري في منطقة دخول العصب البصري",
+common_name: "شحوب القرص البصري في منطقة دخول العصب البصري",
+},
+{
+id: "s_1330",
+type: "symptom",
+name: "بقع القهوة بالحليب",
+common_name: "6 بقع على الأقل بلون بني فاتح على الجلد",
+},
+{
+id: "s_1332",
+type: "symptom",
+name: "تعب أو ضعف يحدث بعد القيام بالتمارين",
+common_name: "شعور بالضعف يزداد بعد القيام بالتمارين الرياضية",
+},
+{
+id: "s_1338",
+type: "symptom",
+name: "أذية لتعصيب منطقتين منفصلتين",
+common_name: "أذية لتعصيب منطقتين منفصلتين",
+},
+{
+id: "s_1340",
+type: "symptom",
+name: "علامة ويستفال",
+common_name: "علامة ويستفال",
+},
+{
+id: "s_1342",
+type: "symptom",
+name: "فحص الشفوفية في كيس الصفن",
+common_name: "فحص الشفوفية في كيس الصفن",
+},
+{
+id: "s_1344",
+type: "symptom",
+name: "نزف شبكي",
+common_name: "نزف شبكي",
+},
+{
+id: "s_1345",
+type: "symptom",
+name: "تخليط ذهني ناتج عن رض",
+common_name: "تخليط ذهني ناتج عن إصابة",
+},
+{
+id: "s_1346",
+type: "symptom",
+name: "نضحة شبكية صلبة",
+common_name: "نضحة شبكية صلبة",
+},
+{
+id: "s_1347",
+type: "symptom",
+name: "نضحة شبكية ناعمة",
+common_name: "نضحة شبكية ناعمة",
+},
+{
+id: "s_1348",
+type: "symptom",
+name: "ضعف في النبض المحيطي",
+common_name: "ضعف في النبض المحيطي",
+},
+{
+id: "s_1349",
+type: "symptom",
+name: "صداع، جبهي",
+common_name: "ألم في الرأس يتوضع قرب الجبهة",
+},
+{
+id: "s_1365",
+type: "symptom",
+name: "إقياء، غالباً في الصباح",
+common_name: "إقياء يحدث غالباً في الصباح",
+},
+{
+id: "s_1367",
+type: "symptom",
+name: "احمرار البلعوم",
+common_name: "احمرار في الحلق",
+},
+{
+id: "s_1369",
+type: "symptom",
+name: "ألم بطني، حاد وطاعن",
+common_name: "ألم في البطن حاد وطاعن كالسكين",
+},
+{
+id: "s_1371",
+type: "symptom",
+name: "حَبَرات على الحنك",
+common_name: "بقع صغيرة على الحنك الرخو",
+},
+{
+id: "s_1376",
+type: "symptom",
+name: "إسهال رزي مائي",
+common_name: "إسهال يشبه منظر ماء الأرز المنقوع",
+},
+{
+id: "s_1377",
+type: "symptom",
+name: "بقع وردية أسفل الصدر والبطن",
+common_name: "بقع وردية أسفل الصدر والبطن",
+},
+{
+id: "s_1378",
+type: "symptom",
+name: "علامة ليفين",
+common_name: "علامة ليفين",
+},
+{
+id: "s_1379",
+type: "symptom",
+name: "رجفان عضلي بشكل تدوير حبة الدواء",
+common_name: "رجفان بشكل تدوير حبة الدواء",
+},
+{
+id: "s_1380",
+type: "symptom",
+name: "احتكاكات تامورية",
+common_name: "احتكاكات تامورية",
+},
+{
+id: "s_1381",
+type: "symptom",
+name: "ألم عند الضغط على القص",
+common_name: "ألم عند الضغط على القص",
+},
+{
+id: "s_1382",
+type: "symptom",
+name: "ألم عند الضغط بقوّة على الظنبوب",
+common_name: "ألم عند الضغط بقوّة على الظنبوب",
+},
+{
+id: "s_1383",
+type: "symptom",
+name: "علاقات كثيرة غير مستقرة",
+common_name: "علاقات كثيرة غير مستقرة",
+},
+{
+id: "s_1386",
+type: "symptom",
+name: "نزف داخل العضلات",
+common_name: "نزف داخل العضلات",
+},
+{
+id: "s_1387",
+type: "symptom",
+name: "ألم بطني، شرسوفي",
+common_name: "ألم في منتصف القسم العلوي من البطن",
+},
+{
+id: "s_1388",
+type: "symptom",
+name: "عدم تناظر في العنق",
+common_name: "رقبة غير متناظرة",
+},
+{
+id: "s_1390",
+type: "symptom",
+name: "توذم البلعوم، في جهة واحدة",
+common_name: "تورّم في جانب واحد من الحلق",
+},
+{
+id: "s_1392",
+type: "symptom",
+name: "مضض بطني، في الربع العلوي الأيمن",
+common_name: "ألم في البطن عند الضغط على الربع العلوي الأيمن منه",
+},
+{
+id: "s_1393",
+type: "symptom",
+name: "تغوُّط مؤلم",
+common_name: "ألم أثناء التغوط",
+},
+{
+id: "s_1394",
+type: "symptom",
+name: "غياب الحليمات الذوقية",
+common_name: "غياب البراعم الذوقية",
+},
+{
+id: "s_1395",
+type: "symptom",
+name: "انخفاض شدّة الأصوات التنفسيّة، في قاعدة الرئة اليمنى",
+common_name: "انخفاض شدّة الأصوات التنفسيّة، في قاعدة الرئة اليمنى",
+},
+{
+id: "s_1396",
+type: "symptom",
+name: "احتكاكات جنبية",
+common_name: "احتكاكات جنبية",
+},
+{
+id: "s_1397",
+type: "symptom",
+name: "نعوظ مستمر",
+common_name: "انتصاب لفترة طويلة",
+},
+{
+id: "s_1398",
+type: "symptom",
+name: "النزف الزجاجي",
+common_name: "النزف الزجاجي",
+},
+{
+id: "s_1399",
+type: "symptom",
+name: "علامة شافير",
+common_name: "علامة شافير",
+},
+{
+id: "s_1400",
+type: "symptom",
+name: "مضض بطني، فوق العانة",
+common_name: "ألم في البطن عند الضغط على الجزء السفلي منه",
+},
+{
+id: "s_1402",
+type: "symptom",
+name: "حلقة ويس",
+common_name: "حلقة ويس",
+},
+{
+id: "s_1403",
+type: "symptom",
+name: "حدقة ماركوس غن",
+common_name: "حدقة ماركوس غن",
+},
+{
+id: "s_1404",
+type: "symptom",
+name: "انخفاض الضغط داخل الحجاج، بفارق أكبر من 4-5 ملم زئبقي بين العين المصابة والأخرى السليمة",
+common_name: "انخفاض الضغط داخل الحجاج، بفارق أكبر من 4-5 ملم زئبقي بين العين المصابة والأخرى السليمة",
+},
+{
+id: "s_1405",
+type: "symptom",
+name: "انفصال موضع في الشبكية",
+common_name: "انفصال موضع في الشبكية",
+},
+{
+id: "s_1406",
+type: "symptom",
+name: "تلون رمادي موضعي في الشبكية",
+common_name: "تلون رمادي موضعي في الشبكية",
+},
+{
+id: "s_1407",
+type: "symptom",
+name: "أوعية شبكية موضعة داكنة تتوضع في الطيات",
+common_name: "أوعية شبكية موضعة داكنة تتوضع في الطيات",
+},
+{
+id: "s_1408",
+type: "symptom",
+name: "تموج موضعي في الشبكية",
+common_name: "تموج موضعي في الشبكية",
+},
+{
+id: "s_1409",
+type: "symptom",
+name: "خط التحديد للشبكية المنفصلة (مُصطبغة أو غير مصطبغة)",
+common_name: "خط التحديد للشبكية المنفصلة (مُصطبغة أو غير مصطبغة)",
+},
+{
+id: "s_1410",
+type: "symptom",
+name: "استحداث أوعية جديدة في القرص البصري",
+common_name: "استحداث أوعية جديدة في القرص البصري",
+},
+{
+id: "s_1411",
+type: "symptom",
+name: "تشكل أوعية دموية جديدة في القزحية",
+common_name: "تشكل أوعية دموية جديدة في القزحية",
+},
+{
+id: "s_1412",
+type: "symptom",
+name: "أمهات دم مجهرية في الشبكية",
+common_name: "أمهات دم مجهرية في الشبكية",
+},
+{
+id: "s_1413",
+type: "symptom",
+name: "وذمة بقعية كيسية",
+common_name: "وذمة بقعية كيسية",
+},
+{
+id: "s_1414",
+type: "symptom",
+name: "وذمة الشبكية",
+common_name: "وذمة الشبكية",
+},
+{
+id: "s_1415",
+type: "symptom",
+name: "استحداث أوعية شبكية جديدة في أماكن غير طبيعية",
+common_name: "استحداث أوعية شبكية جديدة في أماكن غير طبيعية",
+},
+{
+id: "s_1416",
+type: "symptom",
+name: "تشوه الأوعية داخل الشبكية",
+common_name: "تشوه الأوعية داخل الشبكية",
+},
+{
+id: "s_1417",
+type: "symptom",
+name: "بقع حمراء داكنة في أوعية القرص البصري",
+common_name: "بقع حمراء داكنة في أوعية القرص البصري",
+},
+{
+id: "s_1418",
+type: "symptom",
+name: "انسداد الشرايين الشبكية",
+common_name: "انسداد الشرايين الشبكية",
+},
+{
+id: "s_1421",
+type: "symptom",
+name: "ارتعاش خافق",
+common_name: "رعاش خافق",
+},
+{
+id: "s_1422",
+type: "symptom",
+name: "نز من الحلمة، مفرزات غير حليبية",
+common_name: "سيلان مفرزات غير الحليب من الحلمة",
+},
+{
+id: "s_1425",
+type: "symptom",
+name: "تشنجات في عضلات الوجه",
+common_name: "تشنجات في عضلات الوجه",
+},
+{
+id: "s_1426",
+type: "symptom",
+name: "تشنج في عضلات الطرفين العلويين",
+common_name: "تشنج في عضلات الذراعين واليدين",
+},
+{
+id: "s_1429",
+type: "symptom",
+name: "رُعاف",
+common_name: "نزيف من الأنف",
+},
+{
+id: "s_1430",
+type: "symptom",
+name: "ألم مفصلي، في الرسغ",
+common_name: "ألم في المعصم",
+},
+{
+id: "s_1431",
+type: "symptom",
+name: "وذمة، في المعصم",
+common_name: "تورم في المعصم",
+},
+{
+id: "s_1432",
+type: "symptom",
+name: "عسر الهضم",
+common_name: "سوء الهضم",
+},
+{
+id: "s_1433",
+type: "symptom",
+name: "وذمة، في الشفتين",
+common_name: "تورم في الشفاه",
+},
+{
+id: "s_1434",
+type: "symptom",
+name: "إسهال دهني",
+common_name: "تغوط دهني",
+},
+{
+id: "s_1436",
+type: "symptom",
+name: "ألم وجهي، في مناطق الجيوب المجاورة للأنف",
+common_name: "ألم أو حس بالضغط في الجيوب",
+},
+{
+id: "s_1437",
+type: "symptom",
+name: "انصباب جنبي",
+common_name: "انصباب جنبي",
+},
+{
+id: "s_1442",
+type: "symptom",
+name: "وذمة، حول الحجاج، في كلا العينين",
+common_name: "تورم حول كلا العينين",
+},
+{
+id: "s_1447",
+type: "symptom",
+name: "وذمة، في الطرف العلوي",
+common_name: "تورم في الطرف العلوي",
+},
+{
+id: "s_1449",
+type: "symptom",
+name: "خدر، في طرف علوي واحد",
+common_name: "تنميل في طرف علوي واحد",
+},
+{
+id: "s_1451",
+type: "symptom",
+name: "تنفس كوسماول",
+common_name: "تنفس غير طبيعي عميق وشاق مع لهاث",
+},
+{
+id: "s_1452",
+type: "symptom",
+name: "ألم في كلا الطرفين العلويين",
+common_name: "ألم في كلا الطرفين العلويين",
+},
+{
+id: "s_1453",
+type: "symptom",
+name: "ألم في كلا الطرفين السفليين",
+common_name: "ألم في كلا الطرفين السفليين",
+},
+{
+id: "s_1454",
+type: "symptom",
+name: "رعاش حركي",
+common_name: "رعاش أثناء الحركة",
+},
+{
+id: "s_1455",
+type: "symptom",
+name: "رجفان، أثناء الراحة",
+common_name: "رجفة أثناء الراحة",
+},
+{
+id: "s_1456",
+type: "symptom",
+name: "الرقص",
+common_name: "الرقص",
+},
+{
+id: "s_1458",
+type: "symptom",
+name: "انقطاع الطمث، الأولي",
+common_name: "عدم حدوث الدورة الشهرية حتى بعد بلوغ سن الـ16",
+},
+{
+id: "s_1462",
+type: "symptom",
+name: "تنفس سطحي",
+common_name: "تنفس سطحي",
+},
+{
+id: "s_1463",
+type: "symptom",
+name: "تململ الساقين، ليلاً",
+common_name: "تململ الساقين في الليل",
+},
+{
+id: "s_1464",
+type: "symptom",
+name: "وذمة، في اليد",
+common_name: "يد متورمة",
+},
+{
+id: "s_1465",
+type: "symptom",
+name: "فقدان مؤقت للرؤية",
+common_name: "فقدان مؤقت للبصر",
+},
+{
+id: "s_1466",
+type: "symptom",
+name: "طنين في الأذن, نابض",
+common_name: "طنين نابض في الأذن",
+},
+{
+id: "s_1467",
+type: "symptom",
+name: "لسان الفريز",
+common_name: "لسان بلون الفريز",
+},
+{
+id: "s_1468",
+type: "symptom",
+name: "حمامى، على الوجه",
+common_name: "احمرار على الوجه",
+},
+{
+id: "s_1469",
+type: "symptom",
+name: "حمامى وتوسّف في معظم الجسم",
+common_name: "احمرار وتقشر كل الجلد تقريباً",
+},
+{
+id: "s_1470",
+type: "symptom",
+name: "تقشر الجلد",
+common_name: "توسف الجلد",
+},
+{
+id: "s_1471",
+type: "symptom",
+name: "سيلان المفرزات الأنفية من الخلف",
+common_name: "سيلان المخاط إلى الحلق",
+},
+{
+id: "s_1472",
+type: "symptom",
+name: "حلقة كايزر-فيشر",
+common_name: "حلقات داكنة تظهر حول قزحية العين",
+},
+{
+id: "s_1474",
+type: "symptom",
+name: "آفات في الجمجمة",
+common_name: "آفات في الجمجمة",
+},
+{
+id: "s_1476",
+type: "symptom",
+name: "التهاب غشاء الطبل",
+common_name: "التهاب غشاء الطبل",
+},
+{
+id: "s_1479",
+type: "symptom",
+name: "دوخة، عند تدوير الرأس",
+common_name: "دوخة عند تدوير الرأس",
+},
+{
+id: "s_1480",
+type: "symptom",
+name: "مضض بالثدي، ثنائي الجانب",
+common_name: "ألم في كلا الثديين عند الضغط عليهما",
+},
+{
+id: "s_1481",
+type: "symptom",
+name: "فرط حس الألم",
+common_name: "فرط حس الألم",
+},
+{
+id: "s_1483",
+type: "symptom",
+name: "ألم في العنق",
+common_name: "ألم في الرقبة",
+},
+{
+id: "s_1484",
+type: "symptom",
+name: "ضعف حاسة السمع، صَمم متفاقم",
+common_name: "نقص متزايد في السمع بدون أي تحسّن",
+},
+{
+id: "s_1486",
+type: "symptom",
+name: "ألم ومضض في العضلات المجاورة للعمود الفقري",
+common_name: "ألم ومضض في العضلات المجاورة للعمود الفقري",
+},
+{
+id: "s_1488",
+type: "symptom",
+name: "زيادة زمن الزفير",
+common_name: "زيادة زمن الزفير",
+},
+{
+id: "s_1492",
+type: "symptom",
+name: "اصفرار الصلبة اليرقاني",
+common_name: "اصفرار العينين",
+},
+{
+id: "s_1494",
+type: "symptom",
+name: "ألم ارتدادي",
+common_name: "ألم ارتدادي",
+},
+{
+id: "s_1496",
+type: "symptom",
+name: "ألم عند جس الجيوب جانب الأنفية",
+common_name: "ألم عند جس الجيوب جانب الأنفية",
+},
+{
+id: "s_1498",
+type: "symptom",
+name: "احمرار في اللوزتين",
+common_name: "لوزتين محمرتين بشكل غير طبيعي",
+},
+{
+id: "s_1502",
+type: "symptom",
+name: "اشتداد مُنعكس وتر أشيل",
+common_name: "اشتداد مُنعكس وتر أشيل",
+},
+{
+id: "s_1508",
+type: "symptom",
+name: "تطاول زمن امتلاء الشعريات",
+common_name: "تطاول زمن امتلاء الشعريات",
+},
+{
+id: "s_1509",
+type: "symptom",
+name: "ألم صدري، خلف القص",
+common_name: "ألم في الصدر خلف عظم القص",
+},
+{
+id: "s_1510",
+type: "symptom",
+name: "تغيّرات جلدية، دافئة عند لمسها",
+common_name: "تغيرات جلدية تبدو دافئة عند لمسها",
+},
+{
+id: "s_1514",
+type: "symptom",
+name: "مضض بطني",
+common_name: "ألم في البطن عند الضغط عليه",
+},
+{
+id: "s_1528",
+type: "symptom",
+name: "ألم بطني، في الربع العلوي الأيمن",
+common_name: "ألم في الجزء العلوي الأيمن من البطن",
+},
+{
+id: "s_1531",
+type: "symptom",
+name: "ألم بطني، في الربع السفلي الأيمن",
+common_name: "ألم في الجزء السفلي الأيمن من البطن",
+},
+{
+id: "s_1532",
+type: "symptom",
+name: "ألم بطني، حول السُّرَّة‎",
+common_name: "ألم في منتصف البطن",
+},
+{
+id: "s_1533",
+type: "symptom",
+name: "التهاب الأنف البيئي",
+common_name: "سيلان أو انسداد في الأنف ناتج عن البيئة",
+},
+{
+id: "s_1534",
+type: "symptom",
+name: "حصى اللوزتين",
+common_name: "تشكلات بيضاء أو صفراء في اللوزتين",
+},
+{
+id: "s_1535",
+type: "symptom",
+name: "صداع، مزمن",
+common_name: "ألم في الرأس يستمر 3 أشهر أو أكثر",
+},
+{
+id: "s_1536",
+type: "symptom",
+name: "عدم تناظر العمود الفقري",
+common_name: "عدم تناظر العمود الفقري",
+},
+{
+id: "s_1538",
+type: "symptom",
+name: "ضعف حاسة السمع، صَمم مُفاجئ",
+common_name: "فقدان مفاجئ للسمع",
+},
+{
+id: "s_1543",
+type: "symptom",
+name: "غياب الوعي",
+common_name: "فقدان الوعي",
+},
+{
+id: "s_1544",
+type: "symptom",
+name: "طفح الحمى القرمزية",
+common_name: "طفح الحمى القرمزية",
+},
+{
+id: "s_1546",
+type: "symptom",
+name: "تنفس شاين-ستوكس",
+common_name: "تنفس شاين-ستوكس",
+},
+{
+id: "s_1547",
+type: "symptom",
+name: "تعب، استمر أكثر من 6 أشهر",
+common_name: "الشعور بالضعف والتعب لأكثر من 6 أشهر",
+},
+{
+id: "s_1548",
+type: "symptom",
+name: "غشاء كاذب على البلعوم أو الأنف",
+common_name: "طبقة رمادية سميكة في الأنف أو على الحلق",
+},
+{
+id: "s_1551",
+type: "symptom",
+name: "عدم القدرة على إخراج الغازات",
+common_name: "عدم القدرة على إخراج الغازات",
+},
+{
+id: "s_1552",
+type: "symptom",
+name: "أصوات معويّة عالية ذات تردد عالي",
+common_name: "أصوات معويّة زائدة",
+},
+{
+id: "s_1553",
+type: "symptom",
+name: "خفوت الأصوات المعويّة",
+common_name: "انخفاض في الأصوات المعويّة",
+},
+{
+id: "s_1555",
+type: "symptom",
+name: "علامة دانس",
+common_name: "علامة دانس",
+},
+{
+id: "s_1557",
+type: "symptom",
+name: "ألم بطني، مُنتشر",
+common_name: "ألم شامل لكامل البطن",
+},
+{
+id: "s_1558",
+type: "symptom",
+name: "دفاع بطني",
+common_name: "ازدياد قساوة عضلات البطن",
+},
+{
+id: "s_1561",
+type: "symptom",
+name: "ورم أصفر",
+common_name: "ترسبات صفراء تحت الجلد",
+},
+{
+id: "s_1562",
+type: "symptom",
+name: "صرير",
+common_name: "صرير",
+},
+{
+id: "s_1563",
+type: "symptom",
+name: "حكة في العينين",
+common_name: "حكة في العينين",
+},
+{
+id: "s_1565",
+type: "symptom",
+name: "الشعور بامتلاء في المستقيم",
+common_name: "الشعور بامتلاء في المستقيم",
+},
+{
+id: "s_1569",
+type: "symptom",
+name: "إفرازات مهبلية، بيضاء ولزجة",
+common_name: "مفرزات مهبلية بيضاء ولزجة",
+},
+{
+id: "s_1570",
+type: "symptom",
+name: "أعراض هضمية تظهر بعد تناول الأطعمة الحاوية على اللاكتوز",
+common_name: "أعراض بطنية تظهر بعد شرب أو تناول الأطعمة الحاوية على اللاكتوز",
+},
+{
+id: "s_1571",
+type: "symptom",
+name: "تغيرات جلدية، مؤلمة",
+common_name: "تغيرات موْلمة على الجلد",
+},
+{
+id: "s_1574",
+type: "symptom",
+name: "صعوبة في الوصول إلى النشوة الجنسية",
+common_name: "صعوبة في الوصول إلى النشوة الجنسية",
+},
+{
+id: "s_1576",
+type: "symptom",
+name: "نفخة السباتي",
+common_name: "نفخة الشريان السباتي الرقبي",
+},
+{
+id: "s_1577",
+type: "symptom",
+name: "سيلان من الأذن، مفرزات دموية",
+common_name: "نزف من الأذن",
+},
+{
+id: "s_1580",
+type: "symptom",
+name: "ألم صدري، يشتد بجس المفاصل الغضروفية الضلعية",
+common_name: "ألم في الصدر يزداد بالضغط على المفاصل الغضروفية الضلعية",
+},
+{
+id: "s_1581",
+type: "symptom",
+name: "وذمة، في المفاصل الغضروفية الضلعيّة",
+common_name: "تورم في منتصف الصدر",
+},
+{
+id: "s_1586",
+type: "symptom",
+name: "توذّم فرجي أحادي الجانب",
+common_name: "تورم في أحد جوانب الفرج",
+},
+{
+id: "s_1587",
+type: "symptom",
+name: "تبدد الشخصية",
+common_name: "الشعور بالانفصال عن الجسد",
+},
+{
+id: "s_1589",
+type: "symptom",
+name: "مضض بطني، في الربع العلوي الأيسر",
+common_name: "ألم في البطن عند الضغط على الجزء العلوي الأيسر منه",
+},
+{
+id: "s_1591",
+type: "symptom",
+name: "ألم بطني، في الربع العلوي الأيسر",
+common_name: "ألم في الجزء العلوي الأيسر من البطن",
+},
+{
+id: "s_1598",
+type: "symptom",
+name: "ألم بطني، أسفل السرّة",
+common_name: "ألم في الجزء السفلي من البطن",
+},
+{
+id: "s_1601",
+type: "symptom",
+name: "ألم صدري، طاعن",
+common_name: "ألم طاعن في الصدر",
+},
+{
+id: "s_1602",
+type: "symptom",
+name: "تغيرات جلدية، قرح",
+common_name: "قرحة تناسلية غير مؤلمة",
+},
+{
+id: "s_1603",
+type: "symptom",
+name: "تأخر تطور اللغة",
+common_name: "تأخر الكلام",
+},
+{
+id: "s_1605",
+type: "symptom",
+name: "ألم أنفي",
+common_name: "ألم في الأنف",
+},
+{
+id: "s_1610",
+type: "symptom",
+name: "ألم مفصلي، عند تحريك الركبة",
+common_name: "ألم في الركبة عند تحريكها",
+},
+{
+id: "s_1616",
+type: "symptom",
+name: "قشرة الرأس",
+common_name: "قشرة الرأس",
+},
+{
+id: "s_1617",
+type: "symptom",
+name: "حكة جلدية، في الفروة",
+common_name: "حكة في جلد الرأس",
+},
+{
+id: "s_1618",
+type: "symptom",
+name: "مضض في الطرف السفلي",
+common_name: "ألم في الساق عند الضغط عليها",
+},
+{
+id: "s_1619",
+type: "symptom",
+name: "مضض في الطرف العلوي",
+common_name: "ألم عند الضغط على الطرف العلوي",
+},
+{
+id: "s_1620",
+type: "symptom",
+name: "ألم في الطرف السفلي، في الربلة",
+common_name: "ألم في بطة الساق",
+},
+{
+id: "s_1621",
+type: "symptom",
+name: "ألم مفصلي، في الكاحل",
+common_name: "ألم في الكاحل",
+},
+{
+id: "s_1622",
+type: "symptom",
+name: "مضض في الطرف السفلي، في ربلة القدم",
+common_name: "ألم عند الضغط على بطة القدم",
+},
+{
+id: "s_1623",
+type: "symptom",
+name: "ألم مفصلي، عند تحريك الكاحل",
+common_name: "ألم في الكاحل عند تحريكه",
+},
+{
+id: "s_1625",
+type: "symptom",
+name: "زلة تنفسية تستمر أكثر من 4 أسابيع",
+common_name: "ضيق في التنفس يستمر فترة أطول من 4 أسابيع",
+},
+{
+id: "s_1632",
+type: "symptom",
+name: "ألم مفصلي، في المرفق",
+common_name: "ألم في المرفق",
+},
+{
+id: "s_1634",
+type: "symptom",
+name: "ألم مفصلي، عند تحريك المرفق",
+common_name: "ألم في المرفق عند تحريكه",
+},
+{
+id: "s_1635",
+type: "symptom",
+name: "وذمة، في المرفق",
+common_name: "تورم في المرفق",
+},
+{
+id: "s_1636",
+type: "symptom",
+name: "ألم مفصلي، عند تحريك الرسغ",
+common_name: "ألم في المعصم عند تحريكه",
+},
+{
+id: "s_1639",
+type: "symptom",
+name: "ألم مفصلي، في الإبهام",
+common_name: "ألم في الإبهام",
+},
+{
+id: "s_1641",
+type: "symptom",
+name: "ألم مفصلي، عند تحريك الإبهام",
+common_name: "ألم في الإبهام عند تحريكه",
+},
+{
+id: "s_1645",
+type: "symptom",
+name: "ألم في القدم، في مؤخرة القدم عند الوقوف على أصابع إحدى القدمين",
+common_name: "ألم في الجزء الخلفي من القدم عند الوقوف على الأصابع",
+},
+{
+id: "s_1647",
+type: "symptom",
+name: "آفات حلقية جلدية",
+common_name: "تغيرات جلدية حلقية الشكل",
+},
+{
+id: "s_1650",
+type: "symptom",
+name: "تسمك الجلد",
+common_name: "زيادة سماكة الجلد",
+},
+{
+id: "s_1652",
+type: "symptom",
+name: "وذمة، في مفصل الورك",
+common_name: "تورم في الورك",
+},
+{
+id: "s_1654",
+type: "symptom",
+name: "ألم مفصلي، في الكتف",
+common_name: "ألم في الكتف",
+},
+{
+id: "s_1655",
+type: "symptom",
+name: "وذمة، في مفصل الكتف",
+common_name: "تورم في الكتف",
+},
+{
+id: "s_1656",
+type: "symptom",
+name: "مضض مفصلي",
+common_name: "ألم في المفصل عند الضغط عليه",
+},
+{
+id: "s_1665",
+type: "symptom",
+name: "صَلَع، معمم",
+common_name: "تساقط شعر كل أجزاء الرأس",
+},
+{
+id: "s_1671",
+type: "symptom",
+name: "شعر متقصّف",
+common_name: "شعر متقصف",
+},
+{
+id: "s_1673",
+type: "symptom",
+name: "بقع بيضاء في الفم",
+common_name: "لطخ بيضاء في الغشاء المخاطي الفموي",
+},
+{
+id: "s_1674",
+type: "symptom",
+name: "ألم في الجلد",
+common_name: "ألم في الجلد",
+},
+{
+id: "s_1676",
+type: "symptom",
+name: "الثفن",
+common_name: "الثفن",
+},
+{
+id: "s_1680",
+type: "symptom",
+name: "تغيرات جلديّة، فرط تصبّغ للجلد",
+common_name: "اسمرار الجلد",
+},
+{
+id: "s_1682",
+type: "symptom",
+name: "فيمة الأنف",
+common_name: "أنف محمر منتفخ",
+},
+{
+id: "s_1684",
+type: "symptom",
+name: "حرقة جلديّة، في الوجه",
+common_name: "شعور بالحرقة في الوجه",
+},
+{
+id: "s_1685",
+type: "symptom",
+name: "توسع الشعريات الدموية، في الوجه",
+common_name: "أوعية عنكبوتية على الوجه",
+},
+{
+id: "s_1689",
+type: "symptom",
+name: "علامة كيرينغ",
+common_name: "علامة كيرينغ",
+},
+{
+id: "s_1690",
+type: "symptom",
+name: "علامة برودزنسكي",
+common_name: "علامة برودزنسكي",
+},
+{
+id: "s_1692",
+type: "symptom",
+name: "تغيرات جلدية، تسوء بعد تناول الكحول",
+common_name: "تغيرات جلدية تزداد بعد شرب الكحول",
+},
+{
+id: "s_1693",
+type: "symptom",
+name: "انخفاض شدة الأصوات التنفسية",
+common_name: "انخفاض شدة الأصوات التنفسية",
+},
+{
+id: "s_1695",
+type: "symptom",
+name: "مشكلات في العلاقات الشخصية",
+common_name: "مشكلات في العلاقات الشخصية",
+},
+{
+id: "s_1696",
+type: "symptom",
+name: "المحاكاة الصوتية",
+common_name: "تقليد الأصوات",
+},
+{
+id: "s_1697",
+type: "symptom",
+name: "اهتمامات ضيقة الأفق",
+common_name: "اهتمامات قليلة ومحدودة وغير طبيعية ومتعلق بها بشدة",
+},
+{
+id: "s_1698",
+type: "symptom",
+name: "تغيرات سلوكية، تجنّب التواصل البصري",
+common_name: "تجنّب التواصل البصري",
+},
+{
+id: "s_1713",
+type: "symptom",
+name: "تحدد مجال حركة مفصل",
+common_name: "صعوبة تحريك مفصل",
+},
+{
+id: "s_1715",
+type: "symptom",
+name: "كسور مرضية",
+common_name: "كسر عظمي بدون أي رض",
+},
+{
+id: "s_1716",
+type: "symptom",
+name: "الشعور بالامتلاء في المهبل",
+common_name: "الشعور بامتلاء في المهبل",
+},
+{
+id: "s_1717",
+type: "symptom",
+name: "انتفاخ متبارز من فوهة المهبل",
+common_name: "انتفاخ خارج من المهبل",
+},
+{
+id: "s_1719",
+type: "symptom",
+name: "عقد أوسلر",
+common_name: "عقد أوسلر",
+},
+{
+id: "s_1720",
+type: "symptom",
+name: "نفخات قلبية",
+common_name: "نفخات قلبية",
+},
+{
+id: "s_1721",
+type: "symptom",
+name: "رأرأة، أفقية",
+common_name: "رأرأة أفقية",
+},
+{
+id: "s_1725",
+type: "symptom",
+name: "شحوب في الطرف السفلي",
+common_name: "ساق شاحبة",
+},
+{
+id: "s_1729",
+type: "symptom",
+name: "ألم بطني، في الربع السفلي الأيسر",
+common_name: "ألم في الجزء السفلي الأيسر من البطن",
+},
+{
+id: "s_1731",
+type: "symptom",
+name: "مناورة ديكس-هولبايك، رأرأة تدويريّة",
+common_name: "مناورة ديكس-هولبايك، رأرأة تدويريّة",
+},
+{
+id: "s_1732",
+type: "symptom",
+name: "علامة روفسينغ",
+common_name: "علامة روفسينغ",
+},
+{
+id: "s_1733",
+type: "symptom",
+name: "ألم في العقد اللمفاوية",
+common_name: "عقد لمفاوية مؤلمة",
+},
+{
+id: "s_1738",
+type: "symptom",
+name: "علامة رومبيرغ",
+common_name: "علامة رومبيرغ",
+},
+{
+id: "s_1744",
+type: "symptom",
+name: "سماع صوت فرقعة في الركبة عند حدوث الإصابة",
+common_name: "سماع صوت فرقعة في الركبة عند حدوث الإصابة",
+},
+{
+id: "s_1745",
+type: "symptom",
+name: "عدم ثباتية الركبة",
+common_name: "ركبة غير ثابتة",
+},
+{
+id: "s_1761",
+type: "symptom",
+name: "تغيرات جلدية، تزداد بالتوتر النفسي",
+common_name: "تغيرات جلدية تزداد بالتوتر",
+},
+{
+id: "s_1762",
+type: "symptom",
+name: "صداع، يشتد بالتوتر",
+common_name: "ألم رأس يزداد بالتوتر والضغط",
+},
+{
+id: "s_1763",
+type: "symptom",
+name: "ألم صدري، يشتد بالشدة النفسية",
+common_name: "ألم في الصدر يزداد عند التوتر والضغط النفسي",
+},
+{
+id: "s_1765",
+type: "symptom",
+name: "رجفان يحدث أثناء التوتر",
+common_name: "رجفة تسوء بالتوتر",
+},
+{
+id: "s_1766",
+type: "symptom",
+name: "ألم عضلي، يشتد بالتوتر",
+common_name: "ألم عضلي يتحرّض بزيادة التوتر",
+},
+{
+id: "s_1767",
+type: "symptom",
+name: "أعراض هضمية، متعلقة بالتوتر",
+common_name: "أعراض هضمية تظهر عند التوتر أو الإجهاد",
+},
+{
+id: "s_1768",
+type: "symptom",
+name: "اضطرابات نفسية تشتد بالتوتر",
+common_name: "اضطرابات نفسية تزداد بالضغط النفسي",
+},
+{
+id: "s_1772",
+type: "symptom",
+name: "ألم في الظهر، صدري",
+common_name: "ألم في الظهر في الجزء العلوي أو الأوسط منه",
+},
+{
+id: "s_1776",
+type: "symptom",
+name: "عسر البلع، الفموي البلعومي",
+common_name: "صعوبة في بداية البلع",
+},
+{
+id: "s_1779",
+type: "symptom",
+name: "عسر البلع، المريئي",
+common_name: "الشعور بأن الطعام عالق بعد عدة ثوان من بلعه",
+},
+{
+id: "s_1780",
+type: "symptom",
+name: "صداع، خفيف",
+common_name: "ألم رأس خفيف",
+},
+{
+id: "s_1781",
+type: "symptom",
+name: "صداع، معتدل",
+common_name: "ألم رأس معتدل",
+},
+{
+id: "s_1782",
+type: "symptom",
+name: "ألم بطني، خفيف",
+common_name: "ألم خفيف الشدة في البطن",
+},
+{
+id: "s_1783",
+type: "symptom",
+name: "ألم بطني، معتدل",
+common_name: "ألم متوسط الشدة في البطن",
+},
+{
+id: "s_1788",
+type: "symptom",
+name: "تغيرات لونية بيضاء على الأظافر",
+common_name: "بقع بيضاء على الظفر",
+},
+{
+id: "s_1789",
+type: "symptom",
+name: "اصفرار الأظافر",
+common_name: "أظافر صفراء",
+},
+{
+id: "s_1790",
+type: "symptom",
+name: "تسمّك في الأظافر",
+common_name: "زيادة في سماكة الأظافر",
+},
+{
+id: "s_1791",
+type: "symptom",
+name: "حمامى، على فروة الرأس",
+common_name: "بقع حمراء على الفروة",
+},
+{
+id: "s_1792",
+type: "symptom",
+name: "قمل رأس مرئي على الفروة",
+common_name: "قمل رأس مرئي على الفروة",
+},
+{
+id: "s_1793",
+type: "symptom",
+name: "بيض قمل أو صئبان على جذر الشعر",
+common_name: "بيض صغير على قاعدة الشعرة",
+},
+{
+id: "s_1795",
+type: "symptom",
+name: "أنفاق في الجلد",
+common_name: "أخاديد في الجلد",
+},
+{
+id: "s_1796",
+type: "symptom",
+name: "بقعة بيضاء على القرنية",
+common_name: "بقعة بيضاء على قرنية العين",
+},
+{
+id: "s_1798",
+type: "symptom",
+name: "اختلاف في حجم الخصيتين",
+common_name: "اختلاف في حجم الخصيتين",
+},
+{
+id: "s_1799",
+type: "symptom",
+name: "ألم في الساعد",
+common_name: "ألم في الساعد",
+},
+{
+id: "s_1800",
+type: "symptom",
+name: "استئصال سابق للزائدة الدودية",
+common_name: "إزالة الزائدة الدودية في الماضي",
+},
+{
+id: "s_1802",
+type: "symptom",
+name: "ألم بطني، حارق أو لاذع",
+common_name: "ألم في المعدة حارق أو لاذع",
+},
+{
+id: "s_1805",
+type: "symptom",
+name: "ألم مفصلي، عند تحريك الكتف",
+common_name: "ألم في الكتف عند تحريكه",
+},
+{
+id: "s_1808",
+type: "symptom",
+name: "تغيرات جلدية، على الوجه",
+common_name: "تغيرات في جلد الوجه",
+},
+{
+id: "s_1810",
+type: "symptom",
+name: "تغيرات جلدية، في منطقة الأعضاء التناسلية",
+common_name: "تغيرات جلدية على الأعضاء التناسلية أو حولها",
+},
+{
+id: "s_1811",
+type: "symptom",
+name: "جفاف مهبلي",
+common_name: "جفاف بالمهبل",
+},
+{
+id: "s_1812",
+type: "symptom",
+name: "احتقان أنفي، مزمن",
+common_name: "انسداد في الأنف منذ أكثر من 3 أشهر",
+},
+{
+id: "s_1819",
+type: "symptom",
+name: "ضعف بصري، في عين واحدة",
+common_name: "ضعف الرؤية في عين واحدة",
+},
+{
+id: "s_1820",
+type: "symptom",
+name: "حمى، لم يتم قياس درجة الحرارة",
+common_name: "ارتفاع في درجة حرارة الجسم لم يتم قياسه",
+},
+{
+id: "s_1823",
+type: "symptom",
+name: "ألم مفصلي، عند تحريك الورك",
+common_name: "ألم في الورك عند تحريكه",
+},
+{
+id: "s_1826",
+type: "symptom",
+name: "ألم في البلعوم، أحادي الجانب",
+common_name: "ألم أحادي الجانب في الحلق",
+},
+{
+id: "s_1829",
+type: "symptom",
+name: "ألم فرجي مهبلي",
+common_name: "ألم في الفرج أو المهبل",
+},
+{
+id: "s_1830",
+type: "symptom",
+name: "كتلة جلدية، أكبر من 1 سم",
+common_name: "بروز على الجلد قطره أكبر من 1 سم",
+},
+{
+id: "s_1831",
+type: "symptom",
+name: "كتلة جلدية",
+common_name: "كتل أو نتوء في الجلد",
+},
+{
+id: "s_1833",
+type: "symptom",
+name: "ألم في أحد الأباخس",
+common_name: "ألم في أحد أصابع القدم",
+},
+{
+id: "s_1835",
+type: "symptom",
+name: "ألم في كامل الجسم",
+common_name: "ألم في كامل الجسم",
+},
+{
+id: "s_1840",
+type: "symptom",
+name: "ألم بطني، يستمر أقل من يومين",
+common_name: "ألم في البطن يستمر أقل من يومين",
+},
+{
+id: "s_1842",
+type: "symptom",
+name: "ألم بطني، يستمر لأكثر من أسبوعين",
+common_name: "ألم في البطن يستمر لأكثر من أسبوعين",
+},
+{
+id: "s_1843",
+type: "symptom",
+name: "ألم بطني، ذو بدء مفاجئ",
+common_name: "ألم بطني بدأ فجأةً",
+},
+{
+id: "s_1844",
+type: "symptom",
+name: "ألم بطني، ذو بدء تدريجي",
+common_name: "ألم في البطن تزداد شدته بشكل تدريجي بطيء",
+},
+{
+id: "s_1845",
+type: "symptom",
+name: "ألم بطني، ينتشر إلى الكتف الأيسر أو لوح الكتف الأيسر",
+common_name: "ألم في البطن ينتشر إلى الكتف الأيسر أو عظم الكتف الأيسر",
+},
+{
+id: "s_1846",
+type: "symptom",
+name: "ألم بطني، ينتشر إلى منتصف أو أسفل الظهر",
+common_name: "ألم في البطن ينتشر إلى منتصف أو أسفل الظهر",
+},
+{
+id: "s_1847",
+type: "symptom",
+name: "ألم بطني، ناكس",
+common_name: "ألم متكرر في البطن",
+},
+{
+id: "s_1848",
+type: "symptom",
+name: "ألم بطني، قولنجي",
+common_name: "ألم ماغص في البطن",
+},
+{
+id: "s_1851",
+type: "symptom",
+name: "ألم بطني، ينتقل ويتوضّع في الربع السفلي الأيمن",
+common_name: "ألم في البطن انتقل إلى الجزء السفلي الأيمن",
+},
+{
+id: "s_1852",
+type: "symptom",
+name: "ألم بطني، يستمر لـ2-7 أيام",
+common_name: "ألم في البطن يستمر فترة تتراوح بين يومين و7 أيام",
+},
+{
+id: "s_1853",
+type: "symptom",
+name: "ألم بطني، يستمر لـ8-14 أيام",
+common_name: "ألم في البطن يستمر لـ8-14 أيام",
+},
+{
+id: "s_1193",
+type: "symptom",
+name: "ألم بطني، في الجانب الأيسر",
+common_name: "ألم في الجانب الأيسر من البطن",
+},
+{
+id: "s_1855",
+type: "symptom",
+name: "ألم بطني، في الجانب الأيمن",
+common_name: "ألم في الجانب الأيمن من البطن",
+},
+{
+id: "s_1856",
+type: "symptom",
+name: "مضض بطني، في الربع السفلي الأيمن",
+common_name: "ألم في البطن عند الضغط على الجزء السفلي الأيمن منه",
+},
+{
+id: "s_1858",
+type: "symptom",
+name: "سعال، يدوم بين ثلاث وثمان أسابيع",
+common_name: "سعال يستمر بين ثلاث وثمان أسابيع",
+},
+{
+id: "s_1859",
+type: "symptom",
+name: "ألم بطني، في منتصف الدورة الطمثيّة",
+common_name: "إباضة مؤلمة",
+},
+{
+id: "s_1860",
+type: "symptom",
+name: "ألم بطني، تشنجي",
+common_name: "ألم تشنجي في البطن",
+},
+{
+id: "s_1864",
+type: "symptom",
+name: "صداع، أسوأ صداع في الحياة",
+common_name: "أسوأ ألم رأس على الإطلاق",
+},
+{
+id: "s_1868",
+type: "symptom",
+name: "صداع، مزمن، بنوبة تستمر من 5 دقائق إلى 4 ساعات",
+common_name: "نوبات ألم في الرأس تستمر من 5 دقائق إلى 4 ساعات",
+},
+{
+id: "s_1870",
+type: "symptom",
+name: "صداع، مزمن، بنوبة تستمر 4-72 ساعة",
+common_name: "نوبات ألم في الرأس تستمر من4 إلى 72 ساعة",
+},
+{
+id: "s_1871",
+type: "symptom",
+name: "صداع، يشتد بالنشاط الفيزيائي",
+common_name: "ألم رأس يزداد عند ممارسة نشاط جسدي",
+},
+{
+id: "s_1875",
+type: "symptom",
+name: "حرقة فرجية مهبلية",
+common_name: "حرقة فرجية مهبلية",
+},
+{
+id: "s_1878",
+type: "symptom",
+name: "ألم في الربلة، أعلى العقب",
+common_name: "ألم في الجزء الخلفي من الساق أعلى العقب",
+},
+{
+id: "s_1891",
+type: "symptom",
+name: "فرط الحساسية للروائح",
+common_name: "فرط التحسس للروائح",
+},
+{
+id: "s_1893",
+type: "symptom",
+name: "ألم في الطرف السفلي، في الفخذ",
+common_name: "ألم في الفخذ",
+},
+{
+id: "s_1899",
+type: "symptom",
+name: "خدر في الأصابع الثلاثة الأولى",
+common_name: "تنميل في الإبهام والسبابة والإصبع الوسطى",
+},
+{
+id: "s_1900",
+type: "symptom",
+name: "خدر في أصابع اليد، في الإصبعين الرابع والخامس",
+common_name: "تنميل في الخنصر والبنصر في اليد",
+},
+{
+id: "s_1901",
+type: "symptom",
+name: "صداع، مزمن، بنوبات تستمر 3-7 أيام",
+common_name: "نوبات ألم في الرأس تستمر 3-7 أيام",
+},
+{
+id: "s_1903",
+type: "symptom",
+name: "تحدد مجال الحركة المنفعلة لمفصل",
+common_name: "تحدد مجال الحركة المنفعلة لمفصل",
+},
+{
+id: "s_1905",
+type: "symptom",
+name: "صداع،  ذو بدء مفاجئ",
+common_name: "صداع يصل لذروته خلال عدّة دقائق",
+},
+{
+id: "s_1907",
+type: "symptom",
+name: "صداع، مزمن، بنوبة تستمر حتى 5 دقائق",
+common_name: "نوبات ألم في الرأس تدوم لفترة لا تتجاوز 5 دقائق",
+},
+{
+id: "s_1909",
+type: "symptom",
+name: "القدم الهابطة",
+common_name: "انخفاض القدم",
+},
+{
+id: "s_1910",
+type: "symptom",
+name: "هبوط الرسغ",
+common_name: "هبوط المعصم",
+},
+{
+id: "s_1911",
+type: "symptom",
+name: "صداع، في المنطقة الصدغية",
+common_name: "ألم في الصدغ",
+},
+{
+id: "s_1912",
+type: "symptom",
+name: "صداع، حديث",
+common_name: "ألم رأس منذ فترة لا تتجاوز 3 أشهر",
+},
+{
+id: "s_1915",
+type: "symptom",
+name: "طفح فرفري، مجسوس",
+common_name: "بقع صغيرة حمراء أو أرجوانية يزيد قطرها عن 3 مم ويمكن الإحساس بها",
+},
+{
+id: "s_1918",
+type: "symptom",
+name: "ألم في الردفين",
+common_name: "ألم في الردفين",
+},
+{
+id: "s_1921",
+type: "symptom",
+name: "تغيّرات جلدية، تزداد بالتعرّض لضوء الشمس",
+common_name: "تغيرات في الجلد تظهر أو تزداد بعد التعرض لضوء الشمس",
+},
+{
+id: "s_1922",
+type: "symptom",
+name: "إيلام ارتجاجي",
+common_name: "ألم في البطن بعد الهبوط بقوّة على القدمين",
+},
+{
+id: "s_1923",
+type: "symptom",
+name: "تغيرات جلدية، في القدم",
+common_name: "تغيرات جلدية في القدم",
+},
+{
+id: "s_1924",
+type: "symptom",
+name: "سعال، انتيابي",
+common_name: "نوبات سعال شديدة ومفاجئة",
+},
+{
+id: "s_1925",
+type: "symptom",
+name: "ألم صدري، ضاغط",
+common_name: "ألم ضاغط في الصدر",
+},
+{
+id: "s_1926",
+type: "symptom",
+name: "جلد بارد ومتعرّق",
+common_name: "جلد بارد ومتعرّق",
+},
+{
+id: "s_1927",
+type: "symptom",
+name: "ألم في الطرف السفلي، عرج بسبب الألم",
+common_name: "عرج بسبب ألم في الساق",
+},
+{
+id: "s_1929",
+type: "symptom",
+name: "ألم بطني، شديد لا يمكن تحمّله",
+common_name: "ألم لا يطاق في البطن",
+},
+{
+id: "s_1930",
+type: "symptom",
+name: "ألم في الطرف السفلي، شديد",
+common_name: "ألم شديد في الطرف السفلي",
+},
+{
+id: "s_1931",
+type: "symptom",
+name: "كتلة جلدية، نازفة",
+common_name: "كتلة جلدية نازفة",
+},
+{
+id: "s_1932",
+type: "symptom",
+name: "خدر، ذو بدء مفاجئ",
+common_name: "الشعور فجأةً بتنميل أو وخز أو خدر",
+},
+{
+id: "s_1933",
+type: "symptom",
+name: "ارتفاع التوتر الشرياني، فوق 180 ملم زئبقي",
+common_name: "ارتفاع ضغط الدم كثيراً",
+},
+{
+id: "s_1935",
+type: "symptom",
+name: "ألم في الطرف العلوي، شديد",
+common_name: "ألم شديد في الطرف العلوي",
+},
+{
+id: "s_1937",
+type: "symptom",
+name: "ديدان في البراز",
+common_name: "ديدان في البراز أو حول الشرج",
+},
+{
+id: "s_1943",
+type: "symptom",
+name: "حروق الشمس",
+common_name: "حروق الشمس",
+},
+{
+id: "s_1949",
+type: "symptom",
+name: "إقياء، تال لكل وارد طعامي",
+common_name: "إقياء بعد تناول كل وجبة",
+},
+{
+id: "s_1952",
+type: "symptom",
+name: "ألم صدري، ناكس",
+common_name: "ألم متكرر في الصدر",
+},
+{
+id: "s_1955",
+type: "symptom",
+name: "حمامى، حول كلا العينين",
+common_name: "احمرار حول كلا العينين",
+},
+{
+id: "s_1957",
+type: "symptom",
+name: "أفكار هدّامة، تجاه الآخرين أو الأشياء",
+common_name: "أفكار هدّامة، تجاه الآخرين أو الأشياء",
+},
+{
+id: "s_1958",
+type: "symptom",
+name: "بحة في الصوت، تدوم أكثر من أسبوعين",
+common_name: "بحة في الصوت تستمر أكثر من أسبوعين",
+},
+{
+id: "s_1960",
+type: "symptom",
+name: "تكدّم بعد رض",
+common_name: "كدمة بعد إصابة",
+},
+{
+id: "s_1961",
+type: "symptom",
+name: "ألم في الفك",
+common_name: "ألم في الفك",
+},
+{
+id: "s_1973",
+type: "symptom",
+name: "جرح، نزف فعال",
+common_name: "نزف مستمر من جرح",
+},
+{
+id: "s_1979",
+type: "symptom",
+name: "إسهال، أكثر من 6 مرات باليوم",
+common_name: "إسهال لأكثر من 6 مرات في اليوم",
+},
+{
+id: "s_1982",
+type: "symptom",
+name: "تغيرات جلدية، في اليدين",
+common_name: "تغيرات جلدية على إحدى أو كلتا اليدين",
+},
+{
+id: "s_1983",
+type: "symptom",
+name: "آفة جفنيّة، حاكّة",
+common_name: "تغيرات جلدية حاكة على الجفن",
+},
+{
+id: "s_1985",
+type: "symptom",
+name: "سعال، ليلي",
+common_name: "سعال في الليل",
+},
+{
+id: "s_1988",
+type: "symptom",
+name: "تغيرات جلدية، متوسعة",
+common_name: "تغيرات جلدية تزداد بحجمها وانتشارها",
+},
+{
+id: "s_1994",
+type: "symptom",
+name: "سيلان من الأذن، مفرزات قيحية",
+common_name: "خروج سائل أخضر أو أصفر اللون من الأذن",
+},
+{
+id: "s_1995",
+type: "symptom",
+name: "وذمة، في القدمين",
+common_name: "قدمان متورمتان",
+},
+{
+id: "s_1996",
+type: "symptom",
+name: "وذمة، في الأنف",
+common_name: "تورم في الأنف",
+},
+{
+id: "s_1997",
+type: "symptom",
+name: "وذمة، في إصبع القدم",
+common_name: "تورم في إصبع من أصابع القدم",
+},
+{
+id: "s_1999",
+type: "symptom",
+name: "حمامى، في الفرج",
+common_name: "احمرار في الفرج",
+},
+{
+id: "s_2000",
+type: "symptom",
+name: "حمى تتجاوز 40° درجة مئوية (أي 104° درجة فهرنهايتية)",
+common_name: "ارتفاع درجة حرارة الجسم فوق 40° درجة مئوية (أي فوق 104° درجة فهرنهايتية)",
+},
+{
+id: "s_2001",
+type: "symptom",
+name: "خدر، في طرف سفلي واحد",
+common_name: "تنميل في طرف سفلي واحد",
+},
+{
+id: "s_2002",
+type: "symptom",
+name: "خفقان، لأكثر من 5 دقائق",
+common_name: "خفقان يستمر أكثر من 5 دقائق",
+},
+{
+id: "s_2003",
+type: "symptom",
+name: "حمامى، على إصبع من أصابع القدم",
+common_name: "إصبع محمر",
+},
+{
+id: "s_2004",
+type: "symptom",
+name: "خفقان، ناكس",
+common_name: "تكرر حالات الخفقان",
+},
+{
+id: "s_2005",
+type: "symptom",
+name: "ألم في الظفر",
+common_name: "ظفر مؤلم",
+},
+{
+id: "s_2006",
+type: "symptom",
+name: "ألم صدري، يشتد بالاستلقاء",
+common_name: "ألم في الصدر يزداد عند الاستلقاء",
+},
+{
+id: "s_2008",
+type: "symptom",
+name: "تقلصات رحمية منتظمة",
+common_name: "تقلصات رحمية منتظمة",
+},
+{
+id: "s_2010",
+type: "symptom",
+name: "تمزق السلى",
+common_name: "نزول ماء الجنين",
+},
+{
+id: "s_2011",
+type: "symptom",
+name: "مستوى جلوكوز الدم، بين 54 و70 ملغ/دل أو بين 3.0 و3.9 ممول/ل",
+common_name: "مستوى السكر في الدم بين 54 و70 ملغ/دل",
+},
+{
+id: "s_2014",
+type: "symptom",
+name: "مستوى جلوكوز الدم، غير مقيس",
+common_name: "لم يتم قياس مستوى السكر في الدم",
+},
+{
+id: "s_2016",
+type: "symptom",
+name: "رُعاف، مرة واحدة",
+common_name: "نزف من الأنف لمرة واحدة",
+},
+{
+id: "s_2017",
+type: "symptom",
+name: "رُعاف، متكرر",
+common_name: "نزيف متكرر من الأنف",
+},
+{
+id: "s_2018",
+type: "symptom",
+name: "ألم صدري، يستمر أقل من 30 دقيقة",
+common_name: "ألم في الصدر يستمر لأقل من 30 دقيقة",
+},
+{
+id: "s_2019",
+type: "symptom",
+name: "ألم صدري، يستمر بين 30 دقيقة و8 ساعات",
+common_name: "ألم في الصدر يستمر بين 30 دقيقة و8 ساعات",
+},
+{
+id: "s_2022",
+type: "symptom",
+name: "ألم صدري، يستمر أكثر من 8 ساعات",
+common_name: "ألم في الصدر يستمر أكثر من 8 ساعات",
+},
+{
+id: "s_2023",
+type: "symptom",
+name: "دوخة، ناكسة",
+common_name: "دوخة ناكسة",
+},
+{
+id: "s_2024",
+type: "symptom",
+name: "القمار المرضي",
+common_name: "القمار المفرط",
+},
+{
+id: "s_2029",
+type: "symptom",
+name: "لعب القمار، مع الكذب فيما يتعلق به",
+common_name: "الكذب فيما يتعلق بالقمار والمبالغ التي تنفق فيه",
+},
+{
+id: "s_2032",
+type: "symptom",
+name: "لعب القمار",
+common_name: "لعب القمار",
+},
+{
+id: "s_2033",
+type: "symptom",
+name: "حكة جلدية، في القدم",
+common_name: "حكة في قدم واحدة أو كلتيهما",
+},
+{
+id: "s_2034",
+type: "symptom",
+name: "اضطرابات في الوعي",
+common_name: "عدم التوجه أو التشوش",
+},
+{
+id: "s_2041",
+type: "symptom",
+name: "هالات حول الأضواء",
+common_name: "هالات حول الأضواء",
+},
+{
+id: "s_2043",
+type: "symptom",
+name: "حكة قضيبية",
+common_name: "حكة في القضيب",
+},
+{
+id: "s_2045",
+type: "symptom",
+name: "صرع",
+common_name: "اختلاج",
+},
+{
+id: "s_2047",
+type: "symptom",
+name: "نوب الغياب",
+common_name: "نوب الغياب",
+},
+{
+id: "s_2048",
+type: "symptom",
+name: "السلس البولي الليلي",
+common_name: "تبليل الفراش",
+},
+{
+id: "s_2051",
+type: "symptom",
+name: "ألم صدري، يشتد بحركة جدار الصدر",
+common_name: "ألم في الصدر يزداد عند تحريك الجذع",
+},
+{
+id: "s_2052",
+type: "symptom",
+name: "عقم ذكري",
+common_name: "عقم ذكري",
+},
+{
+id: "s_2053",
+type: "symptom",
+name: "غائط هلامي أحمر عنبي",
+common_name: "براز هلامي أحمر عنبي كمربى التوت",
+},
+{
+id: "s_2055",
+type: "symptom",
+name: "إقياء، صفراوي",
+common_name: "تقيؤ لونه أصفر مخضر",
+},
+{
+id: "s_2056",
+type: "symptom",
+name: "إقياء، لأقل من 7 أيام",
+common_name: "إقياء استمر أقل من أسبوع",
+},
+{
+id: "s_2057",
+type: "symptom",
+name: "إقياء، استمر لأكثر من 7 أيام",
+common_name: "تقيؤ استمر لأكثر من 7 أيام",
+},
+{
+id: "s_2058",
+type: "symptom",
+name: "تغيرات جلدية، على الأسطح العاطفة",
+common_name: "تغيرات جلدية على الوجه الداخلي من المفاصل",
+},
+{
+id: "s_2059",
+type: "symptom",
+name: "تغيرات جلدية، على الفروة",
+common_name: "تغيرات جلدية على الفروة",
+},
+{
+id: "s_2060",
+type: "symptom",
+name: "تغيرات جلدية، على الجذع",
+common_name: "تغيرات في جلد الرقبة أو الصدر أو البطن أو الظهر",
+},
+{
+id: "s_2063",
+type: "symptom",
+name: "حمى، لا تستجيب للعلاج",
+common_name: "ارتفاع في درجة حرارة الجسم لا تخف على خافضات الحرارة",
+},
+{
+id: "s_2064",
+type: "symptom",
+name: "بول ذو رائحة كريهة",
+common_name: "بول كريه الرائحة",
+},
+{
+id: "s_2065",
+type: "symptom",
+name: "ألم في الفم",
+common_name: "ألم في الفم",
+},
+{
+id: "s_2066",
+type: "symptom",
+name: "اختلاف في طول الأطرف",
+common_name: "عدم تساوي طول الأطراف",
+},
+{
+id: "s_2068",
+type: "symptom",
+name: "شحوب في الطرف العلوي",
+common_name: "ذراع شاحبة",
+},
+{
+id: "s_2070",
+type: "symptom",
+name: "ألم عظمي، يستمر لأقل من أسبوع",
+common_name: "ألم في العظم يستمر لأقل من أسبوع",
+},
+{
+id: "s_2071",
+type: "symptom",
+name: "ألم عظمي، يدوم أسبوعاً أو أكثر",
+common_name: "ألم في العظام يستمر أسبوعاً أو أكثر",
+},
+{
+id: "s_2072",
+type: "symptom",
+name: "اضطرابات وعي، حادّة",
+common_name: "عدم توجه أو تشوش ذهني بدأ مؤخراً",
+},
+{
+id: "s_2073",
+type: "symptom",
+name: "اضطرابات وعي، مزمنة",
+common_name: "عدم توجه أو تشوش ذهني يستمر لأكثر من أسبوع",
+},
+{
+id: "s_2074",
+type: "symptom",
+name: "ألم صدري، ينتشر إلى الطرف العلوي الأيسر",
+common_name: "ألم في الصدر ينتشر إلى الطرف العلوي الأيسر",
+},
+{
+id: "s_2076",
+type: "symptom",
+name: "ضائقة تنفسية، بعد رض",
+common_name: "اضطرابات تنفسية بعد التعرض لإصابة",
+},
+{
+id: "s_2077",
+type: "symptom",
+name: "جرح، بنزف شديد",
+common_name: "جرح نازف بشدة",
+},
+{
+id: "s_2078",
+type: "symptom",
+name: "جرح، بنزيف بسيط لا يمكن إيقافه",
+common_name: "جرح نازف بشكل بسيط ولكن لا يمكن إيقافه",
+},
+{
+id: "s_2079",
+type: "symptom",
+name: "رض حديث بدون نزف",
+common_name: "رض حديث بدون نزف",
+},
+{
+id: "s_2081",
+type: "symptom",
+name: "ألم شديد، بعد رض",
+common_name: "ألم شديد بعد حادث",
+},
+{
+id: "s_2084",
+type: "symptom",
+name: "تكدّم حول الحجاج",
+common_name: "تكدّم حول العينين",
+},
+{
+id: "s_2085",
+type: "symptom",
+name: "ألم في الظهر، يشتد بالجس",
+common_name: "ألم في الظهر يشتد عند لمس أو ضغط المنطقة المؤلمة",
+},
+{
+id: "s_2086",
+type: "symptom",
+name: "عدم القدرة على حمل ثقل الجسم، بعد رض",
+common_name: "عدم القدرة على الوقوف على أي من القدمين بعد التعرض لإصابة",
+},
+{
+id: "s_2087",
+type: "symptom",
+name: "تشوه مفصلي، بعد رض",
+common_name: "تشوه مفصل بعد التعرض لإصابة ما",
+},
+{
+id: "s_2088",
+type: "symptom",
+name: "أذية جسدية",
+common_name: "إصابة",
+},
+{
+id: "s_2091",
+type: "symptom",
+name: "ألم في كلا الطرفين العلويين، في كلتا اليدين",
+common_name: "ألم في كلتا اليدين",
+},
+{
+id: "s_2092",
+type: "symptom",
+name: "ألم في كلا الطرفين السفليين، في كلا القدمين",
+common_name: "ألم في كلا القدمين",
+},
+{
+id: "s_2093",
+type: "symptom",
+name: "وذمة، في كلتا اليدين",
+common_name: "تورّم في كلتا اليدين",
+},
+{
+id: "s_2094",
+type: "symptom",
+name: "جفاف العينين",
+common_name: "عينين جافتين",
+},
+{
+id: "s_2096",
+type: "symptom",
+name: "ألم صدري، حارق",
+common_name: "ألم حارق في الصدر",
+},
+{
+id: "s_2097",
+type: "symptom",
+name: "إعادة تذكر حدث راض، يؤدي لأعراض تطفلية",
+common_name: "إعادة تذكر حدث راض من خلال ومضات من الذاكرة أو أحلام",
+},
+{
+id: "s_2100",
+type: "symptom",
+name: "تعب",
+common_name: "تعب",
+},
+{
+id: "s_2103",
+type: "symptom",
+name: "وذمة، في القدم",
+common_name: "تورم في القدم",
+},
+{
+id: "s_2105",
+type: "symptom",
+name: "إعادة تذكر حدث راض، يؤدي لأعراض جسدية أو نفسية",
+common_name: "المعاناة من أعراض جسدية أو نفسية نتيجة إعادة تذكر حدث راض",
+},
+{
+id: "s_2107",
+type: "symptom",
+name: "الاستيقاظ في الليل",
+common_name: "الاستيقاظ في الليل",
+},
+{
+id: "s_2108",
+type: "symptom",
+name: "اضطرابات معرفية",
+common_name: "اضطرابات معرفية",
+},
+{
+id: "s_2109",
+type: "symptom",
+name: "غيبوبة",
+common_name: "غيبوبة",
+},
+{
+id: "s_2110",
+type: "symptom",
+name: "تغيرات جلدية، في المنطقة التناسلية الأنثوية",
+common_name: "تغيرات جلدية على أو حول الأعضاء التناسلية الأنثوية",
+},
+{
+id: "s_2111",
+type: "symptom",
+name: "تغيرات جلدية، في المنطقة التناسلية الذكرية",
+common_name: "تغيرات جلدية على الأعضاء التناسلية الذكرية أو حولها",
+},
+{
+id: "s_2112",
+type: "symptom",
+name: "ألم صدري جنبي بعد رض",
+common_name: "ألم صدري حاد ومفاجئ بعد أذية",
+},
+{
+id: "s_2115",
+type: "symptom",
+name: "نزف مهبلي، أثناء الحمل",
+common_name: "نزف من المهبل أثناء الحمل",
+},
+{
+id: "s_2116",
+type: "symptom",
+name: "نزيف مهبلي أثناء الحمل، خفيف",
+common_name: "تمشيح من المهبل أثناء الحمل",
+},
+{
+id: "s_2118",
+type: "symptom",
+name: "دوخة لا تُحتمل",
+common_name: "دوخة لا تحتمل",
+},
+{
+id: "s_2119",
+type: "symptom",
+name: "قرحة، غير مؤلمة",
+common_name: "قرحة غير مؤلمة",
+},
+{
+id: "s_2121",
+type: "symptom",
+name: "القلس",
+common_name: "ارتجاع حمض المعدة",
+},
+{
+id: "s_2122",
+type: "symptom",
+name: "هبوط المستقيم",
+common_name: "هبوط المستقيم",
+},
+{
+id: "s_2124",
+type: "symptom",
+name: "تنفّس صاخب",
+common_name: "تنفّس صاخب",
+},
+{
+id: "s_2125",
+type: "symptom",
+name: "انبثاق الأغشية الجنينية، سائل أمنيوسي قيحي أو كريه الرائحة",
+common_name: "ماء جنيني متلوّن أو كريه الرائحة",
+},
+{
+id: "s_2126",
+type: "symptom",
+name: "إسهال، يستمر أقل من 48 ساعة",
+common_name: "إسهال يستمر أقل من 48 ساعة",
+},
+{
+id: "s_2129",
+type: "symptom",
+name: "المشي أثناء النوم",
+common_name: "مشي أثناء النوم",
+},
+{
+id: "s_2132",
+type: "symptom",
+name: "نزف من جذع الحبل السري",
+common_name: "نزف من جذع الحبل السري",
+},
+{
+id: "s_2133",
+type: "symptom",
+name: "انتباج اليافوخ",
+common_name: "انتباج الأماكن اللينة من رأس الطفل",
+},
+{
+id: "s_2134",
+type: "symptom",
+name: "سحب ضلعي",
+common_name: "سحب ضلعي",
+},
+{
+id: "s_2135",
+type: "symptom",
+name: "شحوب حول الفم",
+common_name: "جلد أبيض فاتح حول الفم",
+},
+{
+id: "s_2138",
+type: "symptom",
+name: "بكاء دون انهمار للدموع",
+common_name: "بكاء دون انهمار للدموع",
+},
+{
+id: "s_2139",
+type: "symptom",
+name: "تغيرات جلدية، في الطيات",
+common_name: "تغيرات جلدية بين الثنيات",
+},
+{
+id: "s_2140",
+type: "symptom",
+name: "رفع الساقين لتكون الركبة ملاصقة للجذع",
+common_name: "رفع الساقين لتكون الركبة ملاصقة للجذع",
+},
+{
+id: "s_2141",
+type: "symptom",
+name: "مفرزات عينية",
+common_name: "خروج مفرزات من العين",
+},
+{
+id: "s_2142",
+type: "symptom",
+name: "عدم كسب الوزن",
+common_name: "زيادة الوزن بوتيرة بطيئة",
+},
+{
+id: "s_2143",
+type: "symptom",
+name: "طحّة زفيرية",
+common_name: "إصدار صوت شخير مع كل نَفَس",
+},
+{
+id: "s_2144",
+type: "symptom",
+name: "مظهر المريض",
+common_name: "مظهر المريض",
+},
+{
+id: "s_2145",
+type: "symptom",
+name: "مظهر المريض، يبعث على القلق الشديد",
+common_name: "مظهر المريض الذي يبعث على القلق الشديد",
+},
+{
+id: "s_2148",
+type: "symptom",
+name: "زيادة مُحيط الرأس",
+common_name: "زيادة مُحيط الرأس",
+},
+{
+id: "s_2149",
+type: "symptom",
+name: "تهيّج، يدوم أكثر من 3 أيام",
+common_name: "سرعة في الغضب تستمر أكثر من 3 أشهر",
+},
+{
+id: "s_2150",
+type: "symptom",
+name: "زلة تنفسية، في الليل",
+common_name: "صعوبة تنفس في الليل",
+},
+{
+id: "s_2151",
+type: "symptom",
+name: "خلل القدرة على تثبيت العينين",
+common_name: "عدم القدرة على تثبيت العينين",
+},
+{
+id: "s_2153",
+type: "symptom",
+name: "سيلان أنفي، مخاطي",
+common_name: "سيلان مفرزات رائقة أو بيضاء من الأنف",
+},
+{
+id: "s_2154",
+type: "symptom",
+name: "سيلان أنفي، قيحي",
+common_name: "سيلان مفرزات صفراء أو خضراء من الأنف",
+},
+{
+id: "s_2155",
+type: "symptom",
+name: "رفرفة المنخرين",
+common_name: "رفرفة المنخرين",
+},
+{
+id: "s_2156",
+type: "symptom",
+name: "إقياء يلي السعال",
+common_name: "إقياء بعد السعال",
+},
+{
+id: "s_2157",
+type: "symptom",
+name: "بقاء الحبل السري",
+common_name: "بقاء الحبل السري",
+},
+{
+id: "s_2159",
+type: "symptom",
+name: "غؤور اليافوخ",
+common_name: "انخفاض اليافوخ في رأس طفل رضيع",
+},
+{
+id: "s_2160",
+type: "symptom",
+name: "بزوغ الأسنان",
+common_name: "ظهور الأسنان",
+},
+{
+id: "s_2162",
+type: "symptom",
+name: "إمساك، يدوم 3 أشهر أو أكثر",
+common_name: "إمساك يستمر 3 أشهر أو أكثر",
+},
+{
+id: "s_2163",
+type: "symptom",
+name: "التواء عنق",
+common_name: "التواء عنق",
+},
+{
+id: "s_2164",
+type: "symptom",
+name: "تناول طعام أو شراب منتهي الصلاحية",
+common_name: "تناول أطعمة أو مشاريب فاسدة",
+},
+{
+id: "s_2165",
+type: "symptom",
+name: "سعال، ضباحي",
+common_name: "سعال كالنباح",
+},
+{
+id: "s_2166",
+type: "symptom",
+name: "وزيز، حاد",
+common_name: "وزيز حاد",
+},
+{
+id: "s_2168",
+type: "symptom",
+name: "درجة حرارة الجسم طبيعية",
+common_name: "درجة حرارة الجسم طبيعية",
+},
+{
+id: "s_2169",
+type: "symptom",
+name: "معدل ضربات قلب طبيعي",
+common_name: "نبض طبيعي",
+},
+{
+id: "s_2170",
+type: "symptom",
+name: "تظاهر لايرقاني",
+common_name: "تظاهر لايرقاني",
+},
+{
+id: "s_2171",
+type: "symptom",
+name: "أصوات تنفسية طبيعية بإصغاء الصدر",
+common_name: "أصوات تنفسية طبيعية بإصغاء الصدر",
+},
+{
+id: "s_2172",
+type: "symptom",
+name: "غياب أي علامات لإنتان طرق تنفسية علوية",
+common_name: "غياب أي علامات لإنتان طرق تنفسية علوية",
+},
+{
+id: "s_2173",
+type: "symptom",
+name: "ألم في العنق، عند تحريك الرأس",
+common_name: "ألم في الرقبة عند تحريك الرأس",
+},
+{
+id: "s_2174",
+type: "symptom",
+name: "علامات حيوية طبيعية",
+common_name: "علامات حيوية طبيعية",
+},
+{
+id: "s_2175",
+type: "symptom",
+name: "احتمال إصابة بالكَلَب",
+common_name: "عضّة حيوان",
+},
+{
+id: "s_2176",
+type: "symptom",
+name: "زلة تنفسية، تستمر بين ساعة و24 ساعة",
+common_name: "ضيق تنفس يستمر ما بين ساعة و24 ساعة",
+},
+{
+id: "s_2177",
+type: "symptom",
+name: "تغيّرات جلديّة، بلون أحمر فاتح أو زهري",
+common_name: "تغيّرات في الجلد باللون الأحمر الفاتح أو الزهري",
+},
+{
+id: "s_2178",
+type: "symptom",
+name: "وزيز، تحت حاد",
+common_name: "وزيز بدأ منذ بضعة أيام أو أسابيع",
+},
+{
+id: "s_2180",
+type: "symptom",
+name: "تشوه عظمي، غير رضي",
+common_name: "تشوّه في العظام غير مترافق مع أي إصابة حديثة",
+},
+{
+id: "s_2181",
+type: "symptom",
+name: "تشوّه عظمي، تالي لرض",
+common_name: "تشوه في العظام بعد التعرض لإصابة حديثة",
+},
+{
+id: "s_2182",
+type: "symptom",
+name: "ألم في الخاصرة",
+common_name: "ألم في إحدى أو كلا الخاصرتين",
+},
+{
+id: "s_2188",
+type: "symptom",
+name: "سيلان عيني، قيحي",
+common_name: "خروج مفرزات قيحية من العين",
+},
+{
+id: "s_2189",
+type: "symptom",
+name: "صداع، حديث، يستمر لأقل من ساعة",
+common_name: "وجع في الرأس يستمر لأقل من ساعة",
+},
+{
+id: "s_2190",
+type: "symptom",
+name: "صداع، حديث، يستمر أكثر من ساعة وأقل من يوم",
+common_name: "ألم في الرأس يستمر لأكثر من ساعة وأقل من يوم",
+},
+{
+id: "s_2191",
+type: "symptom",
+name: "صداع، حديث، يستمر لأكثر من يوم",
+common_name: "وجع في الرأس يستمر لأكثر من يوم",
+},
+{
+id: "s_2193",
+type: "symptom",
+name: "فرك الأذن",
+common_name: "شد الأذن",
+},
+{
+id: "s_2194",
+type: "symptom",
+name: "إسهال، يستمر بين 2 و14 يوماً",
+common_name: "إسهال يستمر بين 2 و14 يوماً",
+},
+{
+id: "s_2196",
+type: "symptom",
+name: "برودة في القدم وأصابعها، أحادي الجانب",
+common_name: "قدم باردة",
+},
+{
+id: "s_2200",
+type: "symptom",
+name: "شفع، يستمر أقل من 24 ساعة",
+common_name: "رؤية مزدوجة تستمر أقل من 24 ساعة",
+},
+{
+id: "s_2201",
+type: "symptom",
+name: "شفع، يستمر لأكثر من 24 ساعة",
+common_name: "رؤية مزدوجة تستمر لأكثر من 24 ساعة",
+},
+{
+id: "s_2203",
+type: "symptom",
+name: "زلة تنفسية، بعد عدّة دقائق من المشي",
+common_name: "ضيق في التنفس بعد المشي لعدة دقائق",
+},
+{
+id: "s_2204",
+type: "symptom",
+name: "زلة تنفسية، على الجهد",
+common_name: "ضيق في التنفس أثناء الجهد",
+},
+{
+id: "s_2206",
+type: "symptom",
+name: "الجُلاع",
+common_name: "تضيق جلد القلفة وتراجعها للخلف",
+},
+{
+id: "s_2207",
+type: "symptom",
+name: "وذمة، في القضيب",
+common_name: "قضيب متورم",
+},
+{
+id: "s_2208",
+type: "symptom",
+name: "قرحة، لم تشفى خلال 6 أسابيع",
+common_name: "قرحة لا تشفى",
+},
+{
+id: "s_2209",
+type: "symptom",
+name: "نوبات صرعية متكررة",
+common_name: "اختلاجات متكررة",
+},
+{
+id: "s_2211",
+type: "symptom",
+name: "شرى، استمر أكثر من 6 أسابيع",
+common_name: "حكّة استمرت أكثر من 6 أسابيع",
+},
+{
+id: "s_2212",
+type: "symptom",
+name: "مفرزات مهبلية قيحية",
+common_name: "مفرزات مهبلية قيحية",
+},
+{
+id: "s_2213",
+type: "symptom",
+name: "سلوك مؤذي للنفس أو التفكير بذلك",
+common_name: "إيذاء للنفس أو التفكير بذلك",
+},
+{
+id: "s_2222",
+type: "symptom",
+name: "جرح، في الشفة",
+common_name: "جرح في الشفة",
+},
+{
+id: "s_2226",
+type: "symptom",
+name: "احتقان أنفي، ساء بعد تحسّنه لفترة قصيرة",
+common_name: "أنف مسدود يزداد سوءاً بعد تحسّنه لفترة قصيرة",
+},
+{
+id: "s_2228",
+type: "symptom",
+name: "إيذاء حديث للنفس",
+common_name: "القيام بسلوك مؤذي للنفس حديثاً",
+},
+{
+id: "s_2230",
+type: "symptom",
+name: "إيذاء حديث للنفس، شديد",
+common_name: "إيذاء حديث وشديد للنفس",
+},
+{
+id: "s_2231",
+type: "symptom",
+name: "زلة تنفسيّة، غير معروفة الشدة",
+common_name: "ضيق في التنفس ذو شدة غير معروفة",
+},
+{
+id: "s_2234",
+type: "symptom",
+name: "عدم تناظر في حجم أو شكل الثديين",
+common_name: "ثديين غير متماثلين",
+},
+{
+id: "s_2236",
+type: "symptom",
+name: "حمامى، في الصفن",
+common_name: "احمرار في الصفن",
+},
+{
+id: "s_2238",
+type: "symptom",
+name: "عدم تناظر الثنيات الجلدية الفخذية",
+common_name: "عدم تناظر الثنيات الجلدية في الفخذ",
+},
+{
+id: "s_2241",
+type: "symptom",
+name: "نز مفرزات من السرة",
+common_name: "سيلان مفرزات من السرة",
+},
+{
+id: "s_2242",
+type: "symptom",
+name: "ألم عيني، لا يُحتمل",
+common_name: "ألم غير محتمل في العين",
+},
+{
+id: "s_2245",
+type: "symptom",
+name: "أذية للأعضاء التناسلية الذكريّة",
+common_name: "أذية للأعضاء التناسلية الذكريّة",
+},
+{
+id: "s_2246",
+type: "symptom",
+name: "أذية للأعضاء التناسلية الأنثوية",
+common_name: "أذية للأعضاء التناسلية الأنثوية",
+},
+{
+id: "s_2247",
+type: "symptom",
+name: "تضخّم مقدمة العنق",
+common_name: "تورم في مقدمة الرقبة",
+},
+{
+id: "s_2248",
+type: "symptom",
+name: "تضخّم العقد اللمفاوية الرقبية",
+common_name: "تضخّم العقد اللمفاوية في الرقبة",
+},
+{
+id: "s_2251",
+type: "symptom",
+name: "معدل ضربات قلب مجهول",
+common_name: "سرعة النبض مجهولة",
+},
+{
+id: "s_2252",
+type: "symptom",
+name: "مضض بطني، في الربع السفلي الأيسر",
+common_name: "ألم في البطن عند الضغط على الجزء السفلي الأيسر منه",
+},
+{
+id: "s_2253",
+type: "symptom",
+name: "القدم المسطحة",
+common_name: "القدم المسحاء",
+},
+{
+id: "s_2259",
+type: "symptom",
+name: "صرع انعكاسي",
+common_name: "اختلاج انعكاسي",
+},
+{
+id: "s_2260",
+type: "symptom",
+name: "تراجع اللثة",
+common_name: "لثة متراجعة",
+},
+{
+id: "s_2261",
+type: "symptom",
+name: "ضخامة في عضلات الساق",
+common_name: "زيادة في حجم عضلات الساق",
+},
+{
+id: "s_2262",
+type: "symptom",
+name: "علامة جاور",
+common_name: "النهوض من وضعية الجلوس بمساعدة اليدين واستنادهما على الساقين",
+},
+{
+id: "s_2263",
+type: "symptom",
+name: "نوبات تيت",
+common_name: "نوبات تيت",
+},
+{
+id: "s_2264",
+type: "symptom",
+name: "تعب، أثناء تناول الطعام",
+common_name: "تعب أثناء تناول الطعام",
+},
+{
+id: "s_2266",
+type: "symptom",
+name: "تغيرات جلدية، على الطرفين العلويين وتعف عن اليدين",
+common_name: "تغيرات على جلد الكتف أو الذراع أو الساعد أو المرفق أو المعصم",
+},
+{
+id: "s_2267",
+type: "symptom",
+name: "تغيرات جلدية، على الطرفين السفليين وتعف عن القدمين",
+common_name: "تغيرات جلدية على الورك أو الفخذ أو الركبة أو الساق أو الكاحل",
+},
+{
+id: "s_2268",
+type: "symptom",
+name: "سعال، متغيّر الإنتاج",
+common_name: "سعال مع خروج لبلغم أو مخاط بين الفينة والأخرى",
+},
+{
+id: "s_2269",
+type: "symptom",
+name: "طفح حويصلي على الشفتين أو في الجلد حول الفم",
+common_name: "بثرات على الشفتين أو حول الفم",
+},
+{
+id: "s_2270",
+type: "symptom",
+name: "طفح حويصلي في الأذن",
+common_name: "بثرات على الأذن",
+},
+{
+id: "s_2271",
+type: "symptom",
+name: "أعراض هضمية بعد تناول أطعمة حاوية على الغلوتين",
+common_name: "حدوث أعراض بطنية بعد تناول طعام حاو على الغلوتين",
+},
+{
+id: "s_2272",
+type: "symptom",
+name: "ضغط الدم، طبيعي أو ما قبل ارتفاع الضغط الشرياني",
+common_name: "ضغط دم طبيعي",
+},
+{
+id: "s_2273",
+type: "symptom",
+name: "ضغط الدم، غير مُقاس",
+common_name: "لم يتم قياس ضغط الدم",
+},
+{
+id: "s_2274",
+type: "symptom",
+name: "تباطؤ في النمو",
+common_name: "بطء النمو",
+},
+{
+id: "s_2275",
+type: "symptom",
+name: "ألم بطني، موضّع",
+common_name: "ألم متوضع في جزء من البطن",
+},
+{
+id: "s_2276",
+type: "symptom",
+name: "نزف شرجي، خفيف",
+common_name: "نزف خفيف من الشرج",
+},
+{
+id: "s_2277",
+type: "symptom",
+name: "نزف شرجي، شديد",
+common_name: "نزف شديد من الشرج",
+},
+{
+id: "s_2278",
+type: "symptom",
+name: "رنح حاد",
+common_name: "صعوبات حديثة بتنسيق الحركات",
+},
+{
+id: "s_2279",
+type: "symptom",
+name: "رنح تحت حاد",
+common_name: "صعوبات في تنسيق الحركات منذ بضعة أيام أو أسابيع أو أشهر",
+},
+{
+id: "s_2280",
+type: "symptom",
+name: "رنح مزمن",
+common_name: "صعوبات بتنسيق الحركات منذ أكثر من سنة",
+},
+{
+id: "s_2281",
+type: "symptom",
+name: "ألم بطني، غير محدد الموضع",
+common_name: "ألم بطني، غير محدد الموضع",
+},
+{
+id: "s_2282",
+type: "symptom",
+name: "شحوب الجلد، في أصابع اليدين",
+common_name: "أصابع يدين شاحبة",
+},
+{
+id: "s_2283",
+type: "symptom",
+name: "صرير الأسنان",
+common_name: "احتكاك الأسنان ببعضها",
+},
+{
+id: "s_2284",
+type: "symptom",
+name: "ألم في الظهر، ليلي",
+common_name: "ألم في الظهر أثناء الليل",
+},
+{
+id: "s_2285",
+type: "symptom",
+name: "كتلة جلدية، في الثلم بين الإليتين",
+common_name: "كتلة أو نتوء في الشق بين الإليتين",
+},
+{
+id: "s_2288",
+type: "symptom",
+name: "ألم بطني، ذو نمط غير معروف",
+common_name: "ألم غير محدد النمط في البطن",
+},
+{
+id: "s_2289",
+type: "symptom",
+name: "قلق الانفصال",
+common_name: "الخوف من الانفصال",
+},
+{
+id: "s_2290",
+type: "symptom",
+name: "ضعف القدرات الكلامية واللغوية، بدء سريع",
+common_name: "صعوبة حديثة الظهور في التكلّم أو فهم اللغة",
+},
+{
+id: "s_2291",
+type: "symptom",
+name: "نزوف شظوية تحت الظفر",
+common_name: "بقع أو خطوط حمراء تحت الظفر",
+},
+{
+id: "s_2292",
+type: "symptom",
+name: "ضخامة العقد اللمفاوية الإبطية",
+common_name: "تضخّم العقد اللمفاوية الموجودة في الإبط",
+},
+{
+id: "s_2294",
+type: "symptom",
+name: "نوب غياب، انعكاسية",
+common_name: "نوب غياب انعكاسية",
+},
+{
+id: "s_2296",
+type: "symptom",
+name: "غصص",
+common_name: "اختناق",
+},
+{
+id: "s_2298",
+type: "symptom",
+name: "ألم مفصلي، ميكانيكي الطبيعة",
+common_name: "ألم في مفصل يزداد بالحركة ويخف عند الراحة",
+},
+{
+id: "s_2299",
+type: "symptom",
+name: "ألم مفصلي، التهابي الطبيعة",
+common_name: "ألم مفاصل يزداد بقلّة الحركة",
+},
+{
+id: "s_2300",
+type: "symptom",
+name: "ابتلاع جسم أجنبي",
+common_name: "ابتلاع شيء ما",
+},
+{
+id: "s_2302",
+type: "symptom",
+name: "فقدان الوعي، عابر",
+common_name: "إغماء",
+},
+{
+id: "s_2303",
+type: "symptom",
+name: "فقدان الوعي، دام أكثر من دقيقة واحدة",
+common_name: "فقدان الوعي، دام أكثر من دقيقة واحدة",
+},
+{
+id: "s_2304",
+type: "symptom",
+name: "خدر، في الطرفين العلويين",
+common_name: "تنميل في الطرفين العلويين",
+},
+{
+id: "s_2306",
+type: "symptom",
+name: "خدر، في الطرفين السفليين",
+common_name: "تنميل في الطرفين السفليين",
+},
+{
+id: "s_2307",
+type: "symptom",
+name: "احتفان أنفي، حاد",
+common_name: "انسداد في الأنف استمر أقل من 10 أيام",
+},
+{
+id: "s_2308",
+type: "symptom",
+name: "احتقان أنفي، تحت حاد",
+common_name: "انسداد في الأنف استمر أكثر من 10 أيام وأقل من 3 أشهر",
+},
+{
+id: "s_2309",
+type: "symptom",
+name: "كتلة في الناحية المأبضية",
+common_name: "كتلة خلف الركبة",
+},
+{
+id: "s_2311",
+type: "symptom",
+name: "ألم بطني، لا علاقة له بالدورة الشهرية",
+common_name: "ألم ثابت في البطن لا يتغير خلال الدورة الشهرية",
+},
+{
+id: "s_2314",
+type: "symptom",
+name: "ألم في الظهر، قطني، ينتشر بشكل غير معروف",
+common_name: "ألم أسفل الظهر ينتشر بشكل غير معروف",
+},
+{
+id: "s_2315",
+type: "symptom",
+name: "خدر، في قدم واحدة",
+common_name: "تنميل في قدم واحدة",
+},
+{
+id: "s_2316",
+type: "symptom",
+name: "إسهال، ذو نمط غير معروف",
+common_name: "إسهال، ذو نمط غير معروف",
+},
+{
+id: "s_2319",
+type: "symptom",
+name: "حمى، تدوم أقل من 3 أيام",
+common_name: "ارتفاع درجة حرارة الجسم يستمر أقل من 3 أيام",
+},
+{
+id: "s_2320",
+type: "symptom",
+name: "حمى، تدوم 3-7 أيام",
+common_name: "ارتفاع في درجة حرارة الجسم يستمر فترة تتراوح بين 3 و7 أيام",
+},
+{
+id: "s_2322",
+type: "symptom",
+name: "إسهال، يدوم أكثر من 4 أسابيع",
+common_name: "إسهال يستمر أكثر من 4 أسابيع",
+},
+{
+id: "s_2328",
+type: "symptom",
+name: "إسهال، يدوم 2-4 أسبوعاً",
+common_name: "إسهال يستمر ما بين أسبوعين و4 أسابيع",
+},
+{
+id: "s_2329",
+type: "symptom",
+name: "سيلان عيني، سميك ورائق",
+common_name: "خروج مفرزات غير قيحية من العين",
+},
+{
+id: "s_2330",
+type: "symptom",
+name: "ضعف عضلي، معمم",
+common_name: "ضعف في كل عضلات الجسم",
+},
+{
+id: "s_2335",
+type: "symptom",
+name: "ألم في الطرف السفلي، في القصبة",
+common_name: "ألم في قصبة الساق",
+},
+{
+id: "s_2336",
+type: "symptom",
+name: "ثر الحليب عند رجل",
+common_name: "خروج مفرزات حليبية من الحلمة",
+},
+{
+id: "s_2338",
+type: "symptom",
+name: "مفرزات مهبلية، رمادية اللون",
+common_name: "مفرزات مهبلية رمادية اللون",
+},
+{
+id: "s_2341",
+type: "symptom",
+name: "كدمة",
+common_name: "كدمة",
+},
+{
+id: "s_2344",
+type: "symptom",
+name: "صعوبات في الكتابة",
+common_name: "صعوبات في الكتابة",
+},
+{
+id: "s_2351",
+type: "symptom",
+name: "صعوبة في القراءة",
+common_name: "صعوبة في القراءة",
+},
+{
+id: "s_2352",
+type: "symptom",
+name: "صعوبات رياضية",
+common_name: "صعوبة في تعلّم مادة الرياضيات",
+},
+{
+id: "s_2354",
+type: "symptom",
+name: "آفات فموية، متوضعة على البلعوم الخلفي",
+common_name: "آفات في الجزء الخلفي من الحلق",
+},
+{
+id: "s_2356",
+type: "symptom",
+name: "منطقة حمراء وحيدة، بقطر أكبر من 1 سم",
+common_name: "منطقة حمراء وحيدة بقطر أكبر من 1 سم",
+},
+{
+id: "s_2357",
+type: "symptom",
+name: "بقع حمراء متعددة، بقطر أكبر من 1 سم",
+common_name: "بقع حمراء متعددة بقطر أكبر من 1 سم",
+},
+{
+id: "s_2358",
+type: "symptom",
+name: "بقعة حمراء وحيدة، بقطر أقل من 1 سم",
+common_name: "بقعة حمراء وحيدة بقطر أقل من 1 سم",
+},
+{
+id: "s_2359",
+type: "symptom",
+name: "عدة بقع حمراء، بقطر أقل من 1 سم",
+common_name: "عدة بقع حمراء بقطر أقل من 1 سم",
+},
+{
+id: "s_2360",
+type: "symptom",
+name: "ورم دموي في الفروة",
+common_name: "كدمة في فروة الرأس",
+},
+{
+id: "s_2361",
+type: "symptom",
+name: "ألم عظمي، ليلي",
+common_name: "ألم في عظم يحدث أثناء الليل",
+},
+{
+id: "s_2362",
+type: "symptom",
+name: "علامة المعركة",
+common_name: "كدمة خلف الأذن",
+},
+{
+id: "s_2363",
+type: "symptom",
+name: "نز من الأنف، بعد رض",
+common_name: "خروج سائل من الأنف بعد رض",
+},
+{
+id: "s_2364",
+type: "symptom",
+name: "نز من الأذن، بعد رض",
+common_name: "خروج سائل من الأذن بعد التعرّض لرض",
+},
+{
+id: "s_2365",
+type: "symptom",
+name: "تأخّر انغلاق اليافوخ الأمامي",
+common_name: "تأخر التحام اليافوخ الأمامي",
+},
+{
+id: "s_2366",
+type: "symptom",
+name: "الحدبة الجبهية",
+common_name: "جبهة بارزة",
+},
+{
+id: "s_2367",
+type: "symptom",
+name: "التابس القحفي",
+common_name: "عظام جمجمة طريّة",
+},
+{
+id: "s_2369",
+type: "symptom",
+name: "خروج مفرزات غير طبيعية من جرح",
+common_name: "خروج مفرزات غير طبيعية من جرح",
+},
+{
+id: "s_2370",
+type: "symptom",
+name: "تغيرات جلدية حمراء، بأقطار مختلفة",
+common_name: "تغيرات جلدية حمراء،د بأقطار مختلفة",
+},
+{
+id: "s_2371",
+type: "symptom",
+name: "حمامى، غير محددة",
+common_name: "احمرار غير محدد الطبيعة في الجلد",
+},
+{
+id: "s_2373",
+type: "symptom",
+name: "نقص محيط الرأس",
+common_name: "صغر الرأس",
+},
+{
+id: "s_2374",
+type: "symptom",
+name: "لعب بنمط متكرر",
+common_name: "لعب وسلوك متكرر",
+},
+{
+id: "s_2375",
+type: "symptom",
+name: "الأكسجة الدموية غير مقاسة",
+common_name: "أكسجة الدم غير مُقاسَة",
+},
+{
+id: "s_2376",
+type: "symptom",
+name: "الأكسجة الدموية طبيعية",
+common_name: "مستوى أكسجة الدم طبيعية",
+},
+{
+id: "s_2377",
+type: "symptom",
+name: "جرح",
+common_name: "جرح",
+},
+{
+id: "s_2378",
+type: "symptom",
+name: "جرح في الجلد، رضي المنشأ",
+common_name: "جرح في الجلد بعد إصابة",
+},
+{
+id: "s_2379",
+type: "symptom",
+name: "جرح في الجلد، غير رضي",
+common_name: "جرح غير ناتج عن إصابة",
+},
+{
+id: "s_2381",
+type: "symptom",
+name: "عيوب في الميناء",
+common_name: "عيب في سن",
+},
+{
+id: "s_2382",
+type: "symptom",
+name: "تغيرات جلدية، موضّعة",
+common_name: "تغيرات جلدية محصورة في جزء محدد من الجسم",
+},
+{
+id: "s_2383",
+type: "symptom",
+name: "نقص تمعدن الميناء",
+common_name: "نقص تمعدن الميناء",
+},
+{
+id: "s_2384",
+type: "symptom",
+name: "عيوب في الميناء، متناظرة",
+common_name: "عيوب متناظرة في الأسنان",
+},
+{
+id: "s_2387",
+type: "symptom",
+name: "الأكسجة الدموية، بين 90% و94%",
+common_name: "أكسجة الدم بين 90% و94%",
+},
+{
+id: "s_2388",
+type: "symptom",
+name: "الأكسجة الدموية، بين 80% و89%",
+common_name: "أكسجة الدم بين 80% و89%",
+},
+{
+id: "s_2389",
+type: "symptom",
+name: "الأكسجة الدموية، أقل من 80%",
+common_name: "أكسجة الدم أقل من 80%",
+},
+{
+id: "s_2390",
+type: "symptom",
+name: "الأكسجة الدموية، متدهورة بشكل فجائي",
+common_name: "انخفاض مفاجئ في نسبة الأوكسجين في الدم",
+},
+{
+id: "s_2391",
+type: "symptom",
+name: "عيوب في الميناء، بقع",
+common_name: "بقع في سن",
+},
+{
+id: "s_2393",
+type: "symptom",
+name: "تغيّر لون سن إلى اللون الأبيض",
+common_name: "تغيّر لون سن إلى اللون الأبيض",
+},
+{
+id: "s_2396",
+type: "symptom",
+name: "تغيّر لون سن إلى اللون البني",
+common_name: "تلوّن سن باللون البني",
+},
+{
+id: "s_2398",
+type: "symptom",
+name: "جرح في الجلد، بعد جراحة",
+common_name: "جرح بعد عمل جراحي",
+},
+{
+id: "s_2399",
+type: "symptom",
+name: "جرح في الجلد، محدث ذاتياً",
+common_name: "جرح الذات",
+},
+{
+id: "s_2402",
+type: "symptom",
+name: "ألم أمام الأذن",
+common_name: "ألم أمام الأذن",
+},
+{
+id: "s_2403",
+type: "symptom",
+name: "انحراف الفك السفلي عند فتح الفم",
+common_name: "ميلان الفك السفلي عند فتح الفم",
+},
+{
+id: "s_2405",
+type: "symptom",
+name: "رجفان، يختفي عند إمساك الطرف أو أثناء الرضاعة",
+common_name: "رجفة تختفي عند إمساك الطرف أو أثناء الرضاعة",
+},
+{
+id: "s_2407",
+type: "symptom",
+name: "اشتباه بحالة تسمم",
+common_name: "حالة تسمم محتملة",
+},
+{
+id: "s_2408",
+type: "symptom",
+name: "التوتر الشرياني، بين 140 و179 ملم زئبقي",
+common_name: "ارتفاع ضغط الدم لما بين 140 و179 ملم زئبقي",
+},
+{
+id: "s_2409",
+type: "symptom",
+name: "التشاؤم",
+common_name: "التشاؤم",
+},
+{
+id: "s_2410",
+type: "symptom",
+name: "مضض بجس الصفن",
+common_name: "ألم عند الضغط على الصفن",
+},
+{
+id: "s_2412",
+type: "symptom",
+name: "تغيرات جلدية، على اللسان",
+common_name: "تغيرات جلدية على اللسان",
+},
+{
+id: "s_2413",
+type: "symptom",
+name: "آفات فموية، ذات حدود واضحة",
+common_name: "آفات واضحة الحدود في الفم",
+},
+{
+id: "s_2414",
+type: "symptom",
+name: "آفات فموية، متعددة",
+common_name: "آفات متعددة في الفم",
+},
+{
+id: "s_2416",
+type: "symptom",
+name: "آفات فموية، حمراء اللون",
+common_name: "آفات حمراء اللون في الفم",
+},
+{
+id: "s_2417",
+type: "symptom",
+name: "آفات فموية، أكبر من 1 سم",
+common_name: "آفات في الفم قطرها أكبر من 1 سم",
+},
+{
+id: "s_2421",
+type: "symptom",
+name: "ألم في الفم، بعد تناول طعام حار أو حامض",
+common_name: "ألم في الفم بعد تناول طعام حار أو حامض",
+},
+{
+id: "s_2422",
+type: "symptom",
+name: "آفات في الفم، تتغيّر بالموقع أو الحجم أو الشكل",
+common_name: "آفات في الفم تتغيّر بالمكان أو الحجم أو الشكل",
+},
+{
+id: "s_2424",
+type: "symptom",
+name: "آفات فموية، ناكسة",
+common_name: "آفات معاودة الظهور في الفم",
+},
+{
+id: "s_2428",
+type: "symptom",
+name: "ألم سني، متوسط الشدة",
+common_name: "ألم متوسط الشدة في سن",
+},
+{
+id: "s_2429",
+type: "symptom",
+name: "ألم سني، خفيف الشدة",
+common_name: "ألم خفيف الشدة في سن",
+},
+{
+id: "s_2430",
+type: "symptom",
+name: "ألم سني، محرض بسبب ما",
+common_name: "ألم في سن محرض بسبب ما",
+},
+{
+id: "s_2431",
+type: "symptom",
+name: "ألم سني، عفوي",
+common_name: "ألم عفوي في الأسنان",
+},
+{
+id: "s_2432",
+type: "symptom",
+name: "ألم سني، مترافق مع التعرّض لشيء بارد",
+common_name: "ألم في سن على البارد",
+},
+{
+id: "s_2433",
+type: "symptom",
+name: "ألم سني، عابر",
+common_name: "ألم عابر في الأسنان",
+},
+{
+id: "s_2438",
+type: "symptom",
+name: "ألم سني، ممض",
+common_name: "ألم ممض في سن",
+},
+{
+id: "s_2440",
+type: "symptom",
+name: "ألم سني، حاد",
+common_name: "ألم حاد في الأسنان",
+},
+{
+id: "s_2441",
+type: "symptom",
+name: "ألم سني، في أكثر من سن",
+common_name: "ألم في عدة أسنان",
+},
+{
+id: "s_2442",
+type: "symptom",
+name: "ألم سني، في سن واحد",
+common_name: "ألم في سن واحد",
+},
+{
+id: "s_2443",
+type: "symptom",
+name: "ألم سني، نابض",
+common_name: "ألم نابض في سن",
+},
+{
+id: "s_2446",
+type: "symptom",
+name: "ألم سني، منتشر",
+common_name: "ألم في الأسنان منتشر",
+},
+{
+id: "s_2449",
+type: "symptom",
+name: "ألم سني، مستمر",
+common_name: "ألم مستمر في الأسنان",
+},
+{
+id: "s_2450",
+type: "symptom",
+name: "ألم سني، يستمر 48 ساعة أو أكثر",
+common_name: "ألم في سن يستمر 48 ساعة أو أكثر",
+},
+{
+id: "s_2451",
+type: "symptom",
+name: "ألم سني، يترافق مع الاستلقاء",
+common_name: "ألم في سن يزداد عند الاستلقاء",
+},
+{
+id: "s_2452",
+type: "symptom",
+name: "ألم سني، يترافق مع تناول الحلويات أو الأطعمة والمشاريب الحامضية",
+common_name: "ألم في سن يترافق مع تناول الحلويات أو الأطعمة والمشاريب الحامضية",
+},
+{
+id: "s_2453",
+type: "symptom",
+name: "حشوة أسنان رخوة",
+common_name: "حشوة أسنان رخوة",
+},
+{
+id: "s_2454",
+type: "symptom",
+name: "إدخال جسم أجنبي، خطير",
+common_name: "إدخال جسم أجنبي خطير",
+},
+{
+id: "s_2455",
+type: "symptom",
+name: "ألم عضلي، بعد القيام بتمارين فيزيائية شديدة",
+common_name: "ألم في العضلات بعد القيام بتمارين رياضية شديدة",
+},
+{
+id: "s_2456",
+type: "symptom",
+name: "ألم سني، يستمر أقل من 48 ساعة",
+common_name: "ألم في سن يستمر أقل من 48 ساعة",
+},
+{
+id: "s_2461",
+type: "symptom",
+name: "توذّم في البلعوم",
+common_name: "تورّم في الحلق",
+},
+{
+id: "s_2462",
+type: "symptom",
+name: "لا قصة سابقة للإصابة بداء الأمعاء الالتهابي",
+common_name: "لا إصابة سابقة بداء الأمعاء الالتهابي",
+},
+{
+id: "s_2463",
+type: "symptom",
+name: "مضض بطني، في المنطقة الشرسوفية",
+common_name: "ألم في البطن عند الضغط على الجزء العلوي المتوسط منه",
+},
+{
+id: "s_2464",
+type: "symptom",
+name: "ضعف الرؤية، ثنائي الجانب",
+common_name: "ضعف في الرؤية في كلتا العينين",
+},
+{
+id: "s_2465",
+type: "symptom",
+name: "تورّم في أحد جانبي العنق",
+common_name: "انتفاخ في أحد جانبي العنق",
+},
+{
+id: "s_2467",
+type: "symptom",
+name: "تورم كل العنق",
+common_name: "انتفاخ كل الرقبة",
+},
+{
+id: "s_2468",
+type: "symptom",
+name: "غياب الوعي، عند الوقوف لفترة طويلة",
+common_name: "فقدان الوعي عند الوقوف لفترة طويلة",
+},
+{
+id: "s_2469",
+type: "symptom",
+name: "إيقاف أو تقليل كمية الأفيون المتناولة",
+common_name: "إيقاف أو تقليل كمية الأفيون المتناولة",
+},
+{
+id: "s_2470",
+type: "symptom",
+name: "رهاب الشيخوخة",
+common_name: "الخوف من التقدم بالعمر أو الشيخوخة",
+},
+{
+id: "s_2471",
+type: "symptom",
+name: "غياب الوعي، أثناء الجلوس أو الاستلقاء",
+common_name: "فقدان الوعي أثناء الجلوس أو الاستلقاء",
+},
+{
+id: "s_2472",
+type: "symptom",
+name: "غياب الوعي، أثناء التمارين",
+common_name: "فقدان الوعي أثناء إجراء التمارين",
+},
+{
+id: "s_2473",
+type: "symptom",
+name: "الرغبة بزيادة الكتلة العضلية",
+common_name: "وجود رغبة كبيرة لزيادة الكتلة العضلية",
+},
+{
+id: "s_2474",
+type: "symptom",
+name: "غياب الوعي، في مكان دافئ",
+common_name: "فقدان الوعي في مكان دافئ",
+},
+{
+id: "s_2475",
+type: "symptom",
+name: "غياب الوعي، عند التوتر",
+common_name: "فقدان الوعي عند التوتر",
+},
+{
+id: "s_2477",
+type: "symptom",
+name: "حمامى، في الأطراف، متناظرة",
+common_name: "احمرار متناظر في جلد الأطراف",
+},
+{
+id: "s_2481",
+type: "symptom",
+name: "حمامى، في العنق",
+common_name: "احمرار في الرقبة",
+},
+{
+id: "s_2484",
+type: "symptom",
+name: "حمامى، في الصدر",
+common_name: "احمرار في جلد الصدر",
+},
+{
+id: "s_2485",
+type: "symptom",
+name: "ألم سنّي، مترافق مع اللمس",
+common_name: "ألم في سن يترافق مع اللمس",
+},
+{
+id: "s_2487",
+type: "symptom",
+name: "مستوى جلوكوز الدم، أقل من 54 ملغ/دل أو أقل من 3 ممول/ل",
+common_name: "انخفاض شديد في مستوى سكر الدم، أقل من 54 ملغ/دل",
+},
+{
+id: "s_2489",
+type: "symptom",
+name: "ضعف في الذاكرة، ظهر في غضون أقل من 24 ساعة",
+common_name: "فقدان في الذاكرة ظهر خلال الساعات الـ24 الماضية",
+},
+{
+id: "s_2490",
+type: "symptom",
+name: "ضعف في الذاكرة، ظهر منذ أكثر من 24 ساعة",
+common_name: "فقدان في الذاكرة ظهر بشكل تدريجي خلال عدة أيام أو أشهر",
+},
+{
+id: "s_2491",
+type: "symptom",
+name: "ألم سني، مع صعوبة في تحديد عدد الأسنان المؤلمة",
+common_name: "صعوبة في تحديد عدد الأسنان المؤلمة",
+},
+{
+id: "s_2494",
+type: "symptom",
+name: "تشنجات عضلية، في الليل",
+common_name: "تشنجات عضلية أثناء الليل",
+},
+{
+id: "s_2495",
+type: "symptom",
+name: "لسان متعرّج",
+common_name: "لسان صدفي",
+},
+{
+id: "s_2496",
+type: "symptom",
+name: "انسحال شديد في النسج الصلبة للسن",
+common_name: "تآكل شديد في السن",
+},
+{
+id: "s_2498",
+type: "symptom",
+name: "ألم في الفك، يشتد صباحاً",
+common_name: "ألم في الفك يحدث صباحاً",
+},
+{
+id: "s_2499",
+type: "symptom",
+name: "ألم وجهي، ثنائي الجانب",
+common_name: "ألم في كلا جانبي الوجه",
+},
+{
+id: "s_2501",
+type: "symptom",
+name: "ألم في الفك، عند اللمس",
+common_name: "ألم في الفك يظهر عند لمسه",
+},
+{
+id: "s_2506",
+type: "symptom",
+name: "تشنجات عضلية، عند بداية النوم",
+common_name: "تشنجات عضلية عند بدء النوم",
+},
+{
+id: "s_2507",
+type: "symptom",
+name: "الهلوسة التنويرية",
+common_name: "هلوسات عند بداية النوم",
+},
+{
+id: "s_2508",
+type: "symptom",
+name: "إطراق، حاد",
+common_name: "تدلي في الجفنين منذ أقل من أسبوع واحد",
+},
+{
+id: "s_2510",
+type: "symptom",
+name: "تراجع الحليمات بين السنيّة",
+common_name: "ظهور مثلثات سوداء بين الأسنان",
+},
+{
+id: "s_2511",
+type: "symptom",
+name: "إطراق، مزمن",
+common_name: "تدلي في الجفنين لأكثر من 7 أيام",
+},
+{
+id: "s_2512",
+type: "symptom",
+name: "غثيان، محرّض بالحركة",
+common_name: "الشعور برغبة بالتقيؤ عند الحركة",
+},
+{
+id: "s_2514",
+type: "symptom",
+name: "هجرة الأسنان",
+common_name: "تغيّر مكان الأسنان",
+},
+{
+id: "s_2516",
+type: "symptom",
+name: "صداع، يوقظ من النوم",
+common_name: "الاستيقاظ من النوم بسبب ألم الرأس",
+},
+{
+id: "s_2517",
+type: "symptom",
+name: "وضع الأشياء أو اليد في الفم بشكل مبالغ به",
+common_name: "وضع الأشياء أو اليد في الفم",
+},
+{
+id: "s_2518",
+type: "symptom",
+name: "البراز الانتقالي لحديث الولادة",
+common_name: "براز مائي أو محبب متكرر عند وليد",
+},
+{
+id: "s_2519",
+type: "symptom",
+name: "براز أصفر أو أخضر اللون",
+common_name: "غائط أصفر أو أخضر",
+},
+{
+id: "s_2520",
+type: "symptom",
+name: "صَلَع أندروجيني",
+common_name: "تساقط شعر الرأس الموجود على جانبيه أو في قمّته",
+},
+{
+id: "s_2521",
+type: "symptom",
+name: "غائط ذو لون بني",
+common_name: "براز بني اللون",
+},
+{
+id: "s_2523",
+type: "symptom",
+name: "براز أسود اللون، متعلّق بنوعية الطعام أو الأدوية المتناولة",
+common_name: "خروج أسود اللون ناتج عن نوعية الطعام أو الأدوية المتناولة",
+},
+{
+id: "s_2524",
+type: "symptom",
+name: "عينان محرّتان",
+common_name: "احمرار في كلتا العينين",
+},
+{
+id: "s_2532",
+type: "symptom",
+name: "آفة في الفم، مفردة",
+common_name: "آفة وحيدة في الفم",
+},
+{
+id: "s_2533",
+type: "symptom",
+name: "آفات فموية، قطرها أقل من 1 سم",
+common_name: "آفات في الفم قطرها أقل من 1 سم",
+},
+{
+id: "s_2535",
+type: "symptom",
+name: "آفات فموية، مؤلمة",
+common_name: "آفات مؤلمة في الفم",
+},
+{
+id: "s_2537",
+type: "symptom",
+name: "آفات فموية، تدوم أقل من 3 أسابيع",
+common_name: "آفات في الفم تستمر فترة لا تزيد عن 3 أسابيع",
+},
+{
+id: "s_2538",
+type: "symptom",
+name: "آفات فمويّة، تدوم 3 أسابيع على الأقل",
+common_name: "آفات في الفم تستمر لـ3 أسابيع على الأقل",
+},
+{
+id: "s_2541",
+type: "symptom",
+name: "احتلام",
+common_name: "قذف المني أثناء النوم",
+},
+{
+id: "s_2543",
+type: "symptom",
+name: "ألم وجهي، غير مُحرَّض",
+common_name: "ألم في الوجه عفوي من دون سبب",
+},
+{
+id: "s_2544",
+type: "symptom",
+name: "ألم وجهي، مستمر",
+common_name: "ألم مستمر في الوجه",
+},
+{
+id: "s_2545",
+type: "symptom",
+name: "ألم سني، حساسية للقرع",
+common_name: "ألم في سن يتحرّض بنقره",
+},
+{
+id: "s_2546",
+type: "symptom",
+name: "تغاير لون القزحيتين",
+common_name: "اختلاف لون العينين",
+},
+{
+id: "s_2547",
+type: "symptom",
+name: "غياب الخصية من كيس الصفن",
+common_name: "غياب الخصية من كيس الصفن",
+},
+{
+id: "s_2548",
+type: "symptom",
+name: "خصية نطاطة",
+common_name: "خصية قابلة للانكماش",
+},
+{
+id: "s_2551",
+type: "symptom",
+name: "حمامى، في الطرفين العلويين وتعف عن اليدين",
+common_name: "احمرار في جلد الكتف أو الذراع أو الساعد أو المرفق أو المعصم",
+},
+{
+id: "s_2552",
+type: "symptom",
+name: "حمامى، في الطرفين السفليين وتعف عن القدمين",
+common_name: "احمرار في جلد الورك أو الفخذ أو الركبة أو الساق أو الكاحل",
+},
+{
+id: "s_2553",
+type: "symptom",
+name: "آفات فموية، ناتجة عن رض",
+common_name: "آفات في الفم ناتجة عن التعرض لإصابة ما",
+},
+{
+id: "s_2557",
+type: "symptom",
+name: "تغيرات جلدية، في الأذنين",
+common_name: "تغيرات جلدية على الأذنين",
+},
+{
+id: "s_2558",
+type: "symptom",
+name: "ألم بطني، ذو بدء غير محدد",
+common_name: "ألم في البطن غير معروف متى وكيف بدأ",
+},
+{
+id: "s_2559",
+type: "symptom",
+name: "حمامى، في القدم",
+common_name: "احمرار في القدم",
+},
+{
+id: "s_2563",
+type: "symptom",
+name: "يرقان، ناكس",
+common_name: "يرقان ناكس",
+},
+{
+id: "s_2565",
+type: "symptom",
+name: "ألم سنّي، ناتج عن رض",
+common_name: "ألم في سن بسبب التعرّض لرض عليه",
+},
+{
+id: "s_2566",
+type: "symptom",
+name: "صُداع، موضّع",
+common_name: "ألم في الرأس يتوضّع في مكان محدد منه",
+},
+{
+id: "s_2567",
+type: "symptom",
+name: "صُداع، في مكان غير محدد",
+common_name: "ألم في الرأس يتوضّع في مكان غير محدد منه",
+},
+{
+id: "s_2568",
+type: "symptom",
+name: "صُداع، جداري",
+common_name: "ألم في الرأس في الجزء العلوي منه",
+},
+{
+id: "s_2569",
+type: "symptom",
+name: "يرقان، جلدي",
+common_name: "اصفرار الجلد",
+},
+{
+id: "s_2571",
+type: "symptom",
+name: "عسر البلع، شديد",
+common_name: "صعوبة شديدة في البلع",
+},
+{
+id: "s_2572",
+type: "symptom",
+name: "أذيّة عينية",
+common_name: "أذية للعين",
+},
+{
+id: "s_2574",
+type: "symptom",
+name: "إصابة سابقة بنوب نقص السكر",
+common_name: "إصابة سابقة بنوب نقص السكر",
+},
+{
+id: "s_2575",
+type: "symptom",
+name: "القدرة على تدبير انخفاض سكر الدم",
+common_name: "القدرة على علاج انخفاض جلوكوز الدم",
+},
+{
+id: "s_2577",
+type: "symptom",
+name: "عين واحدة محمرّة",
+common_name: "احمرار في عين واحدة",
+},
+{
+id: "s_2579",
+type: "symptom",
+name: "توسع في أوردة الساق",
+common_name: "دوالي الساقين",
+},
+{
+id: "s_2580",
+type: "symptom",
+name: "توسع في أوردة البطن",
+common_name: "دوالي البطن",
+},
+{
+id: "s_2581",
+type: "symptom",
+name: "كتلة في كيس الصفن، توسع في الأوردة",
+common_name: "دوالي الخصية",
+},
+{
+id: "s_2582",
+type: "symptom",
+name: "ألم في المنطقة الإربية",
+common_name: "ألم في ثنية الفخذ",
+},
+{
+id: "s_2584",
+type: "symptom",
+name: "جرح ناتج عن لدغة أفعى",
+common_name: "عضة أفعى",
+},
+{
+id: "s_2586",
+type: "symptom",
+name: "الزرام",
+common_name: "انقطاع البول",
+},
+{
+id: "s_2588",
+type: "symptom",
+name: "لدغة عنكبوت، من نوع غير معروف",
+common_name: "لدغة عنكبوت لا يُعرف إن كان ساماً أم لا",
+},
+{
+id: "s_2590",
+type: "symptom",
+name: "لون البول طبيعي",
+common_name: "لون البول طبيعي",
+},
+{
+id: "s_2591",
+type: "symptom",
+name: "ألم مفصلي، في كلتا الركبتين",
+common_name: "ألم في كلتا الركبتين",
+},
+{
+id: "s_2592",
+type: "symptom",
+name: "ألم مفصلي، في كلا الركبتين، أثناء الحركة",
+common_name: "ألم في كلا الركبتين عند تحريكهما",
+},
+{
+id: "s_2593",
+type: "symptom",
+name: "لدغة عنكبوت قد يكون ساماً",
+common_name: "لدغة عنكبوت قد يكون ساماً",
+},
+{
+id: "s_2594",
+type: "symptom",
+name: "لدغة عنكبوت، غير سام",
+common_name: "لدغة عنكبوت غير سام",
+},
+{
+id: "s_2598",
+type: "symptom",
+name: "بثور فموية",
+common_name: "بثور في الفم",
+},
+{
+id: "s_2599",
+type: "symptom",
+name: "جرح، بنزيف يمكن إيقافه",
+common_name: "جرح نازف بنزيف يمكن إيقافه",
+},
+{
+id: "s_2600",
+type: "symptom",
+name: "تضخّم في أحد أوردة الصدر",
+common_name: "تضخم أوردة الصدر",
+},
+{
+id: "s_2604",
+type: "symptom",
+name: "لون البول غير معروف",
+common_name: "لون البول غير معروف",
+},
+{
+id: "s_2605",
+type: "symptom",
+name: "تغيرات جلدية، تتوضع على الشفتين أو حولهما",
+common_name: "تغيرات جلدية متوضعة على الشفتين أو حولهما",
+},
+{
+id: "s_2606",
+type: "symptom",
+name: "مضض في العمود الفقري",
+common_name: "ألم عند الضغط على العمود الفقري",
+},
+{
+id: "s_2608",
+type: "symptom",
+name: "رجفان، في كلا الساقين",
+common_name: "رجفة في كلا الساقين",
+},
+{
+id: "s_2609",
+type: "symptom",
+name: "اختبار تحرّي كسر الفك السفلي باستخدام خافض اللسان",
+common_name: "اختبار كشف كسر الفك باستخدام خافض اللسان",
+},
+{
+id: "s_2610",
+type: "symptom",
+name: "ألم مفصلي، في إحدى أو كلتا الركبتين",
+common_name: "ألم في إحدى أو كلتا الركبتين",
+},
+{
+id: "s_2611",
+type: "symptom",
+name: "رجفان، في إحدى الساقين فقط",
+common_name: "رجفة في إحدى الساقين فقط",
+},
+{
+id: "s_2612",
+type: "symptom",
+name: "تجنّب الذهاب إلى المنزل",
+common_name: "تجنّب الذهاب إلى المنزل",
+},
+{
+id: "s_2614",
+type: "symptom",
+name: "ورم دموي تحت اللسان",
+common_name: "تجمّع دموي تحت اللسان",
+},
+{
+id: "s_2615",
+type: "symptom",
+name: "الخوف من شخص محدد",
+common_name: "الخوف من شخص أو أشخاص محددين",
+},
+{
+id: "s_2619",
+type: "symptom",
+name: "ألم في الجلد، يتحرّض بالسباحة في البحر أو المحيط",
+common_name: "ألم في الجلد عند السباحة في مياه البحر أو المحيط",
+},
+{
+id: "s_2622",
+type: "symptom",
+name: "نقص الوارد من السوائل",
+common_name: "عدم شرب ما يكفي من السوائل",
+},
+{
+id: "s_2624",
+type: "symptom",
+name: "ألم في الطرف العلوي، يدوم أقل من 24 ساعة",
+common_name: "ألم في الطرف العلوي يستمر أقل من 24 ساعة",
+},
+{
+id: "s_2625",
+type: "symptom",
+name: "ألم في الطرف العلوي، يدوم أكثر من 3 أشهر",
+common_name: "ألم في الطرف العلوي يستمر أكثر من 3 أشهر",
+},
+{
+id: "s_2626",
+type: "symptom",
+name: "إمساك، يدوم شهراً أو أكثر",
+common_name: "إمساك يستمر شهراً أو أكثر",
+},
+{
+id: "s_2627",
+type: "symptom",
+name: "وذمة، حول الحجاج، في عين واحدة",
+common_name: "تورم حول إحدى العينين",
+},
+{
+id: "s_2630",
+type: "symptom",
+name: "حمامى، حول إحدى العينين",
+common_name: "احمرار حول إحدى العينين فقط",
+},
+{
+id: "s_2633",
+type: "symptom",
+name: "حمامى، حول إحدى أو كلتا العينين",
+common_name: "احمرار حول إحدى أو كلتا العينين",
+},
+{
+id: "s_2634",
+type: "symptom",
+name: "فقدان القدرة على تحريك مفصل",
+common_name: "عدم القدرة على تحريك مفصل",
+},
+{
+id: "s_2635",
+type: "symptom",
+name: "نقص حاد في الوزن",
+common_name: "نقص حاد في الوزن",
+},
+{
+id: "s_2636",
+type: "symptom",
+name: "ألم في الطرف العلوي، يدوم فترة تتراوح بين يوم واحد و7 أيام",
+common_name: "ألم في الطرف العلوي يستمر فترة تتراوح بين يوم واحد و7 أيام",
+},
+{
+id: "s_2637",
+type: "symptom",
+name: "ألم في الطرف العلوي، يدوم فترة تتراوح بين أسبوع واحد و3 أشهر",
+common_name: "ألم في الطرف العلوي يستمر فترة تتراوح بين أسبوع واحد و3 أشهر",
+},
+{
+id: "s_2638",
+type: "symptom",
+name: "تشنجات عضلية، في الطرف السفلي",
+common_name: "تشنجات في الساق",
+},
+{
+id: "s_2639",
+type: "symptom",
+name: "وذمة، حول الحجاج، في العينين",
+common_name: "تورّم حول العينين",
+},
+{
+id: "s_2641",
+type: "symptom",
+name: "مظهر السليم",
+common_name: "مظهر السليم",
+},
+{
+id: "s_2643",
+type: "symptom",
+name: "نشاط جنسي",
+common_name: "شخص مارس الجنس في الماضي",
+},
+{
+id: "s_2645",
+type: "symptom",
+name: "تعب، نقص اللياقة البدنية",
+common_name: "تناقص اللياقة البدنية وضعف القدرة على تحمل الجهد",
+},
+{
+id: "s_2646",
+type: "symptom",
+name: "رجفان، في إحدى أو كلتا اليدين",
+common_name: "رجفة في إحدى أو كلتا اليدين",
+},
+{
+id: "s_2647",
+type: "symptom",
+name: "رجفان، في إحدى أو كلا الساقين",
+common_name: "رجفة في إحدى أو كلا الساقين",
+},
+{
+id: "s_2648",
+type: "symptom",
+name: "الألم الخيفي",
+common_name: "اضطراب حاسة الألم",
+},
+{
+id: "s_2650",
+type: "symptom",
+name: "الاعتداء الجسدي المتكرر على الآخرين",
+common_name: "الاعتداء الجسدي المتكرر على الآخرين",
+},
+{
+id: "s_2651",
+type: "symptom",
+name: "نفث الدم، شديد",
+common_name: "بصق كميات كبيرة من الدم",
+},
+{
+id: "s_2652",
+type: "symptom",
+name: "الموافقة على طرح أسئلة متعلقة بالحياة الجنسية",
+common_name: "الموافقة على الإجابة عن أسئلة متعلقة بالحياة الجنسية",
+},
+{
+id: "s_2658",
+type: "symptom",
+name: "إقياء، طعامي",
+common_name: "تقيؤ لطعام",
+},
+{
+id: "s_2661",
+type: "symptom",
+name: "كتلة جلدية، مع نقطة مركزية",
+common_name: "كتلة في الجلد تحتوي نقطة في مركزها",
+},
+{
+id: "s_2663",
+type: "symptom",
+name: "نوبات مزاج اكتئابي، تدوم أقل من أسبوعين",
+common_name: "مزاج اكتئابي يستمر أقل من أسبوعين",
+},
+{
+id: "s_2664",
+type: "symptom",
+name: "نوبات مزاج اكتئابي، تدوم فترة أطول من سنتين",
+common_name: "مزاج اكتئابي يستمر فترة أطول من سنتين",
+},
+{
+id: "s_2665",
+type: "symptom",
+name: "نوبة مزاج اكتئابي، بدأت في الفترة ما حول الولادة",
+common_name: "اكتئاب متعلّق بالولادة",
+},
+{
+id: "s_2666",
+type: "symptom",
+name: "نوبات مزاج اكتئابي، تدوم فترة تتراوح بين أسبوعين وسنة واحدة",
+common_name: "مزاج اكتئابي يستمر فترة تتراوح بين أسبوعين وسنة واحدة",
+},
+{
+id: "s_2667",
+type: "symptom",
+name: "نوبات مزاج اكتئابي، تدوم فترة تتراوح بين سنة وسنتين",
+common_name: "مزاج اكتئابي يستمر فترة تتراوح بين سنة وسنتين",
+},
+{
+id: "s_2668",
+type: "symptom",
+name: "كتلة جلدية، شفافة للضوء",
+common_name: "كتلة في الجلد شفافة عند تسليط الضوء عليها",
+},
+{
+id: "s_2669",
+type: "symptom",
+name: "نوبة مزاج مرتفع، تستمر 3 أيام أو أقل",
+common_name: "مزاج مرتفع يستمر 3 أيام أو أقل",
+},
+{
+id: "s_2670",
+type: "symptom",
+name: "نوبة مزاج مرتفع، تستمر فترة بين 4 و6 أيام",
+common_name: "مزاج مرتفع يستمر فترة تتراوح بين 4 و6 أيام",
+},
+{
+id: "s_2671",
+type: "symptom",
+name: "نوبة مزاج مرتفع، تستمر 7 أيام أو أكثر",
+common_name: "مزاج مرتفع يستمر 7 أيام أو أكثر",
+},
+{
+id: "s_2672",
+type: "symptom",
+name: "نوبة مزاج مرتفع، محرّضة باستعمال مادة معيّنة",
+common_name: "مزاج مرتفع ناتج عن استخدام مادة ما",
+},
+{
+id: "s_2673",
+type: "symptom",
+name: "تغيرات جلدية، على الرأس",
+common_name: "تغيرات جلدية على الرأس",
+},
+{
+id: "s_2674",
+type: "symptom",
+name: "تغيرات جلدية، تُسبق بحُمّى أو أي أعراض أخرى تدل على الإصابة بعدوى في الجهاز التنفسي",
+common_name: "تغيرات في الجلد تُسبق بحمى أو غيرها من أعراض الرشح",
+},
+{
+id: "s_2675",
+type: "symptom",
+name: "تقلبات المزاج، تدوم أكثر من سنتين",
+common_name: "تقلبات في المزاج تستمر أكثر من سنتين",
+},
+{
+id: "s_2676",
+type: "symptom",
+name: "تقلبات المزاج، تدوم أقل من سنة واحدة",
+common_name: "تقلبات في المزاج تستمر أقل من سنة واحدة",
+},
+{
+id: "s_2677",
+type: "symptom",
+name: "نوبة مزاج اكتئابي، محرّضة باستعمال مادة معيّنة",
+common_name: "اكتئاب متعلق بسوء استخدام مادة ما",
+},
+{
+id: "s_2678",
+type: "symptom",
+name: "ألم سني، غير معروف السبب",
+common_name: "ألم في الأسنان لا يعرف سببه",
+},
+{
+id: "s_2680",
+type: "symptom",
+name: "المزاج الحالي، مرتفع",
+common_name: "مزاج مرتفع حالياً",
+},
+{
+id: "s_2681",
+type: "symptom",
+name: "المزاج الحالي، اكتئابي",
+common_name: "مزاج اكتئابي حالياً",
+},
+{
+id: "s_2682",
+type: "symptom",
+name: "المزاج الحالي، سوي",
+common_name: "مزاج طبيعي حالياً",
+},
+{
+id: "s_2684",
+type: "symptom",
+name: "كتلة جلدية، تتوضع على المعصم",
+common_name: "كتلة أو نتوء في المعصم",
+},
+{
+id: "s_2686",
+type: "symptom",
+name: "تقلبات المزاج، تدوم فترة تتراوح بين سنة وسنتين",
+common_name: "تقلبات في المزاج تستمر فترة تتراوح بين سنة وسنتين",
+},
+{
+id: "s_2687",
+type: "symptom",
+name: "تقلبات مزاجية، سريعة للغاية",
+common_name: "تقلبات مزاجية سريعة",
+},
+{
+id: "s_2692",
+type: "symptom",
+name: "حرق كامل الاستدارة",
+common_name: "حرق يشمل كامل المحيط",
+},
+{
+id: "s_2696",
+type: "symptom",
+name: "فقدان الحس في طرف واحد، يدوم أقل من 24 ساعة",
+common_name: "غياب الحس في ذراع واحدة أو ساق واحدة يستمر أقل من 24 ساعة",
+},
+{
+id: "s_2702",
+type: "symptom",
+name: "فقدان الحس في طرف واحد، يدوم فترة تتراوح بين 24 ساعة و4 أسابيع",
+common_name: "غياب الحس في ذراع واحدة أو ساق واحدة يستمر فترة تتراوح بين 24 ساعة و4 أسابيع",
+},
+{
+id: "s_2703",
+type: "symptom",
+name: "فقدان الحس في طرف واحد، يدوم أكثر من 4 أسابيع",
+common_name: "غياب الحس في ذراع واحدة أو ساق واحدة يستمر أكثر من 4 أسابيع",
+},
+{
+id: "s_2705",
+type: "symptom",
+name: "سلوك التجنّب، متعلّق بحدث صادم سابق",
+common_name: "سلوك التهرّب من حدث صادم سابق",
+},
+{
+id: "s_2706",
+type: "symptom",
+name: "المشارفة على الموت في الماضي",
+common_name: "المشارفة على الموت في الماضي",
+},
+{
+id: "s_2707",
+type: "symptom",
+name: "التعرّض لكارثة طبيعية في الماضي",
+common_name: "مشاهدة أو التعرّض لكارثة طبيعية في الماضي",
+},
+{
+id: "s_2708",
+type: "symptom",
+name: "التعرّض لحادث مروري خطير",
+common_name: "مشاهدة أو التعرّض لحادث مروري خطير",
+},
+{
+id: "s_2709",
+type: "symptom",
+name: "قصة سابقة للتعرض لحدث راض أو عنيف",
+common_name: "التعرض لحدث راض أو عنيف في الماضي",
+},
+{
+id: "s_2710",
+type: "symptom",
+name: "قصة سابقة لوفاة شخص مقرّب بشكل مفاجئ",
+common_name: "وفاة مفاجئة لشخص مقرّب في الماضي",
+},
+{
+id: "s_2711",
+type: "symptom",
+name: "نوبات صرعية، النوبة الأولى",
+common_name: "أول نوبة صرعية",
+},
+{
+id: "s_2712",
+type: "symptom",
+name: "نوبات صرعية، عدد غير محدد",
+common_name: "عدم التأكد من عدد الاختلاجات التي حدثت في الماضي",
+},
+{
+id: "s_2713",
+type: "symptom",
+name: "اضطرابات متعلقة بضغوط أو حدث صادم",
+common_name: "اضطرابات متعلقة بضغوط أو حدث صادم",
+},
+{
+id: "s_2714",
+type: "symptom",
+name: "قصة سابقة للتعرض لصدمة نفسية",
+common_name: "التعرض لصدمة نفسية في الماضي",
+},
+{
+id: "s_2715",
+type: "symptom",
+name: "اعتداء جسدي حديث على الآخرين، مهدد للحياة أو الصحة",
+common_name: "اعتداء جسدي حديث على الآخرين بحيث يكون مهدداً للحياة أو مؤثراً على الصحة",
+},
+{
+id: "s_2717",
+type: "symptom",
+name: "قيح متجمع تحت جلد أحد أصابع القدمين",
+common_name: "قيح متجمع تحت جلد أحد أصابع القدمين",
+},
+{
+id: "s_2718",
+type: "symptom",
+name: "وذمة، في كل الوجه",
+common_name: "تورم كامل الوجه",
+},
+{
+id: "s_2727",
+type: "symptom",
+name: "فرط اليقظة",
+common_name: "حالة من التيقظ والحذر الدائمين",
+},
+{
+id: "s_2729",
+type: "symptom",
+name: "بول عكر",
+common_name: "بول أبيض حليبي",
+},
+{
+id: "s_2730",
+type: "symptom",
+name: "تغيرات جلدية، على الردفين",
+common_name: "تغيرات جلدية على الردفين",
+},
+{
+id: "s_2731",
+type: "symptom",
+name: "الوكعة",
+common_name: "ورم في إبهام القدم",
+},
+{
+id: "s_2733",
+type: "symptom",
+name: "سلوك هوسي",
+common_name: "سلوك هوسي",
+},
+{
+id: "s_2734",
+type: "symptom",
+name: "سلوك هوسي، إسراف في إنفاق المال",
+common_name: "إنفاق المال بإسراف أثناء المرور بحالة مزاجية مضطربة",
+},
+{
+id: "s_2735",
+type: "symptom",
+name: "سلوك هوسي، ديون متكررة",
+common_name: "اقتراض المال بشكل متكرر أثناء المرور بحالة مزاجية مضطربة",
+},
+{
+id: "s_2737",
+type: "symptom",
+name: "استجابة إجفالية مبالغ بها",
+common_name: "جفل",
+},
+{
+id: "s_2738",
+type: "symptom",
+name: "وهم، يدوم أقل من شهر واحد",
+common_name: "توهمات تستمر لأقل من شهر واحد",
+},
+{
+id: "s_2739",
+type: "symptom",
+name: "وهم، يدوم فترة تتراوح بين شهر و3 أشهر",
+common_name: "توهمات تستمر فترة تتراوح بين شهر و3 أشهر",
+},
+{
+id: "s_2740",
+type: "symptom",
+name: "وهم، يدوم 4 أشهر أو أكثر",
+common_name: "توهمات تستمر 4 أشهر أو أكثر",
+},
+{
+id: "s_2741",
+type: "symptom",
+name: "هلوسات، تدوم أقل من شهر",
+common_name: "هلوسات تستمر أقل من شهر",
+},
+{
+id: "s_2742",
+type: "symptom",
+name: "هلوسات، تدوم فترة تتراوح بين شهر واحد و3 أشهر",
+common_name: "هلوسات تستمر فترة تتراوح بين شهر واحد و3 أشهر",
+},
+{
+id: "s_2743",
+type: "symptom",
+name: "هلوسات، تدوم 4 أشهر أو أكثر",
+common_name: "هلوسات تستمر 4 أشهر أو أكثر",
+},
+{
+id: "s_2744",
+type: "symptom",
+name: "وهم السرقة",
+common_name: "الاعتقاد بأن الشخص تعرَّض للسرقة رغم أن الأدلة تنفي ذلك",
+},
+{
+id: "s_2746",
+type: "symptom",
+name: "إسهال، مُدمّى",
+common_name: "إسهال يحتوي دماً",
+},
+{
+id: "s_2749",
+type: "symptom",
+name: "عدم القدرة على تدبير انخفاض سكر الدم",
+common_name: "عدم القدرة على تدبير انخفاض سكر الدم",
+},
+{
+id: "s_2752",
+type: "symptom",
+name: "الشعور بالاستنزاف بسبب العمل أو الدراسة",
+common_name: "الشعور بالإنهاك الشديد بسبب العمل أو الدراسة",
+},
+{
+id: "s_2753",
+type: "symptom",
+name: "الانفصال نفسياً عن العمل أو الدراسة",
+common_name: "الانفصال ذهنياً عن العمل أو الدراسة",
+},
+{
+id: "s_2754",
+type: "symptom",
+name: "ضعف القدرات الكلامية واللغوية",
+common_name: "صعوبة في التكلم",
+},
+{
+id: "s_2755",
+type: "symptom",
+name: "الشعور بانعدام القيمة",
+common_name: "الشعور بعدم الفعالية",
+},
+{
+id: "s_2758",
+type: "symptom",
+name: "زيادة النشاط الحركي",
+common_name: "الحركة الزائدة",
+},
+{
+id: "s_2759",
+type: "symptom",
+name: "زيادة النشاط الحركي، يستمر 3 أيام أو أقل",
+common_name: "حركة زائدة أو تململ يستمر 3 أيام أو أقل",
+},
+{
+id: "s_2760",
+type: "symptom",
+name: "صعوبة تنظيم الأشياء",
+common_name: "ضياع الأشياء أو وضعها في غير مكانها",
+},
+{
+id: "s_2761",
+type: "symptom",
+name: "زيادة النشاط الحركي، يستمر فترة تتراوح بين 4 و6 أيام",
+common_name: "حركة زائدة أو تململ يستمر فترة تتراوح بين 4 و6 أيام",
+},
+{
+id: "s_2762",
+type: "symptom",
+name: "زيادة النشاط الحركي، يستمر فترة تتراوح بين 7 أيام و6 أشهر",
+common_name: "حركة زائدة أو تململ يستمر فترة تتراوح بين 7 أيام و6 أشهر",
+},
+{
+id: "s_2763",
+type: "symptom",
+name: "زيادة النشاط الحركي، يستمر 6 أشهر أو أكثر",
+common_name: "حركة زائدة أو تململ يستمر 6 أشهر أو أكثر",
+},
+{
+id: "s_2764",
+type: "symptom",
+name: "القلق",
+common_name: "العصبية",
+},
+{
+id: "s_2766",
+type: "symptom",
+name: "قلق، يدوم 3 أيام أو أقل",
+common_name: "عصبية تستمر 3 أيام أو أقل",
+},
+{
+id: "s_2767",
+type: "symptom",
+name: "قلق، يدوم فترة تتراوح بين 4 و6 أيام",
+common_name: "عصبية تستمر فترة تتراوح بين 4 و6 أيام",
+},
+{
+id: "s_2768",
+type: "symptom",
+name: "قلق، يدوم فترة تتراوح بين 7 أيام و6 أشهر",
+common_name: "عصبية تستمر فترة تتراوح بين 7 أيام و6 أشهر",
+},
+{
+id: "s_2769",
+type: "symptom",
+name: "قلق، يدوم 6 أشهر أو أكثر",
+common_name: "عصبية تستمر 6 أشهر على الأقل",
+},
+{
+id: "s_2771",
+type: "symptom",
+name: "صعوبة تنظيم الأشياء، تدوم 3 أيام أو أقل",
+common_name: "ضياع الأشياء أو وضعها في غير مكانها بحيث يستمر ذلك 3 أيام أو أقل",
+},
+{
+id: "s_2772",
+type: "symptom",
+name: "صعوبة تنظيم الأشياء، تدوم فترة تتراوح بين 4 و6 أيام",
+common_name: "ضياع الأشياء أو وضعها في غير مكانها بحيث يستمر ذلك فترة تتراوح بين 4 و6 أيام",
+},
+{
+id: "s_2773",
+type: "symptom",
+name: "صعوبة تنظيم الأشياء، تدوم فترة تتراوح بين 7 أيام و6 أشهر",
+common_name: "ضياع الأشياء أو وضعها في غير مكانها بحيث يستمر ذلك فترة تتراوح بين 7 أيام و6 أشهر",
+},
+{
+id: "s_2774",
+type: "symptom",
+name: "صعوبة تنظيم الأشياء، تدوم 6 أشهر على الأقل",
+common_name: "ضياع الأشياء أو وضعها في غير مكانها بحيث يستمر ذلك 6 أشهر على الأقل",
+},
+{
+id: "s_2775",
+type: "symptom",
+name: "صعوبة في تنظيم المهام أو الأنشطة",
+common_name: "عدم القدرة على إكمال المهام",
+},
+{
+id: "s_2778",
+type: "symptom",
+name: "صعوبة تنظيم المهام أو النشاطات، تدوم 3 أيام على الأكثر",
+common_name: "صعوبة إتمام المهام أو النشاطات بحيث يستمر ذلك 3 أيام على الأكثر",
+},
+{
+id: "s_2779",
+type: "symptom",
+name: "صعوبة تنظيم المهام أو النشاطات، تدوم 4-6 أيام",
+common_name: "صعوبة إتمام المهام أو النشاطات بحيث يستمر ذلك 4-6 أيام",
+},
+{
+id: "s_2780",
+type: "symptom",
+name: "صعوبة تنظيم المهام أو النشاطات، تدوم فترة تتراوح بين 7 أيام و6 أشهر",
+common_name: "صعوبة إتمام المهام أو النشاطات بحيث يستمر ذلك فترة تتراوح بين 7 أيام و6 أشهر",
+},
+{
+id: "s_2781",
+type: "symptom",
+name: "صعوبة تنظيم المهام أو النشاطات، تدوم 6 أشهر أو أكثر",
+common_name: "صعوبة إتمام المهام أو النشاطات بحيث يستمر ذلك 6 أشهر أو أكثر",
+},
+{
+id: "s_2783",
+type: "symptom",
+name: "نقص الانتباه للتفاصيل",
+common_name: "صعوبة الانتباه للتفاصيل",
+},
+{
+id: "s_2784",
+type: "symptom",
+name: "انعدام الصبر",
+common_name: "عدم الصبر",
+},
+{
+id: "s_2785",
+type: "symptom",
+name: "جرح، ناجم عن عضة حيوان",
+common_name: "جرح ناتج عن عضة حيوان",
+},
+{
+id: "s_2786",
+type: "symptom",
+name: "تقلبات مزاجية، تستمر فترة طويلة",
+common_name: "تقلبات مزاجية، تستمر فترة طويلة",
+},
+{
+id: "s_2787",
+type: "symptom",
+name: "ألم سني، لا يُطاق",
+common_name: "ألم لا يطاق في الأسنان",
+},
+{
+id: "s_2789",
+type: "symptom",
+name: "الثرثرة",
+common_name: "كثرة الكلام",
+},
+{
+id: "s_2790",
+type: "symptom",
+name: "وذمة، في الترقوة",
+common_name: "تورم في عظم الترقوة",
+},
+{
+id: "s_2791",
+type: "symptom",
+name: "مضض في الترقوة",
+common_name: "ألم عند الضغط على الترقوة",
+},
+{
+id: "s_2793",
+type: "symptom",
+name: "سلوك تمردي",
+common_name: "تمرد",
+},
+{
+id: "s_2794",
+type: "symptom",
+name: "سلوكيات متكررة لاإرادية، حركية",
+common_name: "حركات متكررة لاإرادية",
+},
+{
+id: "s_2795",
+type: "symptom",
+name: "الخداع",
+common_name: "الكذب بكثرة",
+},
+{
+id: "s_2796",
+type: "symptom",
+name: "سلوكيات متكررة لاإرادية",
+common_name: "سلوكيات متكررة لاإرادية",
+},
+{
+id: "s_2797",
+type: "symptom",
+name: "سلوكيات متكررة لاإرادية، صوتية",
+common_name: "إصدار أصوات لا إرادية بشكل متكرر",
+},
+{
+id: "s_2806",
+type: "symptom",
+name: "انتهاك القانون",
+common_name: "تجاوز القانون",
+},
+{
+id: "s_2812",
+type: "symptom",
+name: "إجهاض",
+common_name: "إجهاض",
+},
+{
+id: "s_2816",
+type: "symptom",
+name: "بطء في كسب الوزن عند حديثي الولادة",
+common_name: "بطء في زيادة الوزن والنمو عند الرضع",
+},
+{
+id: "s_2818",
+type: "symptom",
+name: "براز أحمر اللون، نتيجة نزف خفيف",
+common_name: "براز يحتوي على كميات قليلة من الدم",
+},
+{
+id: "s_2819",
+type: "symptom",
+name: "براز أحمر اللون، نتيجة نزف غزير",
+common_name: "براز يحتوي على كميات كبيرة من الدم",
+},
+{
+id: "s_2820",
+type: "symptom",
+name: "ألم في الظهر، حاد",
+common_name: "ألم حاد في الظهر",
+},
+{
+id: "s_2821",
+type: "symptom",
+name: "ألم في الظهر، تحت حاد",
+common_name: "ألم تحت حاد في الظهر",
+},
+{
+id: "s_2822",
+type: "symptom",
+name: "ألم في الظهر، مزمن",
+common_name: "ألم مزمن في الظهر",
+},
+{
+id: "s_2825",
+type: "symptom",
+name: "صعق بالتيار الكهربائي",
+common_name: "صعق بالتيار الكهربائي",
+},
+{
+id: "s_2826",
+type: "symptom",
+name: "ألم صدري، يزول عند الراحة",
+common_name: "ألم في الصدر يزول عند الراحة",
+},
+{
+id: "s_2827",
+type: "symptom",
+name: "تكدم، في الصفن",
+common_name: "كدمة في الصفن",
+},
+{
+id: "s_2828",
+type: "symptom",
+name: "قساوة في خصية",
+common_name: "إحدى الخصيتين أقسى من الأخرى",
+},
+{
+id: "s_2830",
+type: "symptom",
+name: "سعال، لا يخف مع مرور الوقت",
+common_name: "سعال لا يخف مع مرور الوقت",
+},
+{
+id: "s_2831",
+type: "symptom",
+name: "الخوف من تناول الطعام أمام الآخرين أو محاولة تجنب ذلك",
+common_name: "الخوف من تناول الطعام أمام الآخرين أو محاولة تجنب ذلك",
+},
+{
+id: "s_2832",
+type: "symptom",
+name: "الرهاب الاجتماعي",
+common_name: "الرهاب الاجتماعي",
+},
+{
+id: "s_2833",
+type: "symptom",
+name: "سعال، ديكي",
+common_name: "سعال ديكي",
+},
+{
+id: "s_2834",
+type: "symptom",
+name: "زلة تنفسية تستمر أكثر من 4 أسابيع، ساءَت فجأة",
+common_name: "تفاقم مفاجئ في ضيق التنفس الذي ظهر لأول مرة منذ أكثر من 4 أسابيع",
+},
+{
+id: "s_2835",
+type: "symptom",
+name: "زلة تنفسية تدوم بين يوم و4 أسابيع، ساءَت فجأةً",
+common_name: "تفاقم مفاجئ في ضيق التنفس الذي ظهر لأول مرة منذ فترة تتراوح بين يوم واحد و4 أسابيع",
+},
+{
+id: "s_2836",
+type: "symptom",
+name: "سعال، يخف مع مرور الوقت",
+common_name: "سعال يخف مع مرور الوقت",
+},
+{
+id: "s_2837",
+type: "symptom",
+name: "وذمة حادة، في طرف سفلي واحد",
+common_name: "تورم في الساق منذ أقل من 3 أيام",
+},
+{
+id: "s_2838",
+type: "symptom",
+name: "وذمة مزمنة، في طرف سفلي واحد",
+common_name: "تورم في الساق منذ 3 أيام أو أكثر",
+},
+{
+id: "s_2839",
+type: "symptom",
+name: "وذمة، في كلا الطرفين السفليين، حادة",
+common_name: "تورم في كلتا الساقين استمر أقل من 3 أيام",
+},
+{
+id: "s_2840",
+type: "symptom",
+name: "وذمة، في كلا الطرفين السفليين، مزمنة",
+common_name: "تورم في كلتا الساقين استمر 3 أيام أو أكثر",
+},
+{
+id: "s_2843",
+type: "symptom",
+name: "ألم صدري، عند القيام بجهد شديد",
+common_name: "ألم في الصدر عند القيام بمجهود جسدي شديد",
+},
+{
+id: "s_2845",
+type: "symptom",
+name: "سيلان أنفي، حاد",
+common_name: "سيلان حديث من الأنف",
+},
+{
+id: "s_2846",
+type: "symptom",
+name: "سيلان أنفي، مزمن",
+common_name: "سيلان مزمن من الأنف",
+},
+{
+id: "s_2847",
+type: "symptom",
+name: "ألم صدري، أثناء الجهد الخفيف",
+common_name: "ألم في الصدر يظهر عند القيام بأدنى مجهود جسدي",
+},
+{
+id: "s_2849",
+type: "symptom",
+name: "وذمة، في الفرج",
+common_name: "تورم في الفرج",
+},
+{
+id: "s_2850",
+type: "symptom",
+name: "ألم في الطرف السفلي، يستمر أقل من 24 ساعة",
+common_name: "ألم في الطرف السفلي يستمر أقل من 24 ساعة",
+},
+{
+id: "s_2851",
+type: "symptom",
+name: "ألم في الطرف السفلي، يستمر بين يوم واحد و7 أيام",
+common_name: "ألم في الطرف السفلي يستمر بين يوم واحد و7 أيام",
+},
+{
+id: "s_2852",
+type: "symptom",
+name: "ألم في الطرف السفلي، يستمر بين أسبوع واحد و3 أشهر",
+common_name: "ألم في الطرف السفلي يستمر بين أسبوع واحد و3 أشهر",
+},
+{
+id: "s_2853",
+type: "symptom",
+name: "ألم في الطرف السفلي، يستمر أكثر من 3 أشهر",
+common_name: "ألم في الطرف السفلي يستمر أكثر من 3 أشهر",
+},
+{
+id: "s_2854",
+type: "symptom",
+name: "حمى، تدوم أكثر من 14 يوماً",
+common_name: "ارتفاع في درجة حرارة الجسم يستمر أكثر من 14 يوماً",
+},
+{
+id: "s_2855",
+type: "symptom",
+name: "حمى، تدوم بين 8 و14 يوماً",
+common_name: "ارتفاع في درجة حرارة الجسم يستمر بين 8 و14 يوماً",
+},
+{
+id: "s_2856",
+type: "symptom",
+name: "بثور جلدية",
+common_name: "بثور على الجلد",
+},
+{
+id: "s_2857",
+type: "symptom",
+name: "بثور جلدية، فقاعات",
+common_name: "بثور على الجلد قطرها أكبر من 0.5 سم",
+},
+{
+id: "s_2858",
+type: "symptom",
+name: "بثور جلدية، حويصلات",
+common_name: "بثور على الجلد قطرها أصغر من 0.5 سم",
+},
+{
+id: "s_2860",
+type: "symptom",
+name: "حمى، مستجيبة كلياً على العلاج",
+common_name: "ارتفاع في درجة حرارة الجسم بحيث تنخفض كلياً بالعلاج",
+},
+{
+id: "s_2861",
+type: "symptom",
+name: "تأخر الدورة الشهرية",
+common_name: "تأخر الدورة",
+},
+{
+id: "s_2862",
+type: "symptom",
+name: "تأخر الدورة الشهرية، بين أسبوع واحد و3 أسابيع",
+common_name: "تأخر الدورة فترة تتراوح بين أسبوع واحد و3 أسابيع",
+},
+{
+id: "s_2863",
+type: "symptom",
+name: "تأخر الدورة الشهرية، بين 3 أسابيع و3 أشهر",
+common_name: "تأخر الدورة فترة تتراوح بين 3 أسابيع و3 أشهر",
+},
+{
+id: "s_2864",
+type: "symptom",
+name: "تأخر الدورة الشهرية، بين 3 أشهر و12 شهراً",
+common_name: "تأخر الدورة فترة تتراوح بين 3 أشهر و12 شهراً",
+},
+{
+id: "s_2865",
+type: "symptom",
+name: "تأخر الدورة الشهرية، أكثر من 12 شهراً",
+common_name: "تأخر الدورة أكثر من 12 شهراً",
+},
+{
+id: "s_2866",
+type: "symptom",
+name: "حمى، مستجيبة جزئياً على العلاج",
+common_name: "ارتفاع في درجة حرارة الجسم بحيث تنخفض جزئياً بالعلاج",
+},
+{
+id: "s_2867",
+type: "symptom",
+name: "وذمة، في أحد أو كلا الطرفين السفليين",
+common_name: "تورم في إحدى أو كلتا الساقين",
+},
+{
+id: "s_2871",
+type: "symptom",
+name: "قلة حركات الجنين في الثلث الثالث من الحمل",
+common_name: "قلة حركات الجنين في الثلث الثالث من الحمل",
+},
+{
+id: "s_2872",
+type: "symptom",
+name: "تأخر الدورة الشهرية، أقل من أسبوع واحد",
+common_name: "تأخر الدورة أقل من أسبوع واحد",
+},
+{
+id: "s_2876",
+type: "symptom",
+name: "حمى، مع محاولة تخفيضها باستخدام خافضات الحرارة",
+common_name: "إعطاء خافضات حرارة لتخفيض درجة حرارة الجسم",
+},
+{
+id: "s_2877",
+type: "symptom",
+name: "رجفان، يتحرض باللمس أو البرد أو الأصوات العالية",
+common_name: "رجفة تتحرض باللمس أو البرد أو الأصوات العالية",
+},
+{
+id: "s_2878",
+type: "symptom",
+name: "بدء مفاجئ لضعف القدرات الكلامية واللغوية",
+common_name: "بدء مفاجئ لضعف القدرات الكلامية واللغوية",
+},
+{
+id: "s_2879",
+type: "symptom",
+name: "حمى، مستمرة",
+common_name: "ارتفاع مستمر في درجة حرارة الجسم",
+},
+{
+id: "s_2880",
+type: "symptom",
+name: "حالة صرعية",
+common_name: "نوبة اختلاج طويلة استمرت لأكثر من 5 دقائق",
+},
+{
+id: "s_2881",
+type: "symptom",
+name: "إدخال جسم أجنبي، في منطقة الرأس",
+common_name: "إدخال جسم غريب في أحد الفوهات في منطقة الرأس",
+},
+{
+id: "s_2883",
+type: "symptom",
+name: "إدخال جسم أجنبي، عالق في المهبل",
+common_name: "شيء عالق في المهبل",
+},
+{
+id: "s_2884",
+type: "symptom",
+name: "إدخال جسم أجنبي، عالق في الشرج",
+common_name: "شيء عالق في الشرج",
+},
+{
+id: "s_2888",
+type: "symptom",
+name: "حمى، دورية، كل بضعة أيام أو أسابيع",
+common_name: "حمى دورية تظهر كل بضعة أيام أو أسابيع",
+},
+{
+id: "s_2889",
+type: "symptom",
+name: "شحوب الجلد، عابر",
+common_name: "شحوب عابر في الجلد",
+},
+{
+id: "s_2890",
+type: "symptom",
+name: "حمى، ناكسة بعد 24 ساعة",
+common_name: "ارتفاع في درجة حرارة الجسم تنكس بعد مضي 24 ساعة على انخفاضها",
+},
+{
+id: "s_2891",
+type: "symptom",
+name: "حمى، متقطعة",
+common_name: "ارتفاع في درجة حرارة الجسم بحيث تنخفض كل يوم",
+},
+{
+id: "s_2892",
+type: "symptom",
+name: "تمزق السلى، بين الأسبوع 22 و37 الحملي",
+common_name: "نزول ماء الجنين بين الأسبوع 22 و37 من الحمل",
+},
+{
+id: "s_2893",
+type: "symptom",
+name: "تقلصات رحمية منتظمة، قبل الأسبوع 37 الحملي",
+common_name: "تقلصات رحمية منتظمة قبل الأسبوع 37 من الحمل",
+},
+{
+id: "s_2894",
+type: "symptom",
+name: "نزف مهبلي نفاسي، ازدادت شدته",
+common_name: "زيادة في النزيف التالي للولادة",
+},
+{
+id: "s_2895",
+type: "symptom",
+name: "عدم تحمل التغيير على النظام اليومي",
+common_name: "عدم تحمل التغيير على النظام اليومي",
+},
+{
+id: "s_2898",
+type: "symptom",
+name: "جرح مؤهب للإصابة بالكزاز",
+common_name: "جرح معرض للإصابة بالكزاز",
+},
+{
+id: "s_2904",
+type: "symptom",
+name: "محاولة انتحار نشطة حالياً",
+common_name: "محاولة انتحار نشطة حالياً",
+},
+{
+id: "s_2905",
+type: "symptom",
+name: "تمزق السلى، قبل الأسبوع 22 الحملي",
+common_name: "نزول ماء الجنين قبل الأسبوع 22 من الحمل",
+},
+{
+id: "s_2906",
+type: "symptom",
+name: "تمزق السلى، بعد الأسبوع 37 الحملي",
+common_name: "نزول ماء الجنين بعد الأسبوع 37 من الحمل",
+},
+{
+id: "s_2907",
+type: "symptom",
+name: "حمى، شافية حالياً ولكنها كانت موجودة خلال الساعات الـ72 الماضية",
+common_name: "ارتفاع في درجة حرارة الجسم كان موجوداً خلال الساعات الـ72 الماضية ولكنه زال حالياً",
+},
+{
+id: "s_2908",
+type: "symptom",
+name: "نزيف رحمي غير طبيعي، غير طمثي",
+common_name: "نزف من المهبل يختلف عن الدورة الشهرية",
+},
+{
+id: "s_2909",
+type: "symptom",
+name: "تمشيح رحمي غير طبيعي، غير طمثي",
+common_name: "تمشيح من المهبل يختلف عن الدورة الشهرية",
+},
+{
+id: "s_2913",
+type: "symptom",
+name: "لا نزيف أو تمشيح تناسلي غير طبيعي، غير طمثي",
+common_name: "لا نزيف أو تمشيح تناسلي غير طبيعي، غير طمثي",
+},
+{
+id: "s_2914",
+type: "symptom",
+name: "أذية جسدية، على الرأس",
+common_name: "إصابة في الرأس",
+},
+{
+id: "s_2915",
+type: "symptom",
+name: "أذية جسدية، على الجذع",
+common_name: "إصابة في الجذع",
+},
+{
+id: "s_2916",
+type: "symptom",
+name: "أذية جسدية، على الطرف العلوي",
+common_name: "إصابة في الطرف العلوي",
+},
+{
+id: "s_2917",
+type: "symptom",
+name: "أذية جسدية، على الطرف السفلي",
+common_name: "إصابة في الطرف السفلي",
+},
+{
+id: "s_2918",
+type: "symptom",
+name: "ألم جذري",
+common_name: "ألم في الظهر منتشر",
+},
+{
+id: "s_2919",
+type: "symptom",
+name: "موضع الرض",
+common_name: "موضع الرض",
+},
+{
+id: "s_2920",
+type: "symptom",
+name: "الأعراض ناتجة عن التعرض لرض حديث",
+common_name: "الأعراض ناتجة عن التعرض لإصابة مؤخراً",
+},
+{
+id: "s_2924",
+type: "symptom",
+name: "عَرَج",
+common_name: "عرج",
+},
+{
+id: "s_2927",
+type: "symptom",
+name: "آفات فموية، في الجزء الأمامي منه",
+common_name: "آفات تتوضع في الجزء الأمامي من الفم",
+},
+{
+id: "s_2928",
+type: "symptom",
+name: "سقوط من شاهق",
+common_name: "سقوط من مكان مرتفع",
+},
+{
+id: "s_2929",
+type: "symptom",
+name: "رض ناتج عن حادث بدراجة نارية",
+common_name: "إصابة ناتجة عن حادث بدراجة نارية",
+},
+{
+id: "s_2930",
+type: "symptom",
+name: "اصطدام أحد المشاة أو راكب على الدراجة الهوائية بسيارة",
+common_name: "اصطدام أحد المشاة أو راكب على الدراجة الهوائية بسيارة",
+},
+{
+id: "s_2931",
+type: "symptom",
+name: "رض ناتج عن حادث سيارة خطير",
+common_name: "إصابة ناتجة عن حادث سيارة خطير",
+},
+{
+id: "s_2932",
+type: "symptom",
+name: "لا قصة سابقة للتعرُّض لرض ذي قوة كبيرة",
+common_name: "لا قصة سابقة للتعرُّض لرض ذي قوة كبيرة",
+},
+{
+id: "s_2935",
+type: "symptom",
+name: "اضطرابات في الرؤية، بعد التعرض لرض",
+common_name: "مشاكل في الرؤية بعد التعرض لإصابة ما",
+},
+{
+id: "s_2936",
+type: "symptom",
+name: "عجز عصبي حديث، بعد رض",
+common_name: "تغيرات عصبية حديثة ظهرت بعد التعرض لإصابة ما",
+},
+{
+id: "s_2937",
+type: "symptom",
+name: "انخفاض مفاجئ في ضغط الدم",
+common_name: "انخفاض مفاجئ في ضغط الدم",
+},
+{
+id: "s_2938",
+type: "symptom",
+name: "تغيرات جلدية، حول الشرج",
+common_name: "تغيرات في الجلد حول الشرج",
+},
+{
+id: "s_2939",
+type: "symptom",
+name: "ألم في العنق، حاد",
+common_name: "ألم حاد في الرقبة",
+},
+{
+id: "s_2940",
+type: "symptom",
+name: "ألم في العنق، تحت حاد",
+common_name: "ألم تحت حاد في الرقبة",
+},
+{
+id: "s_2941",
+type: "symptom",
+name: "ألم في العنق، مزمن",
+common_name: "ألم مزمن في الرقبة",
+},
+{
+id: "s_2942",
+type: "symptom",
+name: "اختناق شافٍ",
+common_name: "زوال الاختناق",
+},
+{
+id: "s_2945",
+type: "symptom",
+name: "قصة سابقة للتعرُّض للدغة حشرة القراد، خلال الأسابيع الثلاثة الماضية، في أوروبا",
+common_name: "التعرُّض خلال الأسابيع الثلاثة الماضية للدغة حشرة القراد في أوروبا",
+},
+{
+id: "s_2946",
+type: "symptom",
+name: "لا قصة سابقة للتعرُّض للدغة القراد",
+common_name: "عدم التعرض في الماضي للدغة بحشرة القراد",
+},
+{
+id: "s_2947",
+type: "symptom",
+name: "قصة سابقة للتعرُّض للدغة حشرة القراد، خلال الأسابيع الثلاثة الماضية، في أمريكا الشمالية",
+common_name: "التعرُّض خلال الأسابيع الثلاثة الماضية للدغة حشرة القراد في أمريكا الشمالية",
+},
+{
+id: "s_2948",
+type: "symptom",
+name: "قصة سابقة للتعرُّض للدغة حشرة القراد، خلال الأسابيع الثلاثة الماضية، في شمال آسيا",
+common_name: "التعرُّض خلال الأسابيع الثلاثة الماضية للدغة حشرة القراد في شمال آسيا",
+},
+{
+id: "s_2949",
+type: "symptom",
+name: "قصة سابقة للتعرُّض للدغة حشرة القراد، خلال الأسابيع الثلاثة الماضية، في جنوب شرق آسيا",
+common_name: "التعرُّض خلال الأسابيع الثلاثة الماضية للدغة حشرة القراد في جنوب شرق آسيا",
+},
+{
+id: "s_2950",
+type: "symptom",
+name: "لا نزيف أو تمشيح تناسلي غير طبيعي، أثناء الحمل",
+common_name: "لا نزيف أو تمشيح تناسلي غير طبيعي، أثناء الحمل",
+},
+{
+id: "s_2953",
+type: "symptom",
+name: "ألم في العنق، ذو بدء مفاجئ",
+common_name: "ألم في الرقبة ظهر فجأةً",
+},
+{
+id: "s_2954",
+type: "symptom",
+name: "تحدد حركة العنق",
+common_name: "تحدد حركة الرقبة",
+},
+{
+id: "s_2955",
+type: "symptom",
+name: "حرق في الجلد",
+common_name: "حرق",
+},
+{
+id: "s_2956",
+type: "symptom",
+name: "حرق في الجلد، ناتج عن الحرارة العالية",
+common_name: "حرق ناتج عن الحرارة العالية",
+},
+{
+id: "s_2957",
+type: "symptom",
+name: "حرق في الجلد، بمادة كيميائية",
+common_name: "حرق بمادة كيميائية",
+},
+{
+id: "s_2958",
+type: "symptom",
+name: "حرق في الجلد، بالتيار الكهربائي",
+common_name: "حرق بالتيار الكهربائي",
+},
+{
+id: "s_2959",
+type: "symptom",
+name: "حرق في الجلد، بشيء آخر",
+common_name: "سبب آخر للحرق",
+},
+{
+id: "s_2960",
+type: "symptom",
+name: "ألم شديد عند تحريك طرف، بعد رض",
+common_name: "عدم القدرة على تحريك طرف ما بسبب ألمٍ شديد فيه ظهر بعد التعرض لإصابة",
+},
+{
+id: "s_2961",
+type: "symptom",
+name: "قصة سابقة لسقوط متكرر من نفس ارتفاع الجسم",
+common_name: "سقوط عفوي مفاجئ",
+},
+{
+id: "s_2962",
+type: "symptom",
+name: "حرق في الجلد، سطحي",
+common_name: "حرق سطحي في الجلد",
+},
+{
+id: "s_2963",
+type: "symptom",
+name: "حرق في الجلد، جزئي السماكة",
+common_name: "حرق جزئي السماكة في الجلد",
+},
+{
+id: "s_2964",
+type: "symptom",
+name: "حرق في الجلد، كامل السماكة",
+common_name: "حرق شامل لكامل سماكة الجلد",
+},
+{
+id: "s_2965",
+type: "symptom",
+name: "حرق في الجلد، يشمل النسج العميقة",
+common_name: "حرق يشمل الطبقات العميقة",
+},
+{
+id: "s_2966",
+type: "symptom",
+name: "حرق في الجلد، يشمل 1-10% من مساحة سطح الجسم",
+common_name: "حرق يشمل 1-10% من مساحة سطح الجسم",
+},
+{
+id: "s_2967",
+type: "symptom",
+name: "خزل في طرف، بعد رض",
+common_name: "ضعف في عضلات طرف بعد التعرض لإصابة",
+},
+{
+id: "s_2968",
+type: "symptom",
+name: "تحدد مجال حركة مفصل، بعد رض",
+common_name: "تحدد مجال حركة مفصل، بعد رض",
+},
+{
+id: "s_2969",
+type: "symptom",
+name: "ألم يمكن تحمله عند تحريك طرف، بعد رض",
+common_name: "ألم يمكن تحمله عند تحريك طرف من الأطراف ظهر بعد التعرض لإصابة ما",
+},
+{
+id: "s_2970",
+type: "symptom",
+name: "لا ألم أو تحدد في الحركة عند تحريك طرف، بعد رض",
+common_name: "لا ألم أو تحدد في الحركة عند تحريك طرف، بعد رض",
+},
+{
+id: "s_2971",
+type: "symptom",
+name: "حرق في الجلد، في الرأس أو العنق وما حوله",
+common_name: "حرق في الرأس أو الرقبة أو ما حولها",
+},
+{
+id: "s_2972",
+type: "symptom",
+name: "حرق في الجلد، في اليد",
+common_name: "حرق في اليد",
+},
+{
+id: "s_2973",
+type: "symptom",
+name: "حرق في الجلد، في القدم",
+common_name: "حرق في القدم",
+},
+{
+id: "s_2974",
+type: "symptom",
+name: "حرق في الجلد، في الأعضاء التناسلية أو العجان",
+common_name: "حرق في المنطقة التناسلية",
+},
+{
+id: "s_2975",
+type: "symptom",
+name: "حرق في الجلد، في المفاصل الكبيرة",
+common_name: "حرق، في الجلد المغطي للمفاصل الكبيرة",
+},
+{
+id: "s_2976",
+type: "symptom",
+name: "حرق في الجلد، في مكان آخر",
+common_name: "حرق في مكان آخر",
+},
+{
+id: "s_2977",
+type: "symptom",
+name: "صعوبة في التبول، بعد رض",
+common_name: "صعوبة في التبول بعد التعرض لإصابة",
+},
+{
+id: "s_2980",
+type: "symptom",
+name: "حرق في الجلد، يشمل 10-20% من مساحة سطح الجسم",
+common_name: "حرق يشمل 10-20% من مساحة سطح الجسم",
+},
+{
+id: "s_2981",
+type: "symptom",
+name: "حرق في الجلد، يشمل أكثر من 20% من مساحة سطح الجسم",
+common_name: "حرق يشمل أكثر من 20% من مساحة سطح الجسم",
+},
+{
+id: "s_2982",
+type: "symptom",
+name: "صعوبة في التغوط، بعد رض",
+common_name: "صعوبة في التغوط بعد التعرض لإصابة",
+},
+{
+id: "s_2984",
+type: "symptom",
+name: "عدم القدرة على حمل ثقل الجسم",
+common_name: "عدم القدرة على الوقوف على أي من القدمين",
+},
+{
+id: "s_2985",
+type: "symptom",
+name: "لا توجد مشاكل في المشي",
+common_name: "مشي طبيعي",
+},
+{
+id: "s_2986",
+type: "symptom",
+name: "إجهاض حديث",
+common_name: "إجهاض حديث",
+},
+{
+id: "s_2987",
+type: "symptom",
+name: "ألم عيني، أحادي الجانب",
+common_name: "ألم في عين واحدة",
+},
+{
+id: "s_2988",
+type: "symptom",
+name: "ألم عيني، ثنائي الجانب",
+common_name: "ألم في كلتا العينين",
+},
+{
+id: "s_2991",
+type: "symptom",
+name: "مضض في النواتئ الشوكية",
+common_name: "ألم عند الضغط على النواتئ الشوكية",
+},
+{
+id: "s_2992",
+type: "symptom",
+name: "عدم القدرة على حمل ثقل الجسم، غير رضي المنشأ",
+common_name: "عدم القدرة على الوقوف على أي من القدمين دون التعرض لأي إصابة",
+},
+{
+id: "s_2999",
+type: "symptom",
+name: "كتلة جلدية، في المنطقة الإربية",
+common_name: "بروز تحت الجلد في المنطقة أعلى الفخذ",
+},
+{
+id: "s_3000",
+type: "symptom",
+name: "كتلة جلدية، ردودة",
+common_name: "كتلة ردودة في الجلد",
+},
+{
+id: "s_3001",
+type: "symptom",
+name: "كتلة جلدية، غير ردودة",
+common_name: "كتلة غير ردودة في الجلد",
+},
+{
+id: "s_3002",
+type: "symptom",
+name: "كتلة جلدية، في منطقة السرة",
+common_name: "كتلة في الجلد في المنطقة المحيطة بالسرة",
+},
+{
+id: "s_3003",
+type: "symptom",
+name: "كتلة جلدية، طرية",
+common_name: "كتلة أو نتوء طري في الجلد",
+},
+{
+id: "s_3004",
+type: "symptom",
+name: "حرق في العين",
+common_name: "حرق في العين",
+},
+{
+id: "s_3005",
+type: "symptom",
+name: "كتلة جلدية، داكنة أو زرقاء اللون",
+common_name: "كتلة أو نتوء في الجلد ذات لون داكن أو أزرق",
+},
+{
+id: "s_3006",
+type: "symptom",
+name: "كتلة جلدية، مسررة",
+common_name: "نتوءات في الجلد في مركزها انخفاض صغير",
+},
+{
+id: "s_3007",
+type: "symptom",
+name: "كتلة جلدية، قاسية",
+common_name: "كتلة قاسية في الجلد",
+},
+{
+id: "s_3008",
+type: "symptom",
+name: "كتلة جلدية، ذات قوام غير معروف",
+common_name: "كتلة في الجلد مجهولة القوام",
+},
+{
+id: "s_3009",
+type: "symptom",
+name: "كتلة جلدية، مؤلمة",
+common_name: "كتلة أو نتوء مؤلم في الجلد",
+},
+{
+id: "s_3012",
+type: "symptom",
+name: "حرق في الجلد، يشمل أقل من 1% من مساحة سطح الجسم",
+common_name: "حرق يشمل أقل من 1% من مساحة سطح الجسم",
+},
+{
+id: "s_3013",
+type: "symptom",
+name: "جرح، نظيف",
+common_name: "جرح نظيف",
+},
+{
+id: "s_3014",
+type: "symptom",
+name: "جرح، ملوث",
+common_name: "جرح ملوث",
+},
+{
+id: "s_3015",
+type: "symptom",
+name: "جرح، حاد",
+common_name: "جرح حاد",
+},
+{
+id: "s_3016",
+type: "symptom",
+name: "جرح، مزمن",
+common_name: "جرح مزمن",
+},
+{
+id: "s_3017",
+type: "symptom",
+name: "جرح، ممزق",
+common_name: "تمزق في الجلد",
+},
+{
+id: "s_3018",
+type: "symptom",
+name: "جرح، ثاقب",
+common_name: "جرح ثاقب",
+},
+{
+id: "s_3019",
+type: "symptom",
+name: "جرح، قاطع",
+common_name: "جرح قاطع",
+},
+{
+id: "s_3020",
+type: "symptom",
+name: "سحجة",
+common_name: "سحجة",
+},
+{
+id: "s_3021",
+type: "symptom",
+name: "جرح، هرسي",
+common_name: "جرح هرسي",
+},
+{
+id: "s_3022",
+type: "symptom",
+name: "جرح، ناتج عن طلق ناري",
+common_name: "جرح بطلق ناري",
+},
+{
+id: "s_3025",
+type: "symptom",
+name: "جرح، سطحي",
+common_name: "جرح سطحي في الجلد",
+},
+{
+id: "s_3026",
+type: "symptom",
+name: "جرح، جزئي السماكة",
+common_name: "جرح جزئي السماكة في الجلد",
+},
+{
+id: "s_3027",
+type: "symptom",
+name: "جرح، كامل السماكة",
+common_name: "جرح كامل السماكة في الجلد",
+},
+{
+id: "s_3028",
+type: "symptom",
+name: "جرح، يشمل النسج العميقة",
+common_name: "جرح يصل للأنسجة العميقة",
+},
+{
+id: "s_3030",
+type: "symptom",
+name: "تغير جلدي وحيد",
+common_name: "تغير واحد في الجلد",
+},
+{
+id: "s_3031",
+type: "symptom",
+name: "تغيرات جلدية، متعددة",
+common_name: "تغيرات متعددة في الجلد",
+},
+{
+id: "s_3034",
+type: "symptom",
+name: "صداع، اشتد فجأة",
+common_name: "ألم في الرأس ازدادت شدته فجأة",
+},
+{
+id: "s_3037",
+type: "symptom",
+name: "التفكير الوهمي",
+common_name: "الاعتقاد الجازم بشيء غير صحيح",
+},
+{
+id: "s_3038",
+type: "symptom",
+name: "هلوسات سابقة",
+common_name: "إدراك أحاسيس أو أشياء غير موجودة حقيقة",
+},
+{
+id: "s_3039",
+type: "symptom",
+name: "حالة التلقيح ضد الكزاز غير معروفة",
+common_name: "حالة التطعيم ضد الكزاز غير معروفة",
+},
+{
+id: "s_3042",
+type: "symptom",
+name: "شرب الكحول",
+common_name: "شرب الكحول",
+},
+{
+id: "s_3045",
+type: "symptom",
+name: "إصابة استنشاقية",
+common_name: "حرق في الطريق الهوائي",
+},
+{
+id: "s_3046",
+type: "symptom",
+name: "أذية في الركبة، التواء",
+common_name: "التواء في الركبة",
+},
+{
+id: "s_3047",
+type: "symptom",
+name: "سيلان من الحلمة، مفرزات دموية",
+common_name: "خروج مفرزات دموية من الحلمة",
+},
+{
+id: "s_3048",
+type: "symptom",
+name: "تشقق الحلمة",
+common_name: "تشققات الحلمة",
+},
+{
+id: "s_3049",
+type: "symptom",
+name: "سيلان من الحلمة، قيح",
+common_name: "خروج قيح من الحلمة",
+},
+{
+id: "s_3051",
+type: "symptom",
+name: "سيلان من الحلمة، مفرزات مائية أو مصلية",
+common_name: "خروج مفرزات مائية أو مصلية من الحلمة",
+},
+{
+id: "s_3052",
+type: "symptom",
+name: "مستوى جلوكوز الدم بين 71 و180 ملغ/دل أو بين 4 و9.9 ممول/ل",
+common_name: "مستوى السكر في الدم بين 71 و180 ملغ/دل",
+},
+{
+id: "s_3053",
+type: "symptom",
+name: "مستوى جلوكوز الدم بين 181 و250 ملغ/دل أو بين 10 و13.9 ممول/ل",
+common_name: "مستوى السكر في الدم بين 181 و250 ملغ/دل",
+},
+{
+id: "s_3054",
+type: "symptom",
+name: "مستوى جلوكوز الدم بين 251 و 350 ملغ/دل أو بين 14 و19.4 ممول/ل",
+common_name: "مستوى السكر في الدم بين 251 و 350 ملغ/دل",
+},
+{
+id: "s_3055",
+type: "symptom",
+name: "مستوى جلوكوز الدم أعلى من 350 ملغ/دل أو 19.4 ممول/ل",
+common_name: "مستوى السكر في الدم أعلى من 350 ملغ/دل",
+},
+{
+id: "s_3056",
+type: "symptom",
+name: "مستوى جلوكوز الدم خلال الساعات الستة الماضية، أعلى من 250 ملغ/دل أو 13.9 ممول/ل",
+common_name: "مستوى السكر في الدم بقي أعلى من 250 ملغ/دل خلال الساعات الستة الماضية",
+},
+{
+id: "s_3057",
+type: "symptom",
+name: "إدخال جسم أجنبي، في الشرج",
+common_name: "إدخال جسم غريب في الشرج",
+},
+{
+id: "s_3058",
+type: "symptom",
+name: "إدخال جسم أجنبي، في المهبل",
+common_name: "إدخال جسم غريب في المهبل",
+},
+{
+id: "s_3059",
+type: "symptom",
+name: "رض مباشر على الوجه الأمامي من الركبة",
+common_name: "التعرض لضربة مباشرة على الركبة من الأمام",
+},
+{
+id: "s_3062",
+type: "symptom",
+name: "اضطراب في الدورة الشهرية، عدم انتظام",
+common_name: "عدم انتظام الدورة الشهرية",
+},
+{
+id: "s_3063",
+type: "symptom",
+name: "اضطراب في الدورة الشهرية، طول في الدورة",
+common_name: "طول في الدورة الشهرية أكثر من 8 أيام",
+},
+{
+id: "s_3064",
+type: "symptom",
+name: "اضطراب في الدورة الشهرية، غزارة",
+common_name: "غزارة الدورة الشهرية",
+},
+{
+id: "s_3065",
+type: "symptom",
+name: "اضطراب في الدورة الشهرية، قلة الطمث",
+common_name: "قلة دم الدورة الشهرية",
+},
+{
+id: "s_3066",
+type: "symptom",
+name: "اضطراب في الدورة الشهرية، عسر الطمث",
+common_name: "ألم الدورة الشهرية",
+},
+{
+id: "s_3067",
+type: "symptom",
+name: "اضطراب في الدورة الشهرية، تعدد الطموث",
+common_name: "كثرة عدد الدورات الشهرية",
+},
+{
+id: "s_3068",
+type: "symptom",
+name: "اضطراب في الدورة الشهرية، ندرة الطمث",
+common_name: "قلة عدد الدورات الشهرية",
+},
+{
+id: "s_3069",
+type: "symptom",
+name: "اضطراب في الدورة الشهرية",
+common_name: "مشاكل في الدورة الشهرية",
+},
+{
+id: "s_3070",
+type: "symptom",
+name: "تغيرات جلدية، أحادية الجانب",
+common_name: "تغيرات في الجلد تتوضع على جانب واحد فقط من الجسم",
+},
+{
+id: "s_3071",
+type: "symptom",
+name: "بكاء لا يتوقف",
+common_name: "بكاء لا يمكن إيقافه",
+},
+{
+id: "s_3072",
+type: "symptom",
+name: "نوب متكررة من البكاء الشديد الذي لا يمكن إيقافه ولا سبب واضح له",
+common_name: "نوب متكررة من البكاء الشديد الذي لا يمكن إيقافه ولا سبب واضح له",
+},
+{
+id: "s_3078",
+type: "symptom",
+name: "ضعف عضلي، دون شلل",
+common_name: "ضعف في العضلات مع بقاء القدرة على تحريكها",
+},
+{
+id: "s_3079",
+type: "symptom",
+name: "ضعف عضلي، خزل",
+common_name: "ضعف في العضلات مع تراجع القدرة على الحركة",
+},
+{
+id: "s_3080",
+type: "symptom",
+name: "ضعف عضلي، شلل",
+common_name: "ضعف في العضلات مع عدم القدرة على الحركة",
+},
+{
+id: "s_3083",
+type: "symptom",
+name: "ألم في الخاصرة، في البطن",
+common_name: "ألم في جانب البطن",
+},
+{
+id: "s_3084",
+type: "symptom",
+name: "ألم في الخاصرة، في الظهر",
+common_name: "ألم في جانب الظهر",
+},
+{
+id: "s_3085",
+type: "symptom",
+name: "ألم في الخاصرة، في الجانب",
+common_name: "ألم في الخاصرة، في الجانب",
+},
+{
+id: "s_3087",
+type: "symptom",
+name: "تبارز في الصيوان",
+common_name: "بروز في الأذن",
+},
+{
+id: "s_3089",
+type: "symptom",
+name: "زلة تنفسية، شديدة أثناء الراحة",
+common_name: "ضيق شديد في التنفس يحدث حتى عند الراحة",
+},
+{
+id: "s_3090",
+type: "symptom",
+name: "زلة تنفسية، شديدة",
+common_name: "ضيق شديد في التنفس",
+},
+{
+id: "s_3091",
+type: "symptom",
+name: "الأذية الحالية",
+common_name: "الإصابة الحالية",
+},
+{
+id: "s_3092",
+type: "symptom",
+name: "أذية إضافية",
+common_name: "إصابة أخرى",
+},
+{
+id: "s_3093",
+type: "symptom",
+name: "لا أذية إضافية",
+common_name: "لا إصابة أخرى",
+},
+{
+id: "s_3094",
+type: "symptom",
+name: "التعرض لأحادي أكسيد الكربون في حالة حرق",
+common_name: "التعرض لأحادي أكسيد الكربون في حالة حرق",
+},
+{
+id: "s_3096",
+type: "symptom",
+name: "ضعف عضلي، موضع",
+common_name: "ضعف في العضلات في جزء محدد من الجسم",
+},
+{
+id: "s_3097",
+type: "symptom",
+name: "ضعف عضلي، في الأطراف",
+common_name: "ضعف في الأطراف",
+},
+{
+id: "s_3098",
+type: "symptom",
+name: "ضعف عضلي، وجهي",
+common_name: "ضعف في عضلات الوجه",
+},
+{
+id: "s_3099",
+type: "symptom",
+name: "صعوبة إغلاق العين، في عينٍ واحدة",
+common_name: "صعوبة في إغلاق إحدى العينين بشكل كامل",
+},
+{
+id: "s_3100",
+type: "symptom",
+name: "ضعف عضلي، هبوط زاوية الفم في جهة واحدة",
+common_name: "هبوط في أحد جانبي الفم",
+},
+{
+id: "s_3101",
+type: "symptom",
+name: "ضعف عضلي، في جانب واحد من الوجه",
+common_name: "ضعف في العضلات في جانبٍ واحد من الوجه",
+},
+{
+id: "s_3104",
+type: "symptom",
+name: "ضعف عضلي، في كلا الطرفين العلويين",
+common_name: "ضعف في العضلات في كلا الطرفين العلويين",
+},
+{
+id: "s_3105",
+type: "symptom",
+name: "ضعف عضلي، في طرف علوي واحد",
+common_name: "ضعف في العضلات في طرف علوي واحد",
+},
+{
+id: "s_3106",
+type: "symptom",
+name: "ضعف عضلي، يستمر أقل من 24 ساعة",
+common_name: "ضعف في العضلات يستمر أقل من 24 ساعة",
+},
+{
+id: "s_3107",
+type: "symptom",
+name: "ضعف عضلي، في طرف سفلي واحد",
+common_name: "ضعف في العضلات في طرف سفلي واحد",
+},
+{
+id: "s_3108",
+type: "symptom",
+name: "ضعف عضلي، في كلا الطرفين السفليين",
+common_name: "ضعف في العضلات في كلا الطرفين السفليين",
+},
+{
+id: "s_3109",
+type: "symptom",
+name: "ضعف عضلي، خزل رباعي",
+common_name: "ضعف في كل الأطراف الأربعة",
+},
+{
+id: "s_3110",
+type: "symptom",
+name: "ضعف عضلي، خزل شقي",
+common_name: "ضعف في العضلات في جانب واحد من الجسم",
+},
+{
+id: "s_3111",
+type: "symptom",
+name: "ضعف عضلي، في الأطراف، من نمط آخر",
+common_name: "ضعف عضلي، في الأطراف، من نمط آخر",
+},
+{
+id: "s_3112",
+type: "symptom",
+name: "ضعف عضلي صاعد",
+common_name: "ضعف في العضلات ينتشر من الأسفل للأعلى",
+},
+{
+id: "s_3113",
+type: "symptom",
+name: "ضعف عضلي، يستمر بين 24 ساعة وأسبوع واحد",
+common_name: "ضعف في العضلات يستمر بين 24 ساعة وأسبوع واحد",
+},
+{
+id: "s_3115",
+type: "symptom",
+name: "حمى، استجابة غير معروفة لخافضات الحرارة",
+common_name: "استجابة غير معروفة للحمى على الأدوية الخافضة للحرارة",
+},
+{
+id: "s_3116",
+type: "symptom",
+name: "أذية، لا معلومات",
+common_name: "إصابة دون معلومات تفصيلية",
+},
+{
+id: "s_3117",
+type: "symptom",
+name: "ضعف عضلي، يستمر بين أسبوع واحد و4 أسابيع",
+common_name: "ضعف في العضلات يستمر بين أسبوع واحد و4 اسابيع",
+},
+{
+id: "s_3118",
+type: "symptom",
+name: "ضعف عضلي، يستمر أكثر من 4 أسابيع",
+common_name: "ضعف في العضلات يستمر أكثر من 4 أسابيع",
+},
+{
+id: "s_3120",
+type: "symptom",
+name: "ألم أو مضض في الحلمة",
+common_name: "ألم أو مضض في الحلمة",
+},
+{
+id: "s_3121",
+type: "symptom",
+name: "محاولة انتحار في الماضي",
+common_name: "محاولة انتحار في الماضي",
+},
+{
+id: "s_3122",
+type: "symptom",
+name: "صعوبة إغلاق العين، في كلا العينين",
+common_name: "صعوبة في إغلاق كلا العينين بشكل كامل",
+},
+{
+id: "s_3123",
+type: "symptom",
+name: "ضعف عضلي، هبوط زاوية الفم في الجهتين",
+common_name: "هبوط في جانبي الفم",
+},
+{
+id: "s_3124",
+type: "symptom",
+name: "ضعف عضلي، وجهي، من نمط آخر",
+common_name: "ضعف عضلي، وجهي، من نمط آخر",
+},
+{
+id: "s_3125",
+type: "symptom",
+name: "شرب الكحول، منذ أقل من 24 ساعة، كمية كبيرة",
+common_name: "شرب الكحول، منذ أقل من 24 ساعة، كمية كبيرة",
+},
+{
+id: "s_3126",
+type: "symptom",
+name: "شرب الكحول، منذ أقل من 24 ساعة، كمية قليلة",
+common_name: "شرب الكحول، منذ أقل من 24 ساعة، كمية قليلة",
+},
+{
+id: "s_3127",
+type: "symptom",
+name: "شرب الكحول، منذ أقل من 24 ساعة، كمية غير معروفة",
+common_name: "شرب الكحول، منذ أقل من 24 ساعة، كمية غير معروفة",
+},
+{
+id: "s_3128",
+type: "symptom",
+name: "شرب الكحول، منذ أقل من 24 ساعة، كمية كبيرة عند رجل",
+common_name: "شرب الكحول، منذ أقل من 24 ساعة، كمية كبيرة عند رجل",
+},
+{
+id: "s_3129",
+type: "symptom",
+name: "شرب الكحول، منذ أقل من 24 ساعة، كمية كبيرة عند امرأة",
+common_name: "شرب الكحول، منذ أقل من 24 ساعة، كمية كبيرة عند امرأة",
+},
+{
+id: "s_3130",
+type: "symptom",
+name: "شرب الكحول، منذ أقل من 24 ساعة، كمية قليلة عند رجل",
+common_name: "شرب الكحول، منذ أقل من 24 ساعة، كمية قليلة عند رجل",
+},
+{
+id: "s_3131",
+type: "symptom",
+name: "شرب الكحول، منذ أقل من 24 ساعة، كمية قليلة عند امرأة",
+common_name: "شرب الكحول، منذ أقل من 24 ساعة، كمية قليلة عند امرأة",
+},
+{
+id: "s_3133",
+type: "symptom",
+name: "شرب الكحول، منذ أكثر من 24 ساعة، محفوف بالمخاطر، عند رجل",
+common_name: "شرب الكحول، منذ أكثر من 24 ساعة، محفوف بالمخاطر، عند رجل",
+},
+{
+id: "s_3134",
+type: "symptom",
+name: "شرب الكحول، منذ أكثر من 24 ساعة، محفوف بالمخاطر، عند امرأة",
+common_name: "شرب الكحول، منذ أكثر من 24 ساعة، محفوف بالمخاطر، عند امرأة",
+},
+{
+id: "s_3135",
+type: "symptom",
+name: "شرب الكحول، منذ أكثر من 24 ساعة، محفوف بالمخاطر",
+common_name: "شرب الكحول، منذ أكثر من 24 ساعة، محفوف بالمخاطر",
+},
+{
+id: "s_3136",
+type: "symptom",
+name: "شرب الكحول، منذ أكثر من 24 ساعة، بإفراط",
+common_name: "شرب الكحول، منذ أكثر من 24 ساعة، بإفراط",
+},
+{
+id: "s_3137",
+type: "symptom",
+name: "شرب الكحول، منذ أكثر من 24 ساعة، بإفراط، عند رجل",
+common_name: "شرب الكحول، منذ أكثر من 24 ساعة، بإفراط، عند رجل",
+},
+{
+id: "s_3138",
+type: "symptom",
+name: "شرب الكحول، منذ أكثر من 24 ساعة، بإفراط، عند امرأة",
+common_name: "شرب الكحول، منذ أكثر من 24 ساعة، بإفراط، عند امرأة",
+},
+{
+id: "s_3139",
+type: "symptom",
+name: "شرب الكحول، منذ أكثر من 24 ساعة، بشراهة",
+common_name: "شرب الكحول، منذ أكثر من 24 ساعة، بشراهة",
+},
+{
+id: "s_3140",
+type: "symptom",
+name: "شرب الكحول، منذ أكثر من 24 ساعة، بشراهة، عند رجل",
+common_name: "شرب الكحول، منذ أكثر من 24 ساعة، بشراهة، عند رجل",
+},
+{
+id: "s_3141",
+type: "symptom",
+name: "شرب الكحول، منذ أكثر من 24 ساعة، بشراهة، عند امرأة",
+common_name: "شرب الكحول، منذ أكثر من 24 ساعة، بشراهة، عند امرأة",
+},
+{
+id: "s_3144",
+type: "symptom",
+name: "مضض بالثدي، في أحد أو كلا الثديين",
+common_name: "ألم في أحد أو كلا الثديين عند الضغط عليهما",
+},
+{
+id: "s_3145",
+type: "symptom",
+name: "لا إصابة عينية",
+common_name: "لا توجد إصابة في العين",
+},
+{
+id: "s_3146",
+type: "symptom",
+name: "يرقان، منذ أقل من 72 ساعة",
+common_name: "اصفرار في الجلد منذ أقل من 3 أيام",
+},
+{
+id: "s_3147",
+type: "symptom",
+name: "يرقان، يستمر بين  3 أيام و3 أسابيع",
+common_name: "اصفرار في الجلد يستمر فترة بين 3 أيام و3 أسابيع",
+},
+{
+id: "s_3148",
+type: "symptom",
+name: "يرقان، يستمر بين 3 أسابيع و3 أشهر",
+common_name: "اصفرار في الجلد يستمر فترة بين 3 أسابيع و3 أشهر",
+},
+{
+id: "s_3149",
+type: "symptom",
+name: "يرقان، منذ أكثر من 3 أشهر",
+common_name: "اصفرار في الجلد منذ أكثر من 3 أشهر",
+},
+{
+id: "s_3150",
+type: "symptom",
+name: "يرقان، ظهر خلال الساعات الـ24 الأولى التالية للولادة",
+common_name: "اصفرار في الجلد ظهر خلال أول 24 ساعة من الولادة",
+},
+{
+id: "s_3151",
+type: "symptom",
+name: "حمامى، ذات حدود واضحة",
+common_name: "احمرار في الجلد حوافه واضحة ومحددة",
+},
+{
+id: "s_3154",
+type: "symptom",
+name: "تنخر في الجلد",
+common_name: "تنخر في الجلد",
+},
+{
+id: "s_3156",
+type: "symptom",
+name: "ابتلاع جسم أجنبي، بطارية",
+common_name: "ابتلاع بطارية",
+},
+{
+id: "s_3157",
+type: "symptom",
+name: "ابتلاع جسم أجنبي، مادة كيميائية",
+common_name: "ابتلاع مادة كيميائية",
+},
+{
+id: "s_3158",
+type: "symptom",
+name: "ابتلاع جسم أجنبي، شيء خطير",
+common_name: "ابتلاع شيء خطير",
+},
+{
+id: "s_3159",
+type: "symptom",
+name: "ابتلاع جسم أجنبي، صغير وكليل",
+common_name: "ابتلاع شيء صغير وغير حاد",
+},
+{
+id: "s_3162",
+type: "symptom",
+name: "جرح، ناتج عن حرق",
+common_name: "جرح ناتج عن حرق",
+},
+{
+id: "s_3166",
+type: "symptom",
+name: "شرب الكحول، متلازمة السحب حالياً",
+common_name: "أعراض الانسحاب الكحولي حالياً",
+},
+{
+id: "s_3167",
+type: "symptom",
+name: "جرح، ملتهب",
+common_name: "التهاب في الجرح",
+},
+{
+id: "s_3168",
+type: "symptom",
+name: "جرح، غير ملتهب",
+common_name: "جرح، غير ملتهب",
+},
+{
+id: "s_3171",
+type: "symptom",
+name: "نقص التروية في طرف، بعد التعرض لرض",
+common_name: "ضعف الجريان الدموي إلى الطرف المصاب",
+},
+{
+id: "s_3173",
+type: "symptom",
+name: "جرح، خدش ناجم عن التعرض لحيوان",
+common_name: "خدش ناجم عن التعامل مع حيوان",
+},
+{
+id: "s_3174",
+type: "symptom",
+name: "ضغط الدم، مرتفع عند طفل",
+common_name: "ارتفاع ضغط الدم عند طفل",
+},
+{
+id: "s_3176",
+type: "symptom",
+name: "انخفاض التوتر الشرياني عند طفل",
+common_name: "انخفاض ضغط الدم عند طفل",
+},
+{
+id: "s_3178",
+type: "symptom",
+name: "إدمان الكحول",
+common_name: "إدمان الكحول",
+},
+{
+id: "s_3179",
+type: "symptom",
+name: "ابتلاع جسم أجنبي، غير معروف",
+common_name: "ابتلاع شيء غير معروف",
+},
+{
+id: "s_3188",
+type: "symptom",
+name: "دوخة، مفاجئة وشديدة",
+common_name: "دوخة مفاجئة وشديدة",
+},
+{
+id: "s_3189",
+type: "symptom",
+name: "ضعف الرؤية، فقدان الرؤية في جزء من الساحة البصرية",
+common_name: "فقدان الرؤية في جزء من الساحة البصرية",
+},
+{
+id: "s_3190",
+type: "symptom",
+name: "ضعف الرؤية، بدء مفاجئ",
+common_name: "ضعف مفاجئ في الرؤية",
+},
+{
+id: "s_3193",
+type: "symptom",
+name: "حدقتان غير متناظرتان، منذ أقل من 3 أيام",
+common_name: "حدقتان غير متماثلتان ببدء مفاجئ",
+},
+{
+id: "s_3194",
+type: "symptom",
+name: "حدقتان غير متناظرتان، منذ 3 أيام أو أكثر",
+common_name: "حدقتان غير متماثلتان منذ أكثر من 3 أيام",
+},
+{
+id: "s_3195",
+type: "symptom",
+name: "ظاهرة غروب الشمس",
+common_name: "ظاهرة غروب الشمس",
+},
+{
+id: "s_3197",
+type: "symptom",
+name: "غياب الوعي، بعد التعرض لرض",
+common_name: "فقدان الوعي بعد التعرض لإصابة",
+},
+{
+id: "s_3199",
+type: "symptom",
+name: "ضعف الرؤية، تدريجي",
+common_name: "ضعف تدريجي في الرؤية",
+},
+{
+id: "s_3200",
+type: "symptom",
+name: "ضعف الرؤية، اضطرابات بصرية شخصية",
+common_name: "مشاكل في الرؤية ناتجة عن حوادث غير طبيعية فيها",
+},
+{
+id: "s_3201",
+type: "symptom",
+name: "ضعف الرؤية، عمى تام",
+common_name: "عمى تام",
+},
+{
+id: "s_3205",
+type: "symptom",
+name: "رُعاف، لا يمكن إيقافه",
+common_name: "نزف لا يمكن إيقافه من الأنف",
+},
+{
+id: "s_3206",
+type: "symptom",
+name: "صعوبة إغلاق العين",
+common_name: "صعوبة في إغلاق العين",
+},
+{
+id: "s_3208",
+type: "symptom",
+name: "ضعف القدرة على تحريك بعض أجزاء الجسم",
+common_name: "صعوبة تحريك أحد أجزاء الجسم",
+},
+{
+id: "s_3209",
+type: "symptom",
+name: "صعق بالتيار الكهربائي أدى لمضاعفات قلبية أو رئوية",
+common_name: "مشاكل في القلب أو الرئتين بعد الإصابة بصعق كهربائي",
+},
+{
+id: "s_3210",
+type: "symptom",
+name: "ألم في طرف",
+common_name: "ألم طرف",
+},
+{
+id: "s_3212",
+type: "symptom",
+name: "عدم استخدام أي موانع حمل هرمونية أو معالجة هرمونية معيضة أو لولب رحمي",
+common_name: "عدم استخدام أي موانع حمل هرمونية أو معالجة هرمونية معيضة أو لولب رحمي",
+},
+];
\ No newline at end of file
diff --git a/convert_json.dart b/convert_json.dart
new file mode 100644
index 0000000..08f344d
--- /dev/null
+++ b/convert_json.dart
@@ -0,0 +1,73 @@
+import 'dart:convert';
+import 'dart:io';
+
+void main() async {
+  final file = File('assets/json/body_symptoms_data.json');
+  final content = await file.readAsString();
+
+  print('File size: ${content.length} characters');
+
+  // Split into two parts
+  final parts = content.split('export const SymptomsData = [');
+  if (parts.length != 2) {
+    print('ERROR: Could not split file properly');
+    exit(1);
+  }
+
+  print('Split into ${parts.length} parts');
+
+  // Process BodySymptomsData
+  var bodyPart = parts[0]
+      .replaceAll('export const BodySymptomsData = ', '')
+      .trim()
+      .replaceAll(RegExp(r';$'), '');
+
+  print('Parsing body symptoms...');
+  Map bodySymptomsData;
+  try {
+    bodySymptomsData = json.decode(bodyPart);
+    print('✅ Body symptoms parsed: ${bodySymptomsData.length} body parts');
+  } catch (e) {
+    print('❌ Error parsing body symptoms: $e');
+    exit(1);
+  }
+
+  // Process SymptomsData
+  print('Processing symptoms data...');
+  var symptomsPart = parts[1]
+      .trim()
+      .replaceAll(RegExp(r'\];$'), '')
+      .replaceAllMapped(RegExp(r'\n(\s*)id:'), (m) => '\n${m.group(1)}"id":')
+      .replaceAllMapped(RegExp(r'\n(\s*)type:'), (m) => '\n${m.group(1)}"type":')
+      .replaceAllMapped(RegExp(r'\n(\s*)name:'), (m) => '\n${m.group(1)}"name":')
+      .replaceAllMapped(RegExp(r'\n(\s*)common_name:'), (m) => '\n${m.group(1)}"common_name":');
+
+  print('Parsing symptoms...');
+  List symptomsData;
+  try {
+    symptomsData = json.decode('[$symptomsPart]');
+    print('✅ Symptoms parsed: ${symptomsData.length} symptoms');
+  } catch (e) {
+    print('❌ Error parsing symptoms: $e');
+    print('First 1000 chars:');
+    print('[$symptomsPart]'.substring(0, 1000));
+    exit(1);
+  }
+
+  // Create final JSON
+  print('Creating final JSON structure...');
+  final jsonStructure = {
+    'bodySymptoms': bodySymptomsData,
+    'symptoms': symptomsData,
+  };
+
+  // Write to file
+  print('Writing to file...');
+  final encoder = JsonEncoder.withIndent('  ');
+  await file.writeAsString(encoder.convert(jsonStructure));
+
+  print('\n✅ SUCCESS! File converted to proper JSON');
+  print('✅ Body parts: ${bodySymptomsData.length}');
+  print('✅ Symptoms: ${symptomsData.length}');
+}
+
diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart
index d9906e0..5499787 100644
--- a/lib/core/api_consts.dart
+++ b/lib/core/api_consts.dart
@@ -14,7 +14,7 @@ var PACKAGES_ORDERS = '/api/orders';
 var PACKAGES_ORDER_HISTORY = '/api/orders/items';
 var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara';
 // var  BASE_URL = 'http://10.50.100.198:2018/';
-var  BASE_URL = 'https://uat.hmgwebservices.com/';
+var BASE_URL = 'https://uat.hmgwebservices.com/';
 // var BASE_URL = 'https://hmgwebservices.com/';
 // var  BASE_URL = 'http://10.201.204.103/';
 // var BASE_URL = 'https://orash.cloudsolutions.com.sa/';
@@ -181,6 +181,7 @@ var GET_TABLE_REQUEST = 'Services/Community.svc/REST/CreateVaccinationTable';
 ///
 /// use get all cities from the e-referral, already calling this api there don't use multiple same api calls
 var GET_CITIES_REQUEST = 'Services/Lists.svc/REST/GetAllCities';
+
 ///
 ///
 ///
@@ -444,8 +445,6 @@ var H2O_UPDATE_USER_DETAIL = "Services/H2ORemainder.svc/REST/H2O_UpdateUserDetai
 var H2O_UNDO_USER_ACTIVITY = "Services/H2ORemainder.svc/REST/H2o_UndoUserActivity";
 //E_Referral Services
 
-
-
 // Encillary Orders
 
 var GET_ANCILLARY_ORDERS = 'Services/Doctors.svc/REST/GetOnlineAncillaryOrderList';
@@ -710,7 +709,9 @@ class ApiConsts {
 
   static String baseUrl = 'https://hmgwebservices.com/'; // HIS API URL PROD
 
-  static String rcBaseUrl = 'https://rc.hmg.com/'; // RC API URL PROD
+  static String rcBaseUrl = 'https://rc.hmg.com/'; // dRC API URL PROD
+  static String hmgPharmacyApiBaseUrl = 'https://hmgpharmacyapi.hmg.com/'; // dRC API URL PROD
+  static String symptomsCheckerApi = '${hmgPharmacyApiBaseUrl}symptomsapi/api/SymptomChecker'; // dRC API URL PROD
 
   static var payFortEnvironment = FortEnvironment.production;
   static var applePayMerchantId = "merchant.com.hmgwebservices";
@@ -844,6 +845,12 @@ class ApiConsts {
   static final String updateHHCOrder = 'api/hhc/update';
   static final String addHHCOrder = 'api/HHC/add';
 
+  // SYMPTOMS CHECKER
+  static final String getBodySymptomsByName = '$symptomsCheckerApi/GetBodySymptomsByName';
+  static final String getRiskFactors = '$symptomsCheckerApi/GetRiskFactors';
+  static final String getGeneralSuggestion = '$symptomsCheckerApi/GetGeneralSggestion';
+  static final String diagnosis = '$symptomsCheckerApi/diagnosis';
+  static final String explain = '$symptomsCheckerApi/explain';
 
   //E-REFERRAL SERVICES
 
@@ -854,7 +861,6 @@ class ApiConsts {
   static final createEReferral = "Services/Patients.svc/REST/CreateEReferral";
   static final getEReferrals = "Services/Patients.svc/REST/GetEReferrals";
 
-
   // ************     static values for Api   ****************
   static final double appVersionID = 50.3;
   static final int appChannelId = 3;
diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart
index 88b1f6f..b994d4e 100644
--- a/lib/core/dependencies.dart
+++ b/lib/core/dependencies.dart
@@ -16,6 +16,7 @@ import 'package:hmg_patient_app_new/features/emergency_services/emergency_servic
 import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_repo.dart';
 import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart';
 import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_repo.dart';
+import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_view_model.dart';
 import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_repo.dart';
 import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart';
 import 'package:hmg_patient_app_new/features/insurance/insurance_repo.dart';
@@ -36,9 +37,10 @@ import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_mo
 import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart';
 import 'package:hmg_patient_app_new/features/radiology/radiology_repo.dart';
 import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_repo.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart';
 import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart';
 import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart';
-import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_checker_view_model.dart';
 import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart';
 import 'package:hmg_patient_app_new/services/cache_service.dart';
 import 'package:hmg_patient_app_new/services/dialog_service.dart';
@@ -94,6 +96,9 @@ class AppDependencies {
     final sharedPreferences = await SharedPreferences.getInstance();
     getIt.registerLazySingleton(() => CacheServiceImp(sharedPreferences: sharedPreferences, loggerService: getIt()));
     getIt.registerLazySingleton(() => ApiClientImp(appState: getIt()));
+    getIt.registerLazySingleton(
+      () => LocalAuthService(loggerService: getIt(), localAuth: getIt()),
+    );
 
     // Repositories
     getIt.registerLazySingleton(() => CommonRepoImp(loggerService: getIt()));
@@ -105,9 +110,6 @@ class AppDependencies {
     getIt.registerLazySingleton(() => PrescriptionsRepoImp(loggerService: getIt(), apiClient: getIt()));
     getIt.registerLazySingleton(() => InsuranceRepoImp(loggerService: getIt(), apiClient: getIt()));
     getIt.registerLazySingleton(() => PayfortRepoImp(loggerService: getIt(), apiClient: getIt()));
-    getIt.registerLazySingleton(
-      () => LocalAuthService(loggerService: getIt(), localAuth: getIt()),
-    );
     getIt.registerLazySingleton(() => HabibWalletRepoImp(loggerService: getIt(), apiClient: getIt()));
     getIt.registerLazySingleton(() => MedicalFileRepoImp(loggerService: getIt(), apiClient: getIt()));
     getIt.registerLazySingleton(() => ImmediateLiveCareRepoImp(loggerService: getIt(), apiClient: getIt()));
@@ -116,6 +118,7 @@ class AppDependencies {
     getIt.registerLazySingleton(() => LocationRepoImpl(apiClient: getIt()));
     getIt.registerLazySingleton(() => ContactUsRepoImp(loggerService: getIt(), apiClient: getIt()));
     getIt.registerLazySingleton(() => HmgServicesRepoImp(loggerService: getIt(), apiClient: getIt()));
+    getIt.registerLazySingleton(() => SymptomsCheckerRepoImp(loggerService: getIt(), apiClient: getIt()));
 
     // ViewModels
     // Global/shared VMs → LazySingleton
@@ -126,7 +129,8 @@ class AppDependencies {
       () => RadiologyViewModel(radiologyRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()),
     );
 
-    getIt.registerLazySingleton(() => PrescriptionsViewModel(prescriptionsRepo: getIt(), errorHandlerService: getIt(), navServices: getIt()));
+    getIt.registerLazySingleton(
+        () => PrescriptionsViewModel(prescriptionsRepo: getIt(), errorHandlerService: getIt(), navServices: getIt()));
 
     getIt.registerLazySingleton(() => InsuranceViewModel(insuranceRepo: getIt(), errorHandlerService: getIt()));
 
@@ -216,7 +220,7 @@ class AppDependencies {
       () => TodoSectionViewModel(todoSectionRepo: getIt(), errorHandlerService: getIt()),
     );
 
-    getIt.registerLazySingleton(() => SymptomsCheckerViewModel());
+    getIt.registerLazySingleton(() => SymptomsCheckerViewModel(errorHandlerService: getIt(), symptomsCheckerRepo: getIt()));
     getIt.registerLazySingleton(
       () => HmgServicesViewModel(bookAppointmentsRepo: getIt(), hmgServicesRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()),
     );
diff --git a/lib/core/utils/calender_utils_new.dart b/lib/core/utils/calender_utils_new.dart
index 05448b1..5a43d78 100644
--- a/lib/core/utils/calender_utils_new.dart
+++ b/lib/core/utils/calender_utils_new.dart
@@ -25,7 +25,13 @@ class CalenderUtilsNew {
     });
   }
 
-  FutureOr createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId, int? reminderMinutes}) async {
+  FutureOr createOrUpdateEvent(
+      {required String title,
+      required String description,
+      required String location,
+      DateTime? scheduleDateTime,
+      String? eventId,
+      int? reminderMinutes}) async {
     if (writableCalender.isEmpty) {
       await getCalenders();
     }
@@ -38,12 +44,14 @@ class CalenderUtilsNew {
     // String eventId = await getEventIdIfEventExist(title!.split("#").last);
     // if (eventId.isEmpty) {
     eventResult = await DeviceCalendar.instance.createEvent(
-        calendarId: writableCalendars!.id,
-        title: title,
-        description: description,
-        startDate: scheduleDateTime!,
-        endDate: scheduleDateTime!.add(Duration(minutes: 30)),
-        reminderMinutes: reminderMinutes);
+      calendarId: writableCalendars!.id,
+      title: title,
+      description: description,
+      startDate: scheduleDateTime!,
+      endDate: scheduleDateTime!.add(Duration(minutes: 30)),
+
+      // reminderMinutes: reminderMinutes, // TODO : NEED TO CONFIRM THIS FROM TAHA
+    );
     return eventResult.isNotEmpty;
     // }
 
diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart
index b43c55e..9a03545 100644
--- a/lib/core/utils/utils.dart
+++ b/lib/core/utils/utils.dart
@@ -8,7 +8,6 @@ import 'package:connectivity_plus/connectivity_plus.dart';
 import 'package:crypto/crypto.dart' as crypto;
 import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter_inappwebview/flutter_inappwebview.dart';
 import 'package:flutter_svg/flutter_svg.dart';
 import 'package:fluttertoast/fluttertoast.dart';
 import 'package:google_api_availability/google_api_availability.dart';
@@ -871,7 +870,8 @@ class Utils {
     }
     return isHavePrivilege;
   }
-  static void openWebView({ required String url}) {
+
+  static void openWebView({required String url}) {
     Uri uri = Uri.parse(url);
     launchUrl(uri, mode: LaunchMode.inAppBrowserView);
   }
diff --git a/lib/features/symptoms_checker/organ_mapping_data.dart b/lib/features/symptoms_checker/data/organ_mapping_data.dart
similarity index 73%
rename from lib/features/symptoms_checker/organ_mapping_data.dart
rename to lib/features/symptoms_checker/data/organ_mapping_data.dart
index a2395e4..6b50b25 100644
--- a/lib/features/symptoms_checker/organ_mapping_data.dart
+++ b/lib/features/symptoms_checker/data/organ_mapping_data.dart
@@ -7,25 +7,29 @@ class OrganData {
     // ========== HEAD & FACE ==========
     OrganModel(
       id: 'head',
-      name: 'Head',
+      name: 'whole_head',
+      description: 'Head',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.50, y: 0.03),
     ),
     OrganModel(
       id: 'left_eye',
-      name: 'Left Eye',
+      name: 'eyes',
+      description: 'Left Eye',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.43, y: 0.07),
     ),
     OrganModel(
       id: 'right_eye',
-      name: 'Right Eye',
+      name: 'eyes',
+      description: 'Right Eye',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.57, y: 0.07),
     ),
     OrganModel(
       id: 'nose_mouth',
-      name: 'Nose/Mouth',
+      name: 'oral_cavity',
+      description: 'Nose/Mouth',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.50, y: 0.09),
     ),
@@ -33,7 +37,8 @@ class OrganData {
     // ========== NECK ==========
     OrganModel(
       id: 'throat',
-      name: 'Throat',
+      name: 'neck_or_throat',
+      description: 'Throat',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.50, y: 0.15),
     ),
@@ -41,13 +46,15 @@ class OrganData {
     // ========== SHOULDERS ==========
     OrganModel(
       id: 'left_shoulder',
-      name: 'Left Shoulder',
+      name: 'upper_arm',
+      description: 'Left Shoulder',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.22, y: 0.22),
     ),
     OrganModel(
       id: 'right_shoulder',
-      name: 'Right Shoulder',
+      name: 'upper_arm',
+      description: 'Right Shoulder',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.8, y: 0.22),
     ),
@@ -55,19 +62,22 @@ class OrganData {
     // ========== CHEST ==========
     OrganModel(
       id: 'left_chest',
-      name: 'Left Chest',
+      name: 'chest',
+      description: 'Left Chest',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.38, y: 0.22),
     ),
     OrganModel(
       id: 'center_chest',
-      name: 'Center Chest',
+      name: 'chest',
+      description: 'Center Chest',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.52, y: 0.25),
     ),
     OrganModel(
       id: 'right_chest',
-      name: 'Right Chest',
+      name: 'chest',
+      description: 'Right Chest',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.65, y: 0.22),
     ),
@@ -75,13 +85,15 @@ class OrganData {
     // ========== RIBS ==========
     OrganModel(
       id: 'left_ribs',
-      name: 'Left Ribs',
+      name: 'chest',
+      description: 'Left Ribs',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.38, y: 0.35),
     ),
     OrganModel(
       id: 'right_ribs',
-      name: 'Right Ribs',
+      name: 'chest',
+      description: 'Right Ribs',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.64, y: 0.35),
     ),
@@ -89,19 +101,22 @@ class OrganData {
     // ========== ABDOMEN ==========
     OrganModel(
       id: 'upper_abdomen',
-      name: 'Upper Abdomen',
+      name: 'upper_abdomen',
+      description: 'Upper Abdomen',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.51, y: 0.31),
     ),
     OrganModel(
       id: 'navel',
-      name: 'Navel',
+      name: 'mid_abdomen',
+      description: 'Navel',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.51, y: 0.38),
     ),
     OrganModel(
       id: 'lower_abdomen',
-      name: 'Lower Abdomen',
+      name: 'lower_abdomen',
+      description: 'Lower Abdomen',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.51, y: 0.44),
     ),
@@ -109,13 +124,15 @@ class OrganData {
     // ========== PELVIS ==========
     OrganModel(
       id: 'left_groin',
-      name: 'Left Groin',
+      name: 'sexual_organs',
+      description: 'Left Groin',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.42, y: 0.49),
     ),
     OrganModel(
       id: 'right_groin',
-      name: 'Right Groin',
+      name: 'sexual_organs',
+      description: 'Right Groin',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.59, y: 0.49),
     ),
@@ -124,19 +141,22 @@ class OrganData {
 
     OrganModel(
       id: 'left_elbow',
-      name: 'Left Elbow',
+      name: 'elbow',
+      description: 'Left Elbow',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.21, y: 0.35),
     ),
     OrganModel(
       id: 'left_forearm',
-      name: 'Left Forearm',
+      name: 'forearm',
+      description: 'Left Forearm',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.19, y: 0.43),
     ),
     OrganModel(
       id: 'left_wrist',
-      name: 'Left Wrist',
+      name: 'hand',
+      description: 'Left Wrist',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.14, y: 0.5),
     ),
@@ -145,19 +165,22 @@ class OrganData {
 
     OrganModel(
       id: 'right_elbow',
-      name: 'Right Elbow',
+      name: 'elbow',
+      description: 'Right Elbow',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.79, y: 0.35),
     ),
     OrganModel(
       id: 'right_forearm',
-      name: 'Right Forearm',
+      name: 'forearm',
+      description: 'Right Forearm',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.81, y: 0.43),
     ),
     OrganModel(
       id: 'right_wrist',
-      name: 'Right Wrist',
+      name: 'hand',
+      description: 'Right Wrist',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.85, y: 0.5),
     ),
@@ -165,25 +188,29 @@ class OrganData {
     // ========== LEFT LEG ==========
     OrganModel(
       id: 'left_thigh',
-      name: 'Left Thigh',
+      name: 'thigh',
+      description: 'Left Thigh',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.4, y: 0.60),
     ),
     OrganModel(
       id: 'left_knee',
-      name: 'Left Knee',
+      name: 'knee',
+      description: 'Left Knee',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.4, y: 0.72),
     ),
     OrganModel(
       id: 'left_shin',
-      name: 'Left Shin',
+      name: 'lower_leg',
+      description: 'Left Shin',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.41, y: 0.82),
     ),
     OrganModel(
       id: 'left_ankle',
-      name: 'Left Ankle',
+      name: 'foot',
+      description: 'Left Ankle',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.43, y: 0.91),
     ),
@@ -191,25 +218,29 @@ class OrganData {
     // ========== RIGHT LEG ==========
     OrganModel(
       id: 'right_thigh',
-      name: 'Right Thigh',
+      name: 'thigh',
+      description: 'Right Thigh',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.65, y: 0.60),
     ),
     OrganModel(
       id: 'right_knee',
-      name: 'Right Knee',
+      name: 'knee',
+      description: 'Right Knee',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.6, y: 0.72),
     ),
     OrganModel(
       id: 'right_shin',
-      name: 'Right Shin',
+      name: 'lower_leg',
+      description: 'Right Shin',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.57, y: 0.82),
     ),
     OrganModel(
       id: 'right_ankle',
-      name: 'Right Ankle',
+      name: 'foot',
+      description: 'Right Ankle',
       bodyView: BodyView.front,
       position: OrganPosition(x: 0.57, y: 0.91),
     ),
@@ -220,13 +251,15 @@ class OrganData {
     // ========== HEAD & NECK ==========
     OrganModel(
       id: 'back_of_head',
-      name: 'Back of Head',
+      name: 'whole_head',
+      description: 'Back of Head',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.50, y: 0.04),
     ),
     OrganModel(
       id: 'neck_back',
-      name: 'Neck',
+      name: 'nape_of_neck',
+      description: 'Neck',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.50, y: 0.14),
     ),
@@ -234,13 +267,15 @@ class OrganData {
     // ========== SHOULDERS ==========
     OrganModel(
       id: 'left_shoulder_back',
-      name: 'Left Shoulder',
+      name: 'upper_arm',
+      description: 'Left Shoulder',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.33, y: 0.19),
     ),
     OrganModel(
       id: 'right_shoulder_back',
-      name: 'Right Shoulder',
+      name: 'upper_arm',
+      description: 'Right Shoulder',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.67, y: 0.19),
     ),
@@ -248,19 +283,22 @@ class OrganData {
     // ========== UPPER BACK ==========
     OrganModel(
       id: 'upper_spine',
-      name: 'Upper Spine',
+      name: 'back',
+      description: 'Upper Spine',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.50, y: 0.23),
     ),
     OrganModel(
       id: 'left_upper_back',
-      name: 'Left Upper Back',
+      name: 'back',
+      description: 'Left Upper Back',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.38, y: 0.28),
     ),
     OrganModel(
       id: 'right_upper_back',
-      name: 'Right Upper Back',
+      name: 'back',
+      description: 'Right Upper Back',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.62, y: 0.28),
     ),
@@ -268,19 +306,22 @@ class OrganData {
     // ========== MID BACK ==========
     OrganModel(
       id: 'mid_spine',
-      name: 'Mid Spine',
+      name: 'back',
+      description: 'Mid Spine',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.50, y: 0.35),
     ),
     OrganModel(
       id: 'left_mid_back',
-      name: 'Left Mid Back',
+      name: 'back',
+      description: 'Left Mid Back',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.38, y: 0.35),
     ),
     OrganModel(
       id: 'right_mid_back',
-      name: 'Right Mid Back',
+      name: 'back',
+      description: 'Right Mid Back',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.62, y: 0.35),
     ),
@@ -288,19 +329,22 @@ class OrganData {
     // ========== LOWER BACK ==========
     OrganModel(
       id: 'lower_spine',
-      name: 'Lower Back',
+      name: 'lower_back',
+      description: 'Lower Back',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.50, y: 0.43),
     ),
     OrganModel(
       id: 'left_lower_back',
-      name: 'Left Lower Back',
+      name: 'lower_back',
+      description: 'Left Lower Back',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.40, y: 0.43),
     ),
     OrganModel(
       id: 'right_lower_back',
-      name: 'Right Lower Back',
+      name: 'lower_back',
+      description: 'Right Lower Back',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.60, y: 0.43),
     ),
@@ -308,19 +352,22 @@ class OrganData {
     // ========== GLUTES ==========
     OrganModel(
       id: 'sacrum',
-      name: 'Sacrum',
+      name: 'lower_back',
+      description: 'Sacrum',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.50, y: 0.52),
     ),
     OrganModel(
       id: 'left_glute',
-      name: 'Left Glute',
+      name: 'buttocks',
+      description: 'Left Glute',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.45, y: 0.56),
     ),
     OrganModel(
       id: 'right_glute',
-      name: 'Right Glute',
+      name: 'buttocks',
+      description: 'Right Glute',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.55, y: 0.56),
     ),
@@ -328,25 +375,29 @@ class OrganData {
     // ========== LEGS ==========
     OrganModel(
       id: 'left_hamstring',
-      name: 'Left Hamstring',
+      name: 'thigh',
+      description: 'Left Hamstring',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.43, y: 0.65),
     ),
     OrganModel(
       id: 'right_hamstring',
-      name: 'Right Hamstring',
+      name: 'thigh',
+      description: 'Right Hamstring',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.57, y: 0.65),
     ),
     OrganModel(
       id: 'left_calf',
-      name: 'Left Calf',
+      name: 'lower_leg',
+      description: 'Left Calf',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.43, y: 0.79),
     ),
     OrganModel(
       id: 'right_calf',
-      name: 'Right Calf',
+      name: 'lower_leg',
+      description: 'Right Calf',
       bodyView: BodyView.back,
       position: OrganPosition(x: 0.57, y: 0.79),
     ),
diff --git a/lib/features/symptoms_checker/models/organ_model.dart b/lib/features/symptoms_checker/models/organ_model.dart
index 984a290..fab7dff 100644
--- a/lib/features/symptoms_checker/models/organ_model.dart
+++ b/lib/features/symptoms_checker/models/organ_model.dart
@@ -3,12 +3,14 @@ import 'package:hmg_patient_app_new/core/enums.dart';
 class OrganModel {
   final String id;
   final String name;
+  final String description;
   final BodyView bodyView;
   final OrganPosition position;
 
   const OrganModel({
     required this.id,
     required this.name,
+    required this.description,
     required this.bodyView,
     required this.position,
   });
@@ -16,12 +18,14 @@ class OrganModel {
   OrganModel copyWith({
     String? id,
     String? name,
+    String? description,
     BodyView? bodyView,
     OrganPosition? position,
   }) {
     return OrganModel(
       id: id ?? this.id,
       name: name ?? this.name,
+      description: description ?? this.description,
       bodyView: bodyView ?? this.bodyView,
       position: position ?? this.position,
     );
@@ -37,5 +41,3 @@ class OrganPosition {
     required this.y,
   });
 }
-
-
diff --git a/lib/features/symptoms_checker/models/resp_models/body_symptom_response_model.dart b/lib/features/symptoms_checker/models/resp_models/body_symptom_response_model.dart
new file mode 100644
index 0000000..7c8f915
--- /dev/null
+++ b/lib/features/symptoms_checker/models/resp_models/body_symptom_response_model.dart
@@ -0,0 +1,151 @@
+class BodySymptomResponseModel {
+  final DataDetails? dataDetails;
+
+  BodySymptomResponseModel({
+    this.dataDetails,
+  });
+
+  factory BodySymptomResponseModel.fromJson(Map json) {
+    return BodySymptomResponseModel(
+      dataDetails: json['dataDetails'] != null ? DataDetails.fromJson(json['dataDetails']) : null,
+    );
+  }
+
+  Map toJson() {
+    return {
+      'dataDetails': dataDetails?.toJson(),
+    };
+  }
+}
+
+class DataDetails {
+  final List? result;
+  final int? id;
+  final dynamic exception;
+  final int? status;
+  final bool? isCanceled;
+  final bool? isCompleted;
+  final bool? isCompletedSuccessfully;
+  final int? creationOptions;
+  final dynamic asyncState;
+  final bool? isFaulted;
+
+  DataDetails({
+    this.result,
+    this.id,
+    this.exception,
+    this.status,
+    this.isCanceled,
+    this.isCompleted,
+    this.isCompletedSuccessfully,
+    this.creationOptions,
+    this.asyncState,
+    this.isFaulted,
+  });
+
+  factory DataDetails.fromJson(Map json) {
+    return DataDetails(
+      result: json['Result'] != null ? (json['Result'] as List).map((item) => OrganSymptomResult.fromJson(item)).toList() : null,
+      id: json['Id'],
+      exception: json['Exception'],
+      status: json['Status'],
+      isCanceled: json['IsCanceled'],
+      isCompleted: json['IsCompleted'],
+      isCompletedSuccessfully: json['IsCompletedSuccessfully'],
+      creationOptions: json['CreationOptions'],
+      asyncState: json['AsyncState'],
+      isFaulted: json['IsFaulted'],
+    );
+  }
+
+  Map toJson() {
+    return {
+      'Result': result?.map((item) => item.toJson()).toList(),
+      'Id': id,
+      'Exception': exception,
+      'Status': status,
+      'IsCanceled': isCanceled,
+      'IsCompleted': isCompleted,
+      'IsCompletedSuccessfully': isCompletedSuccessfully,
+      'CreationOptions': creationOptions,
+      'AsyncState': asyncState,
+      'IsFaulted': isFaulted,
+    };
+  }
+}
+
+class OrganSymptomResult {
+  final String? name;
+  final List? bodySymptoms;
+
+  OrganSymptomResult({
+    this.name,
+    this.bodySymptoms,
+  });
+
+  factory OrganSymptomResult.fromJson(Map json) {
+    return OrganSymptomResult(
+      name: json['name'],
+      bodySymptoms: json['bodySymptoms'] != null ? (json['bodySymptoms'] as List).map((item) => BodySymptom.fromJson(item)).toList() : null,
+    );
+  }
+
+  Map toJson() {
+    return {
+      'name': name,
+      'bodySymptoms': bodySymptoms?.map((item) => item.toJson()).toList(),
+    };
+  }
+}
+
+class BodySymptom {
+  final String? id;
+  final String? type;
+  final String? symptomsName;
+  final String? name;
+  final String? commonName;
+  final String? nameAr;
+  final String? commonNameAr;
+
+  BodySymptom({
+    this.id,
+    this.type,
+    this.symptomsName,
+    this.name,
+    this.commonName,
+    this.nameAr,
+    this.commonNameAr,
+  });
+
+  factory BodySymptom.fromJson(Map json) {
+    return BodySymptom(
+      id: json['Id'],
+      type: json['type'],
+      symptomsName: json['symptoms_name'],
+      name: json['name'],
+      commonName: json['common_name'],
+      nameAr: json['nameAr'],
+      commonNameAr: json['common_nameAr'],
+    );
+  }
+
+  Map toJson() {
+    return {
+      'Id': id,
+      'type': type,
+      'symptoms_name': symptomsName,
+      'name': name,
+      'common_name': commonName,
+      'nameAr': nameAr,
+      'common_nameAr': commonNameAr,
+    };
+  }
+
+  // Helper method to get display name based on locale
+  String getDisplayName(bool isArabic) {
+    if (isArabic) {
+      return commonNameAr ?? nameAr ?? commonName ?? name ?? '';
+    }
+    return commonName ?? name ?? '';
+  }
+}
diff --git a/lib/features/symptoms_checker/models/symptom_model.dart b/lib/features/symptoms_checker/models/symptom_model.dart
index d35b11a..19d8be4 100644
--- a/lib/features/symptoms_checker/models/symptom_model.dart
+++ b/lib/features/symptoms_checker/models/symptom_model.dart
@@ -1,27 +1,64 @@
 class SymptomModel {
   final String id;
   final String name;
-  final String organId;
+  final String nameAr;
+  final String? organId;
 
   const SymptomModel({
     required this.id,
     required this.name,
-    required this.organId,
+    this.nameAr = '',
+    this.organId,
   });
 
   SymptomModel copyWith({
     String? id,
     String? name,
+    String? nameAr,
     String? organId,
   }) {
     return SymptomModel(
       id: id ?? this.id,
       name: name ?? this.name,
+      nameAr: nameAr ?? this.nameAr,
       organId: organId ?? this.organId,
     );
   }
+
+  Map toJson() {
+    return {
+      'id': id,
+      'name': name,
+      'nameAr': nameAr,
+      'organId': organId,
+    };
+  }
+
+  factory SymptomModel.fromJson(Map json) {
+    return SymptomModel(
+      id: json['id'] ?? '',
+      name: json['name'] ?? '',
+      nameAr: json['nameAr'] ?? '',
+      organId: json['organId'],
+    );
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(this, other)) return true;
+    return other is SymptomModel && other.id == id;
+  }
+
+  @override
+  int get hashCode => id.hashCode;
+
+  @override
+  String toString() {
+    return 'SymptomModel(id: $id, name: $name, nameAr: $nameAr, organId: $organId)';
+  }
 }
 
+/// Class to group symptoms by organ
 class OrganSymptomsGroup {
   final String organId;
   final String organName;
@@ -35,9 +72,16 @@ class OrganSymptomsGroup {
     Set? selectedSymptomIds,
   }) : selectedSymptomIds = selectedSymptomIds ?? {};
 
+  /// Get count of selected symptoms
+  int get selectedCount => selectedSymptomIds.length;
+
+  /// Check if any symptoms are selected
   bool get hasSelectedSymptoms => selectedSymptomIds.isNotEmpty;
 
-  int get selectedCount => selectedSymptomIds.length;
+  /// Get list of selected symptoms
+  List get selectedSymptoms {
+    return symptoms.where((symptom) => selectedSymptomIds.contains(symptom.id)).toList();
+  }
 
   OrganSymptomsGroup copyWith({
     String? organId,
@@ -52,4 +96,10 @@ class OrganSymptomsGroup {
       selectedSymptomIds: selectedSymptomIds ?? this.selectedSymptomIds,
     );
   }
+
+  @override
+  String toString() {
+    return 'OrganSymptomsGroup(organId: $organId, organName: $organName, symptomsCount: ${symptoms.length}, selectedCount: $selectedCount)';
+  }
 }
+
diff --git a/lib/features/symptoms_checker/symptoms_checker_repo.dart b/lib/features/symptoms_checker/symptoms_checker_repo.dart
new file mode 100644
index 0000000..5379207
--- /dev/null
+++ b/lib/features/symptoms_checker/symptoms_checker_repo.dart
@@ -0,0 +1,86 @@
+import 'dart:convert';
+import 'dart:developer';
+
+import 'package:dartz/dartz.dart';
+import 'package:hmg_patient_app_new/core/api/api_client.dart';
+import 'package:hmg_patient_app_new/core/api_consts.dart';
+import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart';
+import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/resp_models/body_symptom_response_model.dart';
+import 'package:hmg_patient_app_new/services/logger_service.dart';
+import 'package:http/http.dart' as http;
+
+abstract class SymptomsCheckerRepo {
+  Future>> getBodySymptomsByName({
+    required List organNames,
+  });
+}
+
+class SymptomsCheckerRepoImp implements SymptomsCheckerRepo {
+  final ApiClient apiClient;
+  final LoggerService loggerService;
+
+  SymptomsCheckerRepoImp({
+    required this.apiClient,
+    required this.loggerService,
+  });
+
+  @override
+  Future>> getBodySymptomsByName({
+    required List organNames,
+  }) async {
+    try {
+      // API expects a direct JSON array: ["mid_abdomen", "chest"]
+      // Not an object like: {"organNames": [...]}
+      // Since ApiClient.post expects Map and encodes it as object,
+      // we make direct HTTP call here to send array body
+
+      final String requestBody = jsonEncode(organNames);
+
+      loggerService.logInfo("GetBodySymptomsByName Request: $requestBody");
+      log("GetBodySymptomsByName Request URL: ${ApiConsts.getBodySymptomsByName}");
+      log("GetBodySymptomsByName Request Body: $requestBody");
+
+      // Make direct HTTP POST request with JSON array body
+      final response = await http.post(
+        Uri.parse(ApiConsts.getBodySymptomsByName),
+        headers: {'Content-Type': 'application/json', 'Accept': 'text/plain'},
+        body: requestBody,
+      );
+
+      final int statusCode = response.statusCode;
+
+      log("GetBodySymptomsByName Response Status: $statusCode");
+      loggerService.logInfo("GetBodySymptomsByName Response Status: $statusCode");
+
+      try {
+        // Parse the response
+        final responseBody = jsonDecode(response.body);
+
+        loggerService.logInfo("GetBodySymptomsByName API Success: $responseBody");
+        log("GetBodySymptomsByName Response: $responseBody");
+
+        BodySymptomResponseModel bodySymptomResponse = BodySymptomResponseModel.fromJson(responseBody);
+
+        GenericApiModel apiResponse = GenericApiModel(
+          messageStatus: 1,
+          statusCode: statusCode,
+          errorMessage: null,
+          data: bodySymptomResponse,
+        );
+
+        return Right(apiResponse);
+      } catch (e, stackTrace) {
+        loggerService.logError("Error parsing GetBodySymptomsByName response: $e");
+        loggerService.logError("StackTrace: $stackTrace");
+        log("Parse Error: $e");
+        return Left(DataParsingFailure(e.toString()));
+      }
+    } catch (e, stackTrace) {
+      loggerService.logError("Exception in getBodySymptomsByName: $e");
+      loggerService.logError("StackTrace: $stackTrace");
+      log("Exception: $e");
+      return Left(UnknownFailure(e.toString()));
+    }
+  }
+}
diff --git a/lib/features/symptoms_checker/symptoms_checker_view_model.dart b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
new file mode 100644
index 0000000..16cb01e
--- /dev/null
+++ b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
@@ -0,0 +1,326 @@
+import 'dart:async';
+
+import 'package:flutter/cupertino.dart';
+import 'package:hmg_patient_app_new/core/enums.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/data/organ_mapping_data.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/resp_models/body_symptom_response_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_repo.dart';
+import 'package:hmg_patient_app_new/services/error_handler_service.dart';
+
+class SymptomsCheckerViewModel extends ChangeNotifier {
+  final SymptomsCheckerRepo symptomsCheckerRepo;
+  final ErrorHandlerService errorHandlerService;
+
+  SymptomsCheckerViewModel({
+    required this.symptomsCheckerRepo,
+    required this.errorHandlerService,
+  });
+
+  // State variables
+  bool isBodyHidden = false;
+  BodyView _currentView = BodyView.front;
+  final Set _selectedOrganIds = {};
+  bool _isBottomSheetExpanded = false;
+
+  // Tooltip state
+  String? _tooltipOrganId;
+  Timer? _tooltipTimer;
+
+  // API loading states
+  bool isBodySymptomsLoading = false;
+
+  // API data storage - using API models directly
+  BodySymptomResponseModel? bodySymptomResponse;
+
+  // Selected symptoms tracking (organId -> Set of symptom IDs)
+  final Map> _selectedSymptomsByOrgan = {};
+
+  // Getters
+
+  bool isPossibleConditionsLoading = false;
+
+  BodyView get currentView => _currentView;
+
+  Set get selectedOrganIds => _selectedOrganIds;
+
+  bool get isBottomSheetExpanded => _isBottomSheetExpanded;
+
+  String? get tooltipOrganId => _tooltipOrganId;
+
+  /// Get organs for current view
+  List get currentOrgans => OrganData.getOrgansForView(_currentView);
+
+  /// Get all selected organs from both views
+  List get selectedOrgans {
+    final allOrgans = [
+      ...OrganData.frontViewOrgans,
+      ...OrganData.backViewOrgans,
+    ];
+    return allOrgans.where((organ) => _selectedOrganIds.contains(organ.id)).toList();
+  }
+
+  /// Check if any organs are selected
+  bool get hasSelectedOrgans => _selectedOrganIds.isNotEmpty;
+
+  /// Get count of selected organs
+  int get selectedOrgansCount => _selectedOrganIds.length;
+
+  /// Get organ symptoms from API response
+  List get organSymptomsResults {
+    if (bodySymptomResponse?.dataDetails?.result == null) {
+      return [];
+    }
+    return bodySymptomResponse!.dataDetails!.result ?? [];
+  }
+
+  /// Get total selected symptoms count across all organs
+  int get totalSelectedSymptomsCount {
+    return _selectedSymptomsByOrgan.values.fold(0, (sum, symptomIds) => sum + symptomIds.length);
+  }
+
+  /// Check if at least one symptom is selected
+  bool get hasSelectedSymptoms {
+    return _selectedSymptomsByOrgan.values.any((symptomIds) => symptomIds.isNotEmpty);
+  }
+
+  // Methods
+
+  /// Toggle between front and back body view
+  void toggleView() {
+    _currentView = _currentView == BodyView.front ? BodyView.back : BodyView.front;
+    notifyListeners();
+  }
+
+  toggleIsBodyHidden() {
+    isBodyHidden = !isBodyHidden;
+    notifyListeners();
+  }
+
+  /// Toggle organ selection (add if not selected, remove if selected)
+  void toggleOrganSelection(String organId) {
+    if (_selectedOrganIds.contains(organId)) {
+      _selectedOrganIds.remove(organId);
+    } else {
+      _selectedOrganIds.add(organId);
+    }
+
+    // Show tooltip
+    _showTooltip(organId);
+
+    notifyListeners();
+  }
+
+  /// Show tooltip for an organ
+  void _showTooltip(String organId) {
+    // Cancel any existing timer
+    _tooltipTimer?.cancel();
+
+    // Set the tooltip organ
+    _tooltipOrganId = organId;
+    notifyListeners();
+
+    // Hide tooltip after 2 seconds
+    _tooltipTimer = Timer(const Duration(seconds: 1), () {
+      _tooltipOrganId = null;
+      notifyListeners();
+    });
+  }
+
+  /// Hide tooltip immediately
+  void hideTooltip() {
+    _tooltipTimer?.cancel();
+    _tooltipOrganId = null;
+    notifyListeners();
+  }
+
+  /// Remove a specific organ from selection
+  void removeOrgan(String organId) {
+    _selectedOrganIds.remove(organId);
+    notifyListeners();
+  }
+
+  /// Clear all selected organs
+  void clearAllSelections() {
+    _selectedOrganIds.clear();
+    notifyListeners();
+  }
+
+  /// Toggle bottom sheet expanded/collapsed state
+  void toggleBottomSheet() {
+    _isBottomSheetExpanded = !_isBottomSheetExpanded;
+    notifyListeners();
+  }
+
+  /// Set bottom sheet expanded state
+  void setBottomSheetExpanded(bool isExpanded) {
+    _isBottomSheetExpanded = isExpanded;
+    notifyListeners();
+  }
+
+  /// Validate if at least one organ is selected
+  bool validateSelection() {
+    return _selectedOrganIds.isNotEmpty;
+  }
+
+  /// Get selected organ IDs as a list
+  List getSelectedOrganIds() {
+    return _selectedOrganIds.toList();
+  }
+
+  /// Get selected organ names as a list
+  List getSelectedOrganNames() {
+    return selectedOrgans.map((organ) => organ.description).toList();
+  }
+
+  /// Initialize symptoms from API based on selected organs
+  Future initializeSymptomGroups({
+    Function()? onSuccess,
+    Function(String)? onError,
+  }) async {
+    if (_selectedOrganIds.isEmpty) {
+      if (onError != null) {
+        onError('No organs selected');
+      }
+      return;
+    }
+
+    // Get the 'name' field from selected organs to send to API
+    List organNames = selectedOrgans.map((organ) => organ.name).toList();
+
+    // Fetch symptoms from API
+    await getBodySymptomsByName(
+      organNames: organNames,
+      onSuccess: (response) {
+        // API response is already stored in bodySymptomResponse
+        if (onSuccess != null) {
+          onSuccess();
+        }
+      },
+      onError: (error) {
+        if (onError != null) {
+          onError(error);
+        }
+      },
+    );
+  }
+
+  /// Toggle symptom selection for a specific organ
+  void toggleSymptomSelection(String organId, String symptomId) {
+    if (!_selectedSymptomsByOrgan.containsKey(organId)) {
+      _selectedSymptomsByOrgan[organId] = {};
+    }
+
+    if (_selectedSymptomsByOrgan[organId]!.contains(symptomId)) {
+      _selectedSymptomsByOrgan[organId]!.remove(symptomId);
+    } else {
+      _selectedSymptomsByOrgan[organId]!.add(symptomId);
+    }
+    notifyListeners();
+  }
+
+  /// Check if a symptom is selected
+  bool isSymptomSelected(String organId, String symptomId) {
+    return _selectedSymptomsByOrgan[organId]?.contains(symptomId) ?? false;
+  }
+
+  /// Get all selected symptoms across all organs (using API models)
+  List getAllSelectedSymptoms() {
+    List allSymptoms = [];
+
+    if (bodySymptomResponse?.dataDetails?.result == null) {
+      return allSymptoms;
+    }
+
+    for (var organResult in bodySymptomResponse!.dataDetails!.result!) {
+      // Find matching organ ID
+      String? matchingOrganId;
+      for (var organ in selectedOrgans) {
+        if (organ.name == organResult.name) {
+          matchingOrganId = organ.id;
+          break;
+        }
+      }
+
+      if (matchingOrganId != null && _selectedSymptomsByOrgan.containsKey(matchingOrganId)) {
+        final selectedIds = _selectedSymptomsByOrgan[matchingOrganId]!;
+
+        if (organResult.bodySymptoms != null) {
+          for (var symptom in organResult.bodySymptoms!) {
+            if (symptom.id != null && selectedIds.contains(symptom.id)) {
+              allSymptoms.add(symptom);
+            }
+          }
+        }
+      }
+    }
+
+    return allSymptoms;
+  }
+
+  /// Clear all symptom selections
+  void clearAllSymptomSelections() {
+    _selectedSymptomsByOrgan.clear();
+    notifyListeners();
+  }
+
+  /// Reset the view model to initial state
+  void reset() {
+    _currentView = BodyView.front;
+    _selectedOrganIds.clear();
+    _selectedSymptomsByOrgan.clear();
+    bodySymptomResponse = null;
+    _isBottomSheetExpanded = false;
+    _tooltipTimer?.cancel();
+    _tooltipOrganId = null;
+    notifyListeners();
+  }
+
+  /// Fetch body symptoms by organ names from API
+  Future getBodySymptomsByName({
+    required List organNames,
+    Function(BodySymptomResponseModel)? onSuccess,
+    Function(String)? onError,
+  }) async {
+    isBodySymptomsLoading = true;
+    notifyListeners();
+
+    final result = await symptomsCheckerRepo.getBodySymptomsByName(
+      organNames: organNames,
+    );
+
+    result.fold(
+      // Handle failure
+      (failure) async {
+        isBodySymptomsLoading = false;
+        notifyListeners();
+        await errorHandlerService.handleError(failure: failure);
+        if (onError != null) {
+          onError(failure.toString());
+        }
+      },
+      // Handle success
+      (apiResponse) {
+        isBodySymptomsLoading = false;
+        if (apiResponse.messageStatus == 1 && apiResponse.data != null) {
+          bodySymptomResponse = apiResponse.data;
+          notifyListeners();
+          if (onSuccess != null) {
+            onSuccess(apiResponse.data!);
+          }
+        } else {
+          notifyListeners();
+          if (onError != null) {
+            onError(apiResponse.errorMessage ?? 'Failed to fetch symptoms');
+          }
+        }
+      },
+    );
+  }
+
+  @override
+  void dispose() {
+    _tooltipTimer?.cancel();
+    super.dispose();
+  }
+}
diff --git a/lib/main.dart b/lib/main.dart
index 254a2ca..9d1ec39 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -28,7 +28,7 @@ import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_mo
 import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart';
 import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart';
 import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart';
-import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart';
 import 'package:hmg_patient_app_new/routes/app_routes.dart';
 import 'package:hmg_patient_app_new/services/logger_service.dart';
 import 'package:hmg_patient_app_new/services/navigation_service.dart';
diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart
index 7bc9c62..cca227a 100644
--- a/lib/presentation/appointments/widgets/appointment_card.dart
+++ b/lib/presentation/appointments/widgets/appointment_card.dart
@@ -193,7 +193,7 @@ class AppointmentCard extends StatelessWidget {
                   ).toShimmer2(isShow: isLoading),
                   AppCustomChipWidget(
                     isIconPNG: true,
-                    icon: getIt.get().getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg,
+                    icon: getIt.get().getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg,
                     iconSize: 18.h,
                     labelText: isLoading ? 'Cardiology' : "Patient: ${getIt.get().getAuthenticatedUser()!.firstName!}",
                   ).toShimmer2(isShow: isLoading),
diff --git a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart
index 8f9943c..8cfe6dd 100644
--- a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart
+++ b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart
@@ -152,7 +152,7 @@ class _WaitingAppointmentPaymentPageState extends State {
       if (appState.isAuthenticated) {
         habibWalletVM.initHabibWalletProvider();
         habibWalletVM.getPatientBalanceAmount();
-        immediateLiveCareViewModel.initImmediateLiveCare();
-        immediateLiveCareViewModel.getPatientLiveCareHistory();
         myAppointmentsViewModel.initAppointmentsViewModel();
         myAppointmentsViewModel.getPatientAppointments(true, false);
         myAppointmentsViewModel.getPatientMyDoctors();
         prescriptionsViewModel.initPrescriptionsViewModel();
         insuranceViewModel.initInsuranceProvider();
+        immediateLiveCareViewModel.initImmediateLiveCare();
+        immediateLiveCareViewModel.getPatientLiveCareHistory();
         emergencyServicesViewModel.checkPatientERAdvanceBalance();
       }
     });
     super.initState();
   }
 
-  @override
-  Widget build(BuildContext context) {
-    bookAppointmentsViewModel = Provider.of(context, listen: false);
-    myAppointmentsViewModel = Provider.of(context, listen: false);
-    prescriptionsViewModel = Provider.of(context, listen: false);
-    insuranceViewModel = Provider.of(context, listen: false);
-    immediateLiveCareViewModel = Provider.of(context, listen: false);
-    emergencyServicesViewModel = Provider.of(context, listen: false);
-    appState = getIt.get();
-    return PopScope(
-      canPop: false,
-      child: Scaffold(
-        backgroundColor: AppColors.bgScaffoldColor,
-        body: SingleChildScrollView(
-          padding: EdgeInsets.only(top: kToolbarHeight + 0.h, bottom: 24),
-          child: Column(
-            spacing: 16.h,
-            children: [
-              Row(
-                spacing: 8.h,
-                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                children: [
-                  appState.isAuthenticated
-                      ? WelcomeWidget(
-                          onTap: () {
-                            Navigator.of(context).push(springPageRoute(ProfileSettings()));
-                          },
-                          name: ('${appState.getAuthenticatedUser()!.firstName!} ${appState.getAuthenticatedUser()!.lastName!}'),
-                          imageUrl: appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg,
-                        ).expanded
-                      : CustomButton(
-                          text: LocaleKeys.loginOrRegister.tr(context: context),
-                          onPressed: () async {
-                            await authVM.onLoginPressed();
-
-                            // Navigator.pushReplacementNamed(
-                            //   // context,
-                            //   context,
-                            //   AppRoutes.zoomCallPage,
-                            //   // arguments: CallArguments(appointmentID, "111", "Patient", "40", "1", true, 1),
-                            //   arguments: CallArguments("test123", "123", "Patient", "40", "0", true, 1),
-                            //   // arguments: CallArguments("SmallDailyStandup9875", "123", "Patient", "40", "0", false, int.parse(widget.incomingCallData!.appointmentNo!)),
-                            // );
-                          },
-                          backgroundColor: AppColors.secondaryLightRedColor,
-                          borderColor: AppColors.secondaryLightRedColor,
-                          textColor: AppColors.primaryRedColor,
-                          fontSize: 14.f,
-                          fontWeight: FontWeight.w500,
-                          borderRadius: 12.r,
-                          padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0),
-                          height: 40.h,
+  Widget buildOptionsForAuthenticatedUser() {
+    return Column(
+      children: [
+        SizedBox(height: 12.h),
+        Row(
+          mainAxisAlignment: MainAxisAlignment.spaceBetween,
+          children: [
+            "Appointments & Visits".toText16(isBold: true),
+            Row(
+              children: [
+                LocaleKeys.viewAll.tr(context: context).toText12(color: AppColors.primaryRedColor),
+                SizedBox(width: 2.h),
+                Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h),
+              ],
+            ),
+          ],
+        ).paddingSymmetrical(24.h, 0.h).onPress(() {
+          Navigator.of(context).push(CustomPageRoute(page: MyAppointmentsPage()));
+        }),
+        SizedBox(height: 16.h),
+        Consumer(
+          builder: (context, myAppointmentsVM, child) {
+            return myAppointmentsVM.isMyAppointmentsLoading
+                ? Container(
+                    decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                      color: AppColors.whiteColor,
+                      borderRadius: 24.r,
+                      hasShadow: true,
+                    ),
+                    child: AppointmentCard(
+                      patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(),
+                      myAppointmentsViewModel: myAppointmentsViewModel,
+                      bookAppointmentsViewModel: bookAppointmentsViewModel,
+                      isLoading: true,
+                      isFromHomePage: true,
+                    ),
+                  ).paddingSymmetrical(24.h, 0.h)
+                : myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty
+                    ? myAppointmentsVM.patientAppointmentsHistoryList.length == 1
+                        ? Container(
+                            decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                              color: AppColors.whiteColor,
+                              borderRadius: 24.r,
+                              hasShadow: true,
+                            ),
+                            child: AppointmentCard(
+                              patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList.first,
+                              myAppointmentsViewModel: myAppointmentsViewModel,
+                              bookAppointmentsViewModel: bookAppointmentsViewModel,
+                              isLoading: false,
+                              isFromHomePage: true,
+                            ),
+                          ).paddingSymmetrical(24.h, 0.h)
+                        : Swiper(
+                            itemCount: myAppointmentsVM.isMyAppointmentsLoading
+                                ? 3
+                                : myAppointmentsVM.patientAppointmentsHistoryList.length < 3
+                                    ? myAppointmentsVM.patientAppointmentsHistoryList.length
+                                    : 3,
+                            layout: SwiperLayout.STACK,
+                            loop: true,
+                            itemWidth: MediaQuery.of(context).size.width - 48.h,
+                            indicatorLayout: PageIndicatorLayout.COLOR,
+                            axisDirection: AxisDirection.right,
+                            controller: _controller,
+                            itemHeight: 200.h,
+                            pagination: const SwiperPagination(
+                              alignment: Alignment.bottomCenter,
+                              margin: EdgeInsets.only(top: 210 + 8 + 24),
+                              builder: DotSwiperPaginationBuilder(color: Color(0xffD9D9D9), activeColor: AppColors.blackBgColor),
+                            ),
+                            itemBuilder: (BuildContext context, int index) {
+                              return Container(
+                                decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                                  color: AppColors.whiteColor,
+                                  borderRadius: 24.r,
+                                  hasShadow: true,
+                                ),
+                                child: AppointmentCard(
+                                  patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index],
+                                  myAppointmentsViewModel: myAppointmentsViewModel,
+                                  bookAppointmentsViewModel: bookAppointmentsViewModel,
+                                  isLoading: false,
+                                  isFromHomePage: true,
+                                ),
+                              );
+                            },
+                          )
+                    : Container(
+                        width: double.infinity,
+                        decoration:
+                            RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true),
+                        child: Padding(
+                          padding: EdgeInsets.all(12.h),
+                          child: Column(
+                            children: [
+                              Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h),
+                              SizedBox(height: 12.h),
+                              "You do not have any upcoming appointment. Please book an appointment".needTranslation.toText12(isCenter: true),
+                              SizedBox(height: 12.h),
+                              CustomButton(
+                                text: LocaleKeys.bookAppo.tr(context: context),
+                                onPressed: () {
+                                  Navigator.of(context).push(CustomPageRoute(page: BookAppointmentPage()));
+                                },
+                                backgroundColor: Color(0xffFEE9EA),
+                                borderColor: Color(0xffFEE9EA),
+                                textColor: Color(0xffED1C2B),
+                                fontSize: 14.f,
+                                fontWeight: FontWeight.w500,
+                                padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0),
+                                icon: AppAssets.add_icon,
+                                iconColor: AppColors.primaryRedColor,
+                                height: 46.h,
+                              ),
+                            ],
+                          ),
                         ),
-                  Row(
-                    mainAxisSize: MainAxisSize.min,
-                    spacing: 12.h,
+                      ).paddingSymmetrical(24.h, 0.h);
+          },
+        ),
+
+        // Consumer for LiveCare pending request
+        Consumer(
+          builder: (context, immediateLiveCareVM, child) {
+            return immediateLiveCareVM.patientHasPendingLiveCareRequest
+                ? Column(
                     children: [
-                      Utils.buildSvgWithAssets(icon: AppAssets.bell, height: 18.h, width: 18.h).onPress(() {
-                        Navigator.of(context).push(
-                          CustomPageRoute(
-                            page: MedicalFilePage(),
-                            // page: LoginScreen(),
+                      SizedBox(height: 12.h),
+                      Container(
+                        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                          color: AppColors.whiteColor,
+                          borderRadius: 20.r,
+                          hasShadow: true,
+                          side: BorderSide(color: AppColors.ratingColorYellow, width: 3.h),
+                        ),
+                        width: double.infinity,
+                        child: Padding(
+                          padding: EdgeInsets.all(16.h),
+                          child: Column(
+                            crossAxisAlignment: CrossAxisAlignment.start,
+                            children: [
+                              Row(
+                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                children: [
+                                  AppCustomChipWidget(
+                                    labelText: immediateLiveCareViewModel.patientLiveCareHistoryList[0].stringCallStatus,
+                                    backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20),
+                                    textColor: AppColors.alertColor,
+                                  ),
+                                  Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h),
+                                  // Lottie.asset(AppAnimations.pending_loading_animation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 40.h, height: 40.h, fit: BoxFit.contain),
+                                ],
+                              ),
+                              SizedBox(height: 8.h),
+                              Row(
+                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                children: [
+                                  "You have a pending LiveCare request".needTranslation.toText12(isBold: true),
+                                  Utils.buildSvgWithAssets(
+                                    icon: AppAssets.forward_arrow_icon_small,
+                                    iconColor: AppColors.blackColor,
+                                    width: 20.h,
+                                    height: 15.h,
+                                    fit: BoxFit.contain,
+                                  ),
+                                ],
+                              ),
+                            ],
                           ),
-                        );
-                      }),
-                      Utils.buildSvgWithAssets(icon: AppAssets.search_icon, height: 18.h, width: 18.h).onPress(() {
-                        // Navigator.of(context).push(
-                        //   CustomPageRoute(
-                        //     page: MedicalFilePage(),
-                        //     // page: LoginScreen(),
-                        //   ),
-                        // );
-                      }),
-                      Utils.buildSvgWithAssets(icon: AppAssets.contact_icon, height: 18.h, width: 18.h).onPress(() {
-                        showCommonBottomSheetWithoutHeight(
-                          context,
-                          title: LocaleKeys.contactUs.tr(),
-                          child: ContactUs(),
-                          callBackFunc: () {},
-                          isFullScreen: false,
-                        );
+                        ),
+                      ).paddingSymmetrical(24.h, 0.h).onPress(() {
+                        Navigator.of(context).push(CustomPageRoute(page: ImmediateLiveCarePendingRequestPage()));
                       }),
+                      SizedBox(height: 12.h),
                     ],
-                  ),
-                ],
-              ).paddingSymmetrical(24.h, 0.h),
-              appState.isAuthenticated
-                  ? Column(
-                      children: [
-                        SizedBox(height: 12.h),
-                        Row(
-                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                          children: [
-                            "Appointments & Visits".toText16(isBold: true),
-                            Row(
-                              children: [
-                                LocaleKeys.viewAll.tr(context: context).toText12(color: AppColors.primaryRedColor),
-                                SizedBox(width: 2.h),
-                                Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h),
-                              ],
-                            ),
-                          ],
-                        ).paddingSymmetrical(24.h, 0.h).onPress(() {
-                          Navigator.of(context).push(CustomPageRoute(page: MyAppointmentsPage()));
-                        }),
-                        SizedBox(height: 16.h),
-                        Consumer2(
-                          builder: (context, myAppointmentsVM, immediateLiveCareVM, child) {
-                            return myAppointmentsVM.isMyAppointmentsLoading
-                                ? Container(
-                                    decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                      color: AppColors.whiteColor,
-                                      borderRadius: 24.r,
-                                      hasShadow: true,
-                                    ),
-                                    child: AppointmentCard(
-                                      patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(),
-                                      myAppointmentsViewModel: myAppointmentsViewModel,
-                                      bookAppointmentsViewModel: bookAppointmentsViewModel,
-                                      isLoading: true,
-                                      isFromHomePage: true,
-                                    ),
-                                  ).paddingSymmetrical(24.h, 0.h)
-                                : myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty
-                                    ? myAppointmentsVM.patientAppointmentsHistoryList.length == 1
-                                        ? Container(
-                                            decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                              color: AppColors.whiteColor,
-                                              borderRadius: 24.r,
-                                              hasShadow: true,
-                                            ),
-                                            child: AppointmentCard(
-                                              patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList.first,
-                                              myAppointmentsViewModel: myAppointmentsViewModel,
-                                              bookAppointmentsViewModel: bookAppointmentsViewModel,
-                                              isLoading: false,
-                                              isFromHomePage: true,
-                                            ),
-                                          ).paddingSymmetrical(24.h, 0.h)
-                                        : Swiper(
-                                            itemCount: myAppointmentsVM.isMyAppointmentsLoading
-                                                ? 3
-                                                : myAppointmentsVM.patientAppointmentsHistoryList.length < 3
-                                                    ? myAppointmentsVM.patientAppointmentsHistoryList.length
-                                                    : 3,
-                                            layout: SwiperLayout.STACK,
-                                            loop: true,
-                                            itemWidth: MediaQuery.of(context).size.width - 48.h,
-                                            indicatorLayout: PageIndicatorLayout.COLOR,
-                                            axisDirection: AxisDirection.right,
-                                            controller: _controller,
-                                            itemHeight: 255.h,
-                                            pagination: SwiperPagination(
-                                              alignment: Alignment.bottomCenter,
-                                              margin: EdgeInsets.only(top: 240.h + 8 + 24),
-                                              builder: DotSwiperPaginationBuilder(color: Color(0xffD9D9D9), activeColor: AppColors.blackBgColor),
-                                            ),
-                                            itemBuilder: (BuildContext context, int index) {
-                                              return (immediateLiveCareVM.patientHasPendingLiveCareRequest && index == 0)
-                                                  ? Column(
-                                                      children: [
-                                                        SizedBox(height: 12.h),
-                                                        Container(
-                                                          decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                                            color: AppColors.whiteColor,
-                                                            borderRadius: 20.r,
-                                                            hasShadow: true,
-                                                            side: BorderSide(color: AppColors.ratingColorYellow, width: 3.h),
-                                                          ),
-                                                          child: Padding(
-                                                            padding: EdgeInsets.all(16.h),
-                                                            child: Column(
-                                                              crossAxisAlignment: CrossAxisAlignment.start,
-                                                              children: [
-                                                                "Immediate LiveCare Request".needTranslation.toText16(isBold: true),
-                                                                SizedBox(height: 10.h),
-                                                                Row(
-                                                                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                                                                  children: [
-                                                                    Row(
-                                                                      children: [
-                                                                        AppCustomChipWidget(
-                                                                          labelText: immediateLiveCareVM.patientLiveCareHistoryList[0].stringCallStatus,
-                                                                          backgroundColor: AppColors.warningColorYellow.withValues(alpha: 0.20),
-                                                                          textColor: AppColors.alertColor,
-                                                                        ),
-                                                                        SizedBox(width: 8.w),
-                                                                        AppCustomChipWidget(
-                                                                            icon: AppAssets.appointment_calendar_icon,
-                                                                            labelText: DateUtil.formatDateToDate(
-                                                                                DateUtil.convertStringToDate(immediateLiveCareVM.patientLiveCareHistoryList[0].arrivalTime), false)),
-                                                                      ],
-                                                                    ),
-                                                                    Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h),
-                                                                    // Lottie.asset(AppAnimations.pending_loading_animation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 80.h, height: 80.h, fit: BoxFit.cover),
-                                                                  ],
-                                                                ),
-                                                                SizedBox(height: 10.h),
-                                                                "Hala ${appState.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true),
-                                                                SizedBox(height: 8.h),
-                                                                "Your turn is after ${immediateLiveCareVM.patientLiveCareHistoryList[0].patCount} patients.".toText14(isBold: true),
-                                                                SizedBox(height: 8.h),
-                                                                Column(
-                                                                  crossAxisAlignment: CrossAxisAlignment.start,
-                                                                  children: [
-                                                                    "Expected waiting time: ".toText12(isBold: true),
-                                                                    SizedBox(height: 8.h),
-                                                                    ValueListenableBuilder(
-                                                                      valueListenable: immediateLiveCareVM.durationNotifier,
-                                                                      builder: (context, duration, child) {
-                                                                        return Column(
-                                                                          mainAxisAlignment: MainAxisAlignment.center,
-                                                                          children: [
-                                                                            buildTime(duration),
-                                                                          ],
-                                                                        );
-                                                                      },
-                                                                    ),
-                                                                    SizedBox(height: 12.h),
-                                                                  ],
-                                                                ),
-                                                                // CustomButton(
-                                                                //   text: "View Details".needTranslation,
-                                                                //   onPressed: () async {
-                                                                //     Navigator.of(context).push(CustomPageRoute(page: ImmediateLiveCarePendingRequestPage()));
-                                                                //   },
-                                                                //   backgroundColor: Color(0xffFEE9EA),
-                                                                //   borderColor: Color(0xffFEE9EA),
-                                                                //   textColor: Color(0xffED1C2B),
-                                                                //   fontSize: 14.f,
-                                                                //   fontWeight: FontWeight.w500,
-                                                                //   borderRadius: 12.r,
-                                                                //   padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0),
-                                                                //   height: 40.h,
-                                                                // ),
-                                                              ],
-                                                            ),
-                                                          ),
-                                                        ).paddingSymmetrical(0.h, 0.h).onPress(() {
-                                                          Navigator.of(context).push(CustomPageRoute(page: ImmediateLiveCarePendingRequestPage()));
-                                                        }),
-                                                        SizedBox(height: 12.h),
-                                                      ],
-                                                    )
-                                                  : Container(
-                                                      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                                        color: AppColors.whiteColor,
-                                                        borderRadius: 24.r,
-                                                        hasShadow: true,
-                                                      ),
-                                                      child: AppointmentCard(
-                                                        patientAppointmentHistoryResponseModel:
-                                                            myAppointmentsVM.patientAppointmentsHistoryList[immediateLiveCareViewModel.patientHasPendingLiveCareRequest ? --index : index],
-                                                        myAppointmentsViewModel: myAppointmentsViewModel,
-                                                        bookAppointmentsViewModel: bookAppointmentsViewModel,
-                                                        isLoading: false,
-                                                        isFromHomePage: true,
-                                                      ),
-                                                    );
-                                            },
-                                          )
-                                    : Container(
-                                        width: double.infinity,
-                                        decoration: RoundedRectangleBorder()
-                                            .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true),
-                                        child: Padding(
-                                          padding: EdgeInsets.all(12.h),
-                                          child: Column(
-                                            children: [
-                                              Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h),
-                                              SizedBox(height: 12.h),
-                                              "You do not have any upcoming appointment. Please book an appointment"
-                                                  .needTranslation
-                                                  .toText12(isCenter: true),
-                                              SizedBox(height: 12.h),
-                                              CustomButton(
-                                                text: LocaleKeys.bookAppo.tr(context: context),
-                                                onPressed: () {
-                                                  Navigator.of(context).push(CustomPageRoute(page: BookAppointmentPage()));
-                                                },
-                                                backgroundColor: Color(0xffFEE9EA),
-                                                borderColor: Color(0xffFEE9EA),
-                                                textColor: Color(0xffED1C2B),
-                                                fontSize: 14.f,
-                                                fontWeight: FontWeight.w500,
-                                                padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0),
-                                                icon: AppAssets.add_icon,
-                                                iconColor: AppColors.primaryRedColor,
-                                                height: 46.h,
-                                              ),
-                                            ],
-                                          ),
-                                        ),
-                                      ).paddingSymmetrical(24.h, 0.h);
-                          },
-                        ),
+                  )
+                : SizedBox(height: 12.h);
+          },
+        ),
 
-                        // Consumer for ER Online Check-In pending request
-                        Consumer(
-                          builder: (context, emergencyServicesVM, child) {
-                            return emergencyServicesVM.patientHasAdvanceERBalance
-                                ? Column(
-                                    children: [
-                                      SizedBox(height: 4.h),
-                                      Container(
-                                        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                                          color: AppColors.whiteColor,
-                                          borderRadius: 20.r,
-                                          hasShadow: true,
-                                          side: BorderSide(color: AppColors.primaryRedColor, width: 3.h),
-                                        ),
-                                        width: double.infinity,
-                                        child: Padding(
-                                          padding: EdgeInsets.all(16.h),
-                                          child: Column(
-                                            crossAxisAlignment: CrossAxisAlignment.start,
-                                            children: [
-                                              Row(
-                                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                                                children: [
-                                                  AppCustomChipWidget(
-                                                    labelText: "ER Online Check-In Request",
-                                                    backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.10),
-                                                    textColor: AppColors.primaryRedColor,
-                                                  ),
-                                                  Utils.buildSvgWithAssets(icon: AppAssets.appointment_checkin_icon, width: 24.h, height: 24.h, iconColor: AppColors.primaryRedColor),
-                                                ],
-                                              ),
-                                              SizedBox(height: 8.h),
-                                              Row(
-                                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                                                children: [
-                                                  "You have ER Online Check-In Request".needTranslation.toText12(isBold: true),
-                                                  Utils.buildSvgWithAssets(
-                                                    icon: AppAssets.forward_arrow_icon_small,
-                                                    iconColor: AppColors.blackColor,
-                                                    width: 20.h,
-                                                    height: 15.h,
-                                                    fit: BoxFit.contain,
-                                                  ),
-                                                ],
-                                              ),
-                                            ],
-                                          ),
-                                        ),
-                                      ).paddingSymmetrical(24.h, 0.h).onPress(() {
-                                        Navigator.of(context).push(CustomPageRoute(page: ErOnlineCheckinHome()));
-                                        // context.read().navigateToEROnlineCheckIn();
-                                      }),
-                                      SizedBox(height: 12.h),
-                                    ],
-                                  )
-                                : SizedBox(height: 12.h);
-                          },
+        // Consumer for ER Online Check-In pending request
+        Consumer(
+          builder: (context, emergencyServicesVM, child) {
+            return emergencyServicesVM.patientHasAdvanceERBalance
+                ? Column(
+                    children: [
+                      SizedBox(height: 4.h),
+                      Container(
+                        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                          color: AppColors.whiteColor,
+                          borderRadius: 20.r,
+                          hasShadow: true,
+                          side: BorderSide(color: AppColors.primaryRedColor, width: 3.h),
                         ),
+                        width: double.infinity,
+                        child: Padding(
+                          padding: EdgeInsets.all(16.h),
+                          child: Column(
+                            crossAxisAlignment: CrossAxisAlignment.start,
+                            children: [
+                              Row(
+                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                children: [
+                                  AppCustomChipWidget(
+                                    labelText: "ER Online Check-In Request",
+                                    backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.10),
+                                    textColor: AppColors.primaryRedColor,
+                                  ),
+                                  Utils.buildSvgWithAssets(
+                                      icon: AppAssets.appointment_checkin_icon, width: 24.h, height: 24.h, iconColor: AppColors.primaryRedColor),
+                                ],
+                              ),
+                              SizedBox(height: 8.h),
+                              Row(
+                                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                children: [
+                                  "You have ER Online Check-In Request".needTranslation.toText12(isBold: true),
+                                  Utils.buildSvgWithAssets(
+                                    icon: AppAssets.forward_arrow_icon_small,
+                                    iconColor: AppColors.blackColor,
+                                    width: 20.h,
+                                    height: 15.h,
+                                    fit: BoxFit.contain,
+                                  ),
+                                ],
+                              ),
+                            ],
+                          ),
+                        ),
+                      ).paddingSymmetrical(24.h, 0.h).onPress(() {
+                        Navigator.of(context).push(CustomPageRoute(page: ErOnlineCheckinHome()));
+                        // context.read().navigateToEROnlineCheckIn();
+                      }),
+                      SizedBox(height: 12.h),
+                    ],
+                  )
+                : SizedBox(height: 12.h);
+          },
+        ),
 
         Row(
           mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -644,7 +525,7 @@ class _LandingPageState extends State {
                     Navigator.of(context).push(CustomPageRoute(page: ServicesPage()));
                   }),
                 ],
-              ).paddingSymmetrical(24.w, 0.h),
+              ).paddingSymmetrical(24.h, 0.h),
               SizedBox(
                 height: 340.h,
                 child: ListView.separated(
@@ -691,13 +572,10 @@ class _LandingPageState extends State {
             isDone: isDone,
             onPressed: () {
               // sharedPref.setBool(HAS_ENABLED_QUICK_LOGIN, true);
-              authVM.loginWithFingerPrintFace(() async {
+              authVM.loginWithFingerPrintFace(() {
                 isDone = true;
                 cacheService.saveBool(key: CacheConst.quickLoginEnabled, value: true);
                 setState(() {});
-                await Future.delayed(Duration(milliseconds: 2000)).then((value) {
-                  if (mounted) Navigator.pop(context);
-                });
               });
             },
           );
diff --git a/lib/presentation/symptoms_checker/organ_selector_screen.dart b/lib/presentation/symptoms_checker/organ_selector_screen.dart
index e47032c..65d9a00 100644
--- a/lib/presentation/symptoms_checker/organ_selector_screen.dart
+++ b/lib/presentation/symptoms_checker/organ_selector_screen.dart
@@ -8,7 +8,7 @@ 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/presentation/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/widgets/interactive_body_widget.dart';
 import 'package:hmg_patient_app_new/theme/colors.dart';
 import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
@@ -267,7 +267,7 @@ class _OrganSelectorPageState extends State {
           runSpacing: 8.h,
           children: viewModel.selectedOrgans.map((organ) {
             return AppCustomChipWidget(
-              labelText: organ.name,
+              labelText: organ.description,
               backgroundColor: AppColors.secondaryLightRedColor,
               textColor: AppColors.primaryRedColor,
               deleteIcon: AppAssets.cancel,
diff --git a/lib/presentation/symptoms_checker/possible_conditions_screen.dart b/lib/presentation/symptoms_checker/possible_conditions_screen.dart
index 0587c32..2c99515 100644
--- a/lib/presentation/symptoms_checker/possible_conditions_screen.dart
+++ b/lib/presentation/symptoms_checker/possible_conditions_screen.dart
@@ -9,7 +9,7 @@ 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/symptoms_checker/models/conditions_model.dart';
 import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
-import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/widgets/condition_card.dart';
 import 'package:hmg_patient_app_new/services/navigation_service.dart';
 import 'package:hmg_patient_app_new/theme/colors.dart';
diff --git a/lib/presentation/symptoms_checker/risk_factors_screen.dart b/lib/presentation/symptoms_checker/risk_factors_screen.dart
new file mode 100644
index 0000000..211aabc
--- /dev/null
+++ b/lib/presentation/symptoms_checker/risk_factors_screen.dart
@@ -0,0 +1,291 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.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/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.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:provider/provider.dart';
+
+class RiskFactorsScreen extends StatefulWidget {
+  const RiskFactorsScreen({super.key});
+
+  @override
+  State createState() => _RiskFactorsScreenState();
+}
+
+class _RiskFactorsScreenState extends State {
+  @override
+  void initState() {
+    super.initState();
+    // Initialize symptom groups based on selected organs
+    WidgetsBinding.instance.addPostFrameCallback((_) {
+      final viewModel = context.read();
+      viewModel.initializeSymptomGroups();
+    });
+  }
+
+  void _onOptionSelected(int optionIndex) {}
+
+  void _onNextPressed(SymptomsCheckerViewModel viewModel) {
+    if (viewModel.hasSelectedSymptoms) {
+      // Navigate to triage screen
+      context.navigateWithName(AppRoutes.suggestionsScreen);
+    } else {
+      ScaffoldMessenger.of(context).showSnackBar(
+        SnackBar(
+          content: Text('Please select at least one option before proceeding'.needTranslation),
+          backgroundColor: AppColors.errorColor,
+        ),
+      );
+    }
+  }
+
+  void _onPreviousPressed() {
+    context.pop();
+  }
+
+  _buildConfirmationBottomSheet({required BuildContext context, required VoidCallback onConfirm}) {
+    return showCommonBottomSheetWithoutHeight(
+      title: LocaleKeys.notice.tr(context: context),
+      context,
+      child: Utils.getWarningWidget(
+        loadingText: "Are you sure you want to restart the organ selection?".needTranslation,
+        isShowActionButtons: true,
+        onCancelTap: () => Navigator.pop(context),
+        onConfirmTap: () => onConfirm(),
+      ),
+      callBackFunc: () {},
+      isFullScreen: false,
+      isCloseButtonVisible: true,
+    );
+  }
+
+  Widget _buildOptionItem(int index, bool selected, String optionText) {
+    return GestureDetector(
+      onTap: () => _onOptionSelected(index),
+      child: Container(
+        margin: EdgeInsets.only(bottom: 12.h),
+        child: Row(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            AnimatedContainer(
+              duration: const Duration(milliseconds: 300),
+              curve: Curves.easeInOut,
+              width: 24.w,
+              height: 24.w,
+              decoration: BoxDecoration(
+                color: selected ? AppColors.primaryRedColor : Colors.transparent,
+                borderRadius: BorderRadius.circular(5.r),
+                border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.borderGrayColor, width: 1.w),
+              ),
+              child: selected ? Icon(Icons.check, size: 16.f, color: AppColors.whiteColor) : null,
+            ),
+            SizedBox(width: 12.w),
+            Expanded(
+              child: Text(
+                optionText,
+                style: TextStyle(fontSize: 14.f, color: AppColors.textColor, fontWeight: FontWeight.w500),
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  Widget buildFactorsList() {
+    return AnimatedSwitcher(
+      duration: const Duration(milliseconds: 400),
+      transitionBuilder: (Widget child, Animation animation) {
+        final offsetAnimation = Tween(
+          begin: const Offset(1.0, 0.0),
+          end: Offset.zero,
+        ).animate(CurvedAnimation(
+          parent: animation,
+          curve: Curves.easeInOut,
+        ));
+
+        return SlideTransition(
+          position: offsetAnimation,
+          child: FadeTransition(
+            opacity: animation,
+            child: child,
+          ),
+        );
+      },
+      child: Container(
+        width: double.infinity,
+        margin: EdgeInsets.symmetric(horizontal: 24.w),
+        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+        padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 20.w),
+        child: Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            ...List.generate(4, (index) {
+              return _buildOptionItem(index, false, "currentQuestion.options[index].text");
+            }),
+          ],
+        ),
+      ),
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      backgroundColor: AppColors.bgScaffoldColor,
+      body: Consumer(
+        builder: (context, viewModel, _) {
+          return Column(
+            children: [
+              Expanded(
+                child: CollapsingListView(
+                  title: "Risks".needTranslation,
+                  onLeadingTapped: () => _buildConfirmationBottomSheet(
+                      context: context,
+                      onConfirm: () => {
+                            context.pop(),
+                            context.pop(),
+                          }),
+                  child: _buildEmptyState(),
+                  // child: viewModel.organSymptomsGroups.isEmpty
+                  //     ? _buildEmptyState()
+                  //     : Column(
+                  //         crossAxisAlignment: CrossAxisAlignment.start,
+                  //         children: [
+                  //           SizedBox(height: 16.h),
+                  //           ...viewModel.organSymptomsGroups.map((group) {
+                  //             return Padding(
+                  //               padding: EdgeInsets.only(bottom: 16.h),
+                  //               child: Container(
+                  //                 width: double.infinity,
+                  //                 margin: EdgeInsets.symmetric(horizontal: 24.w),
+                  //                 decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+                  //                 padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
+                  //                 child: Column(
+                  //                   crossAxisAlignment: CrossAxisAlignment.start,
+                  //                   children: [
+                  //                     Row(
+                  //                       mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  //                       children: [
+                  //                         Expanded(
+                  //                           child: Text(
+                  //                             'Possible symptoms related to "${group.organName}"',
+                  //                             style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
+                  //                           ),
+                  //                         ),
+                  //                       ],
+                  //                     ),
+                  //                     SizedBox(height: 24.h),
+                  //                     Wrap(
+                  //                       runSpacing: 12.h,
+                  //                       spacing: 8.w,
+                  //                       children: group.symptoms.map((symptom) {
+                  //                         bool isSelected = viewModel.isSymptomSelected(group.organId, symptom.id);
+                  //                         return GestureDetector(
+                  //                           onTap: () => viewModel.toggleSymptomSelection(group.organId, symptom.id),
+                  //                           child: CustomSelectableChip(
+                  //                             label: symptom.name,
+                  //                             selected: isSelected,
+                  //                             activeColor: AppColors.primaryRedBorderColor,
+                  //                             activeTextColor: AppColors.primaryRedBorderColor,
+                  //                             inactiveBorderColor: AppColors.bottomNAVBorder,
+                  //                             inactiveTextColor: AppColors.textColor,
+                  //                           ),
+                  //                         );
+                  //                       }).toList(),
+                  //                     ),
+                  //                   ],
+                  //                 ),
+                  //               ),
+                  //             );
+                  //           }),
+                  //         ],
+                  //       ),
+                ),
+              ),
+              _buildStickyBottomCard(context, viewModel),
+            ],
+          );
+        },
+      ),
+    );
+  }
+
+  Widget _buildEmptyState() {
+    return Center(
+      child: Padding(
+        padding: EdgeInsets.all(24.h),
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.center,
+          children: [
+            Icon(Icons.info_outline, size: 64.h, color: AppColors.greyTextColor),
+            SizedBox(height: 16.h),
+            Text(
+              'No organs selected'.needTranslation,
+              style: TextStyle(
+                fontSize: 18.f,
+                fontWeight: FontWeight.w600,
+                color: AppColors.textColor,
+              ),
+            ),
+            SizedBox(height: 8.h),
+            Text(
+              'Please go back and select organs first'.needTranslation,
+              textAlign: TextAlign.center,
+              style: TextStyle(
+                fontSize: 14.f,
+                color: AppColors.greyTextColor,
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  Widget _buildStickyBottomCard(BuildContext context, SymptomsCheckerViewModel viewModel) {
+    return Container(
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+      child: Column(
+        mainAxisSize: MainAxisSize.min,
+        children: [
+          SizedBox(height: 16.h),
+          Row(
+            children: [
+              Expanded(
+                child: CustomButton(
+                  text: "Previous".needTranslation,
+                  onPressed: _onPreviousPressed,
+                  backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
+                  borderColor: Colors.transparent,
+                  textColor: AppColors.primaryRedColor,
+                  fontSize: 16.f,
+                ),
+              ),
+              SizedBox(width: 12.w),
+              Expanded(
+                child: CustomButton(
+                  text: "Next".needTranslation,
+                  onPressed: () => _onNextPressed(viewModel),
+                  backgroundColor: AppColors.primaryRedColor,
+                  borderColor: AppColors.primaryRedColor,
+                  textColor: AppColors.whiteColor,
+                  fontSize: 16.f,
+                ),
+              ),
+            ],
+          ),
+          SizedBox(height: 24.h),
+        ],
+      ).paddingSymmetrical(24.w, 0),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/suggestions_screen.dart b/lib/presentation/symptoms_checker/suggestions_screen.dart
new file mode 100644
index 0000000..f9d922a
--- /dev/null
+++ b/lib/presentation/symptoms_checker/suggestions_screen.dart
@@ -0,0 +1,292 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.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/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.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:provider/provider.dart';
+
+class SuggestionsScreen extends StatefulWidget {
+  const SuggestionsScreen({super.key});
+
+  @override
+  State createState() => _SuggestionsScreenState();
+}
+
+class _SuggestionsScreenState extends State {
+  @override
+  void initState() {
+    super.initState();
+    // Initialize symptom groups based on selected organs
+    WidgetsBinding.instance.addPostFrameCallback((_) {
+      final viewModel = context.read();
+      viewModel.initializeSymptomGroups();
+    });
+  }
+
+  void _onOptionSelected(int optionIndex) {}
+
+  void _onNextPressed(SymptomsCheckerViewModel viewModel) {
+    if (viewModel.hasSelectedSymptoms) {
+      // Navigate to triage screen
+      context.navigateWithName(AppRoutes.triageScreen);
+    } else {
+      ScaffoldMessenger.of(context).showSnackBar(
+        SnackBar(
+          content: Text('Please select at least one option before proceeding'.needTranslation),
+          backgroundColor: AppColors.errorColor,
+        ),
+      );
+    }
+  }
+
+  void _onPreviousPressed() {
+    context.pop();
+  }
+
+  _buildConfirmationBottomSheet({required BuildContext context, required VoidCallback onConfirm}) {
+    return showCommonBottomSheetWithoutHeight(
+      title: LocaleKeys.notice.tr(context: context),
+      context,
+      child: Utils.getWarningWidget(
+        loadingText: "Are you sure you want to restart the organ selection?".needTranslation,
+        isShowActionButtons: true,
+        onCancelTap: () => Navigator.pop(context),
+        onConfirmTap: () => onConfirm(),
+      ),
+      callBackFunc: () {},
+      isFullScreen: false,
+      isCloseButtonVisible: true,
+    );
+  }
+
+  Widget _buildOptionItem(int index, bool selected, String optionText) {
+    return GestureDetector(
+      onTap: () => _onOptionSelected(index),
+      child: Container(
+        margin: EdgeInsets.only(bottom: 12.h),
+        child: Row(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            AnimatedContainer(
+              duration: const Duration(milliseconds: 300),
+              curve: Curves.easeInOut,
+              width: 24.w,
+              height: 24.w,
+              decoration: BoxDecoration(
+                color: selected ? AppColors.primaryRedColor : Colors.transparent,
+                borderRadius: BorderRadius.circular(5.r),
+                border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.borderGrayColor, width: 1.w),
+              ),
+              child: selected ? Icon(Icons.check, size: 16.f, color: AppColors.whiteColor) : null,
+            ),
+            SizedBox(width: 12.w),
+            Expanded(
+              child: Text(
+                optionText,
+                style: TextStyle(fontSize: 14.f, color: AppColors.textColor, fontWeight: FontWeight.w500),
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  Widget buildFactorsList() {
+    return AnimatedSwitcher(
+      duration: const Duration(milliseconds: 400),
+      transitionBuilder: (Widget child, Animation animation) {
+        final offsetAnimation = Tween(
+          begin: const Offset(1.0, 0.0),
+          end: Offset.zero,
+        ).animate(CurvedAnimation(
+          parent: animation,
+          curve: Curves.easeInOut,
+        ));
+
+        return SlideTransition(
+          position: offsetAnimation,
+          child: FadeTransition(
+            opacity: animation,
+            child: child,
+          ),
+        );
+      },
+      child: Container(
+        width: double.infinity,
+        margin: EdgeInsets.symmetric(horizontal: 24.w),
+        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+        padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 20.w),
+        child: Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            ...List.generate(4, (index) {
+              return _buildOptionItem(index, false, "currentQuestion.options[index].text");
+            }),
+          ],
+        ),
+      ),
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      backgroundColor: AppColors.bgScaffoldColor,
+      body: Consumer(
+        builder: (context, viewModel, _) {
+          return Column(
+            children: [
+              Expanded(
+                child: CollapsingListView(
+                  title: "Suggestions".needTranslation,
+                  onLeadingTapped: () => _buildConfirmationBottomSheet(
+                      context: context,
+                      onConfirm: () => {
+                            context.pop(),
+                            context.pop(),
+                          }),
+                  child: _buildEmptyState(),
+
+                  // child: viewModel.organSymptomsGroups.isEmpty
+                  //     ? _buildEmptyState()
+                  //     : Column(
+                  //         crossAxisAlignment: CrossAxisAlignment.start,
+                  //         children: [
+                  //           SizedBox(height: 16.h),
+                  //           ...viewModel.organSymptomsGroups.map((group) {
+                  //             return Padding(
+                  //               padding: EdgeInsets.only(bottom: 16.h),
+                  //               child: Container(
+                  //                 width: double.infinity,
+                  //                 margin: EdgeInsets.symmetric(horizontal: 24.w),
+                  //                 decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+                  //                 padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
+                  //                 child: Column(
+                  //                   crossAxisAlignment: CrossAxisAlignment.start,
+                  //                   children: [
+                  //                     Row(
+                  //                       mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                  //                       children: [
+                  //                         Expanded(
+                  //                           child: Text(
+                  //                             'Possible symptoms related to "${group.organName}"',
+                  //                             style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
+                  //                           ),
+                  //                         ),
+                  //                       ],
+                  //                     ),
+                  //                     SizedBox(height: 24.h),
+                  //                     Wrap(
+                  //                       runSpacing: 12.h,
+                  //                       spacing: 8.w,
+                  //                       children: group.symptoms.map((symptom) {
+                  //                         bool isSelected = viewModel.isSymptomSelected(group.organId, symptom.id);
+                  //                         return GestureDetector(
+                  //                           onTap: () => viewModel.toggleSymptomSelection(group.organId, symptom.id),
+                  //                           child: CustomSelectableChip(
+                  //                             label: symptom.name,
+                  //                             selected: isSelected,
+                  //                             activeColor: AppColors.primaryRedBorderColor,
+                  //                             activeTextColor: AppColors.primaryRedBorderColor,
+                  //                             inactiveBorderColor: AppColors.bottomNAVBorder,
+                  //                             inactiveTextColor: AppColors.textColor,
+                  //                           ),
+                  //                         );
+                  //                       }).toList(),
+                  //                     ),
+                  //                   ],
+                  //                 ),
+                  //               ),
+                  //             );
+                  //           }),
+                  //         ],
+                  //       ),
+                ),
+              ),
+              _buildStickyBottomCard(context, viewModel),
+            ],
+          );
+        },
+      ),
+    );
+  }
+
+  Widget _buildEmptyState() {
+    return Center(
+      child: Padding(
+        padding: EdgeInsets.all(24.h),
+        child: Column(
+          mainAxisAlignment: MainAxisAlignment.center,
+          children: [
+            Icon(Icons.info_outline, size: 64.h, color: AppColors.greyTextColor),
+            SizedBox(height: 16.h),
+            Text(
+              'No organs selected'.needTranslation,
+              style: TextStyle(
+                fontSize: 18.f,
+                fontWeight: FontWeight.w600,
+                color: AppColors.textColor,
+              ),
+            ),
+            SizedBox(height: 8.h),
+            Text(
+              'Please go back and select organs first'.needTranslation,
+              textAlign: TextAlign.center,
+              style: TextStyle(
+                fontSize: 14.f,
+                color: AppColors.greyTextColor,
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  Widget _buildStickyBottomCard(BuildContext context, SymptomsCheckerViewModel viewModel) {
+    return Container(
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+      child: Column(
+        mainAxisSize: MainAxisSize.min,
+        children: [
+          SizedBox(height: 16.h),
+          Row(
+            children: [
+              Expanded(
+                child: CustomButton(
+                  text: "Previous".needTranslation,
+                  onPressed: _onPreviousPressed,
+                  backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
+                  borderColor: Colors.transparent,
+                  textColor: AppColors.primaryRedColor,
+                  fontSize: 16.f,
+                ),
+              ),
+              SizedBox(width: 12.w),
+              Expanded(
+                child: CustomButton(
+                  text: "Next".needTranslation,
+                  onPressed: () => _onNextPressed(viewModel),
+                  backgroundColor: AppColors.primaryRedColor,
+                  borderColor: AppColors.primaryRedColor,
+                  textColor: AppColors.whiteColor,
+                  fontSize: 16.f,
+                ),
+              ),
+            ],
+          ),
+          SizedBox(height: 24.h),
+        ],
+      ).paddingSymmetrical(24.w, 0),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart b/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
deleted file mode 100644
index 9d42dc7..0000000
--- a/lib/presentation/symptoms_checker/symptoms_checker_view_model.dart
+++ /dev/null
@@ -1,240 +0,0 @@
-import 'dart:async';
-
-import 'package:flutter/cupertino.dart';
-import 'package:hmg_patient_app_new/core/enums.dart';
-import 'package:hmg_patient_app_new/features/symptoms_checker/data/symptoms_mapping_data.dart';
-import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart';
-import 'package:hmg_patient_app_new/features/symptoms_checker/models/symptom_model.dart';
-import 'package:hmg_patient_app_new/features/symptoms_checker/organ_mapping_data.dart';
-
-class SymptomsCheckerViewModel extends ChangeNotifier {
-  // State variables
-  bool isBodyHidden = false;
-  BodyView _currentView = BodyView.front;
-  final Set _selectedOrganIds = {};
-  bool _isBottomSheetExpanded = false;
-
-  // Symptom selection state
-  final Map _organSymptomsGroups = {};
-
-  // Tooltip state
-  String? _tooltipOrganId;
-  Timer? _tooltipTimer;
-
-  // Getters
-
-  bool isPossibleConditionsLoading = false;
-
-  BodyView get currentView => _currentView;
-
-  Set get selectedOrganIds => _selectedOrganIds;
-
-  bool get isBottomSheetExpanded => _isBottomSheetExpanded;
-
-  String? get tooltipOrganId => _tooltipOrganId;
-
-  /// Get organs for current view
-  List get currentOrgans => OrganData.getOrgansForView(_currentView);
-
-  /// Get all selected organs from both views
-  List get selectedOrgans {
-    final allOrgans = [
-      ...OrganData.frontViewOrgans,
-      ...OrganData.backViewOrgans,
-    ];
-    return allOrgans.where((organ) => _selectedOrganIds.contains(organ.id)).toList();
-  }
-
-  /// Check if any organs are selected
-  bool get hasSelectedOrgans => _selectedOrganIds.isNotEmpty;
-
-  /// Get count of selected organs
-  int get selectedOrgansCount => _selectedOrganIds.length;
-
-  /// Get organ symptoms groups for selected organs
-  List get organSymptomsGroups {
-    return _organSymptomsGroups.values.toList();
-  }
-
-  /// Get total selected symptoms count across all organs
-  int get totalSelectedSymptomsCount {
-    return _organSymptomsGroups.values.fold(0, (sum, group) => sum + group.selectedCount);
-  }
-
-  /// Check if at least one symptom is selected
-  bool get hasSelectedSymptoms {
-    return _organSymptomsGroups.values.any((group) => group.hasSelectedSymptoms);
-  }
-
-  // Methods
-
-  /// Toggle between front and back body view
-  void toggleView() {
-    _currentView = _currentView == BodyView.front ? BodyView.back : BodyView.front;
-    notifyListeners();
-  }
-
-  toggleIsBodyHidden() {
-    isBodyHidden = !isBodyHidden;
-    notifyListeners();
-  }
-
-  /// Toggle organ selection (add if not selected, remove if selected)
-  void toggleOrganSelection(String organId) {
-    if (_selectedOrganIds.contains(organId)) {
-      _selectedOrganIds.remove(organId);
-    } else {
-      _selectedOrganIds.add(organId);
-    }
-
-    // Show tooltip
-    _showTooltip(organId);
-
-    notifyListeners();
-  }
-
-  /// Show tooltip for an organ
-  void _showTooltip(String organId) {
-    // Cancel any existing timer
-    _tooltipTimer?.cancel();
-
-    // Set the tooltip organ
-    _tooltipOrganId = organId;
-    notifyListeners();
-
-    // Hide tooltip after 2 seconds
-    _tooltipTimer = Timer(const Duration(seconds: 1), () {
-      _tooltipOrganId = null;
-      notifyListeners();
-    });
-  }
-
-  /// Hide tooltip immediately
-  void hideTooltip() {
-    _tooltipTimer?.cancel();
-    _tooltipOrganId = null;
-    notifyListeners();
-  }
-
-  /// Remove a specific organ from selection
-  void removeOrgan(String organId) {
-    _selectedOrganIds.remove(organId);
-    notifyListeners();
-  }
-
-  /// Clear all selected organs
-  void clearAllSelections() {
-    _selectedOrganIds.clear();
-    notifyListeners();
-  }
-
-  /// Toggle bottom sheet expanded/collapsed state
-  void toggleBottomSheet() {
-    _isBottomSheetExpanded = !_isBottomSheetExpanded;
-    notifyListeners();
-  }
-
-  /// Set bottom sheet expanded state
-  void setBottomSheetExpanded(bool isExpanded) {
-    _isBottomSheetExpanded = isExpanded;
-    notifyListeners();
-  }
-
-  /// Validate if at least one organ is selected
-  bool validateSelection() {
-    return _selectedOrganIds.isNotEmpty;
-  }
-
-  /// Get selected organ IDs as a list
-  List getSelectedOrganIds() {
-    return _selectedOrganIds.toList();
-  }
-
-  /// Get selected organ names as a list
-  List getSelectedOrganNames() {
-    return selectedOrgans.map((organ) => organ.name).toList();
-  }
-
-  /// Initialize symptom groups based on selected organs
-  void initializeSymptomGroups() {
-    _organSymptomsGroups.clear();
-
-    for (String organId in _selectedOrganIds) {
-      List symptoms = SymptomsMappingData.getSymptomsForOrgan(organId);
-      if (symptoms.isNotEmpty) {
-        // Find organ name from selectedOrgans
-        String organName = selectedOrgans
-            .firstWhere((organ) => organ.id == organId, orElse: () => OrganModel(id: organId, name: organId, bodyView: BodyView.front, position: OrganPosition(x: 0, y: 0)))
-            .name;
-
-        _organSymptomsGroups[organId] = OrganSymptomsGroup(
-          organId: organId,
-          organName: organName,
-          symptoms: symptoms,
-        );
-      }
-    }
-    notifyListeners();
-  }
-
-  /// Toggle symptom selection for a specific organ
-  void toggleSymptomSelection(String organId, String symptomId) {
-    if (_organSymptomsGroups.containsKey(organId)) {
-      final group = _organSymptomsGroups[organId]!;
-      final selectedIds = Set.from(group.selectedSymptomIds);
-
-      if (selectedIds.contains(symptomId)) {
-        selectedIds.remove(symptomId);
-      } else {
-        selectedIds.add(symptomId);
-      }
-
-      _organSymptomsGroups[organId] = group.copyWith(selectedSymptomIds: selectedIds);
-      notifyListeners();
-    }
-  }
-
-  /// Check if a symptom is selected
-  bool isSymptomSelected(String organId, String symptomId) {
-    return _organSymptomsGroups[organId]?.selectedSymptomIds.contains(symptomId) ?? false;
-  }
-
-  /// Get all selected symptoms across all organs
-  List getAllSelectedSymptoms() {
-    List allSymptoms = [];
-    for (var group in _organSymptomsGroups.values) {
-      for (var symptom in group.symptoms) {
-        if (group.selectedSymptomIds.contains(symptom.id)) {
-          allSymptoms.add(symptom);
-        }
-      }
-    }
-    return allSymptoms;
-  }
-
-  /// Clear all symptom selections
-  void clearAllSymptomSelections() {
-    for (var organId in _organSymptomsGroups.keys) {
-      _organSymptomsGroups[organId] = _organSymptomsGroups[organId]!.copyWith(selectedSymptomIds: {});
-    }
-    notifyListeners();
-  }
-
-  /// Reset the view model to initial state
-  void reset() {
-    _currentView = BodyView.front;
-    _selectedOrganIds.clear();
-    _organSymptomsGroups.clear();
-    _isBottomSheetExpanded = false;
-    _tooltipTimer?.cancel();
-    _tooltipOrganId = null;
-    notifyListeners();
-  }
-
-  @override
-  void dispose() {
-    _tooltipTimer?.cancel();
-    super.dispose();
-  }
-
-}
diff --git a/lib/presentation/symptoms_checker/symptoms_selector_screen.dart b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
index b1c3234..7b1c8a6 100644
--- a/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
+++ b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
@@ -5,9 +5,9 @@ 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/symptoms_checker/models/symptom_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/models/resp_models/body_symptom_response_model.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart';
 import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
-import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_checker_view_model.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';
@@ -36,7 +36,7 @@ class _SymptomsSelectorScreenState extends State {
   void _onNextPressed(SymptomsCheckerViewModel viewModel) {
     if (viewModel.hasSelectedSymptoms) {
       // Navigate to triage screen
-      context.navigateWithName(AppRoutes.triageScreen);
+      context.navigateWithName(AppRoutes.riskFactorsScreen);
     } else {
       ScaffoldMessenger.of(context).showSnackBar(
         SnackBar(
@@ -84,23 +84,47 @@ class _SymptomsSelectorScreenState extends State {
                             context.pop(),
                             context.pop(),
                           }),
-                  child: viewModel.organSymptomsGroups.isEmpty
-                      ? _buildEmptyState()
-                      : Column(
-                          crossAxisAlignment: CrossAxisAlignment.start,
-                          children: [
-                            SizedBox(height: 16.h),
-                            ...viewModel.organSymptomsGroups.map((group) {
-                              return Padding(
-                                padding: EdgeInsets.only(bottom: 16.h),
-                                child: _buildSymptomsSelectionCard(viewModel, group),
-                              );
-                            }),
-                          ],
-                        ),
+                  child: viewModel.isBodySymptomsLoading
+                      ? _buildLoadingShimmer()
+                      : viewModel.organSymptomsResults.isEmpty
+                          ? _buildEmptyState()
+                          : Column(
+                              crossAxisAlignment: CrossAxisAlignment.start,
+                              children: [
+                                SizedBox(height: 16.h),
+                                ...viewModel.organSymptomsResults.map((organResult) {
+                                  // Find matching organ ID from selected organs
+                                  String? organId;
+                                  String? organName;
+                                  for (var organ in viewModel.selectedOrgans) {
+                                    if (organ.name == organResult.name) {
+                                      organId = organ.id;
+                                      organName = organ.description;
+                                      break;
+                                    }
+                                  }
+
+                                  if (organId != null && organResult.bodySymptoms != null) {
+                                    return Padding(
+                                      padding: EdgeInsets.only(bottom: 16.h),
+                                      child: _buildSymptomsSelectionCard(
+                                        viewModel,
+                                        organId,
+                                        organName ?? organResult.name ?? '',
+                                        organResult.bodySymptoms!,
+                                      ),
+                                    );
+                                  }
+                                  return SizedBox.shrink();
+                                }),
+                              ],
+                            ),
                 ),
               ),
-              _buildStickyBottomCard(context, viewModel),
+              if (!viewModel.isBodySymptomsLoading) ...[
+                _buildStickyBottomCard(context, viewModel),
+
+              ],
             ],
           );
         },
@@ -108,7 +132,12 @@ class _SymptomsSelectorScreenState extends State {
     );
   }
 
-  Widget _buildSymptomsSelectionCard(SymptomsCheckerViewModel viewModel, OrganSymptomsGroup group) {
+  Widget _buildSymptomsSelectionCard(
+    SymptomsCheckerViewModel viewModel,
+    String organId,
+    String organName,
+    List symptoms,
+  ) {
     return Container(
       width: double.infinity,
       margin: EdgeInsets.symmetric(horizontal: 24.w),
@@ -122,7 +151,7 @@ class _SymptomsSelectorScreenState extends State {
             children: [
               Expanded(
                 child: Text(
-                  'Possible symptoms related to "${group.organName}"',
+                  'Possible symptoms related to "$organName"',
                   style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
                 ),
               ),
@@ -132,12 +161,14 @@ class _SymptomsSelectorScreenState extends State {
           Wrap(
             runSpacing: 12.h,
             spacing: 8.w,
-            children: group.symptoms.map((symptom) {
-              bool isSelected = viewModel.isSymptomSelected(group.organId, symptom.id);
+            children: symptoms.map((symptom) {
+              final symptomId = symptom.id ?? '';
+              final symptomLabel = symptom.getDisplayName(false); // Pass isArabic from AppState if needed
+              bool isSelected = viewModel.isSymptomSelected(organId, symptomId);
               return GestureDetector(
-                onTap: () => viewModel.toggleSymptomSelection(group.organId, symptom.id),
+                onTap: () => viewModel.toggleSymptomSelection(organId, symptomId),
                 child: CustomSelectableChip(
-                  label: symptom.name,
+                  label: symptomLabel,
                   selected: isSelected,
                   activeColor: AppColors.primaryRedBorderColor,
                   activeTextColor: AppColors.primaryRedBorderColor,
@@ -152,6 +183,64 @@ class _SymptomsSelectorScreenState extends State {
     );
   }
 
+  Widget _buildLoadingShimmer() {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        SizedBox(height: 16.h),
+        // Create 2-3 shimmer cards
+        ...List.generate(3, (index) {
+          return Padding(
+            padding: EdgeInsets.only(bottom: 16.h),
+            child: _buildShimmerCard(),
+          );
+        }),
+      ],
+    );
+  }
+
+  Widget _buildShimmerCard() {
+    return Container(
+      width: double.infinity,
+      margin: EdgeInsets.symmetric(horizontal: 24.w),
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+      padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          // Shimmer title
+          Container(
+            height: 40.h,
+            decoration: BoxDecoration(
+              color: Colors.white,
+              borderRadius: BorderRadius.circular(24.r),
+            ),
+          ).toShimmer2(isShow: true, radius: 24.r),
+          SizedBox(height: 16.h),
+          // Shimmer chips
+          Wrap(
+            runSpacing: 12.h,
+            spacing: 8.w,
+            children: List.generate(4, (index) {
+              return Container(
+                padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h),
+                decoration: BoxDecoration(
+                  color: AppColors.whiteColor,
+                  borderRadius: BorderRadius.circular(24.r),
+                  border: Border.all(color: AppColors.bottomNAVBorder, width: 1),
+                ),
+                child: Text(
+                  'Loading..',
+                  style: TextStyle(fontSize: 14.f, color: AppColors.textColor),
+                ),
+              ).toShimmer2(isShow: true, radius: 24.r);
+            }),
+          ),
+        ],
+      ),
+    );
+  }
+
   Widget _buildEmptyState() {
     return Center(
       child: Padding(
diff --git a/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart b/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
index 34cc049..8957fb1 100644
--- a/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
+++ b/lib/presentation/symptoms_checker/widgets/interactive_body_widget.dart
@@ -118,7 +118,7 @@ class _InteractiveBodyWidgetState extends State {
                           (organ) {
                             final centerX = organ.position.x * imageConstraints.maxWidth;
                             final centerY = organ.position.y * imageConstraints.maxHeight;
-                            return OrganTooltipWidget(organName: organ.name, position: Offset(centerX, centerY));
+                            return OrganTooltipWidget(organName: organ.description, position: Offset(centerX, centerY));
                           },
                         ),
                     ],
diff --git a/lib/presentation/symptoms_checker/widgets/selected_organs_section.dart b/lib/presentation/symptoms_checker/widgets/selected_organs_section.dart
index dbb93ab..c0f1be3 100644
--- a/lib/presentation/symptoms_checker/widgets/selected_organs_section.dart
+++ b/lib/presentation/symptoms_checker/widgets/selected_organs_section.dart
@@ -114,7 +114,7 @@ class _SelectedOrgansSectionState extends State {
                 runSpacing: 8.h,
                 children: widget.selectedOrgans.map((organ) {
                   return AppCustomChipWidget(
-                    labelText: organ.name,
+                    labelText: organ.description,
                     backgroundColor: AppColors.secondaryLightRedColor,
                     textColor: AppColors.primaryRedColor,
                     deleteIcon: AppAssets.cross_circle,
diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart
index 2e6b253..e40dbd0 100644
--- a/lib/routes/app_routes.dart
+++ b/lib/routes/app_routes.dart
@@ -9,6 +9,8 @@ import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures
 import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/organ_selector_screen.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/possible_conditions_screen.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/risk_factors_screen.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/suggestions_screen.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_selector_screen.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/triage_screen.dart';
 import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/call_screen.dart';
@@ -29,6 +31,8 @@ class AppRoutes {
   // Symptoms Checker
   static const String organSelectorPage = '/organSelectorPage';
   static const String symptomsCheckerScreen = '/symptomsCheckerScreen';
+  static const String suggestionsScreen = '/suggestionsScreen';
+  static const String riskFactorsScreen = '/riskFactorsScreen';
   static const String possibleConditionsScreen = '/possibleConditionsScreen';
   static const String triageScreen = '/triageProgressScreen';
 
@@ -39,13 +43,14 @@ class AppRoutes {
         register: (context) => RegisterNew(),
         registerStepTwo: (context) => RegisterNewStep2(),
         medicalFilePage: (context) => MedicalFilePage(),
+        zoomCallPage: (context) => CallScreen(),
         eReferralPage: (context) => NewReferralPage(),
         comprehensiveCheckupPage: (context) => ComprehensiveCheckupPage(),
         homeHealthCarePage: (context) => HhcProceduresPage(),
-        zoomCallPage: (context) => CallScreen()
-        homeHealthCarePage: (context) => HhcProceduresPage(),
         organSelectorPage: (context) => OrganSelectorPage(),
         symptomsCheckerScreen: (context) => SymptomsSelectorScreen(),
+        riskFactorsScreen: (context) => RiskFactorsScreen(),
+        suggestionsScreen: (context) => SuggestionsScreen(),
         possibleConditionsScreen: (context) => PossibleConditionsScreen(),
         triageScreen: (context) => TriageScreen()
       };

From 9410ad9b60d13fc24e7e19e3bd06e834cd388b9a Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Wed, 10 Dec 2025 09:12:39 +0300
Subject: [PATCH 08/55] Refactoring

---
 .../symptoms_checker_view_model.dart          | 85 ++++++-------------
 .../symptoms_selector_screen.dart             |  1 -
 2 files changed, 28 insertions(+), 58 deletions(-)

diff --git a/lib/features/symptoms_checker/symptoms_checker_view_model.dart b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
index 16cb01e..a467d01 100644
--- a/lib/features/symptoms_checker/symptoms_checker_view_model.dart
+++ b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
@@ -66,28 +66,23 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   /// Get count of selected organs
   int get selectedOrgansCount => _selectedOrganIds.length;
 
-  /// Get organ symptoms from API response
-  List get organSymptomsResults {
+   List get organSymptomsResults {
     if (bodySymptomResponse?.dataDetails?.result == null) {
       return [];
     }
     return bodySymptomResponse!.dataDetails!.result ?? [];
   }
 
-  /// Get total selected symptoms count across all organs
-  int get totalSelectedSymptomsCount {
+   int get totalSelectedSymptomsCount {
     return _selectedSymptomsByOrgan.values.fold(0, (sum, symptomIds) => sum + symptomIds.length);
   }
 
-  /// Check if at least one symptom is selected
-  bool get hasSelectedSymptoms {
+   bool get hasSelectedSymptoms {
     return _selectedSymptomsByOrgan.values.any((symptomIds) => symptomIds.isNotEmpty);
   }
 
-  // Methods
 
-  /// Toggle between front and back body view
-  void toggleView() {
+   void toggleView() {
     _currentView = _currentView == BodyView.front ? BodyView.back : BodyView.front;
     notifyListeners();
   }
@@ -97,8 +92,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-  /// Toggle organ selection (add if not selected, remove if selected)
-  void toggleOrganSelection(String organId) {
+   void toggleOrganSelection(String organId) {
     if (_selectedOrganIds.contains(organId)) {
       _selectedOrganIds.remove(organId);
     } else {
@@ -111,13 +105,10 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-  /// Show tooltip for an organ
-  void _showTooltip(String organId) {
-    // Cancel any existing timer
-    _tooltipTimer?.cancel();
+   void _showTooltip(String organId) {
+     _tooltipTimer?.cancel();
 
-    // Set the tooltip organ
-    _tooltipOrganId = organId;
+     _tooltipOrganId = organId;
     notifyListeners();
 
     // Hide tooltip after 2 seconds
@@ -134,47 +125,39 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-  /// Remove a specific organ from selection
-  void removeOrgan(String organId) {
+   void removeOrgan(String organId) {
     _selectedOrganIds.remove(organId);
     notifyListeners();
   }
 
-  /// Clear all selected organs
-  void clearAllSelections() {
+   void clearAllSelections() {
     _selectedOrganIds.clear();
     notifyListeners();
   }
 
-  /// Toggle bottom sheet expanded/collapsed state
-  void toggleBottomSheet() {
+   void toggleBottomSheet() {
     _isBottomSheetExpanded = !_isBottomSheetExpanded;
     notifyListeners();
   }
 
-  /// Set bottom sheet expanded state
-  void setBottomSheetExpanded(bool isExpanded) {
+   void setBottomSheetExpanded(bool isExpanded) {
     _isBottomSheetExpanded = isExpanded;
     notifyListeners();
   }
 
-  /// Validate if at least one organ is selected
-  bool validateSelection() {
+   bool validateSelection() {
     return _selectedOrganIds.isNotEmpty;
   }
 
-  /// Get selected organ IDs as a list
-  List getSelectedOrganIds() {
+   List getSelectedOrganIds() {
     return _selectedOrganIds.toList();
   }
 
-  /// Get selected organ names as a list
-  List getSelectedOrganNames() {
+   List getSelectedOrganNames() {
     return selectedOrgans.map((organ) => organ.description).toList();
   }
 
-  /// Initialize symptoms from API based on selected organs
-  Future initializeSymptomGroups({
+   Future initializeSymptomGroups({
     Function()? onSuccess,
     Function(String)? onError,
   }) async {
@@ -185,15 +168,12 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
       return;
     }
 
-    // Get the 'name' field from selected organs to send to API
-    List organNames = selectedOrgans.map((organ) => organ.name).toList();
+     List organNames = selectedOrgans.map((organ) => organ.name).toList();
 
-    // Fetch symptoms from API
-    await getBodySymptomsByName(
+     await getBodySymptomsByName(
       organNames: organNames,
       onSuccess: (response) {
-        // API response is already stored in bodySymptomResponse
-        if (onSuccess != null) {
+         if (onSuccess != null) {
           onSuccess();
         }
       },
@@ -205,8 +185,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     );
   }
 
-  /// Toggle symptom selection for a specific organ
-  void toggleSymptomSelection(String organId, String symptomId) {
+   void toggleSymptomSelection(String organId, String symptomId) {
     if (!_selectedSymptomsByOrgan.containsKey(organId)) {
       _selectedSymptomsByOrgan[organId] = {};
     }
@@ -219,13 +198,11 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-  /// Check if a symptom is selected
-  bool isSymptomSelected(String organId, String symptomId) {
+   bool isSymptomSelected(String organId, String symptomId) {
     return _selectedSymptomsByOrgan[organId]?.contains(symptomId) ?? false;
   }
 
-  /// Get all selected symptoms across all organs (using API models)
-  List getAllSelectedSymptoms() {
+   List getAllSelectedSymptoms() {
     List allSymptoms = [];
 
     if (bodySymptomResponse?.dataDetails?.result == null) {
@@ -233,8 +210,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     }
 
     for (var organResult in bodySymptomResponse!.dataDetails!.result!) {
-      // Find matching organ ID
-      String? matchingOrganId;
+       String? matchingOrganId;
       for (var organ in selectedOrgans) {
         if (organ.name == organResult.name) {
           matchingOrganId = organ.id;
@@ -258,14 +234,12 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     return allSymptoms;
   }
 
-  /// Clear all symptom selections
-  void clearAllSymptomSelections() {
+   void clearAllSymptomSelections() {
     _selectedSymptomsByOrgan.clear();
     notifyListeners();
   }
 
-  /// Reset the view model to initial state
-  void reset() {
+   void reset() {
     _currentView = BodyView.front;
     _selectedOrganIds.clear();
     _selectedSymptomsByOrgan.clear();
@@ -276,8 +250,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-  /// Fetch body symptoms by organ names from API
-  Future getBodySymptomsByName({
+   Future getBodySymptomsByName({
     required List organNames,
     Function(BodySymptomResponseModel)? onSuccess,
     Function(String)? onError,
@@ -290,8 +263,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     );
 
     result.fold(
-      // Handle failure
-      (failure) async {
+       (failure) async {
         isBodySymptomsLoading = false;
         notifyListeners();
         await errorHandlerService.handleError(failure: failure);
@@ -299,8 +271,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
           onError(failure.toString());
         }
       },
-      // Handle success
-      (apiResponse) {
+       (apiResponse) {
         isBodySymptomsLoading = false;
         if (apiResponse.messageStatus == 1 && apiResponse.data != null) {
           bodySymptomResponse = apiResponse.data;
diff --git a/lib/presentation/symptoms_checker/symptoms_selector_screen.dart b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
index 7b1c8a6..bed232b 100644
--- a/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
+++ b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
@@ -123,7 +123,6 @@ class _SymptomsSelectorScreenState extends State {
               ),
               if (!viewModel.isBodySymptomsLoading) ...[
                 _buildStickyBottomCard(context, viewModel),
-
               ],
             ],
           );

From c97a49224406f43f3584786e0b37739332b1267e Mon Sep 17 00:00:00 2001
From: haroon amjad 
Date: Wed, 10 Dec 2025 15:00:47 +0300
Subject: [PATCH 09/55] Medical File page updates

---
 .../svg/ask_doctor_medical_file_icon.svg      |   4 +
 assets/images/svg/blood_sugar_icon.svg        |   5 +
 assets/images/svg/internet_pairing_icon.svg   |   7 ++
 assets/images/svg/weight_tracker_icon.svg     |   4 +
 lib/core/app_assets.dart                      |   4 +
 .../medical_file/medical_file_page.dart       | 100 ++++++++++++++++--
 .../widgets/medical_file_card.dart            |   2 +-
 7 files changed, 117 insertions(+), 9 deletions(-)
 create mode 100644 assets/images/svg/ask_doctor_medical_file_icon.svg
 create mode 100644 assets/images/svg/blood_sugar_icon.svg
 create mode 100644 assets/images/svg/internet_pairing_icon.svg
 create mode 100644 assets/images/svg/weight_tracker_icon.svg

diff --git a/assets/images/svg/ask_doctor_medical_file_icon.svg b/assets/images/svg/ask_doctor_medical_file_icon.svg
new file mode 100644
index 0000000..11facfb
--- /dev/null
+++ b/assets/images/svg/ask_doctor_medical_file_icon.svg
@@ -0,0 +1,4 @@
+
+    
+    
+
diff --git a/assets/images/svg/blood_sugar_icon.svg b/assets/images/svg/blood_sugar_icon.svg
new file mode 100644
index 0000000..3c77019
--- /dev/null
+++ b/assets/images/svg/blood_sugar_icon.svg
@@ -0,0 +1,5 @@
+
+    
+    
+    
+
diff --git a/assets/images/svg/internet_pairing_icon.svg b/assets/images/svg/internet_pairing_icon.svg
new file mode 100644
index 0000000..3e1ac63
--- /dev/null
+++ b/assets/images/svg/internet_pairing_icon.svg
@@ -0,0 +1,7 @@
+
+    
+    
+    
+    
+    
+
diff --git a/assets/images/svg/weight_tracker_icon.svg b/assets/images/svg/weight_tracker_icon.svg
new file mode 100644
index 0000000..5110575
--- /dev/null
+++ b/assets/images/svg/weight_tracker_icon.svg
@@ -0,0 +1,4 @@
+
+    
+    
+
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index 1c17024..9b6f4b1 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -188,6 +188,10 @@ class AppAssets {
   static const String latest_news_icon = '$svgBasePath/latest_news_icon.svg';
   static const String hmg_contact_icon = '$svgBasePath/hmg_contact_icon.svg';
   static const String services_medical_file_icon = '$svgBasePath/services_medical_file_icon.svg';
+  static const String blood_sugar_icon = '$svgBasePath/blood_sugar_icon.svg';
+  static const String weight_tracker_icon = '$svgBasePath/weight_tracker_icon.svg';
+  static const String ask_doctor_medical_file_icon = '$svgBasePath/ask_doctor_medical_file_icon.svg';
+  static const String internet_pairing_icon = '$svgBasePath/internet_pairing_icon.svg';
 
 
   //bottom navigation//
diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart
index 5cfbcb9..d735bd9 100644
--- a/lib/presentation/medical_file/medical_file_page.dart
+++ b/lib/presentation/medical_file/medical_file_page.dart
@@ -299,9 +299,8 @@ class _MedicalFilePageState extends State {
                 title: "Tracker & Others".toText18(weight: FontWeight.w600),
                 expandedBackgroundColor: Colors.transparent,
                 children: [
-                  Text("Blood Report"),
-                  SizedBox(height: 8),
-                  Text("X-Ray Report"),
+                  SizedBox(height: 10.h),
+                  getSelectedTabData(3),
                 ],
               ),
             ],
@@ -443,7 +442,7 @@ class _MedicalFilePageState extends State {
                         ? Container(
                             padding: EdgeInsets.all(12.w),
                             width: MediaQuery.of(context).size.width,
-                            decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.r, hasShadow: true),
+                            decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.r, hasShadow: false),
                             child: Column(
                               children: [
                                 Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h),
@@ -811,7 +810,7 @@ class _MedicalFilePageState extends State {
             GridView(
               gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                 crossAxisCount: 3,
-                crossAxisSpacing: 16.h,
+                crossAxisSpacing: 10.h,
                 mainAxisSpacing: 16.w,
                 mainAxisExtent: 115.h,
               ),
@@ -928,7 +927,7 @@ class _MedicalFilePageState extends State {
             GridView(
               gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                 crossAxisCount: 3,
-                crossAxisSpacing: 16.h,
+                crossAxisSpacing: 10.h,
                 mainAxisSpacing: 16.w,
                 mainAxisExtent: 120.h,
               ),
@@ -1015,7 +1014,7 @@ class _MedicalFilePageState extends State {
             GridView(
               gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                 crossAxisCount: 3,
-                crossAxisSpacing: 16.h,
+                crossAxisSpacing: 10.h,
                 mainAxisSpacing: 16.w,
                 mainAxisExtent: 110.h,
               ),
@@ -1067,7 +1066,92 @@ class _MedicalFilePageState extends State {
           ],
         );
       case 3:
-        return Container();
+        // Trackers Tab Data
+        return Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            Row(
+              children: [
+                "Health Trackers".needTranslation.toText16(weight: FontWeight.w500, color: AppColors.textColor),
+              ],
+            ),
+            SizedBox(height: 16.h),
+            GridView(
+              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+                crossAxisCount: 3,
+                crossAxisSpacing: 10.h,
+                mainAxisSpacing: 16.w,
+                mainAxisExtent: 115.h,
+              ),
+              physics: NeverScrollableScrollPhysics(),
+              padding: EdgeInsets.zero,
+              shrinkWrap: true,
+              children: [
+                MedicalFileCard(
+                  label: "Blood Sugar".needTranslation,
+                  textColor: AppColors.blackColor,
+                  backgroundColor: AppColors.whiteColor,
+                  svgIcon: AppAssets.blood_sugar_icon,
+                  isLargeText: true,
+                  iconSize: 36.w,
+                ).onPress(() {}),
+                MedicalFileCard(
+                  label: "Blood Pressure".needTranslation,
+                  textColor: AppColors.blackColor,
+                  backgroundColor: AppColors.whiteColor,
+                  svgIcon: AppAssets.lab_result_icon,
+                  isLargeText: true,
+                  iconSize: 36.w,
+                ).onPress(() {}),
+                MedicalFileCard(
+                  label: "Weight Tracker".needTranslation,
+                  textColor: AppColors.blackColor,
+                  backgroundColor: AppColors.whiteColor,
+                  svgIcon: AppAssets.weight_tracker_icon,
+                  isLargeText: true,
+                  iconSize: 36.w,
+                ).onPress(() {}),
+              ],
+            ).paddingSymmetrical(0.w, 0.0),
+            SizedBox(height: 16.h),
+            Row(
+              children: [
+                "Others".needTranslation.toText16(weight: FontWeight.w500, color: AppColors.textColor),
+              ],
+            ),
+            SizedBox(height: 16.h),
+            GridView(
+              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+                crossAxisCount: 3,
+                crossAxisSpacing: 10.h,
+                mainAxisSpacing: 16.w,
+                mainAxisExtent: 115.h,
+              ),
+              physics: NeverScrollableScrollPhysics(),
+              padding: EdgeInsets.zero,
+              shrinkWrap: true,
+              children: [
+                MedicalFileCard(
+                  label: "Ask Your Doctor".needTranslation,
+                  textColor: AppColors.blackColor,
+                  backgroundColor: AppColors.whiteColor,
+                  svgIcon: AppAssets.ask_doctor_medical_file_icon,
+                  isLargeText: true,
+                  iconSize: 36.w,
+                ).onPress(() {}),
+                MedicalFileCard(
+                  label: "Internet Pairing".needTranslation,
+                  textColor: AppColors.blackColor,
+                  backgroundColor: AppColors.whiteColor,
+                  svgIcon: AppAssets.internet_pairing_icon,
+                  isLargeText: true,
+                  iconSize: 36.w,
+                ).onPress(() {}),
+              ],
+            ).paddingSymmetrical(0.w, 0.0),
+            SizedBox(height: 24.h),
+          ],
+        );
       default:
         return Container();
     }
diff --git a/lib/presentation/medical_file/widgets/medical_file_card.dart b/lib/presentation/medical_file/widgets/medical_file_card.dart
index 6343e2a..77968c5 100644
--- a/lib/presentation/medical_file/widgets/medical_file_card.dart
+++ b/lib/presentation/medical_file/widgets/medical_file_card.dart
@@ -28,7 +28,7 @@ class MedicalFileCard extends StatelessWidget {
     return Container(
       decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
         color: backgroundColor,
-        borderRadius: 12.r,
+        borderRadius: 20.r,
         hasShadow: false
       ),
       padding: EdgeInsets.all(12.w),

From c7c0a0ac093910f7a56db3dda9a7a268d7f6a566 Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Thu, 11 Dec 2025 00:00:52 +0300
Subject: [PATCH 10/55] Added user_info module IAP

---
 assets/images/png/female_icon.png             | Bin 0 -> 31413 bytes
 assets/images/png/male_icon.png               | Bin 0 -> 20457 bytes
 assets/images/svg/calendar-grey.svg           |   8 +
 assets/images/svg/gender.svg                  |   4 +
 assets/images/svg/ruler.svg                   |   3 +
 assets/images/svg/tick.svg                    |   3 +
 assets/images/svg/weight-scale.svg            |   3 +
 lib/core/app_assets.dart                      |  13 +-
 .../symptoms_checker_view_model.dart          | 103 +++++++
 lib/presentation/authentication/login.dart    |   1 -
 .../book_appointment_page.dart                | 284 ++++++++++--------
 .../emergency_services_page.dart              |   6 +-
 lib/presentation/home/landing_page.dart       |   6 +-
 lib/presentation/home/navigation_screen.dart  |  12 +-
 .../organ_selector_screen.dart                |   2 +-
 .../symptoms_checker/risk_factors_screen.dart |   2 +-
 .../symptoms_checker/suggestions_screen.dart  |   2 +-
 .../symptoms_selector_screen.dart             |   2 +-
 .../symptoms_checker/triage_screen.dart       |   2 +-
 .../symptoms_checker/user_info_selection.dart | 187 ++++++++++++
 .../pages/age_selection_page.dart             |  36 +++
 .../pages/gender_selection_page.dart          |  75 +++++
 .../pages/height_selection_page.dart          | 175 +++++++++++
 .../pages/weight_selection_page.dart          | 236 +++++++++++++++
 .../user_info_flow_manager.dart               | 209 +++++++++++++
 .../widgets/user_info_progress_bar.dart       |  36 +++
 .../widgets/user_info_selection_scaffold.dart |  67 +++++
 .../widgets/user_info_sticky_bottom_card.dart |  68 +++++
 lib/routes/app_routes.dart                    |  24 +-
 lib/widgets/appbar/collapsing_list_view.dart  |   8 +-
 lib/widgets/input_widget.dart                 |  14 +-
 31 files changed, 1427 insertions(+), 164 deletions(-)
 create mode 100644 assets/images/png/female_icon.png
 create mode 100644 assets/images/png/male_icon.png
 create mode 100644 assets/images/svg/calendar-grey.svg
 create mode 100644 assets/images/svg/gender.svg
 create mode 100644 assets/images/svg/ruler.svg
 create mode 100644 assets/images/svg/tick.svg
 create mode 100644 assets/images/svg/weight-scale.svg
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/pages/age_selection_page.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/pages/gender_selection_page.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/pages/height_selection_page.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/pages/weight_selection_page.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_selection_scaffold.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart

diff --git a/assets/images/png/female_icon.png b/assets/images/png/female_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..b41a542bbc7de9c09a3705557c0d47b33ac25301
GIT binary patch
literal 31413
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
F`X5SD6)*q*

literal 0
HcmV?d00001

diff --git a/assets/images/png/male_icon.png b/assets/images/png/male_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa518fbd972a7d12c240479e9320f62538533c72
GIT binary patch
literal 20457
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
kAq@;Xi
+
+
+
+
+
+
+
diff --git a/assets/images/svg/gender.svg b/assets/images/svg/gender.svg
new file mode 100644
index 0000000..6819ba6
--- /dev/null
+++ b/assets/images/svg/gender.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/images/svg/ruler.svg b/assets/images/svg/ruler.svg
new file mode 100644
index 0000000..a2e8c11
--- /dev/null
+++ b/assets/images/svg/ruler.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/images/svg/tick.svg b/assets/images/svg/tick.svg
new file mode 100644
index 0000000..b6210c0
--- /dev/null
+++ b/assets/images/svg/tick.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/images/svg/weight-scale.svg b/assets/images/svg/weight-scale.svg
new file mode 100644
index 0000000..c3329ff
--- /dev/null
+++ b/assets/images/svg/weight-scale.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index b369d62..2f806b6 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -195,8 +195,13 @@ class AppAssets {
   static const String heart = '$svgBasePath/heart.svg';
   static const String alertSquare = '$svgBasePath/alert-square.svg';
   static const String arrowRight = '$svgBasePath/arrow-right.svg';
+  static const String tickIcon = '$svgBasePath/tick.svg';
 
   // Symptoms Checker
+  static const String calendarGrey = '$svgBasePath/calendar-grey.svg';
+  static const String weightScale = '$svgBasePath/weight-scale.svg';
+  static const String rulerIcon = '$svgBasePath/ruler.svg';
+  static const String genderIcon = '$svgBasePath/gender.svg';
   static const String bodyIcon = '$svgBasePath/body_icon.svg';
   static const String rotateIcon = '$svgBasePath/rotate_icon.svg';
   static const String refreshIcon = '$svgBasePath/refresh.svg';
@@ -218,6 +223,8 @@ class AppAssets {
   static const String dummyUser = '$pngBasePath/dummy_user.png';
   static const String comprehensiveCheckupEn = '$pngBasePath/cc_en.png';
   static const String comprehensiveCheckupAr = '$pngBasePath/cc_er.png';
+  static const String maleIcon = '$pngBasePath/male_icon.png';
+  static const String femaleIcon = '$pngBasePath/female_icon.png';
 
   static const String fullBodyFront = '$pngBasePath/full_body_front.png';
   static const String fullBodyBack = '$pngBasePath/full_body_back.png';
@@ -236,9 +243,9 @@ class AppAnimations {
   static const String splashLaunching = '$lottieBasePath/splash_launching.json';
   static const String noData = '$lottieBasePath/Nodata.json';
   static const String ripple = '$lottieBasePath/Ripple.json';
-  static const String pending_loading_animation = '$lottieBasePath/pending_loading_animation.json';
+  static const String pendingLoadingAnimation = '$lottieBasePath/pending_loading_animation.json';
 
   static const String ambulance = '$lottieBasePath/ambulance.json';
-  static const String ambulance_alert = '$lottieBasePath/ambulance_alert.json';
-  static const String rrt_ambulance = '$lottieBasePath/rrt_ambulance.json';
+  static const String ambulanceAlert = '$lottieBasePath/ambulance_alert.json';
+  static const String rrtAmbulance = '$lottieBasePath/rrt_ambulance.json';
 }
diff --git a/lib/features/symptoms_checker/symptoms_checker_view_model.dart b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
index a467d01..34a1754 100644
--- a/lib/features/symptoms_checker/symptoms_checker_view_model.dart
+++ b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
@@ -36,10 +36,28 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   // Selected symptoms tracking (organId -> Set of symptom IDs)
   final Map> _selectedSymptomsByOrgan = {};
 
+  // User Info Flow State
+  int _userInfoCurrentPage = 0;
+  String? _selectedGender;
+  int? _selectedAge;
+  double? _selectedHeight;
+  bool _isHeightCm = true;
+  double? _selectedWeight;
+  bool _isWeightKg = true;
+
   // Getters
 
   bool isPossibleConditionsLoading = false;
 
+  // User Info Getters
+  int get userInfoCurrentPage => _userInfoCurrentPage;
+  String? get selectedGender => _selectedGender;
+  int? get selectedAge => _selectedAge;
+  double? get selectedHeight => _selectedHeight;
+  bool get isHeightCm => _isHeightCm;
+  double? get selectedWeight => _selectedWeight;
+  bool get isWeightKg => _isWeightKg;
+
   BodyView get currentView => _currentView;
 
   Set get selectedOrganIds => _selectedOrganIds;
@@ -247,6 +265,91 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     _isBottomSheetExpanded = false;
     _tooltipTimer?.cancel();
     _tooltipOrganId = null;
+    // Reset user info flow
+    _userInfoCurrentPage = 0;
+    _selectedGender = null;
+    _selectedAge = null;
+    _selectedHeight = null;
+    _isHeightCm = true;
+    _selectedWeight = null;
+    _isWeightKg = true;
+    notifyListeners();
+  }
+
+  // User Info Flow Methods
+
+  /// Set current page in user info flow
+  void setUserInfoPage(int page) {
+    _userInfoCurrentPage = page;
+    notifyListeners();
+  }
+
+  /// Navigate to next page in user info flow
+  void nextUserInfoPage() {
+    if (_userInfoCurrentPage < 3) {
+      _userInfoCurrentPage++;
+      notifyListeners();
+    }
+  }
+
+  /// Navigate to previous page in user info flow
+  void previousUserInfoPage() {
+    if (_userInfoCurrentPage > 0) {
+      _userInfoCurrentPage--;
+      notifyListeners();
+    }
+  }
+
+  /// Set selected gender
+  void setGender(String gender) {
+    _selectedGender = gender;
+    notifyListeners();
+  }
+
+  /// Set selected age
+  void setAge(int age) {
+    _selectedAge = age;
+    notifyListeners();
+  }
+
+  /// Set selected height
+  void setHeight(double height, bool isCm) {
+    _selectedHeight = height;
+    _isHeightCm = isCm;
+    notifyListeners();
+  }
+
+  /// Set selected weight
+  void setWeight(double weight, bool isKg) {
+    _selectedWeight = weight;
+    _isWeightKg = isKg;
+    notifyListeners();
+  }
+
+  /// Check if user info page is last
+  bool get isUserInfoLastPage => _userInfoCurrentPage == 3;
+
+  /// Validate and submit user info
+  Map getUserInfoData() {
+    return {
+      'gender': _selectedGender,
+      'age': _selectedAge,
+      'height': _selectedHeight,
+      'heightUnit': _isHeightCm ? 'cm' : 'ft',
+      'weight': _selectedWeight,
+      'weightUnit': _isWeightKg ? 'kg' : 'lbs',
+    };
+  }
+
+  /// Reset user info flow
+  void resetUserInfo() {
+    _userInfoCurrentPage = 0;
+    _selectedGender = null;
+    _selectedAge = null;
+    _selectedHeight = null;
+    _isHeightCm = true;
+    _selectedWeight = null;
+    _isWeightKg = true;
     notifyListeners();
   }
 
diff --git a/lib/presentation/authentication/login.dart b/lib/presentation/authentication/login.dart
index 28430a8..c14e957 100644
--- a/lib/presentation/authentication/login.dart
+++ b/lib/presentation/authentication/login.dart
@@ -1,7 +1,6 @@
 import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/gestures.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
 import 'package:hmg_patient_app_new/core/app_assets.dart';
 import 'package:hmg_patient_app_new/core/app_state.dart';
 import 'package:hmg_patient_app_new/core/dependencies.dart';
diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart
index 0ad58cc..0e60a28 100644
--- a/lib/presentation/book_appointment/book_appointment_page.dart
+++ b/lib/presentation/book_appointment/book_appointment_page.dart
@@ -4,11 +4,11 @@ import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_staggered_animations/flutter_staggered_animations.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/app_state.dart';
 import 'package:hmg_patient_app_new/core/dependencies.dart';
-import 'package:hmg_patient_app_new/core/utils/size_config.dart';
-import 'package:hmg_patient_app_new/core/utils/size_utils.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/authentication/authentication_view_model.dart';
@@ -25,7 +25,6 @@ import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/immed
 import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart';
 import 'package:hmg_patient_app_new/presentation/book_appointment/search_doctor_by_name.dart';
 import 'package:hmg_patient_app_new/presentation/book_appointment/select_clinic_page.dart';
-import 'package:hmg_patient_app_new/presentation/home/navigation_screen.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';
@@ -71,145 +70,137 @@ class _BookAppointmentPageState extends State {
     regionalViewModel = Provider.of(context, listen: true);
     return Scaffold(
       backgroundColor: AppColors.bgScaffoldColor,
-      body: CollapsingListView(
-        title: LocaleKeys.bookAppo.tr(context: context),
-        isLeading: true,
-        leadingCallback: () {
-          Navigator.pushAndRemoveUntil(
-              context,
-              CustomPageRoute(
-                page: LandingNavigation(),
-              ),
-              (r) => false);
-        },
-        child: SingleChildScrollView(
-          child: Consumer(builder: (context, bookAppointmentsVM, child) {
-            return Column(
-              crossAxisAlignment: CrossAxisAlignment.start,
-              children: [
-                SizedBox(height: 16.h),
-                CustomTabBar(
-                  activeTextColor: Color(0xffED1C2B),
-                  activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1),
-                  tabs: [
-                    CustomTabBarModel(null, "General".needTranslation),
-                    CustomTabBarModel(null, "LiveCare".needTranslation),
-                  ],
-                  onTabChange: (index) {
-                    bookAppointmentsVM.onTabChanged(index);
-                  },
-                ).paddingSymmetrical(24.h, 0.h),
-                SizedBox(height: 24.h),
-                getSelectedTabData(bookAppointmentsVM.selectedTabIndex),
-                SizedBox(height: 24.h),
-                "Recent Visits".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0.h),
-                SizedBox(height: 16.h),
-                Consumer(builder: (context, myAppointmentsVM, child) {
-                  return myAppointmentsVM.isPatientMyDoctorsLoading
-                      ? Column(
-                    crossAxisAlignment: CrossAxisAlignment.center,
+      body: Column(
+        children: [
+          Expanded(
+            child: CollapsingListView(
+              title: LocaleKeys.bookAppo.tr(context: context),
+              isLeading: true,
+              child: SingleChildScrollView(
+                child: Consumer(builder: (context, bookAppointmentsVM, child) {
+                  return Column(
+                    crossAxisAlignment: CrossAxisAlignment.start,
                     children: [
-                      Image.network(
-                        "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png",
-                        width: 64.w,
-                        height: 64.h,
-                        fit: BoxFit.cover,
-                      ).circle(100).toShimmer2(isShow: true, radius: 50.r),
-                      SizedBox(height: 8.h),
-                      ("Dr. John Smith Smith Smith")
-                          .toString()
-                          .toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2)
-                          .toShimmer2(isShow: true),
-                    ],
-                  )
-                      : myAppointmentsVM.patientMyDoctorsList.isEmpty
-                      ? Container(
-                    width: SizeConfig.screenWidth,
-                    decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                      color: AppColors.whiteColor,
-                      borderRadius: 12.r,
-                      hasShadow: false,
-                    ),
-                    child: Utils.getNoDataWidget(
-                      context,
-                      noDataText: "You don't have any completed visits yet".needTranslation,
-                      isSmallWidget: true,
-                      width: 62.w,
-                      height: 62.h,
-                    ),
-                  ).paddingSymmetrical(24.w, 0.h)
-                      : SizedBox(
-                    height: 110.h,
-                    child: ListView.separated(
-                      scrollDirection: Axis.horizontal,
-                      itemCount: myAppointmentsVM.patientMyDoctorsList.length,
-                      shrinkWrap: true,
-                      padding: EdgeInsets.only(left: 24.w, right: 24.w),
-                      itemBuilder: (context, index) {
-                        return AnimationConfiguration.staggeredList(
-                          position: index,
-                          duration: const Duration(milliseconds: 1000),
-                          child: SlideAnimation(
-                            horizontalOffset: 100.0,
-                            child: FadeInAnimation(
-                              child: SizedBox(
-                                // width: 80.w,
-                                child: Column(
+                      SizedBox(height: 16.h),
+                      CustomTabBar(
+                        activeTextColor: Color(0xffED1C2B),
+                        activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1),
+                        tabs: [
+                          CustomTabBarModel(null, "General".needTranslation),
+                          CustomTabBarModel(null, "LiveCare".needTranslation),
+                        ],
+                        onTabChange: (index) {
+                          bookAppointmentsVM.onTabChanged(index);
+                        },
+                      ).paddingSymmetrical(24.h, 0.h),
+                      SizedBox(height: 24.h),
+                      getSelectedTabData(bookAppointmentsVM.selectedTabIndex),
+                      SizedBox(height: 24.h),
+                      if (appState.isAuthenticated) ...[
+                        Consumer(builder: (context, myAppointmentsVM, child) {
+                          return myAppointmentsVM.isPatientMyDoctorsLoading
+                              ? Column(
                                   crossAxisAlignment: CrossAxisAlignment.center,
                                   children: [
                                     Image.network(
-                                      myAppointmentsVM.patientMyDoctorsList[index].doctorImageURL!,
+                                      "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png",
                                       width: 64.w,
                                       height: 64.h,
                                       fit: BoxFit.cover,
-                                    ).circle(100).toShimmer2(isShow: false, radius: 50.r),
+                                    ).circle(100).toShimmer2(isShow: true, radius: 50.r),
                                     SizedBox(height: 8.h),
-                                    SizedBox(
-                                      width: 80.w,
-                                      child: (myAppointmentsVM.patientMyDoctorsList[index].doctorName)
-                                          .toString()
-                                          .toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2)
-                                          .toShimmer2(isShow: false),
-                                    ),
+                                    ("Dr. John Smith Smith Smith")
+                                        .toString()
+                                        .toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2)
+                                        .toShimmer2(isShow: true),
                                   ],
-                                ),
-                              ).onPress(() async {
-                                bookAppointmentsViewModel.setSelectedDoctor(DoctorsListResponseModel(
-                                  clinicID: myAppointmentsVM.patientMyDoctorsList[index].clinicID,
-                                  projectID: myAppointmentsVM.patientMyDoctorsList[index].projectID,
-                                  doctorID: myAppointmentsVM.patientMyDoctorsList[index].doctorID,
-                                ));
-                                LoaderBottomSheet.showLoader();
-                                await bookAppointmentsViewModel.getDoctorProfile(onSuccess: (dynamic respData) {
-                                  LoaderBottomSheet.hideLoader();
-                                  Navigator.of(context).push(
-                                    CustomPageRoute(
-                                      page: DoctorProfilePage(),
-                                    ),
-                                  );
-                                }, onError: (err) {
-                                  LoaderBottomSheet.hideLoader();
-                                  showCommonBottomSheetWithoutHeight(
-                                    context,
-                                    child: Utils.getErrorWidget(loadingText: err),
-                                    callBackFunc: () {},
-                                    isFullScreen: false,
-                                    isCloseButtonVisible: true,
-                                  );
-                                });
-                              }),
-                            ),
-                          ),
-                        );
-                      },
-                      separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 8.h),
-                    ),
+                                )
+                              : myAppointmentsVM.patientMyDoctorsList.isEmpty
+                                  ? SizedBox()
+                                  : Column(
+                                      children: [
+                                        if (appState.isAuthenticated) ...[],
+                                        "Recent Visits".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0.h),
+                                        SizedBox(height: 16.h),
+                                        SizedBox(
+                                          height: 110.h,
+                                          child: ListView.separated(
+                                            scrollDirection: Axis.horizontal,
+                                            itemCount: myAppointmentsVM.patientMyDoctorsList.length,
+                                            shrinkWrap: true,
+                                            padding: EdgeInsets.only(left: 24.w, right: 24.w),
+                                            itemBuilder: (context, index) {
+                                              return AnimationConfiguration.staggeredList(
+                                                position: index,
+                                                duration: const Duration(milliseconds: 1000),
+                                                child: SlideAnimation(
+                                                  horizontalOffset: 100.0,
+                                                  child: FadeInAnimation(
+                                                    child: SizedBox(
+                                                      // width: 80.w,
+                                                      child: Column(
+                                                        crossAxisAlignment: CrossAxisAlignment.center,
+                                                        children: [
+                                                          Image.network(
+                                                            myAppointmentsVM.patientMyDoctorsList[index].doctorImageURL!,
+                                                            width: 64.w,
+                                                            height: 64.h,
+                                                            fit: BoxFit.cover,
+                                                          ).circle(100).toShimmer2(isShow: false, radius: 50.r),
+                                                          SizedBox(height: 8.h),
+                                                          SizedBox(
+                                                            width: 80.w,
+                                                            child: (myAppointmentsVM.patientMyDoctorsList[index].doctorName)
+                                                                .toString()
+                                                                .toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2)
+                                                                .toShimmer2(isShow: false),
+                                                          ),
+                                                        ],
+                                                      ),
+                                                    ).onPress(() async {
+                                                      bookAppointmentsViewModel.setSelectedDoctor(DoctorsListResponseModel(
+                                                        clinicID: myAppointmentsVM.patientMyDoctorsList[index].clinicID,
+                                                        projectID: myAppointmentsVM.patientMyDoctorsList[index].projectID,
+                                                        doctorID: myAppointmentsVM.patientMyDoctorsList[index].doctorID,
+                                                      ));
+                                                      LoaderBottomSheet.showLoader();
+                                                      await bookAppointmentsViewModel.getDoctorProfile(onSuccess: (dynamic respData) {
+                                                        LoaderBottomSheet.hideLoader();
+                                                        Navigator.of(context).push(
+                                                          CustomPageRoute(
+                                                            page: DoctorProfilePage(),
+                                                          ),
+                                                        );
+                                                      }, onError: (err) {
+                                                        LoaderBottomSheet.hideLoader();
+                                                        showCommonBottomSheetWithoutHeight(
+                                                          context,
+                                                          child: Utils.getErrorWidget(loadingText: err),
+                                                          callBackFunc: () {},
+                                                          isFullScreen: false,
+                                                          isCloseButtonVisible: true,
+                                                        );
+                                                      });
+                                                    }),
+                                                  ),
+                                                ),
+                                              );
+                                            },
+                                            separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 8.h),
+                                          ),
+                                        ),
+                                      ],
+                                    );
+                        }),
+                      ],
+                    ],
                   );
                 }),
-              ],
-            );
-          }),
-        ),
+              ),
+            ),
+          ),
+          _buildSymptomsBottomCard(),
+        ],
       ),
     );
   }
@@ -460,6 +451,37 @@ class _BookAppointmentPageState extends State {
     return Container();
   }
 
+  Widget _buildSymptomsBottomCard() {
+    return Container(
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+      child: Row(
+        children: [
+          Expanded(
+            child: Column(
+              mainAxisSize: MainAxisSize.min,
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                "Not sure? help me choose a clinic!".needTranslation.toText16(weight: FontWeight.w600, color: AppColors.textColor),
+                SizedBox(height: 4.h),
+                "Mention your symptoms and find the list of doctors accordingly".needTranslation.toText12(
+                      fontWeight: FontWeight.w500,
+                      color: AppColors.greyTextColor,
+                    ),
+              ],
+            ),
+          ),
+          SizedBox(width: 16.w),
+          CustomButton(
+            height: 40.h,
+            text: "",
+            onPressed: () => context.navigateWithName(AppRoutes.userInfoSelection),
+            icon: AppAssets.arrow_forward,
+          )
+        ],
+      ).paddingAll(24.w),
+    );
+  }
+
   void openRegionListBottomSheet(BuildContext context, RegionBottomSheetType type) {
     regionalViewModel.flush();
     regionalViewModel.setBottomSheetType(type);
diff --git a/lib/presentation/emergency_services/emergency_services_page.dart b/lib/presentation/emergency_services/emergency_services_page.dart
index bce7daf..3833d32 100644
--- a/lib/presentation/emergency_services/emergency_services_page.dart
+++ b/lib/presentation/emergency_services/emergency_services_page.dart
@@ -97,7 +97,7 @@ class EmergencyServicesPage extends StatelessWidget {
                               }),
                             ],
                           ),
-                          Lottie.asset(AppAnimations.ambulance_alert,
+                          Lottie.asset(AppAnimations.ambulanceAlert,
                               repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain),
                           SizedBox(height: 8.h),
                           "Confirmation".needTranslation.toText28(color: AppColors.whiteColor, isBold: true),
@@ -200,7 +200,7 @@ class EmergencyServicesPage extends StatelessWidget {
                       child: Column(
                         crossAxisAlignment: CrossAxisAlignment.start,
                         children: [
-                          Lottie.asset(AppAnimations.ambulance_alert, repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain),
+                          Lottie.asset(AppAnimations.ambulanceAlert, repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain),
                           SizedBox(height: 8.h),
                           LocaleKeys.confirm.tr().toText28(color: AppColors.whiteColor, isBold: true),
                           SizedBox(height: 8.h),
@@ -313,7 +313,7 @@ class EmergencyServicesPage extends StatelessWidget {
                               }),
                             ],
                           ),
-                          Lottie.asset(AppAnimations.ambulance_alert,
+                          Lottie.asset(AppAnimations.ambulanceAlert,
                               repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain),
                           SizedBox(height: 8.h),
                           LocaleKeys.confirm.tr().toText28(color: AppColors.whiteColor, isBold: true),
diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart
index 454f1e7..96ec558 100644
--- a/lib/presentation/home/landing_page.dart
+++ b/lib/presentation/home/landing_page.dart
@@ -12,7 +12,6 @@ import 'package:hmg_patient_app_new/core/dependencies.dart';
 import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
 import 'package:hmg_patient_app_new/core/utils/utils.dart';
 import 'package:hmg_patient_app_new/extensions/int_extensions.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/authentication/authentication_view_model.dart';
@@ -40,7 +39,6 @@ import 'package:hmg_patient_app_new/presentation/home/widgets/small_service_card
 import 'package:hmg_patient_app_new/presentation/home/widgets/welcome_widget.dart';
 import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
 import 'package:hmg_patient_app_new/presentation/profile_settings/profile_settings.dart';
-import 'package:hmg_patient_app_new/routes/app_routes.dart';
 import 'package:hmg_patient_app_new/services/cache_service.dart';
 import 'package:hmg_patient_app_new/theme/colors.dart';
 import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
@@ -494,8 +492,7 @@ class _LandingPageState extends State {
                     mainAxisSize: MainAxisSize.min,
                     spacing: 12.h,
                     children: [
-                      Utils.buildSvgWithAssets(icon: AppAssets.bell, height: 18.h, width: 18.h)
-                          .onPress(() => context.navigateWithName(AppRoutes.organSelectorPage)),
+                      Utils.buildSvgWithAssets(icon: AppAssets.bell, height: 18.h, width: 18.h),
                       Utils.buildSvgWithAssets(icon: AppAssets.search_icon, height: 18.h, width: 18.h).onPress(() {}),
                       Utils.buildSvgWithAssets(icon: AppAssets.contact_icon, height: 18.h, width: 18.h).onPress(() {
                         showCommonBottomSheetWithoutHeight(
@@ -581,7 +578,6 @@ class _LandingPageState extends State {
           );
         },
       ),
-      // height: isDone == false ? ResponsiveExtension.screenHeight * 0.5 : ResponsiveExtension.screenHeight * 0.3,
       isFullScreen: false,
       callBackFunc: () {
         isDone = true;
diff --git a/lib/presentation/home/navigation_screen.dart b/lib/presentation/home/navigation_screen.dart
index f8447d2..7fbcdb3 100644
--- a/lib/presentation/home/navigation_screen.dart
+++ b/lib/presentation/home/navigation_screen.dart
@@ -1,12 +1,13 @@
 import 'package:flutter/material.dart';
 import 'package:hmg_patient_app_new/core/app_state.dart';
 import 'package:hmg_patient_app_new/core/dependencies.dart';
-import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart';
+import 'package:hmg_patient_app_new/extensions/route_extensions.dart';
 import 'package:hmg_patient_app_new/presentation/contact_us/feedback_page.dart';
 import 'package:hmg_patient_app_new/presentation/hmg_services/services_page.dart';
 import 'package:hmg_patient_app_new/presentation/home/landing_page.dart';
 import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
 import 'package:hmg_patient_app_new/presentation/todo_section/todo_page.dart';
+import 'package:hmg_patient_app_new/routes/app_routes.dart';
 import 'package:hmg_patient_app_new/widgets/bottom_navigation/bottom_navigation.dart';
 
 class LandingNavigation extends StatefulWidget {
@@ -18,12 +19,11 @@ class LandingNavigation extends StatefulWidget {
 
 class _LandingNavigationState extends State {
   int _currentIndex = 0;
-  late AppState appState;
   final PageController _pageController = PageController();
 
   @override
   Widget build(BuildContext context) {
-    appState = getIt.get();
+    AppState appState = getIt.get();
     return Scaffold(
       body: PageView(
         controller: _pageController,
@@ -31,7 +31,7 @@ class _LandingNavigationState extends State {
         children: [
           const LandingPage(),
           appState.isAuthenticated ? MedicalFilePage() : /* need add feedback page */ FeedbackPage(),
-          BookAppointmentPage(),
+          SizedBox(),
           const ToDoPage(),
           ServicesPage(),
         ],
@@ -40,6 +40,10 @@ class _LandingNavigationState extends State {
         currentIndex: _currentIndex,
         onTap: (index) {
           setState(() => _currentIndex = index);
+          if (_currentIndex == 2) {
+            context.navigateWithName(AppRoutes.bookAppointmentPage);
+            return;
+          }
           _pageController.animateToPage(index, duration: const Duration(milliseconds: 300), curve: Curves.easeInOut);
         },
       ),
diff --git a/lib/presentation/symptoms_checker/organ_selector_screen.dart b/lib/presentation/symptoms_checker/organ_selector_screen.dart
index 65d9a00..d5dc32c 100644
--- a/lib/presentation/symptoms_checker/organ_selector_screen.dart
+++ b/lib/presentation/symptoms_checker/organ_selector_screen.dart
@@ -42,7 +42,7 @@ class _OrganSelectorPageState extends State {
       return;
     }
 
-    context.navigateWithName(AppRoutes.symptomsCheckerScreen);
+    context.navigateWithName(AppRoutes.symptomsSelectorScreen);
   }
 
   @override
diff --git a/lib/presentation/symptoms_checker/risk_factors_screen.dart b/lib/presentation/symptoms_checker/risk_factors_screen.dart
index 211aabc..2992593 100644
--- a/lib/presentation/symptoms_checker/risk_factors_screen.dart
+++ b/lib/presentation/symptoms_checker/risk_factors_screen.dart
@@ -148,7 +148,7 @@ class _RiskFactorsScreenState extends State {
               Expanded(
                 child: CollapsingListView(
                   title: "Risks".needTranslation,
-                  onLeadingTapped: () => _buildConfirmationBottomSheet(
+                  leadingCallback: () => _buildConfirmationBottomSheet(
                       context: context,
                       onConfirm: () => {
                             context.pop(),
diff --git a/lib/presentation/symptoms_checker/suggestions_screen.dart b/lib/presentation/symptoms_checker/suggestions_screen.dart
index f9d922a..2832515 100644
--- a/lib/presentation/symptoms_checker/suggestions_screen.dart
+++ b/lib/presentation/symptoms_checker/suggestions_screen.dart
@@ -148,7 +148,7 @@ class _SuggestionsScreenState extends State {
               Expanded(
                 child: CollapsingListView(
                   title: "Suggestions".needTranslation,
-                  onLeadingTapped: () => _buildConfirmationBottomSheet(
+                  leadingCallback: () => _buildConfirmationBottomSheet(
                       context: context,
                       onConfirm: () => {
                             context.pop(),
diff --git a/lib/presentation/symptoms_checker/symptoms_selector_screen.dart b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
index bed232b..522c5f8 100644
--- a/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
+++ b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart
@@ -78,7 +78,7 @@ class _SymptomsSelectorScreenState extends State {
               Expanded(
                 child: CollapsingListView(
                   title: "Symptoms Selector".needTranslation,
-                  onLeadingTapped: () => _buildConfirmationBottomSheet(
+                  leadingCallback: () => _buildConfirmationBottomSheet(
                       context: context,
                       onConfirm: () => {
                             context.pop(),
diff --git a/lib/presentation/symptoms_checker/triage_screen.dart b/lib/presentation/symptoms_checker/triage_screen.dart
index 4dbe0ca..aa0cd72 100644
--- a/lib/presentation/symptoms_checker/triage_screen.dart
+++ b/lib/presentation/symptoms_checker/triage_screen.dart
@@ -103,7 +103,7 @@ class _TriageScreenState extends State {
               //           context.pop(),
               //         }),
 
-              onLeadingTapped: () => context.pop(),
+              leadingCallback: () => context.pop(),
               child: Column(
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
diff --git a/lib/presentation/symptoms_checker/user_info_selection.dart b/lib/presentation/symptoms_checker/user_info_selection.dart
new file mode 100644
index 0000000..2fb6cc9
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection.dart
@@ -0,0 +1,187 @@
+import 'package:flutter/material.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/app_state.dart';
+import 'package:hmg_patient_app_new/core/dependencies.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/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';
+
+class UserInfoSelectionScreen extends StatelessWidget {
+  const UserInfoSelectionScreen({super.key});
+
+  _buildEditInfoTile({
+    required String leadingIcon,
+    required String title,
+    required String subTitle,
+    required VoidCallback onTap,
+    required String trailingIcon,
+    required BuildContext context,
+    Color? iconColor,
+  }) {
+    return InkWell(
+      onTap: onTap,
+      child: Row(
+        children: [
+          Expanded(
+            child: Row(
+              children: [
+                Container(
+                    height: 40.h,
+                    width: 40.h,
+                    margin: EdgeInsets.only(right: 10.h),
+                    padding: EdgeInsets.all(8.h),
+                    decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 12.r, color: AppColors.greyColor),
+                    child: Utils.buildSvgWithAssets(icon: leadingIcon, iconColor: iconColor)),
+                Column(
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    title.toText16(weight: FontWeight.w500),
+                    subTitle.toText14(color: AppColors.primaryRedColor, weight: FontWeight.w500),
+                  ],
+                ),
+              ],
+            ),
+          ),
+          Utils.buildSvgWithAssets(icon: trailingIcon, height: 24.h, width: 24.h),
+        ],
+      ),
+    );
+  }
+
+  Widget _getDivider() {
+    return Divider(
+      color: AppColors.dividerColor,
+    ).paddingSymmetrical(0, 16.h);
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    AppState appState = getIt.get();
+
+    String name = "";
+    if (appState.isAuthenticated) {
+      name = "${appState.getAuthenticatedUser()!.firstName!} ${appState.getAuthenticatedUser()!.lastName!} ";
+    } else {
+      name = "Guest";
+    }
+    return Scaffold(
+      backgroundColor: AppColors.bgScaffoldColor,
+      body: Column(
+        children: [
+          Expanded(
+            child: CollapsingListView(
+              title: "Symptoms Checker".needTranslation,
+              isLeading: true,
+              child: SingleChildScrollView(
+                child: Column(
+                  children: [
+                    Container(
+                      width: double.infinity,
+                      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+                      padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
+                      child: Column(
+                        children: [
+                          "Hi $name, Is your information up to date?".needTranslation.toText18(
+                                weight: FontWeight.w600,
+                                color: AppColors.textColor,
+                              ),
+                          SizedBox(height: 24.h),
+                          _buildEditInfoTile(
+                            context: context,
+                            leadingIcon: AppAssets.genderIcon,
+                            title: "Gender".needTranslation,
+                            subTitle: "Male".needTranslation,
+                            onTap: () {},
+                            trailingIcon: AppAssets.edit_icon,
+                          ),
+                          _getDivider(),
+                          _buildEditInfoTile(
+                            context: context,
+                            leadingIcon: AppAssets.calendar,
+                            title: "Age".needTranslation,
+                            subTitle: "32 Years",
+                            iconColor: AppColors.greyTextColor,
+                            onTap: () {},
+                            trailingIcon: AppAssets.edit_icon,
+                          ),
+                          _getDivider(),
+                          _buildEditInfoTile(
+                            context: context,
+                            leadingIcon: AppAssets.rulerIcon,
+                            title: "Height".needTranslation,
+                            subTitle: "17 8cm",
+                            onTap: () {},
+                            trailingIcon: AppAssets.edit_icon,
+                          ),
+                          _getDivider(),
+                          _buildEditInfoTile(
+                            context: context,
+                            leadingIcon: AppAssets.weightScale,
+                            title: "Weight".needTranslation,
+                            subTitle: "88 kg",
+                            onTap: () {},
+                            trailingIcon: AppAssets.edit_icon,
+                          ),
+                        ],
+                      ),
+                    ),
+                  ],
+                ).paddingAll(24.w),
+              ),
+            ),
+          ),
+          _buildBottomCard(context),
+        ],
+      ),
+    );
+  }
+
+  Widget _buildBottomCard(BuildContext context) {
+    return Container(
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+      child: SafeArea(
+        top: false,
+        child: Column(
+          mainAxisSize: MainAxisSize.min,
+          children: [
+            SizedBox(height: 24.h),
+            Row(
+              children: [
+                Expanded(
+                  child: CustomButton(
+                    text: "No, Edit all".needTranslation,
+                    icon: AppAssets.edit_icon,
+                    iconColor: AppColors.primaryRedColor,
+                    onPressed: () => context.navigateWithName(AppRoutes.userInfoFlowManager),
+                    backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
+                    borderColor: Colors.transparent,
+                    textColor: AppColors.primaryRedColor,
+                    fontSize: 16.f,
+                  ),
+                ),
+                SizedBox(width: 12.w),
+                Expanded(
+                  child: CustomButton(
+                    text: "Yes, It is".needTranslation,
+                    icon: AppAssets.tickIcon,
+                    iconColor: AppColors.whiteColor,
+                    onPressed: () => () {},
+                    backgroundColor: AppColors.primaryRedColor,
+                    borderColor: AppColors.primaryRedColor,
+                    textColor: AppColors.whiteColor,
+                    fontSize: 16.f,
+                  ),
+                ),
+              ],
+            ),
+          ],
+        ).paddingSymmetrical(24.w, 0),
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/pages/age_selection_page.dart b/lib/presentation/symptoms_checker/user_info_selection/pages/age_selection_page.dart
new file mode 100644
index 0000000..6433b93
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/pages/age_selection_page.dart
@@ -0,0 +1,36 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
+import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:provider/provider.dart';
+
+/// Age selection page content
+class AgeSelectionPage extends StatelessWidget {
+  final int? selectedAge;
+  final Function(int) onAgeSelected;
+
+  const AgeSelectionPage({
+    super.key,
+    required this.selectedAge,
+    required this.onAgeSelected,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return SingleChildScrollView(
+      padding: EdgeInsets.all(24.w),
+      child: Consumer(
+        builder: (BuildContext context, symptomsViewModel, Widget? child) {
+          return Column(
+            children: [
+              "What is your gender?".needTranslation.toText18(weight: FontWeight.w600, color: AppColors.textColor),
+              SizedBox(height: 70.h),
+              "< Age Widget Here >".needTranslation.toText18(weight: FontWeight.w600, color: AppColors.greyTextColor),
+            ],
+          );
+        },
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/pages/gender_selection_page.dart b/lib/presentation/symptoms_checker/user_info_selection/pages/gender_selection_page.dart
new file mode 100644
index 0000000..85cb6e2
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/pages/gender_selection_page.dart
@@ -0,0 +1,75 @@
+import 'package:flutter/material.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/utils/utils.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/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:provider/provider.dart';
+
+/// Gender selection page content
+class GenderSelectionPage extends StatelessWidget {
+  final String? selectedGender;
+  final Function(String) onGenderSelected;
+
+  GenderSelectionPage({
+    super.key,
+    required this.selectedGender,
+    required this.onGenderSelected,
+  });
+
+  _buildGenderOption(String iconPng, String label, bool isSelected) {
+    return Container(
+      height: 160.h,
+      width: 160.w,
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+          color: AppColors.whiteColor, borderRadius: 24.r, side: isSelected ? BorderSide(color: AppColors.primaryRedColor, width: 2.5) : null),
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.center,
+        children: [
+          Utils.buildImgWithAssets(icon: iconPng, height: 80.h, width: 80.h, fit: BoxFit.contain),
+          SizedBox(height: 8.h),
+          label.toText16(
+            weight: FontWeight.w500,
+          )
+        ],
+      ),
+    );
+  }
+
+  final genders = ["Male", "Female"];
+
+  @override
+  Widget build(BuildContext context) {
+    return SingleChildScrollView(
+      padding: EdgeInsets.all(24.w),
+      child: Consumer(
+        builder: (BuildContext context, symptomsViewModel, Widget? child) {
+          return Column(
+            children: [
+              "What is your gender?".needTranslation.toText18(weight: FontWeight.w600, color: AppColors.textColor),
+              SizedBox(height: 70.h),
+              Row(
+                children: [
+                  Expanded(
+                    child: InkWell(
+                      onTap: () => onGenderSelected(genders[0]),
+                      child: _buildGenderOption(AppAssets.maleIcon, "Male".needTranslation, symptomsViewModel.selectedGender == genders[0]),
+                    ),
+                  ),
+                  SizedBox(width: 16.w),
+                  Expanded(
+                      child: InkWell(
+                    onTap: () => onGenderSelected(genders[1]),
+                    child: _buildGenderOption(AppAssets.femaleIcon, "Female".needTranslation, symptomsViewModel.selectedGender == genders[1]),
+                  ))
+                ],
+              ),
+            ],
+          );
+        },
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/pages/height_selection_page.dart b/lib/presentation/symptoms_checker/user_info_selection/pages/height_selection_page.dart
new file mode 100644
index 0000000..e10aca3
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/pages/height_selection_page.dart
@@ -0,0 +1,175 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.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/theme/colors.dart';
+
+/// Height selection page content
+class HeightSelectionPage extends StatefulWidget {
+  final double height;
+  final bool isCm;
+  final Function(double, bool) onHeightChanged;
+
+  const HeightSelectionPage({
+    super.key,
+    required this.height,
+    required this.isCm,
+    required this.onHeightChanged,
+  });
+
+  @override
+  State createState() => _HeightSelectionPageState();
+}
+
+class _HeightSelectionPageState extends State {
+  late double heightValue;
+
+  @override
+  void initState() {
+    super.initState();
+    heightValue = widget.height;
+  }
+
+  Widget _unitSelector() {
+    return Container(
+      height: 54.h,
+      padding: EdgeInsets.all(4.h),
+      decoration: BoxDecoration(
+        color: AppColors.whiteColor,
+        borderRadius: BorderRadius.circular(10.r),
+      ),
+      child: LayoutBuilder(
+        builder: (context, constraints) {
+          final tabWidth = (constraints.maxWidth - 8.w) / 2;
+          return Stack(
+            children: [
+              // Animated sliding indicator
+              AnimatedContainer(
+                duration: const Duration(milliseconds: 250),
+                curve: Curves.easeInOut,
+                width: tabWidth,
+                height: constraints.maxHeight,
+                margin: EdgeInsets.only(left: widget.isCm ? 0 : tabWidth + 8.w),
+                decoration: BoxDecoration(
+                  color: AppColors.bottomNAVBorder,
+                  borderRadius: BorderRadius.circular(7.r),
+                ),
+              ),
+              // Tab buttons
+              Row(
+                children: [
+                  Expanded(
+                    child: GestureDetector(
+                      onTap: () {
+                        if (!widget.isCm) {
+                          // Convert from FT to CM (1 ft = 30.48 cm)
+                          final convertedHeight = heightValue * 30.48;
+                          widget.onHeightChanged(convertedHeight, true);
+                        }
+                      },
+                      child: Container(
+                        alignment: Alignment.center,
+                        color: Colors.transparent,
+                        child: Text(
+                          'CM',
+                          style: TextStyle(
+                            fontWeight: FontWeight.w700,
+                            fontSize: 14.f,
+                            color: widget.isCm ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
+                          ),
+                        ),
+                      ),
+                    ),
+                  ),
+                  Expanded(
+                    child: GestureDetector(
+                      onTap: () {
+                        if (widget.isCm) {
+                          // Convert from CM to FT (1 cm = 0.0328084 ft)
+                          final convertedHeight = heightValue / 30.48;
+                          widget.onHeightChanged(convertedHeight, false);
+                        }
+                      },
+                      child: Container(
+                        alignment: Alignment.center,
+                        color: Colors.transparent,
+                        child: Text(
+                          'FT',
+                          style: TextStyle(
+                            fontWeight: FontWeight.w700,
+                            fontSize: 14.f,
+                            color: !widget.isCm ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
+                          ),
+                        ),
+                      ),
+                    ),
+                  ),
+                ],
+              ),
+            ],
+          );
+        },
+      ),
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        SizedBox(height: 24.h),
+        Center(
+          child: Text(
+            'How tall are you?'.needTranslation,
+            style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
+          ),
+        ),
+        SizedBox(height: 24.h),
+        Padding(
+          padding: EdgeInsets.symmetric(horizontal: 24.w),
+          child: _unitSelector(),
+        ),
+        SizedBox(height: 90.h),
+        Row(
+          crossAxisAlignment: CrossAxisAlignment.end,
+          mainAxisAlignment: MainAxisAlignment.center,
+          children: [
+            Text(
+              heightValue.round().toString(),
+              style: TextStyle(fontSize: 100.f, color: AppColors.textColor, height: 1),
+            ),
+            SizedBox(width: 8.w),
+            Text(widget.isCm ? 'cm' : 'ft', style: TextStyle(fontWeight: FontWeight.w700, fontSize: 24.f)).paddingOnly(bottom: 10.h, left: 8.w),
+          ],
+        ),
+      ],
+    );
+  }
+}
+
+class _RulerPainter extends CustomPainter {
+  @override
+  void paint(Canvas canvas, Size size) {
+    final paintTick = Paint()..color = const Color(0xFF222222);
+    final paintSmall = Paint()..color = const Color(0xFF222222).withValues(alpha: 0.6);
+
+    final width = size.width;
+    final start = 120;
+    final end = 210;
+    final steps = end - start;
+    for (int i = 0; i <= steps; i++) {
+      final x = (i / steps) * width;
+      if (i % 10 == 0) {
+        canvas.drawLine(Offset(x, size.height * 0.1), Offset(x, size.height * 0.6), paintTick);
+      } else if (i % 5 == 0) {
+        canvas.drawLine(Offset(x, size.height * 0.2), Offset(x, size.height * 0.5), paintSmall);
+      } else {
+        canvas.drawLine(Offset(x, size.height * 0.35), Offset(x, size.height * 0.5), paintSmall);
+      }
+    }
+  }
+
+  @override
+  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/pages/weight_selection_page.dart b/lib/presentation/symptoms_checker/user_info_selection/pages/weight_selection_page.dart
new file mode 100644
index 0000000..0319f4b
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/pages/weight_selection_page.dart
@@ -0,0 +1,236 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.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/theme/colors.dart';
+
+/// Weight selection page content
+class WeightSelectionPage extends StatefulWidget {
+  final double weight;
+  final bool isKg;
+  final Function(double, bool) onWeightChanged;
+
+  const WeightSelectionPage({
+    super.key,
+    required this.weight,
+    required this.isKg,
+    required this.onWeightChanged,
+  });
+
+  @override
+  State createState() => _WeightSelectionPageState();
+}
+
+class _WeightSelectionPageState extends State {
+  late double weightValue;
+
+  @override
+  void initState() {
+    super.initState();
+    weightValue = widget.weight;
+  }
+
+  Widget _unitSelector() {
+    return Container(
+      height: 54.h,
+      padding: EdgeInsets.all(4.h),
+      decoration: BoxDecoration(
+        color: AppColors.whiteColor,
+        borderRadius: BorderRadius.circular(10.r),
+      ),
+      child: LayoutBuilder(
+        builder: (context, constraints) {
+          final tabWidth = (constraints.maxWidth - 8.w) / 2;
+          return Stack(
+            children: [
+              // Animated sliding indicator
+              AnimatedContainer(
+                duration: const Duration(milliseconds: 250),
+                curve: Curves.easeInOut,
+                width: tabWidth,
+                height: constraints.maxHeight,
+                margin: EdgeInsets.only(left: widget.isKg ? 0 : tabWidth + 8.w),
+                decoration: BoxDecoration(
+                  color: AppColors.bottomNAVBorder,
+                  borderRadius: BorderRadius.circular(7.r),
+                ),
+              ),
+              // Tab buttons
+              Row(
+                children: [
+                  Expanded(
+                    child: GestureDetector(
+                      onTap: () {
+                        if (!widget.isKg) {
+                          // Convert from LBS to KG (1 lb = 0.453592 kg)
+                          final convertedWeight = weightValue / 2.20462;
+                          widget.onWeightChanged(convertedWeight, true);
+                        }
+                      },
+                      child: Container(
+                        alignment: Alignment.center,
+                        color: Colors.transparent,
+                        child: Text(
+                          'KG',
+                          style: TextStyle(
+                            fontWeight: FontWeight.w700,
+                            fontSize: 14.f,
+                            color: widget.isKg ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
+                          ),
+                        ),
+                      ),
+                    ),
+                  ),
+                  Expanded(
+                    child: GestureDetector(
+                      onTap: () {
+                        if (widget.isKg) {
+                          // Convert from KG to LBS (1 kg = 2.20462 lbs)
+                          final convertedWeight = weightValue * 2.20462;
+                          widget.onWeightChanged(convertedWeight, false);
+                        }
+                      },
+                      child: Container(
+                        alignment: Alignment.center,
+                        color: Colors.transparent,
+                        child: Text(
+                          'LBS',
+                          style: TextStyle(
+                            fontWeight: FontWeight.w700,
+                            fontSize: 14.f,
+                            color: !widget.isKg ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
+                          ),
+                        ),
+                      ),
+                    ),
+                  ),
+                ],
+              ),
+            ],
+          );
+        },
+      ),
+    );
+  }
+
+  Widget _weightSlider() {
+    return Column(
+      children: [
+        SizedBox(height: 18.h),
+        SizedBox(height: 12.h),
+        SizedBox(
+          height: 80.h,
+          child: Row(
+            children: [
+              Expanded(child: Container()),
+              Expanded(
+                flex: 6,
+                child: Stack(
+                  alignment: Alignment.center,
+                  children: [
+                    Positioned.fill(
+                      child: CustomPaint(
+                        painter: _WeightRulerPainter(),
+                      ),
+                    ),
+                    SliderTheme(
+                      data: SliderTheme.of(context).copyWith(
+                        trackHeight: 6.h,
+                        thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 0),
+                        overlayShape: const RoundSliderOverlayShape(overlayRadius: 0),
+                        activeTrackColor: AppColors.primaryRedColor,
+                        inactiveTrackColor: AppColors.lightRedButtonColor,
+                      ),
+                      child: Slider(
+                        min: 30,
+                        max: 150,
+                        value: weightValue,
+                        onChanged: (v) {
+                          setState(() => weightValue = v);
+                          widget.onWeightChanged(v, widget.isKg);
+                        },
+                      ),
+                    ),
+                    Positioned(
+                      right: 0,
+                      child: Container(
+                        width: 18.w,
+                        height: 18.h,
+                        decoration: BoxDecoration(
+                          color: AppColors.primaryRedColor,
+                          shape: BoxShape.rectangle,
+                          borderRadius: BorderRadius.circular(4.r),
+                        ),
+                      ),
+                    ),
+                  ],
+                ),
+              ),
+              Expanded(child: Container()),
+            ],
+          ),
+        ),
+      ],
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+        SizedBox(height: 24.h),
+        Center(
+          child: Text(
+            'What is your weight?'.needTranslation,
+            style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
+          ),
+        ),
+        SizedBox(height: 20.h),
+        Padding(
+          padding: EdgeInsets.symmetric(horizontal: 24.w),
+          child: _unitSelector(),
+        ),
+        SizedBox(height: 90.h),
+        Row(
+          mainAxisAlignment: MainAxisAlignment.center,
+          crossAxisAlignment: CrossAxisAlignment.end,
+          children: [
+            Text(
+              weightValue.round().toString(),
+              style: TextStyle(fontSize: 100.f, color: AppColors.textColor, height: 1),
+            ),
+            SizedBox(width: 8.w),
+            Text(widget.isKg ? 'kg' : 'lbs', style: TextStyle(fontWeight: FontWeight.w700, fontSize: 24.f)).paddingOnly(bottom: 10.h, left: 8.w),
+          ],
+        ),
+      ],
+    );
+  }
+}
+
+class _WeightRulerPainter extends CustomPainter {
+  @override
+  void paint(Canvas canvas, Size size) {
+    final paintTick = Paint()..color = const Color(0xFF222222);
+    final paintSmall = Paint()..color = const Color(0xFF222222).withValues(alpha: 0.6);
+
+    final width = size.width;
+    final start = 30;
+    final end = 150;
+    final steps = end - start;
+    for (int i = 0; i <= steps; i++) {
+      final x = (i / steps) * width;
+      if (i % 10 == 0) {
+        canvas.drawLine(Offset(x, size.height * 0.1), Offset(x, size.height * 0.6), paintTick);
+      } else if (i % 5 == 0) {
+        canvas.drawLine(Offset(x, size.height * 0.2), Offset(x, size.height * 0.5), paintSmall);
+      } else {
+        canvas.drawLine(Offset(x, size.height * 0.35), Offset(x, size.height * 0.5), paintSmall);
+      }
+    }
+  }
+
+  @override
+  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart b/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart
new file mode 100644
index 0000000..43d485a
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart
@@ -0,0 +1,209 @@
+import 'dart:developer';
+
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.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/features/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/pages/age_selection_page.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/pages/gender_selection_page.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/pages/height_selection_page.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/pages/weight_selection_page.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:provider/provider.dart';
+
+/// Manages the user info selection flow with PageView
+/// Only the page content changes, header and footer remain fixed
+class UserInfoFlowManager extends StatefulWidget {
+  const UserInfoFlowManager({super.key});
+
+  @override
+  State createState() => _UserInfoFlowManagerState();
+}
+
+class _UserInfoFlowManagerState extends State {
+  final PageController _pageController = PageController();
+  late SymptomsCheckerViewModel _viewModel;
+
+  // Page titles
+  final List _pageTitles = [
+    "Your Gender",
+    "Your Birth Date",
+    "Your Height",
+    "Your Weight",
+  ];
+
+  @override
+  void initState() {
+    super.initState();
+    _viewModel = context.read();
+    // _viewModel.resetUserInfo();
+  }
+
+  @override
+  void dispose() {
+    _pageController.dispose();
+    super.dispose();
+  }
+
+  void _onNext() {
+    if (_viewModel.userInfoCurrentPage < 3) {
+      _viewModel.nextUserInfoPage();
+      _pageController.animateToPage(
+        _viewModel.userInfoCurrentPage,
+        duration: const Duration(milliseconds: 300),
+        curve: Curves.easeInOut,
+      );
+    } else {
+      // Submit and navigate to next screen
+      _submitUserInfo();
+    }
+  }
+
+  void _onPrevious() {
+    if (_viewModel.userInfoCurrentPage > 0) {
+      _viewModel.previousUserInfoPage();
+      _pageController.animateToPage(
+        _viewModel.userInfoCurrentPage,
+        duration: const Duration(milliseconds: 300),
+        curve: Curves.easeInOut,
+      );
+    } else {
+      context.pop();
+    }
+  }
+
+  void _submitUserInfo() {
+    final userInfo = _viewModel.getUserInfoData();
+
+    // Log user info
+    log('User Info Submitted:');
+    log('Gender: ${userInfo['gender']}');
+    log('Age: ${userInfo['age']}');
+    log('Height: ${userInfo['height']} ${userInfo['heightUnit']}');
+    log('Weight: ${userInfo['weight']} ${userInfo['weightUnit']}');
+
+    // TODO: Save user info to backend/storage
+
+    // Navigate to symptoms checker or next screen
+    context.pop();
+  }
+
+  Widget _buildProgressBar(int currentPage) {
+    return Row(
+      children: List.generate(4, (index) {
+        final isActive = index <= currentPage;
+        return Expanded(
+          child: Container(
+            height: 4.h,
+            margin: EdgeInsets.symmetric(horizontal: 6.w),
+            decoration: BoxDecoration(
+              color: isActive ? AppColors.primaryRedColor : AppColors.greyLightColor,
+              borderRadius: BorderRadius.circular(8.r),
+            ),
+          ),
+        );
+      }),
+    );
+  }
+
+  Widget _buildStickyBottomCard(bool isLastPage) {
+    return Container(
+      decoration: BoxDecoration(
+        color: AppColors.whiteColor,
+        borderRadius: BorderRadius.vertical(top: Radius.circular(24.r)),
+      ),
+      padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 16.h),
+      child: SafeArea(
+        top: false,
+        child: Row(
+          children: [
+            Expanded(
+              child: CustomButton(
+                text: "Previous".needTranslation,
+                onPressed: _onPrevious,
+                backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
+                borderColor: Colors.transparent,
+                textColor: AppColors.primaryRedColor,
+                fontSize: 16.f,
+              ),
+            ),
+            SizedBox(width: 12.w),
+            Expanded(
+              child: CustomButton(
+                text: isLastPage ? "Submit".needTranslation : "Next".needTranslation,
+                onPressed: _onNext,
+                backgroundColor: AppColors.primaryRedColor,
+                borderColor: AppColors.primaryRedColor,
+                textColor: AppColors.whiteColor,
+                fontSize: 16.f,
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Consumer(
+      builder: (context, viewModel, child) {
+        return Scaffold(
+          backgroundColor: AppColors.bgScaffoldColor,
+          body: Column(
+            children: [
+              Expanded(
+                child: CollapsingListView(
+                  title: _pageTitles[viewModel.userInfoCurrentPage].needTranslation,
+                  isLeading: true,
+                  child: Column(
+                    crossAxisAlignment: CrossAxisAlignment.start,
+                    children: [
+                      SizedBox(height: 24.h),
+                      _buildProgressBar(viewModel.userInfoCurrentPage),
+                      SizedBox(height: 24.h),
+                      SizedBox(
+                        height: 600.h,
+                        child: PageView(
+                          controller: _pageController,
+                          physics: const NeverScrollableScrollPhysics(), // Disable swipe
+                          onPageChanged: (index) {
+                            viewModel.setUserInfoPage(index);
+                          },
+                          children: [
+                            GenderSelectionPage(
+                              selectedGender: viewModel.selectedGender,
+                              onGenderSelected: viewModel.setGender,
+                            ),
+                            AgeSelectionPage(
+                              selectedAge: viewModel.selectedAge,
+                              onAgeSelected: viewModel.setAge,
+                            ),
+                            HeightSelectionPage(
+                              height: viewModel.selectedHeight ?? 178,
+                              isCm: viewModel.isHeightCm,
+                              onHeightChanged: viewModel.setHeight,
+                            ),
+                            WeightSelectionPage(
+                              weight: viewModel.selectedWeight ?? 70,
+                              isKg: viewModel.isWeightKg,
+                              onWeightChanged: viewModel.setWeight,
+                            ),
+                          ],
+                        ),
+                      ),
+                    ],
+                  ),
+                ),
+              ),
+              _buildStickyBottomCard(viewModel.isUserInfoLastPage),
+            ],
+          ),
+        );
+      },
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart
new file mode 100644
index 0000000..6e6d762
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart
@@ -0,0 +1,36 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+
+/// Progress bar widget showing the current step in user info selection flow
+/// Total steps: 4 (Gender -> Age -> Height -> Weight)
+class UserInfoProgressBar extends StatelessWidget {
+  final int currentStep;
+  final int totalSteps;
+
+  const UserInfoProgressBar({
+    super.key,
+    required this.currentStep,
+    this.totalSteps = 4,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Row(
+      children: List.generate(totalSteps, (index) {
+        final isActive = index < currentStep;
+        return Expanded(
+          child: Container(
+            height: 4.h,
+            margin: EdgeInsets.symmetric(horizontal: 6.w),
+            decoration: BoxDecoration(
+              color: isActive ? AppColors.primaryRedColor : AppColors.greyLightColor,
+              borderRadius: BorderRadius.circular(8.r),
+            ),
+          ),
+        );
+      }),
+    );
+  }
+}
+
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_selection_scaffold.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_selection_scaffold.dart
new file mode 100644
index 0000000..3390c31
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_selection_scaffold.dart
@@ -0,0 +1,67 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
+
+/// Base scaffold for user info selection flow pages
+/// Provides consistent layout with progress bar and sticky bottom card
+class UserInfoSelectionScaffold extends StatelessWidget {
+  final String title;
+  final int currentStep;
+  final Widget child;
+  final VoidCallback? onPrevious;
+  final VoidCallback? onNext;
+  final bool showPrevious;
+  final String? nextButtonText;
+  final bool isScrollable;
+
+  const UserInfoSelectionScaffold({
+    super.key,
+    required this.title,
+    required this.currentStep,
+    required this.child,
+    this.onPrevious,
+    this.onNext,
+    this.showPrevious = true,
+    this.nextButtonText,
+    this.isScrollable = true,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      backgroundColor: AppColors.bgScaffoldColor,
+      body: Column(
+        children: [
+          Expanded(
+            child: CollapsingListView(
+              title: title,
+              isLeading: true,
+              child: Column(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  SizedBox(height: 24.h),
+                  UserInfoProgressBar(currentStep: currentStep),
+                  SizedBox(height: 24.h),
+                  isScrollable
+                      ? SingleChildScrollView(
+                          child: child,
+                        )
+                      : child,
+                ],
+              ),
+            ),
+          ),
+          UserInfoStickyBottomCard(
+            onPrevious: onPrevious,
+            onNext: onNext,
+            showPrevious: showPrevious,
+            nextButtonText: nextButtonText,
+          ),
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart
new file mode 100644
index 0000000..10fd934
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart
@@ -0,0 +1,68 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_export.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/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+
+/// Sticky bottom card with Previous/Next navigation buttons
+class UserInfoStickyBottomCard extends StatelessWidget {
+  final VoidCallback? onPrevious;
+  final VoidCallback? onNext;
+  final bool showPrevious;
+  final String? nextButtonText;
+
+  const UserInfoStickyBottomCard({
+    super.key,
+    this.onPrevious,
+    this.onNext,
+    this.showPrevious = true,
+    this.nextButtonText,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+        color: AppColors.whiteColor,
+        borderRadius: 24.r,
+      ),
+      child: Column(
+        mainAxisSize: MainAxisSize.min,
+        children: [
+          SizedBox(height: 16.h),
+          Row(
+            children: [
+              if (showPrevious) ...[
+                Expanded(
+                  child: CustomButton(
+                    text: "Previous".needTranslation,
+                    onPressed: onPrevious ?? () => context.pop(),
+                    backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
+                    borderColor: Colors.transparent,
+                    textColor: AppColors.primaryRedColor,
+                    fontSize: 16.f,
+                  ),
+                ),
+                SizedBox(width: 12.w),
+              ],
+              Expanded(
+                child: CustomButton(
+                  text: nextButtonText ?? "Next".needTranslation,
+                  onPressed: onNext ?? () {},
+                  backgroundColor: AppColors.primaryRedColor,
+                  borderColor: AppColors.primaryRedColor,
+                  textColor: AppColors.whiteColor,
+                  fontSize: 16.f,
+                ),
+              ),
+            ],
+          ),
+          SizedBox(height: 24.h),
+        ],
+      ).paddingSymmetrical(24.w, 0),
+    );
+  }
+}
+
diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart
index f73eba3..183c2a0 100644
--- a/lib/routes/app_routes.dart
+++ b/lib/routes/app_routes.dart
@@ -3,6 +3,7 @@ import 'package:hmg_patient_app_new/presentation/authentication/login.dart';
 import 'package:hmg_patient_app_new/presentation/authentication/register.dart';
 import 'package:hmg_patient_app_new/presentation/authentication/register_step2.dart';
 import 'package:hmg_patient_app_new/presentation/blood_donation/blood_donation_page.dart';
+import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart';
 import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/comprehensive_checkup_page.dart';
 import 'package:hmg_patient_app_new/presentation/e_referral/new_e_referral.dart';
 import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart';
@@ -14,6 +15,8 @@ import 'package:hmg_patient_app_new/presentation/symptoms_checker/risk_factors_s
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/suggestions_screen.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/symptoms_selector_screen.dart';
 import 'package:hmg_patient_app_new/presentation/symptoms_checker/triage_screen.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart';
 import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/call_screen.dart';
 import 'package:hmg_patient_app_new/splashPage.dart';
 
@@ -30,14 +33,21 @@ class AppRoutes {
   static const String zoomCallPage = '/zoomCallPage';
   static const String bloodDonationPage = '/bloodDonationPage';
 
+  //appointments
+  static const String bookAppointmentPage = '/bookAppointmentPage';
+
   // Symptoms Checker
   static const String organSelectorPage = '/organSelectorPage';
-  static const String symptomsCheckerScreen = '/symptomsCheckerScreen';
+  static const String symptomsSelectorScreen = '/symptomsCheckerScreen';
   static const String suggestionsScreen = '/suggestionsScreen';
   static const String riskFactorsScreen = '/riskFactorsScreen';
   static const String possibleConditionsScreen = '/possibleConditionsScreen';
   static const String triageScreen = '/triageProgressScreen';
 
+  //UserInfoSelection
+  static const String userInfoSelection = '/userInfoSelection';
+  static const String userInfoFlowManager = '/userInfoFlowManager';
+
   static Map get routes => {
         initialRoute: (context) => SplashPage(),
         loginScreen: (context) => LoginScreen(),
@@ -50,12 +60,16 @@ class AppRoutes {
         comprehensiveCheckupPage: (context) => ComprehensiveCheckupPage(),
         homeHealthCarePage: (context) => HhcProceduresPage(),
         organSelectorPage: (context) => OrganSelectorPage(),
-        symptomsCheckerScreen: (context) => SymptomsSelectorScreen(),
+        symptomsSelectorScreen: (context) => SymptomsSelectorScreen(),
         riskFactorsScreen: (context) => RiskFactorsScreen(),
         suggestionsScreen: (context) => SuggestionsScreen(),
         possibleConditionsScreen: (context) => PossibleConditionsScreen(),
-        triageScreen: (context) => TriageScreen()
-        zoomCallPage: (context) => CallScreen(),
-        bloodDonationPage: (context) => BloodDonationPage()
+        triageScreen: (context) => TriageScreen(),
+        bloodDonationPage: (context) => BloodDonationPage(),
+        bookAppointmentPage: (context) => BookAppointmentPage(),
+        userInfoSelection: (context) => UserInfoSelectionScreen(),
+        userInfoFlowManager: (context) => UserInfoFlowManager(),
+
+        //
       };
 }
diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart
index 3e20689..ad8e743 100644
--- a/lib/widgets/appbar/collapsing_list_view.dart
+++ b/lib/widgets/appbar/collapsing_list_view.dart
@@ -26,7 +26,7 @@ class CollapsingListView extends StatelessWidget {
   Widget? trailing;
   bool isClose;
   bool isLeading;
-  VoidCallback? onLeadingTapped;
+  VoidCallback? leadingCallback;
 
   CollapsingListView({
     super.key,
@@ -42,7 +42,7 @@ class CollapsingListView extends StatelessWidget {
     this.requests,
     this.isLeading = true,
     this.trailing,
-    this.onLeadingTapped,
+    this.leadingCallback,
   });
 
   @override
@@ -69,8 +69,8 @@ class CollapsingListView extends StatelessWidget {
                           icon: Utils.buildSvgWithAssets(icon: isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 32.h, height: 32.h),
                           padding: EdgeInsets.only(left: 12),
                           onPressed: () {
-                            if (onLeadingTapped != null) {
-                              onLeadingTapped!();
+                            if (leadingCallback != null) {
+                              leadingCallback!();
                             } else {
                               context.pop();
                             }
diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart
index c1a38ab..7992ece 100644
--- a/lib/widgets/input_widget.dart
+++ b/lib/widgets/input_widget.dart
@@ -215,8 +215,11 @@ class TextInputWidget extends StatelessWidget {
               language: appState.getLanguageCode()!,
               initialDate: DateTime.now(),
               fontFamily: appState.getLanguageCode() == "ar" ? "GESSTwo" : "Poppins",
-              okWidget: Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.confirm, width: 24.h, height: 24.h)),
-              cancelWidget: Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.cancel, iconColor: Colors.white, width: 24.h, height: 24.h)),
+              okWidget:
+                  Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.confirm, width: 24.h, height: 24.h)),
+              cancelWidget: Padding(
+                  padding: EdgeInsets.only(right: 8.h),
+                  child: Utils.buildSvgWithAssets(icon: AppAssets.cancel, iconColor: Colors.white, width: 24.h, height: 24.h)),
               onCalendarTypeChanged: (bool value) {
             isGregorian = value;
           });
@@ -276,7 +279,12 @@ class TextInputWidget extends StatelessWidget {
       decoration: InputDecoration(
         isDense: true,
         hintText: hintText,
-        hintStyle: TextStyle(fontSize: 14.f, height: 21 / 16, fontWeight: FontWeight.w500, color: hintColor != null ? AppColors.textColor : Color(0xff898A8D), letterSpacing: -0.75),
+        hintStyle: TextStyle(
+            fontSize: 14.f,
+            height: 21 / 16,
+            fontWeight: FontWeight.w500,
+            color: hintColor != null ? AppColors.textColor : Color(0xff898A8D),
+            letterSpacing: -0.75),
         prefixIconConstraints: BoxConstraints(minWidth: 30.h),
         prefixIcon: prefix == null ? null : "+${prefix!}".toText14(letterSpacing: -1, color: AppColors.textColor, weight: FontWeight.w500),
         contentPadding: EdgeInsets.zero,

From 796aeb03d3cd997188de02859d28026414911cc4 Mon Sep 17 00:00:00 2001
From: haroon amjad 
Date: Thu, 11 Dec 2025 16:54:14 +0300
Subject: [PATCH 11/55] Ancillary order fixes, QLine API integrated & other
 enhancements

---
 .../images/svg/ancillary_orders_list_icon.svg |   5 +
 assets/images/svg/insurance_approval_icon.svg |   4 +
 assets/images/svg/invoices_list_icon.svg      |   4 +
 assets/images/svg/medical_reports_icon.svg    |   5 +
 assets/images/svg/monthly_reports_icon.svg    |   4 +
 assets/images/svg/my_doctors_icon.svg         |   4 +
 assets/images/svg/my_radiology_icon.svg       |   3 +
 assets/images/svg/my_sick_leave_icon.svg      |   5 +
 assets/images/svg/sick_leave_report_icon.svg  |   5 +
 assets/images/svg/update_insurance_icon.svg   |   5 +
 lib/core/api_consts.dart                      |   8 ++
 lib/core/app_assets.dart                      |  10 ++
 lib/core/utils/utils.dart                     |   6 +-
 .../authentication_view_model.dart            |   1 +
 .../patient_queue_details_response_model.dart |  40 ++++++
 .../my_appointments/my_appointments_repo.dart |  34 +++++
 .../my_appointments_view_model.dart           |  54 ++++++-
 .../appointment_details_page.dart             |   4 +-
 .../appointments/appointment_queue_page.dart  |  73 +++++-----
 .../widgets/appointment_card.dart             |   3 +
 .../appointment_checkin_bottom_sheet.dart     |   1 +
 .../widgets/appointment_doctor_card.dart      |   2 +
 .../laser/widgets/body_type_listing.dart      |  20 +--
 .../home/data/landing_page_data.dart          |   6 +-
 lib/presentation/home/landing_page.dart       |  31 ++--
 .../medical_file/medical_file_page.dart       |  27 ++--
 .../patient_sickleaves_list_page.dart         |   2 +
 .../ancillary_order_payment_page.dart         |   7 +-
 .../ancillary_procedures_details_page.dart    | 132 +++++++++++++-----
 lib/presentation/todo_section/todo_page.dart  |   6 +-
 .../widgets/ancillary_orders_list.dart        |   2 +-
 31 files changed, 396 insertions(+), 117 deletions(-)
 create mode 100644 assets/images/svg/ancillary_orders_list_icon.svg
 create mode 100644 assets/images/svg/insurance_approval_icon.svg
 create mode 100644 assets/images/svg/invoices_list_icon.svg
 create mode 100644 assets/images/svg/medical_reports_icon.svg
 create mode 100644 assets/images/svg/monthly_reports_icon.svg
 create mode 100644 assets/images/svg/my_doctors_icon.svg
 create mode 100644 assets/images/svg/my_radiology_icon.svg
 create mode 100644 assets/images/svg/my_sick_leave_icon.svg
 create mode 100644 assets/images/svg/sick_leave_report_icon.svg
 create mode 100644 assets/images/svg/update_insurance_icon.svg
 create mode 100644 lib/features/my_appointments/models/resp_models/patient_queue_details_response_model.dart

diff --git a/assets/images/svg/ancillary_orders_list_icon.svg b/assets/images/svg/ancillary_orders_list_icon.svg
new file mode 100644
index 0000000..f0497d8
--- /dev/null
+++ b/assets/images/svg/ancillary_orders_list_icon.svg
@@ -0,0 +1,5 @@
+
+    
+    
+    
+
diff --git a/assets/images/svg/insurance_approval_icon.svg b/assets/images/svg/insurance_approval_icon.svg
new file mode 100644
index 0000000..b46a54a
--- /dev/null
+++ b/assets/images/svg/insurance_approval_icon.svg
@@ -0,0 +1,4 @@
+
+    
+    
+
diff --git a/assets/images/svg/invoices_list_icon.svg b/assets/images/svg/invoices_list_icon.svg
new file mode 100644
index 0000000..f123096
--- /dev/null
+++ b/assets/images/svg/invoices_list_icon.svg
@@ -0,0 +1,4 @@
+
+    
+    
+
diff --git a/assets/images/svg/medical_reports_icon.svg b/assets/images/svg/medical_reports_icon.svg
new file mode 100644
index 0000000..862b813
--- /dev/null
+++ b/assets/images/svg/medical_reports_icon.svg
@@ -0,0 +1,5 @@
+
+    
+    
+    
+
diff --git a/assets/images/svg/monthly_reports_icon.svg b/assets/images/svg/monthly_reports_icon.svg
new file mode 100644
index 0000000..5e786e2
--- /dev/null
+++ b/assets/images/svg/monthly_reports_icon.svg
@@ -0,0 +1,4 @@
+
+    
+    
+
diff --git a/assets/images/svg/my_doctors_icon.svg b/assets/images/svg/my_doctors_icon.svg
new file mode 100644
index 0000000..c5fc541
--- /dev/null
+++ b/assets/images/svg/my_doctors_icon.svg
@@ -0,0 +1,4 @@
+
+    
+    
+
diff --git a/assets/images/svg/my_radiology_icon.svg b/assets/images/svg/my_radiology_icon.svg
new file mode 100644
index 0000000..7b5ebe4
--- /dev/null
+++ b/assets/images/svg/my_radiology_icon.svg
@@ -0,0 +1,3 @@
+
+    
+
diff --git a/assets/images/svg/my_sick_leave_icon.svg b/assets/images/svg/my_sick_leave_icon.svg
new file mode 100644
index 0000000..f488cff
--- /dev/null
+++ b/assets/images/svg/my_sick_leave_icon.svg
@@ -0,0 +1,5 @@
+
+    
+    
+    
+
diff --git a/assets/images/svg/sick_leave_report_icon.svg b/assets/images/svg/sick_leave_report_icon.svg
new file mode 100644
index 0000000..521c063
--- /dev/null
+++ b/assets/images/svg/sick_leave_report_icon.svg
@@ -0,0 +1,5 @@
+
+    
+    
+    
+
diff --git a/assets/images/svg/update_insurance_icon.svg b/assets/images/svg/update_insurance_icon.svg
new file mode 100644
index 0000000..684d672
--- /dev/null
+++ b/assets/images/svg/update_insurance_icon.svg
@@ -0,0 +1,5 @@
+
+    
+    
+    
+
diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart
index b92461e..3e8c512 100644
--- a/lib/core/api_consts.dart
+++ b/lib/core/api_consts.dart
@@ -728,6 +728,8 @@ class ApiConsts {
   static String GET_TAMARA_INSTALLMENTS_URL = "https://mdlaboratories.com/tamaralive/Home/GetInstallments";
   static String GET_TAMARA_PAYMENT_STATUS = 'https://mdlaboratories.com/tamaralive/api/OnlineTamara/order_status?orderid=';
 
+  static String QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail";
+
   // static String GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments";
 
 // var payFortEnvironment = FortEnvironment.test;
@@ -744,6 +746,7 @@ class ApiConsts {
         GET_TAMARA_INSTALLMENTS_URL = "https://mdlaboratories.com/tamaralive/Home/GetInstallments";
         GET_TAMARA_PAYMENT_STATUS = 'https://mdlaboratories.com/tamaralive/api/OnlineTamara/order_status?orderid=';
         rcBaseUrl = 'https://rc.hmg.com/';
+        QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail";
         break;
       case AppEnvironmentTypeEnum.dev:
         baseUrl = "https://uat.hmgwebservices.com/";
@@ -754,6 +757,7 @@ class ApiConsts {
         GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments";
         GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid=';
         rcBaseUrl = 'https://rc.hmg.com/uat/';
+        QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail";
         break;
       case AppEnvironmentTypeEnum.uat:
         baseUrl = "https://uat.hmgwebservices.com/";
@@ -764,6 +768,7 @@ class ApiConsts {
         GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments";
         GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid=';
         rcBaseUrl = 'https://rc.hmg.com/uat/';
+        QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail";
         break;
       case AppEnvironmentTypeEnum.preProd:
         baseUrl = "https://webservices.hmg.com/";
@@ -774,6 +779,7 @@ class ApiConsts {
         GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments";
         GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid=';
         rcBaseUrl = 'https://rc.hmg.com/';
+        QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail";
         break;
       case AppEnvironmentTypeEnum.qa:
         baseUrl = "https://uat.hmgwebservices.com/";
@@ -784,6 +790,7 @@ class ApiConsts {
         GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments";
         GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid=';
         rcBaseUrl = 'https://rc.hmg.com/uat/';
+        QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail";
         break;
       case AppEnvironmentTypeEnum.staging:
         baseUrl = "https://uat.hmgwebservices.com/";
@@ -794,6 +801,7 @@ class ApiConsts {
         GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments";
         GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid=';
         rcBaseUrl = 'https://rc.hmg.com/uat/';
+        QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail";
         break;
     }
   }
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index 9b6f4b1..05bb7a9 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -192,6 +192,16 @@ class AppAssets {
   static const String weight_tracker_icon = '$svgBasePath/weight_tracker_icon.svg';
   static const String ask_doctor_medical_file_icon = '$svgBasePath/ask_doctor_medical_file_icon.svg';
   static const String internet_pairing_icon = '$svgBasePath/internet_pairing_icon.svg';
+  static const String my_doctors_icon = '$svgBasePath/my_doctors_icon.svg';
+  static const String my_sick_leave_icon = '$svgBasePath/my_sick_leave_icon.svg';
+  static const String my_radiology_icon = '$svgBasePath/my_radiology_icon.svg';
+  static const String monthly_reports_icon = '$svgBasePath/monthly_reports_icon.svg';
+  static const String medical_reports_icon = '$svgBasePath/medical_reports_icon.svg';
+  static const String sick_leave_report_icon = '$svgBasePath/sick_leave_report_icon.svg';
+  static const String update_insurance_icon = '$svgBasePath/update_insurance_icon.svg';
+  static const String insurance_approval_icon = '$svgBasePath/insurance_approval_icon.svg';
+  static const String invoices_list_icon = '$svgBasePath/invoices_list_icon.svg';
+  static const String ancillary_orders_list_icon = '$svgBasePath/ancillary_orders_list_icon.svg';
 
 
   //bottom navigation//
diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart
index df8cdcb..87dee02 100644
--- a/lib/core/utils/utils.dart
+++ b/lib/core/utils/utils.dart
@@ -913,14 +913,14 @@ class Utils {
     return AppColors.primaryRedColor;
   }
 
-  static String getCardButtonText(int currentQueueStatus) {
+  static String getCardButtonText(int currentQueueStatus, String roomNumber) {
     switch (currentQueueStatus) {
       case 0:
         return "Please wait! you will be called for vital signs".needTranslation;
       case 1:
-        return "Please visit Room S5 for vital signs".needTranslation;
+        return "Please visit Room $roomNumber for vital signs".needTranslation;
       case 2:
-        return "Please visit Room S5 to the Doctor".needTranslation;
+        return "Please visit Room $roomNumber to the Doctor".needTranslation;
     }
     return "";
   }
diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart
index fa16423..faedcd8 100644
--- a/lib/features/authentication/authentication_view_model.dart
+++ b/lib/features/authentication/authentication_view_model.dart
@@ -586,6 +586,7 @@ class AuthenticationViewModel extends ChangeNotifier {
               activation.list!.first.bloodGroup = activation.patientBlodType;
               _appState.setAuthenticatedUser(activation.list!.first);
               _appState.setPrivilegeModelList(activation.list!.first.listPrivilege!);
+              _appState.setUserBloodGroup = activation.patientBlodType ?? "N/A";
             }
             // _appState.setUserBloodGroup = (activation.patientBlodType ?? "");
             _appState.setAppAuthToken = activation.authenticationTokenId;
diff --git a/lib/features/my_appointments/models/resp_models/patient_queue_details_response_model.dart b/lib/features/my_appointments/models/resp_models/patient_queue_details_response_model.dart
new file mode 100644
index 0000000..c36b9ec
--- /dev/null
+++ b/lib/features/my_appointments/models/resp_models/patient_queue_details_response_model.dart
@@ -0,0 +1,40 @@
+class PatientQueueDetails {
+  int? patientID;
+  String? patientName;
+  String? queueNo;
+  int? callType;
+  String? roomNo;
+  String? calledOn;
+  bool? servingNow;
+
+  PatientQueueDetails(
+      {this.patientID,
+        this.patientName,
+        this.queueNo,
+        this.callType,
+        this.roomNo,
+        this.calledOn,
+        this.servingNow});
+
+  PatientQueueDetails.fromJson(Map json) {
+    patientID = json['patientID'];
+    patientName = json['patientName'];
+    queueNo = json['queueNo'];
+    callType = json['callType'];
+    roomNo = json['roomNo'];
+    calledOn = json['calledOn'];
+    servingNow = json['servingNow'];
+  }
+
+  Map toJson() {
+    final Map data = new Map();
+    data['patientID'] = this.patientID;
+    data['patientName'] = this.patientName;
+    data['queueNo'] = this.queueNo;
+    data['callType'] = this.callType;
+    data['roomNo'] = this.roomNo;
+    data['calledOn'] = this.calledOn;
+    data['servingNow'] = this.servingNow;
+    return data;
+  }
+}
diff --git a/lib/features/my_appointments/my_appointments_repo.dart b/lib/features/my_appointments/my_appointments_repo.dart
index 87ec10d..3308f93 100644
--- a/lib/features/my_appointments/my_appointments_repo.dart
+++ b/lib/features/my_appointments/my_appointments_repo.dart
@@ -13,6 +13,7 @@ import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart' show HospitalsModel;
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_queue_details_response_model.dart';
 import 'package:hmg_patient_app_new/services/logger_service.dart';
 
 abstract class MyAppointmentsRepo {
@@ -58,6 +59,8 @@ abstract class MyAppointmentsRepo {
 
   Future>> sendAskDocCallRequest(
       {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, required String requestType, required String remarks, required String userMobileNumber});
+
+  Future>>> getPatientAppointmentQueueDetails({required int appointmentNo, required int patientID});
 }
 
 class MyAppointmentsRepoImp implements MyAppointmentsRepo {
@@ -746,4 +749,35 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo {
       return Left(UnknownFailure(e.toString()));
     }
   }
+
+  @override
+  Future>>> getPatientAppointmentQueueDetails({required int appointmentNo, required int patientID}) async {
+    Map mapDevice = {"appointmentNo": appointmentNo, "patientID": patientID, "apiKey": "EE17D21C7943485D9780223CCE55DCE5"};
+    try {
+      GenericApiModel>? apiResponse;
+      Failure? failure;
+      await apiClient.post(ApiConsts.QLINE_URL, onFailure: (error, statusCode, {messageStatus, failureType}) {
+        failure = failureType;
+      }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+        try {
+          final list = response['data'];
+          final queueList = list.map((item) => PatientQueueDetails.fromJson(item as Map)).toList().cast();
+
+          apiResponse = GenericApiModel>(
+            messageStatus: messageStatus,
+            statusCode: statusCode,
+            errorMessage: null,
+            data: queueList,
+          );
+        } catch (e) {
+          failure = DataParsingFailure(e.toString());
+        }
+      }, body: mapDevice, isExternal: true, isAllowAny: true);
+      if (failure != null) return Left(failure!);
+      if (apiResponse == null) return Left(ServerFailure("Unknown error"));
+      return Right(apiResponse!);
+    } catch (e) {
+      return Left(UnknownFailure(e.toString()));
+    }
+  }
 }
diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart
index 71e0312..c4b8687 100644
--- a/lib/features/my_appointments/my_appointments_view_model.dart
+++ b/lib/features/my_appointments/my_appointments_view_model.dart
@@ -6,6 +6,7 @@ import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_queue_details_response_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart';
 import 'package:hmg_patient_app_new/services/error_handler_service.dart';
@@ -37,8 +38,11 @@ class MyAppointmentsViewModel extends ChangeNotifier {
   DateTime? start = null;
   DateTime? end = null;
 
+  bool isAppointmentQueueDetailsLoading = false;
   bool isPatientHasQueueAppointment = false;
   int currentQueueStatus = 0;
+  List patientQueueDetailsList = [];
+  late PatientQueueDetails currentPatientQueueDetails;
 
   List patientAppointmentsHistoryList = [];
   List filteredAppointmentList = [];
@@ -88,7 +92,7 @@ class MyAppointmentsViewModel extends ChangeNotifier {
     isTamaraDetailsLoading = true;
     isAppointmentPatientShareLoading = true;
     isEyeMeasurementsAppointmentsLoading = true;
-    isPatientHasQueueAppointment = false;
+    isAppointmentQueueDetailsLoading = true;
     notifyListeners();
   }
 
@@ -218,6 +222,10 @@ class MyAppointmentsViewModel extends ChangeNotifier {
     patientAppointmentsHistoryList.addAll(patientArrivedAppointmentsHistoryList);
     filteredAppointmentList.addAll(patientAppointmentsHistoryList);
 
+    if (patientArrivedAppointmentsHistoryList.isNotEmpty) {
+      getPatientAppointmentQueueDetails(appointmentNo: patientArrivedAppointmentsHistoryList.first.appointmentNo, patientID: patientArrivedAppointmentsHistoryList.first.patientID);
+    }
+
     print('Upcoming Appointments: ${patientUpcomingAppointmentsHistoryList.length}');
     print('Arrived Appointments: ${patientArrivedAppointmentsHistoryList.length}');
     print('All Appointments: ${patientAppointmentsHistoryList.length}');
@@ -659,6 +667,50 @@ class MyAppointmentsViewModel extends ChangeNotifier {
     );
   }
 
+  Future getPatientAppointmentQueueDetails({required int appointmentNo, required int patientID, Function(dynamic)? onSuccess, Function(String)? onError}) async {
+    isAppointmentQueueDetailsLoading = true;
+    notifyListeners();
+    final result = await myAppointmentsRepo.getPatientAppointmentQueueDetails(appointmentNo: appointmentNo, patientID: patientID);
+
+    isAppointmentQueueDetailsLoading = false;
+
+    result.fold(
+      // (failure) async => await errorHandlerService.handleError(failure: failure),
+      (failure) async {
+        if (onError != null) {
+          onError(failure.message);
+        }
+      },
+      (apiResponse) {
+        if (apiResponse.messageStatus == 2) {
+          onError!(apiResponse.errorMessage!);
+        } else if (apiResponse.messageStatus == 1) {
+          if (apiResponse.data != null && apiResponse.data!.isNotEmpty) {
+            isPatientHasQueueAppointment = true;
+            patientQueueDetailsList = apiResponse.data!;
+            for (var element in patientQueueDetailsList) {
+              if (element.patientID == patientID) {
+                currentPatientQueueDetails = element;
+                currentQueueStatus = element.callType!;
+                // currentQueueStatus = 2;
+                break;
+              }
+            }
+            // patientQueueDetailsList.first.callType = 1;
+
+            patientQueueDetailsList.removeWhere((element) => element.patientID == patientID);
+          } else {
+            isPatientHasQueueAppointment = false;
+          }
+          notifyListeners();
+          if (onSuccess != null) {
+            onSuccess(apiResponse.data);
+          }
+        }
+      },
+    );
+  }
+
   Future sendAskDocCallRequest({
     required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel,
     required String requestType,
diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart
index 7f863a1..54d654a 100644
--- a/lib/presentation/appointments/appointment_details_page.dart
+++ b/lib/presentation/appointments/appointment_details_page.dart
@@ -70,7 +70,6 @@ class _AppointmentDetailsPageState extends State {
     scheduleMicrotask(() async {
       CalenderUtilsNew calendarUtils = await CalenderUtilsNew.instance;
       var doesExist = await calendarUtils.checkIfEventExist("${widget.patientAppointmentHistoryResponseModel.appointmentNo}");
-      print("the appointment reminder exist $doesExist");
       myAppointmentsViewModel.setAppointmentReminder(doesExist, widget.patientAppointmentHistoryResponseModel);
       setState((){
 
@@ -82,7 +81,6 @@ class _AppointmentDetailsPageState extends State {
 
   @override
   Widget build(BuildContext context) {
-    AppState appState = getIt.get();
     myAppointmentsViewModel = Provider.of(context, listen: false);
     prescriptionsViewModel = Provider.of(context, listen: false);
     bookAppointmentsViewModel = Provider.of(context, listen: false);
@@ -390,7 +388,7 @@ class _AppointmentDetailsPageState extends State {
                                 label: "${LocaleKeys.radiology.tr(context: context)} ${LocaleKeys.radiologySubtitle.tr(context: context)}",
                                 textColor: AppColors.blackColor,
                                 backgroundColor: AppColors.whiteColor,
-                                svgIcon: AppAssets.allergy_info_icon,
+                                svgIcon: AppAssets.radiology_icon,
                                 isLargeText: true,
                                 iconSize: 36.w,
                               ).onPress(() async {
diff --git a/lib/presentation/appointments/appointment_queue_page.dart b/lib/presentation/appointments/appointment_queue_page.dart
index f48f1eb..d9e5832 100644
--- a/lib/presentation/appointments/appointment_queue_page.dart
+++ b/lib/presentation/appointments/appointment_queue_page.dart
@@ -42,7 +42,8 @@ class AppointmentQueuePage extends StatelessWidget {
                             color: AppColors.whiteColor,
                             borderRadius: 20.h,
                             hasShadow: false,
-                            side: BorderSide(color: Utils.getCardBorderColor(myAppointmentsVM.currentQueueStatus), width: 2.w),
+                            side:
+                                BorderSide(color: myAppointmentsVM.isAppointmentQueueDetailsLoading ? AppColors.whiteColor : Utils.getCardBorderColor(myAppointmentsVM.currentQueueStatus), width: 2.w),
                           ),
                           child: Padding(
                             padding: EdgeInsets.all(16.h),
@@ -59,16 +60,19 @@ class AppointmentQueuePage extends StatelessWidget {
                                     ),
                                     Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h),
                                   ],
-                                ),
+                                ).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading),
                                 SizedBox(height: 10.h),
-                                "Hala ${appState!.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true),
+                                "Hala ${appState!.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading),
                                 SizedBox(height: 8.h),
-                                "Thank you for your patience, here is your queue number.".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight),
+                                "Thank you for your patience, here is your queue number."
+                                    .needTranslation
+                                    .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight)
+                                    .toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading),
                                 SizedBox(height: 8.h),
-                                "IMD W-A-5".needTranslation.toText32(isBold: true),
+                                myAppointmentsVM.currentPatientQueueDetails.queueNo!.toText32(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading),
                                 SizedBox(height: 8.h),
                                 CustomButton(
-                                  text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus),
+                                  text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus, myAppointmentsVM.currentPatientQueueDetails.roomNo!),
                                   onPressed: () {},
                                   backgroundColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus),
                                   borderColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus).withValues(alpha: 0.01),
@@ -80,15 +84,16 @@ class AppointmentQueuePage extends StatelessWidget {
                                   height: 40.h,
                                   iconColor: AppColors.whiteColor,
                                   iconSize: 18.h,
-                                ),
+                                ).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading),
                               ],
                             ),
                           ),
                         ),
                         SizedBox(height: 16.h),
-                        Container(
-                          decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-                            color: AppColors.whiteColor,
+                        myAppointmentsVM.patientQueueDetailsList.isNotEmpty
+                            ? Container(
+                                decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                                  color: AppColors.whiteColor,
                             borderRadius: 20.h,
                             hasShadow: true,
                           ),
@@ -97,14 +102,14 @@ class AppointmentQueuePage extends StatelessWidget {
                             child: Column(
                               crossAxisAlignment: CrossAxisAlignment.start,
                               children: [
-                                "Serving Now".needTranslation.toText16(isBold: true),
-                                SizedBox(height: 18.h),
-                                ListView.separated(
+                                      "Serving Now".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading),
+                                      SizedBox(height: 18.h),
+                                      ListView.separated(
                                   padding: EdgeInsets.zero,
                                   shrinkWrap: true,
-                                  itemCount: 3,
-                                  physics: NeverScrollableScrollPhysics(),
-                                  itemBuilder: (BuildContext context, int index) {
+                                        itemCount: myAppointmentsVM.patientQueueDetailsList.length,
+                                        physics: NeverScrollableScrollPhysics(),
+                                        itemBuilder: (BuildContext context, int index) {
                                     return Row(
                                       mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                       crossAxisAlignment: CrossAxisAlignment.start,
@@ -113,28 +118,32 @@ class AppointmentQueuePage extends StatelessWidget {
                                         Row(
                                           crossAxisAlignment: CrossAxisAlignment.center,
                                           children: [
-                                            "Room: S2".toText12(fontWeight: FontWeight.w500),
-                                            SizedBox(width: 8.w),
-                                            AppCustomChipWidget(
-                                              deleteIcon: AppAssets.call_for_vitals,
-                                              labelText: "Call for vital signs".needTranslation,
-                                              iconColor: AppColors.primaryRedColor,
-                                              textColor: AppColors.primaryRedColor,
-                                              iconSize: 14.w,
-                                              backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.1),
-                                              labelPadding: EdgeInsetsDirectional.only(start: 8.h, end: -2.h),
-                                            ),
+                                                  "Room: ${myAppointmentsVM.patientQueueDetailsList[index].roomNo}".toText12(fontWeight: FontWeight.w500),
+                                                  SizedBox(width: 8.w),
+                                                  AppCustomChipWidget(
+                                                    deleteIcon: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 ? AppAssets.call_for_vitals : AppAssets.call_for_doctor,
+                                                    labelText:
+                                                        myAppointmentsVM.patientQueueDetailsList[index].callType == 1 ? "Call for vital signs".needTranslation : "Call for Doctor".needTranslation,
+                                                    iconColor: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 ? AppColors.primaryRedColor : AppColors.successColor,
+                                                    textColor: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 ? AppColors.primaryRedColor : AppColors.successColor,
+                                                    iconSize: 14.w,
+                                                    backgroundColor: myAppointmentsVM.patientQueueDetailsList[index].callType == 1
+                                                        ? AppColors.primaryRedColor.withValues(alpha: 0.1)
+                                                        : AppColors.successColor.withValues(alpha: 0.1),
+                                                    labelPadding: EdgeInsetsDirectional.only(start: 8.h, end: -2.h),
+                                                  ),
                                           ],
                                         ),
                                       ],
                                     );
                                   },
                                   separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 8.h),
-                                ),
-                              ],
-                            ),
+                                      ).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading),
+                                    ],
+                                  ),
                           ),
-                        ),
+                              )
+                            : SizedBox.shrink(),
                         SizedBox(height: 16.h),
                         Container(
                           decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
@@ -174,7 +183,7 @@ class AppointmentQueuePage extends StatelessWidget {
 
                                 SizedBox(height: 16.h),
                               ],
-                            ),
+                            ).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading),
                           ),
                         ),
                       ],
diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart
index e6b974e..3d59907 100644
--- a/lib/presentation/appointments/widgets/appointment_card.dart
+++ b/lib/presentation/appointments/widgets/appointment_card.dart
@@ -17,6 +17,7 @@ import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_vie
 import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart';
 import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
 import 'package:hmg_patient_app_new/presentation/appointments/appointment_details_page.dart';
+import 'package:hmg_patient_app_new/presentation/appointments/appointment_queue_page.dart';
 import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart';
 import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart';
 import 'package:hmg_patient_app_new/presentation/medical_file/eye_measurement_details_page.dart';
@@ -180,12 +181,14 @@ class AppointmentCard extends StatelessWidget {
                   ).toShimmer2(isShow: isLoading),
                   AppCustomChipWidget(labelText: isLoading ? 'Olaya' : patientAppointmentHistoryResponseModel.projectName!).toShimmer2(isShow: isLoading),
                   AppCustomChipWidget(
+                    labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
                     icon: AppAssets.appointment_calendar_icon,
                     labelText: isLoading
                         ? 'Cardiology'
                         : "${DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false)} ${DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false)}",
                   ).toShimmer2(isShow: isLoading),
                   AppCustomChipWidget(
+                    labelPadding: EdgeInsetsDirectional.only(start: -2.w, end: 6.w),
                     isIconPNG: true,
                     icon: getIt.get().getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg,
                     iconSize: 18.h,
diff --git a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart
index f430447..cd43b17 100644
--- a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart
+++ b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart
@@ -149,6 +149,7 @@ class AppointmentCheckinBottomSheet extends StatelessWidget {
       onSuccess: (apiResponse) {
         LoaderBottomSheet.hideLoader();
         showCommonBottomSheetWithoutHeight(context, title: "Success".needTranslation, child: Utils.getSuccessWidget(loadingText: LocaleKeys.success.tr()), callBackFunc: () {
+          myAppointmentsViewModel.getPatientAppointmentQueueDetails(appointmentNo: patientAppointmentHistoryResponseModel.appointmentNo, patientID: patientAppointmentHistoryResponseModel.patientID);
           Navigator.of(context).pop();
           Navigator.pushAndRemoveUntil(
               context,
diff --git a/lib/presentation/appointments/widgets/appointment_doctor_card.dart b/lib/presentation/appointments/widgets/appointment_doctor_card.dart
index 96d538b..405aa14 100644
--- a/lib/presentation/appointments/widgets/appointment_doctor_card.dart
+++ b/lib/presentation/appointments/widgets/appointment_doctor_card.dart
@@ -99,6 +99,7 @@ class AppointmentDoctorCard extends StatelessWidget {
                             labelPadding: EdgeInsetsDirectional.only(start: 6.w, end: 6.w),
                           ),
                           AppCustomChipWidget(
+                            labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
                             icon: AppAssets.doctor_calendar_icon,
                             labelText: "${DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false)} ${DateUtil.formatDateToTimeLang(
                               DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate),
@@ -106,6 +107,7 @@ class AppointmentDoctorCard extends StatelessWidget {
                             )}",
                           ),
                           AppCustomChipWidget(
+                            labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
                             icon: !patientAppointmentHistoryResponseModel.isLiveCareAppointment!
                                 ? AppAssets.walkin_appointment_icon
                                 : AppAssets.small_livecare_icon,
diff --git a/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart b/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart
index d8fa736..46047ff 100644
--- a/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart
+++ b/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart
@@ -45,20 +45,22 @@ class BodyTypeListing extends StatelessWidget {
                           ? AppColors.chipPrimaryRedBorderColor
                           : AppColors.blackColor,
                       iconSize: 16,
-                      labelPadding:
-                          EdgeInsetsDirectional.only(start: 8.h, end: 0.h),
-                      padding:
-                          EdgeInsets.symmetric(vertical: 16.h, horizontal: 12.h),
-                      deleteIconSize: Size(18.h, 18.h),
-                      shape: SmoothRectangleBorder(
-                        borderRadius: BorderRadius.circular(10),
-                        smoothness: 10,
+                  labelPadding: EdgeInsetsDirectional.only(start: 8.w, end: 8.w),
+                  padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 12.w),
+                  deleteIconSize: Size(18.w, 18.h),
+                  shape: SmoothRectangleBorder(
+                    borderRadius: BorderRadius.circular(10.r),
+                    smoothness: 10,
                         side: BorderSide(
                             color: index == selectedBodyAreaIndex
                                 ? AppColors.chipPrimaryRedBorderColor
                                 : AppColors.borderGrayColor,
                             width: 1),
-                      )).onPress(() => onCategoryChanged(index))))
+                  )).onPress(
+                () => onCategoryChanged(index),
+              ),
+            ),
+          )
         ],
       ),
     );
diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart
index 3d74cfd..82c423a 100644
--- a/lib/presentation/home/data/landing_page_data.dart
+++ b/lib/presentation/home/data/landing_page_data.dart
@@ -90,7 +90,7 @@ class LandingPageData {
     ),
     ServiceCardData(
       serviceName: "radiology_results",
-      icon: AppAssets.home_lab_result_icon,
+      icon: AppAssets.my_radiology_icon,
       title: "Radiology",
       subtitle: "Results",
       backgroundColor: AppColors.whiteColor,
@@ -120,7 +120,7 @@ class LandingPageData {
     ),
     ServiceCardData(
       serviceName: "my_doctors",
-      icon: AppAssets.insurance_update_icon,
+      icon: AppAssets.my_doctors_icon,
       title: "My",
       subtitle: "Doctors",
       backgroundColor: AppColors.whiteColor,
@@ -130,7 +130,7 @@ class LandingPageData {
     ),
     ServiceCardData(
       serviceName: "sick_leaves",
-      icon: AppAssets.insurance_update_icon,
+      icon: AppAssets.my_sick_leave_icon,
       title: "Sick",
       subtitle: "Leaves",
       backgroundColor: AppColors.whiteColor,
diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart
index 88b9274..a43aa18 100644
--- a/lib/presentation/home/landing_page.dart
+++ b/lib/presentation/home/landing_page.dart
@@ -25,6 +25,7 @@ import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/
 import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
 import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart';
 import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/appointments/appointment_queue_page.dart';
 import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart';
 import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart';
 import 'package:hmg_patient_app_new/presentation/authentication/quick_login.dart';
@@ -291,15 +292,15 @@ class _LandingPageState extends State {
                                                               ],
                                                             ),
                                                             SizedBox(height: 10.h),
-                                                            "Hala ${appState!.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true),
+                                                            "Hala ${appState.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true),
                                                             SizedBox(height: 8.h),
                                                             "Thank you for your patience, here is your queue number."
                                                                 .needTranslation
                                                                 .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight),
                                                             SizedBox(height: 8.h),
-                                                            "IMD W-A-5".needTranslation.toText28(isBold: true),
+                                                            myAppointmentsVM.currentPatientQueueDetails.queueNo!.toText28(isBold: true),
                                                             SizedBox(height: 12.h),
-                                                            Row(
+                                                            myAppointmentsVM.patientQueueDetailsList.isNotEmpty ? Row(
                                                               mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                                               crossAxisAlignment: CrossAxisAlignment.center,
                                                               children: [
@@ -307,24 +308,24 @@ class _LandingPageState extends State {
                                                                 Row(
                                                                   crossAxisAlignment: CrossAxisAlignment.center,
                                                                   children: [
-                                                                    "IMD W-A-2".needTranslation.toText12(isBold: true),
+                                                                    myAppointmentsVM.patientQueueDetailsList.first.queueNo!.toText12(isBold: true),
                                                                     SizedBox(width: 8.w),
                                                                     AppCustomChipWidget(
-                                                                      deleteIcon: AppAssets.call_for_vitals,
-                                                                      labelText: "Call for vital signs".needTranslation,
-                                                                      iconColor: AppColors.primaryRedColor,
-                                                                      textColor: AppColors.primaryRedColor,
+                                                                      deleteIcon: myAppointmentsVM.patientQueueDetailsList.first.callType == 1 ? AppAssets.call_for_vitals : AppAssets.call_for_doctor,
+                                                                      labelText: myAppointmentsVM.patientQueueDetailsList.first.callType == 1 ? "Call for vital signs".needTranslation : "Call for Doctor".needTranslation,
+                                                                      iconColor: myAppointmentsVM.patientQueueDetailsList.first.callType == 1 ? AppColors.primaryRedColor :  AppColors.successColor,
+                                                                      textColor: myAppointmentsVM.patientQueueDetailsList.first.callType == 1 ? AppColors.primaryRedColor :  AppColors.successColor,
                                                                       iconSize: 14.w,
-                                                                      backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.1),
+                                                                      backgroundColor: myAppointmentsVM.patientQueueDetailsList.first.callType == 1 ? AppColors.primaryRedColor.withValues(alpha: 0.1) : AppColors.successColor.withValues(alpha: 0.1),
                                                                       labelPadding: EdgeInsetsDirectional.only(start: 8.h, end: -2.h),
                                                                     ),
                                                                   ],
                                                                 ),
                                                               ],
-                                                            ),
+                                                            ) : SizedBox(height: 12.h),
                                                             SizedBox(height: 8.h),
                                                             CustomButton(
-                                                              text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus),
+                                                              text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus, myAppointmentsVM.currentPatientQueueDetails.roomNo!),
                                                               onPressed: () {},
                                                               backgroundColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus),
                                                               borderColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus).withValues(alpha: 0.01),
@@ -340,7 +341,13 @@ class _LandingPageState extends State {
                                                           ],
                                                         ),
                                                       ),
-                                                    )
+                                                    ).onPress(() {
+                                                      Navigator.of(context).push(
+                                                        CustomPageRoute(
+                                                          page: AppointmentQueuePage(),
+                                                        ),
+                                                      );
+                                                    })
                                                   : (immediateLiveCareVM.patientHasPendingLiveCareRequest && index == 0)
                                                       ? Column(
                                                           children: [
diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart
index d735bd9..8b6b19d 100644
--- a/lib/presentation/medical_file/medical_file_page.dart
+++ b/lib/presentation/medical_file/medical_file_page.dart
@@ -192,20 +192,21 @@ class _MedicalFilePageState extends State {
                               AppCustomChipWidget(
                                 icon: AppAssets.file_icon,
                                 labelText: "${LocaleKeys.fileno.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}",
-                                labelPadding: EdgeInsetsDirectional.only(end: 6.w),
+                                labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
                                 onChipTap: () {
                                   navigationService.pushPage(
                                       page: FamilyMedicalScreen(
                                     profiles: medicalFileViewModel.patientFamilyFiles,
                                     onSelect: (FamilyFileResponseModelLists p1) {},
-                                  ));
+                                    ),
+                                  );
                                 },
                               ),
                               AppCustomChipWidget(
                                 icon: AppAssets.checkmark_icon,
                                 labelText: LocaleKeys.verified.tr(context: context),
                                 iconColor: AppColors.successColor,
-                                labelPadding: EdgeInsetsDirectional.only(end: 6.w),
+                                labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
                               ),
                             ],
                           ),
@@ -227,9 +228,9 @@ class _MedicalFilePageState extends State {
                       ),
                       AppCustomChipWidget(
                         icon: AppAssets.blood_icon,
-                        labelText: "Blood: ${appState.getUserBloodGroup.isEmpty ? "N/A" : appState.getUserBloodGroup.isEmpty}",
+                        labelText: "Blood: ${appState.getUserBloodGroup.isEmpty ? "N/A" : appState.getUserBloodGroup}",
                         iconColor: AppColors.primaryRedColor,
-                        labelPadding: EdgeInsetsDirectional.only(end: 4.w),
+                        labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
                         padding: EdgeInsets.zero,
                       ),
                       Consumer(builder: (context, insuranceVM, child) {
@@ -240,7 +241,7 @@ class _MedicalFilePageState extends State {
                           textColor: insuranceVM.isInsuranceExpired ? AppColors.primaryRedColor : AppColors.successColor,
                           iconSize: 12.w,
                           backgroundColor: insuranceVM.isInsuranceExpired ? AppColors.primaryRedColor.withOpacity(0.1) : AppColors.successColor.withOpacity(0.1),
-                          labelPadding: EdgeInsetsDirectional.only(end: 8.w),
+                          labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w),
                         );
                       }),
                     ],
@@ -939,7 +940,7 @@ class _MedicalFilePageState extends State {
                   label: "Update Insurance".needTranslation,
                   textColor: AppColors.blackColor,
                   backgroundColor: AppColors.whiteColor,
-                  svgIcon: AppAssets.eye_result_icon,
+                  svgIcon: AppAssets.update_insurance_icon,
                   isLargeText: true,
                   iconSize: 36.w,
                 ).onPress(() {
@@ -949,7 +950,7 @@ class _MedicalFilePageState extends State {
                   label: "${LocaleKeys.insurance.tr(context: context)} ${LocaleKeys.approvals.tr(context: context)}",
                   textColor: AppColors.blackColor,
                   backgroundColor: AppColors.whiteColor,
-                  svgIcon: AppAssets.eye_result_icon,
+                  svgIcon: AppAssets.insurance_approval_icon,
                   isLargeText: true,
                   iconSize: 36.w,
                 ).onPress(() {
@@ -963,7 +964,7 @@ class _MedicalFilePageState extends State {
                   label: "My Invoices List".needTranslation,
                   textColor: AppColors.blackColor,
                   backgroundColor: AppColors.whiteColor,
-                  svgIcon: AppAssets.eye_result_icon,
+                  svgIcon: AppAssets.invoices_list_icon,
                   isLargeText: true,
                   iconSize: 36.w,
                 ),
@@ -971,7 +972,7 @@ class _MedicalFilePageState extends State {
                   label: "Ancillary Orders List".needTranslation,
                   textColor: AppColors.blackColor,
                   backgroundColor: AppColors.whiteColor,
-                  svgIcon: AppAssets.eye_result_icon,
+                  svgIcon: AppAssets.ancillary_orders_list_icon,
                   isLargeText: true,
                   iconSize: 36.w,
                 ),
@@ -1026,7 +1027,7 @@ class _MedicalFilePageState extends State {
                   label: LocaleKeys.monthlyReports.tr(context: context),
                   textColor: AppColors.blackColor,
                   backgroundColor: AppColors.whiteColor,
-                  svgIcon: AppAssets.eye_result_icon,
+                  svgIcon: AppAssets.monthly_reports_icon,
                   isLargeText: true,
                   iconSize: 36.h,
                 ),
@@ -1034,7 +1035,7 @@ class _MedicalFilePageState extends State {
                   label: "Medical Reports".needTranslation,
                   textColor: AppColors.blackColor,
                   backgroundColor: AppColors.whiteColor,
-                  svgIcon: AppAssets.allergy_info_icon,
+                  svgIcon: AppAssets.medical_reports_icon,
                   isLargeText: true,
                   iconSize: 36.h,
                 ).onPress(() {
@@ -1050,7 +1051,7 @@ class _MedicalFilePageState extends State {
                   label: "Sick Leave Report".needTranslation,
                   textColor: AppColors.blackColor,
                   backgroundColor: AppColors.whiteColor,
-                  svgIcon: AppAssets.vaccine_info_icon,
+                  svgIcon: AppAssets.sick_leave_report_icon,
                   isLargeText: true,
                   iconSize: 36.h,
                 ).onPress(() {
diff --git a/lib/presentation/medical_file/patient_sickleaves_list_page.dart b/lib/presentation/medical_file/patient_sickleaves_list_page.dart
index a28f518..709e4e3 100644
--- a/lib/presentation/medical_file/patient_sickleaves_list_page.dart
+++ b/lib/presentation/medical_file/patient_sickleaves_list_page.dart
@@ -47,7 +47,9 @@ class _PatientSickleavesListPageState extends State {
             return Column(
               crossAxisAlignment: CrossAxisAlignment.start,
               children: [
+                SizedBox(height: 24.h),
                 ListView.separated(
+                  padding: EdgeInsets.zero,
                   scrollDirection: Axis.vertical,
                   itemCount: medicalFileVM.isPatientSickLeaveListLoading
                       ? 3
diff --git a/lib/presentation/todo_section/ancillary_order_payment_page.dart b/lib/presentation/todo_section/ancillary_order_payment_page.dart
index f9995dc..5263643 100644
--- a/lib/presentation/todo_section/ancillary_order_payment_page.dart
+++ b/lib/presentation/todo_section/ancillary_order_payment_page.dart
@@ -180,7 +180,6 @@ class _AncillaryOrderPaymentPageState extends State {
                   ),
                 ),
               ),
-
               // Payment Summary Footer
               todoVM.isProcessingPayment ? SizedBox.shrink() : _buildPaymentSummary()
             ],
@@ -220,7 +219,7 @@ class _AncillaryOrderPaymentPageState extends State {
               children: [
                 "Amount before tax".needTranslation.toText14(isBold: true),
                 Utils.getPaymentAmountWithSymbol(
-                  amountBeforeTax.toString().toText16(isBold: true),
+                  amountBeforeTax.toStringAsFixed(2).toText16(isBold: true),
                   AppColors.blackColor,
                   13,
                   isSaudiCurrency: true,
@@ -234,7 +233,7 @@ class _AncillaryOrderPaymentPageState extends State {
               children: [
                 "VAT 15%".needTranslation.toText14(isBold: true, color: AppColors.greyTextColor),
                 Utils.getPaymentAmountWithSymbol(
-                  taxAmount.toString().toText14(isBold: true, color: AppColors.greyTextColor),
+                  taxAmount.toStringAsFixed(2).toText14(isBold: true, color: AppColors.greyTextColor),
                   AppColors.greyTextColor,
                   13,
                   isSaudiCurrency: true,
@@ -250,7 +249,7 @@ class _AncillaryOrderPaymentPageState extends State {
               children: [
                 "".needTranslation.toText14(isBold: true),
                 Utils.getPaymentAmountWithSymbol(
-                  widget.totalAmount.toString().toText24(isBold: true),
+                  widget.totalAmount.toStringAsFixed(2).toText24(isBold: true),
                   AppColors.blackColor,
                   17,
                   isSaudiCurrency: true,
diff --git a/lib/presentation/todo_section/ancillary_procedures_details_page.dart b/lib/presentation/todo_section/ancillary_procedures_details_page.dart
index 449d21e..cb6cbd2 100644
--- a/lib/presentation/todo_section/ancillary_procedures_details_page.dart
+++ b/lib/presentation/todo_section/ancillary_procedures_details_page.dart
@@ -1,6 +1,7 @@
 import 'dart:async';
 
 import 'package:collection/collection.dart';
+import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
 import 'package:hmg_patient_app_new/core/app_assets.dart';
@@ -13,6 +14,7 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
 import 'package:hmg_patient_app_new/features/todo_section/models/resp_models/ancillary_order_list_response_model.dart';
 import 'package:hmg_patient_app_new/features/todo_section/models/resp_models/ancillary_order_procedures_detail_response_model.dart';
 import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
 import 'package:hmg_patient_app_new/presentation/todo_section/ancillary_order_payment_page.dart';
 import 'package:hmg_patient_app_new/presentation/todo_section/widgets/ancillary_orders_list.dart';
 import 'package:hmg_patient_app_new/theme/colors.dart';
@@ -130,7 +132,6 @@ class _AncillaryOrderDetailsListState extends State {
         if (viewModel.patientAncillaryOrderProceduresList.isNotEmpty) {
           orderData = viewModel.patientAncillaryOrderProceduresList[0];
         }
-
         return Column(
           children: [
             Expanded(
@@ -618,39 +619,102 @@ class _AncillaryOrderDetailsListState extends State {
 
   Widget _buildStickyPaymentButton(orderData) {
     final isButtonEnabled = selectedProcedures.isNotEmpty;
-    return Column(
-      mainAxisAlignment: MainAxisAlignment.spaceBetween,
-      children: [
-        SizedBox(height: 16.h),
-        _buildSummarySection(orderData),
-        SizedBox(height: 16.h),
-        CustomButton(
-          borderWidth: 0,
-          backgroundColor: AppColors.infoLightColor,
-          text: "Proceed to Payment".needTranslation,
-          onPressed: () {
-            // Navigate to payment page with selected procedures
-            Navigator.of(context).push(
-              CustomPageRoute(
-                page: AncillaryOrderPaymentPage(
-                  appointmentNoVida: widget.appointmentNoVida,
-                  orderNo: widget.orderNo,
-                  projectID: widget.projectID,
-                  selectedProcedures: selectedProcedures,
-                  totalAmount: _getTotalAmount(),
-                  appointmentDate: orderData.appointmentDate,
-                ),
+    return Container(
+      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+        color: AppColors.whiteColor,
+        borderRadius: 24.r,
+        hasShadow: true,
+      ),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          SizedBox(height: 4.h),
+          Row(
+            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+            children: [
+              Expanded(child: LocaleKeys.upcomingPaymentNow.tr(context: context).toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor)),
+            ],
+          ),
+          SizedBox(height: 18.h),
+          Row(
+            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+            children: [
+              SizedBox(
+                width: 150.h,
+                child: Utils.getPaymentMethods(),
               ),
-            );
-          },
-          isDisabled: !isButtonEnabled,
-          textColor: AppColors.whiteColor,
-          borderRadius: 12.r,
-          borderColor: Colors.transparent,
-          padding: EdgeInsets.symmetric(vertical: 16.h),
-        ),
-        SizedBox(height: 22.h),
-      ],
-    ).paddingSymmetrical(24.w, 0);
+              Row(
+                mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                children: [
+                  Utils.getPaymentAmountWithSymbol(_getTotalAmount().toStringAsFixed(2).toText24(isBold: true), AppColors.blackColor, 17, isSaudiCurrency: true),
+                ],
+              ),
+            ],
+          ),
+          SizedBox(height: 16.h),
+          CustomButton(
+            borderWidth: 0,
+            backgroundColor: AppColors.infoLightColor,
+            text: "Proceed to Payment".needTranslation,
+            onPressed: () {
+              // Navigate to payment page with selected procedures
+              Navigator.of(context).push(
+                CustomPageRoute(
+                  page: AncillaryOrderPaymentPage(
+                    appointmentNoVida: widget.appointmentNoVida,
+                    orderNo: widget.orderNo,
+                    projectID: widget.projectID,
+                    selectedProcedures: selectedProcedures,
+                    totalAmount: _getTotalAmount(),
+                    appointmentDate: orderData.appointmentDate,
+                  ),
+                ),
+              );
+            },
+            isDisabled: !isButtonEnabled,
+            textColor: AppColors.whiteColor,
+            borderRadius: 12.r,
+            borderColor: Colors.transparent,
+            padding: EdgeInsets.symmetric(vertical: 16.h),
+          ),
+          SizedBox(height: 22.h),
+        ],
+      ).paddingOnly(left: 16.h, top: 24.h, right: 16.h, bottom: 0.h),
+    );
+
+    //   Column(
+    //   mainAxisAlignment: MainAxisAlignment.spaceBetween,
+    //   children: [
+    //     SizedBox(height: 16.h),
+    //     _buildSummarySection(orderData),
+    //     SizedBox(height: 16.h),
+    //     CustomButton(
+    //       borderWidth: 0,
+    //       backgroundColor: AppColors.infoLightColor,
+    //       text: "Proceed to Payment".needTranslation,
+    //       onPressed: () {
+    //         // Navigate to payment page with selected procedures
+    //         Navigator.of(context).push(
+    //           CustomPageRoute(
+    //             page: AncillaryOrderPaymentPage(
+    //               appointmentNoVida: widget.appointmentNoVida,
+    //               orderNo: widget.orderNo,
+    //               projectID: widget.projectID,
+    //               selectedProcedures: selectedProcedures,
+    //               totalAmount: _getTotalAmount(),
+    //               appointmentDate: orderData.appointmentDate,
+    //             ),
+    //           ),
+    //         );
+    //       },
+    //       isDisabled: !isButtonEnabled,
+    //       textColor: AppColors.whiteColor,
+    //       borderRadius: 12.r,
+    //       borderColor: Colors.transparent,
+    //       padding: EdgeInsets.symmetric(vertical: 16.h),
+    //     ),
+    //     SizedBox(height: 22.h),
+    //   ],
+    // ).paddingSymmetrical(24.w, 0);
   }
 }
diff --git a/lib/presentation/todo_section/todo_page.dart b/lib/presentation/todo_section/todo_page.dart
index 11e258f..8907fc8 100644
--- a/lib/presentation/todo_section/todo_page.dart
+++ b/lib/presentation/todo_section/todo_page.dart
@@ -68,6 +68,7 @@ class _ToDoPageState extends State {
           children: [
             SizedBox(height: 16.h),
             "Ancillary Orders".needTranslation.toText18(isBold: true),
+            SizedBox(height: 24.h),
             Consumer(
               builder: (BuildContext context, TodoSectionViewModel todoSectionViewModel, Widget? child) {
                 return todoSectionViewModel.isAncillaryOrdersLoading
@@ -82,8 +83,9 @@ class _ToDoPageState extends State {
                             orderNo: order.orderNo ?? 0,
                             projectID: order.projectID ?? 0,
                             projectName: order.projectName ?? "",
-                          )));
-                          log("View details for order: ${order.orderNo}");
+                              ),
+                            ),
+                          );
                         },
                       );
               },
diff --git a/lib/presentation/todo_section/widgets/ancillary_orders_list.dart b/lib/presentation/todo_section/widgets/ancillary_orders_list.dart
index 31a778f..8a3e3fa 100644
--- a/lib/presentation/todo_section/widgets/ancillary_orders_list.dart
+++ b/lib/presentation/todo_section/widgets/ancillary_orders_list.dart
@@ -35,10 +35,10 @@ class AncillaryOrdersList extends StatelessWidget {
       shrinkWrap: true,
       physics: const NeverScrollableScrollPhysics(),
       itemCount: orders.length,
+      padding: EdgeInsets.zero,
       separatorBuilder: (BuildContext context, int index) => SizedBox(height: 12.h),
       itemBuilder: (context, index) {
         final order = orders[index];
-
         return AnimationConfiguration.staggeredList(
           position: index,
           duration: const Duration(milliseconds: 500),

From cf26e716459f480cca34ff9b6d3333f34a1359e6 Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Thu, 11 Dec 2025 17:00:00 +0300
Subject: [PATCH 12/55] Complete USerInfo Selectoiun

---
 .../symptoms_checker_view_model.dart          | 103 ++++----
 .../symptoms_checker/user_info_selection.dart | 227 +++++++++++-----
 .../pages/age_selection_page.dart             |  21 +-
 .../pages/height_selection_page.dart          | 177 +++++++------
 .../pages/weight_selection_page.dart          | 220 ++++++----------
 .../user_info_flow_manager.dart               | 246 +++++++++++-------
 .../widgets/custom_date_picker.dart           | 235 +++++++++++++++++
 .../widgets/height_scale.dart                 | 169 ++++++++++++
 .../widgets/triangle_indicator.dart           |  85 ++++++
 .../widgets/user_info_progress_bar.dart       |  36 ---
 .../widgets/user_info_selection_scaffold.dart |  67 -----
 .../widgets/user_info_sticky_bottom_card.dart |  68 -----
 .../widgets/weight_scale.dart                 | 180 +++++++++++++
 lib/widgets/appbar/collapsing_list_view.dart  |  20 +-
 14 files changed, 1221 insertions(+), 633 deletions(-)
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/custom_date_picker.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/height_scale.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/triangle_indicator.dart
 delete mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart
 delete mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_selection_scaffold.dart
 delete mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart
 create mode 100644 lib/presentation/symptoms_checker/user_info_selection/widgets/weight_scale.dart

diff --git a/lib/features/symptoms_checker/symptoms_checker_view_model.dart b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
index 34a1754..1b43fc2 100644
--- a/lib/features/symptoms_checker/symptoms_checker_view_model.dart
+++ b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
@@ -39,10 +39,11 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   // User Info Flow State
   int _userInfoCurrentPage = 0;
   String? _selectedGender;
+  DateTime? _dateOfBirth;
   int? _selectedAge;
-  double? _selectedHeight;
+  double _selectedHeight = 170;
   bool _isHeightCm = true;
-  double? _selectedWeight;
+  double _selectedWeight = 60;
   bool _isWeightKg = true;
 
   // Getters
@@ -51,11 +52,19 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
 
   // User Info Getters
   int get userInfoCurrentPage => _userInfoCurrentPage;
+
   String? get selectedGender => _selectedGender;
+
+  DateTime? get dateOfBirth => _dateOfBirth;
+
   int? get selectedAge => _selectedAge;
+
   double? get selectedHeight => _selectedHeight;
+
   bool get isHeightCm => _isHeightCm;
+
   double? get selectedWeight => _selectedWeight;
+
   bool get isWeightKg => _isWeightKg;
 
   BodyView get currentView => _currentView;
@@ -84,23 +93,22 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   /// Get count of selected organs
   int get selectedOrgansCount => _selectedOrganIds.length;
 
-   List get organSymptomsResults {
+  List get organSymptomsResults {
     if (bodySymptomResponse?.dataDetails?.result == null) {
       return [];
     }
     return bodySymptomResponse!.dataDetails!.result ?? [];
   }
 
-   int get totalSelectedSymptomsCount {
+  int get totalSelectedSymptomsCount {
     return _selectedSymptomsByOrgan.values.fold(0, (sum, symptomIds) => sum + symptomIds.length);
   }
 
-   bool get hasSelectedSymptoms {
+  bool get hasSelectedSymptoms {
     return _selectedSymptomsByOrgan.values.any((symptomIds) => symptomIds.isNotEmpty);
   }
 
-
-   void toggleView() {
+  void toggleView() {
     _currentView = _currentView == BodyView.front ? BodyView.back : BodyView.front;
     notifyListeners();
   }
@@ -110,7 +118,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-   void toggleOrganSelection(String organId) {
+  void toggleOrganSelection(String organId) {
     if (_selectedOrganIds.contains(organId)) {
       _selectedOrganIds.remove(organId);
     } else {
@@ -123,10 +131,10 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-   void _showTooltip(String organId) {
-     _tooltipTimer?.cancel();
+  void _showTooltip(String organId) {
+    _tooltipTimer?.cancel();
 
-     _tooltipOrganId = organId;
+    _tooltipOrganId = organId;
     notifyListeners();
 
     // Hide tooltip after 2 seconds
@@ -143,39 +151,39 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-   void removeOrgan(String organId) {
+  void removeOrgan(String organId) {
     _selectedOrganIds.remove(organId);
     notifyListeners();
   }
 
-   void clearAllSelections() {
+  void clearAllSelections() {
     _selectedOrganIds.clear();
     notifyListeners();
   }
 
-   void toggleBottomSheet() {
+  void toggleBottomSheet() {
     _isBottomSheetExpanded = !_isBottomSheetExpanded;
     notifyListeners();
   }
 
-   void setBottomSheetExpanded(bool isExpanded) {
+  void setBottomSheetExpanded(bool isExpanded) {
     _isBottomSheetExpanded = isExpanded;
     notifyListeners();
   }
 
-   bool validateSelection() {
+  bool validateSelection() {
     return _selectedOrganIds.isNotEmpty;
   }
 
-   List getSelectedOrganIds() {
+  List getSelectedOrganIds() {
     return _selectedOrganIds.toList();
   }
 
-   List getSelectedOrganNames() {
+  List getSelectedOrganNames() {
     return selectedOrgans.map((organ) => organ.description).toList();
   }
 
-   Future initializeSymptomGroups({
+  Future initializeSymptomGroups({
     Function()? onSuccess,
     Function(String)? onError,
   }) async {
@@ -186,12 +194,12 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
       return;
     }
 
-     List organNames = selectedOrgans.map((organ) => organ.name).toList();
+    List organNames = selectedOrgans.map((organ) => organ.name).toList();
 
-     await getBodySymptomsByName(
+    await getBodySymptomsByName(
       organNames: organNames,
       onSuccess: (response) {
-         if (onSuccess != null) {
+        if (onSuccess != null) {
           onSuccess();
         }
       },
@@ -203,7 +211,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     );
   }
 
-   void toggleSymptomSelection(String organId, String symptomId) {
+  void toggleSymptomSelection(String organId, String symptomId) {
     if (!_selectedSymptomsByOrgan.containsKey(organId)) {
       _selectedSymptomsByOrgan[organId] = {};
     }
@@ -216,11 +224,11 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
-   bool isSymptomSelected(String organId, String symptomId) {
+  bool isSymptomSelected(String organId, String symptomId) {
     return _selectedSymptomsByOrgan[organId]?.contains(symptomId) ?? false;
   }
 
-   List getAllSelectedSymptoms() {
+  List getAllSelectedSymptoms() {
     List allSymptoms = [];
 
     if (bodySymptomResponse?.dataDetails?.result == null) {
@@ -228,7 +236,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     }
 
     for (var organResult in bodySymptomResponse!.dataDetails!.result!) {
-       String? matchingOrganId;
+      String? matchingOrganId;
       for (var organ in selectedOrgans) {
         if (organ.name == organResult.name) {
           matchingOrganId = organ.id;
@@ -252,12 +260,12 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     return allSymptoms;
   }
 
-   void clearAllSymptomSelections() {
+  void clearAllSymptomSelections() {
     _selectedSymptomsByOrgan.clear();
     notifyListeners();
   }
 
-   void reset() {
+  void reset() {
     _currentView = BodyView.front;
     _selectedOrganIds.clear();
     _selectedSymptomsByOrgan.clear();
@@ -268,10 +276,11 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     // Reset user info flow
     _userInfoCurrentPage = 0;
     _selectedGender = null;
+    _dateOfBirth = null;
     _selectedAge = null;
-    _selectedHeight = null;
+    _selectedHeight = 170;
     _isHeightCm = true;
-    _selectedWeight = null;
+    _selectedWeight = 60;
     _isWeightKg = true;
     notifyListeners();
   }
@@ -312,6 +321,19 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
+  /// Set date of birth
+  void setDateOfBirth(DateTime dateOfBirth) {
+    _dateOfBirth = dateOfBirth;
+    // Calculate age from date of birth
+    final now = DateTime.now();
+    int age = now.year - dateOfBirth.year;
+    if (now.month < dateOfBirth.month || (now.month == dateOfBirth.month && now.day < dateOfBirth.day)) {
+      age--;
+    }
+    _selectedAge = age;
+    notifyListeners();
+  }
+
   /// Set selected height
   void setHeight(double height, bool isCm) {
     _selectedHeight = height;
@@ -329,10 +351,13 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   /// Check if user info page is last
   bool get isUserInfoLastPage => _userInfoCurrentPage == 3;
 
+  bool get isUserInfoFirstPage => _userInfoCurrentPage == 0;
+
   /// Validate and submit user info
   Map getUserInfoData() {
     return {
       'gender': _selectedGender,
+      'dateOfBirth': _dateOfBirth?.toIso8601String(),
       'age': _selectedAge,
       'height': _selectedHeight,
       'heightUnit': _isHeightCm ? 'cm' : 'ft',
@@ -341,19 +366,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     };
   }
 
-  /// Reset user info flow
-  void resetUserInfo() {
-    _userInfoCurrentPage = 0;
-    _selectedGender = null;
-    _selectedAge = null;
-    _selectedHeight = null;
-    _isHeightCm = true;
-    _selectedWeight = null;
-    _isWeightKg = true;
-    notifyListeners();
-  }
-
-   Future getBodySymptomsByName({
+  Future getBodySymptomsByName({
     required List organNames,
     Function(BodySymptomResponseModel)? onSuccess,
     Function(String)? onError,
@@ -366,7 +379,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     );
 
     result.fold(
-       (failure) async {
+      (failure) async {
         isBodySymptomsLoading = false;
         notifyListeners();
         await errorHandlerService.handleError(failure: failure);
@@ -374,7 +387,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
           onError(failure.toString());
         }
       },
-       (apiResponse) {
+      (apiResponse) {
         isBodySymptomsLoading = false;
         if (apiResponse.messageStatus == 1 && apiResponse.data != null) {
           bodySymptomResponse = apiResponse.data;
diff --git a/lib/presentation/symptoms_checker/user_info_selection.dart b/lib/presentation/symptoms_checker/user_info_selection.dart
index 2fb6cc9..9a66a65 100644
--- a/lib/presentation/symptoms_checker/user_info_selection.dart
+++ b/lib/presentation/symptoms_checker/user_info_selection.dart
@@ -7,13 +7,63 @@ 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/symptoms_checker/symptoms_checker_view_model.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:provider/provider.dart';
 
-class UserInfoSelectionScreen extends StatelessWidget {
+class UserInfoSelectionScreen extends StatefulWidget {
   const UserInfoSelectionScreen({super.key});
 
+  @override
+  State createState() => _UserInfoSelectionScreenState();
+}
+
+class _UserInfoSelectionScreenState extends State {
+  @override
+  void initState() {
+    super.initState();
+    WidgetsBinding.instance.addPostFrameCallback((_) {
+      _initializeUserInfo();
+    });
+  }
+
+  /// Initialize user info from appState if user is logged in
+  void _initializeUserInfo() {
+    final appState = getIt.get();
+    final viewModel = context.read();
+
+    if (appState.isAuthenticated) {
+      final user = appState.getAuthenticatedUser();
+
+      if (user == null) return;
+
+      // Populate gender (gender is int: 1=Male, 2=Female)
+      if (user.gender != null) {
+        String genderStr = user.gender == 1
+            ? "Male"
+            : user.gender == 2
+                ? "Female"
+                : "Other";
+        viewModel.setGender(genderStr);
+      }
+
+      if (user.dateofBirth != null && user.dateofBirth!.isNotEmpty) {
+        try {
+          DateTime dob = DateTime.parse(user.dateofBirth!);
+          viewModel.setDateOfBirth(dob);
+        } catch (e) {
+          // If date parsing fails, ignore and let user fill manually
+        }
+      }
+
+      // Note: AuthenticatedUser doesn't have height/weight fields
+      // User will need to fill these manually
+    }
+    // If not authenticated or fields are empty, user will fill them manually
+  }
+
   _buildEditInfoTile({
     required String leadingIcon,
     required String title,
@@ -69,79 +119,111 @@ class UserInfoSelectionScreen extends StatelessWidget {
     } else {
       name = "Guest";
     }
+
     return Scaffold(
       backgroundColor: AppColors.bgScaffoldColor,
-      body: Column(
-        children: [
-          Expanded(
-            child: CollapsingListView(
-              title: "Symptoms Checker".needTranslation,
-              isLeading: true,
-              child: SingleChildScrollView(
-                child: Column(
-                  children: [
-                    Container(
-                      width: double.infinity,
-                      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
-                      padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
-                      child: Column(
-                        children: [
-                          "Hi $name, Is your information up to date?".needTranslation.toText18(
-                                weight: FontWeight.w600,
-                                color: AppColors.textColor,
+      body: Consumer(
+        builder: (context, viewModel, child) {
+          // Check if any field is empty
+          bool hasEmptyFields = viewModel.selectedGender == null ||
+              viewModel.selectedAge == null ||
+              viewModel.selectedHeight == null ||
+              viewModel.selectedWeight == null;
+
+          // Get display values
+          String genderText = viewModel.selectedGender ?? "Not set";
+          // Show age calculated from DOB, not the DOB itself
+          String ageText = viewModel.selectedAge != null ? "${viewModel.selectedAge} Years" : "Not set";
+          String heightText =
+              viewModel.selectedHeight != null ? "${viewModel.selectedHeight!.round()} ${viewModel.isHeightCm ? 'cm' : 'ft'}" : "Not set";
+          String weightText =
+              viewModel.selectedWeight != null ? "${viewModel.selectedWeight!.round()} ${viewModel.isWeightKg ? 'kg' : 'lbs'}" : "Not set";
+
+          return Column(
+            children: [
+              Expanded(
+                child: CollapsingListView(
+                  title: "Symptoms Checker".needTranslation,
+                  isLeading: true,
+                  child: SingleChildScrollView(
+                    child: Column(
+                      children: [
+                        Container(
+                          width: double.infinity,
+                          decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
+                          padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
+                          child: Column(
+                            children: [
+                              "Hello $name, Is your information up to date?".needTranslation.toText18(
+                                    weight: FontWeight.w600,
+                                    color: AppColors.textColor,
+                                  ),
+                              SizedBox(height: 24.h),
+                              _buildEditInfoTile(
+                                context: context,
+                                leadingIcon: AppAssets.genderIcon,
+                                title: "Gender".needTranslation,
+                                subTitle: genderText,
+                                onTap: () {
+                                  viewModel.setUserInfoPage(0);
+                                  context.navigateWithName(AppRoutes.userInfoFlowManager);
+                                },
+                                trailingIcon: AppAssets.edit_icon,
                               ),
-                          SizedBox(height: 24.h),
-                          _buildEditInfoTile(
-                            context: context,
-                            leadingIcon: AppAssets.genderIcon,
-                            title: "Gender".needTranslation,
-                            subTitle: "Male".needTranslation,
-                            onTap: () {},
-                            trailingIcon: AppAssets.edit_icon,
-                          ),
-                          _getDivider(),
-                          _buildEditInfoTile(
-                            context: context,
-                            leadingIcon: AppAssets.calendar,
-                            title: "Age".needTranslation,
-                            subTitle: "32 Years",
-                            iconColor: AppColors.greyTextColor,
-                            onTap: () {},
-                            trailingIcon: AppAssets.edit_icon,
-                          ),
-                          _getDivider(),
-                          _buildEditInfoTile(
-                            context: context,
-                            leadingIcon: AppAssets.rulerIcon,
-                            title: "Height".needTranslation,
-                            subTitle: "17 8cm",
-                            onTap: () {},
-                            trailingIcon: AppAssets.edit_icon,
-                          ),
-                          _getDivider(),
-                          _buildEditInfoTile(
-                            context: context,
-                            leadingIcon: AppAssets.weightScale,
-                            title: "Weight".needTranslation,
-                            subTitle: "88 kg",
-                            onTap: () {},
-                            trailingIcon: AppAssets.edit_icon,
+                              _getDivider(),
+                              _buildEditInfoTile(
+                                context: context,
+                                leadingIcon: AppAssets.calendarGrey,
+                                title: "Age".needTranslation,
+                                subTitle: ageText,
+                                iconColor: AppColors.greyTextColor,
+                                onTap: () {
+                                  viewModel.setUserInfoPage(1);
+                                  context.navigateWithName(AppRoutes.userInfoFlowManager);
+                                },
+                                trailingIcon: AppAssets.edit_icon,
+                              ),
+                              _getDivider(),
+                              _buildEditInfoTile(
+                                context: context,
+                                leadingIcon: AppAssets.rulerIcon,
+                                title: "Height".needTranslation,
+                                subTitle: heightText,
+                                onTap: () {
+                                  viewModel.setUserInfoPage(2);
+                                  context.navigateWithName(AppRoutes.userInfoFlowManager);
+                                },
+                                trailingIcon: AppAssets.edit_icon,
+                              ),
+                              _getDivider(),
+                              _buildEditInfoTile(
+                                context: context,
+                                leadingIcon: AppAssets.weightScale,
+                                title: "Weight".needTranslation,
+                                subTitle: weightText,
+                                onTap: () {
+                                  viewModel.setUserInfoPage(3);
+                                  context.navigateWithName(AppRoutes.userInfoFlowManager);
+                                },
+                                trailingIcon: AppAssets.edit_icon,
+                              ),
+                            ],
                           ),
-                        ],
-                      ),
-                    ),
-                  ],
-                ).paddingAll(24.w),
+                        ),
+                      ],
+                    ).paddingAll(24.w),
+                  ),
+                ),
               ),
-            ),
-          ),
-          _buildBottomCard(context),
-        ],
+              _buildBottomCard(context, hasEmptyFields),
+            ],
+          );
+        },
       ),
     );
   }
 
-  Widget _buildBottomCard(BuildContext context) {
+  Widget _buildBottomCard(BuildContext context, bool hasEmptyFields) {
     return Container(
       decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r),
       child: SafeArea(
@@ -157,7 +239,10 @@ class UserInfoSelectionScreen extends StatelessWidget {
                     text: "No, Edit all".needTranslation,
                     icon: AppAssets.edit_icon,
                     iconColor: AppColors.primaryRedColor,
-                    onPressed: () => context.navigateWithName(AppRoutes.userInfoFlowManager),
+                    onPressed: () {
+                      context.read().setUserInfoPage(0);
+                      context.navigateWithName(AppRoutes.userInfoFlowManager);
+                    },
                     backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
                     borderColor: Colors.transparent,
                     textColor: AppColors.primaryRedColor,
@@ -170,10 +255,12 @@ class UserInfoSelectionScreen extends StatelessWidget {
                     text: "Yes, It is".needTranslation,
                     icon: AppAssets.tickIcon,
                     iconColor: AppColors.whiteColor,
-                    onPressed: () => () {},
-                    backgroundColor: AppColors.primaryRedColor,
-                    borderColor: AppColors.primaryRedColor,
-                    textColor: AppColors.whiteColor,
+                    onPressed: hasEmptyFields
+                        ? () {} // Empty function for disabled state
+                        : () => context.navigateWithName(AppRoutes.organSelectorPage),
+                    backgroundColor: hasEmptyFields ? AppColors.greyLightColor : AppColors.primaryRedColor,
+                    borderColor: hasEmptyFields ? AppColors.greyLightColor : AppColors.primaryRedColor,
+                    textColor: hasEmptyFields ? AppColors.greyTextColor : AppColors.whiteColor,
                     fontSize: 16.f,
                   ),
                 ),
diff --git a/lib/presentation/symptoms_checker/user_info_selection/pages/age_selection_page.dart b/lib/presentation/symptoms_checker/user_info_selection/pages/age_selection_page.dart
index 6433b93..d73f387 100644
--- a/lib/presentation/symptoms_checker/user_info_selection/pages/age_selection_page.dart
+++ b/lib/presentation/symptoms_checker/user_info_selection/pages/age_selection_page.dart
@@ -1,7 +1,11 @@
-import 'package:flutter/material.dart';
+import 'dart:developer';
+
+import 'package:flutter/cupertino.dart';
 import 'package:hmg_patient_app_new/core/app_export.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/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/custom_date_picker.dart';
 import 'package:hmg_patient_app_new/theme/colors.dart';
 import 'package:provider/provider.dart';
 
@@ -19,14 +23,21 @@ class AgeSelectionPage extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return SingleChildScrollView(
-      padding: EdgeInsets.all(24.w),
       child: Consumer(
         builder: (BuildContext context, symptomsViewModel, Widget? child) {
           return Column(
             children: [
-              "What is your gender?".needTranslation.toText18(weight: FontWeight.w600, color: AppColors.textColor),
-              SizedBox(height: 70.h),
-              "< Age Widget Here >".needTranslation.toText18(weight: FontWeight.w600, color: AppColors.greyTextColor),
+              "What is your Date of Birth?".needTranslation.toText18(weight: FontWeight.w600, color: AppColors.textColor).paddingAll(24.w),
+              SizedBox(height: 30.h),
+              ThreeColumnDatePicker(
+                enableHaptic: true,
+                enableSound: true,
+                initialDate: symptomsViewModel.dateOfBirth ?? DateTime(2000, 1, 1),
+                onDateChanged: (date) {
+                  symptomsViewModel.setDateOfBirth(date);
+                  log('DOB saved: $date, Age: ${symptomsViewModel.selectedAge}');
+                },
+              )
             ],
           );
         },
diff --git a/lib/presentation/symptoms_checker/user_info_selection/pages/height_selection_page.dart b/lib/presentation/symptoms_checker/user_info_selection/pages/height_selection_page.dart
index e10aca3..0744e81 100644
--- a/lib/presentation/symptoms_checker/user_info_selection/pages/height_selection_page.dart
+++ b/lib/presentation/symptoms_checker/user_info_selection/pages/height_selection_page.dart
@@ -1,36 +1,19 @@
+import 'dart:developer';
+
 import 'package:flutter/material.dart';
 import 'package:hmg_patient_app_new/core/app_export.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/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/height_scale.dart';
 import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:provider/provider.dart';
 
 /// Height selection page content
-class HeightSelectionPage extends StatefulWidget {
-  final double height;
-  final bool isCm;
-  final Function(double, bool) onHeightChanged;
-
-  const HeightSelectionPage({
-    super.key,
-    required this.height,
-    required this.isCm,
-    required this.onHeightChanged,
-  });
+class HeightSelectionPage extends StatelessWidget {
+  const HeightSelectionPage({super.key});
 
-  @override
-  State createState() => _HeightSelectionPageState();
-}
-
-class _HeightSelectionPageState extends State {
-  late double heightValue;
-
-  @override
-  void initState() {
-    super.initState();
-    heightValue = widget.height;
-  }
-
-  Widget _unitSelector() {
+  Widget _unitSelector(SymptomsCheckerViewModel viewModel) {
     return Container(
       height: 54.h,
       padding: EdgeInsets.all(4.h),
@@ -43,13 +26,12 @@ class _HeightSelectionPageState extends State {
           final tabWidth = (constraints.maxWidth - 8.w) / 2;
           return Stack(
             children: [
-              // Animated sliding indicator
               AnimatedContainer(
                 duration: const Duration(milliseconds: 250),
                 curve: Curves.easeInOut,
                 width: tabWidth,
                 height: constraints.maxHeight,
-                margin: EdgeInsets.only(left: widget.isCm ? 0 : tabWidth + 8.w),
+                margin: EdgeInsets.only(left: viewModel.isHeightCm ? 0 : tabWidth + 8.w),
                 decoration: BoxDecoration(
                   color: AppColors.bottomNAVBorder,
                   borderRadius: BorderRadius.circular(7.r),
@@ -61,10 +43,9 @@ class _HeightSelectionPageState extends State {
                   Expanded(
                     child: GestureDetector(
                       onTap: () {
-                        if (!widget.isCm) {
-                          // Convert from FT to CM (1 ft = 30.48 cm)
-                          final convertedHeight = heightValue * 30.48;
-                          widget.onHeightChanged(convertedHeight, true);
+                        if (!viewModel.isHeightCm) {
+                          final convertedHeight = viewModel.selectedHeight! * 30.48;
+                          viewModel.setHeight(convertedHeight, true);
                         }
                       },
                       child: Container(
@@ -75,7 +56,7 @@ class _HeightSelectionPageState extends State {
                           style: TextStyle(
                             fontWeight: FontWeight.w700,
                             fontSize: 14.f,
-                            color: widget.isCm ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
+                            color: viewModel.isHeightCm ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
                           ),
                         ),
                       ),
@@ -84,10 +65,9 @@ class _HeightSelectionPageState extends State {
                   Expanded(
                     child: GestureDetector(
                       onTap: () {
-                        if (widget.isCm) {
-                          // Convert from CM to FT (1 cm = 0.0328084 ft)
-                          final convertedHeight = heightValue / 30.48;
-                          widget.onHeightChanged(convertedHeight, false);
+                        if (viewModel.isHeightCm) {
+                          final convertedHeight = viewModel.selectedHeight! / 30.48;
+                          viewModel.setHeight(convertedHeight, false);
                         }
                       },
                       child: Container(
@@ -98,7 +78,7 @@ class _HeightSelectionPageState extends State {
                           style: TextStyle(
                             fontWeight: FontWeight.w700,
                             fontSize: 14.f,
-                            color: !widget.isCm ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
+                            color: !viewModel.isHeightCm ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
                           ),
                         ),
                       ),
@@ -115,61 +95,80 @@ class _HeightSelectionPageState extends State {
 
   @override
   Widget build(BuildContext context) {
-    return Column(
-      crossAxisAlignment: CrossAxisAlignment.start,
-      children: [
-        SizedBox(height: 24.h),
-        Center(
-          child: Text(
-            'How tall are you?'.needTranslation,
-            style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
-          ),
-        ),
-        SizedBox(height: 24.h),
-        Padding(
-          padding: EdgeInsets.symmetric(horizontal: 24.w),
-          child: _unitSelector(),
-        ),
-        SizedBox(height: 90.h),
-        Row(
-          crossAxisAlignment: CrossAxisAlignment.end,
-          mainAxisAlignment: MainAxisAlignment.center,
+    return Consumer(
+      builder: (context, viewModel, child) {
+        // Define min/max values based on unit
+        final minValue = viewModel.isHeightCm ? 50.0 : 1.6; // 50cm or 1.6ft (approx. 1'7")
+        final maxValue = viewModel.isHeightCm ? 280.0 : 9.2; // 280cm or 9.2ft (approx. 9'2")
+
+        return Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
           children: [
-            Text(
-              heightValue.round().toString(),
-              style: TextStyle(fontSize: 100.f, color: AppColors.textColor, height: 1),
+            SizedBox(height: 24.h),
+            Center(
+              child: Text(
+                'How tall are you?'.needTranslation,
+                style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
+              ),
+            ),
+            SizedBox(height: 24.h),
+            Padding(
+              padding: EdgeInsets.symmetric(horizontal: 24.w),
+              child: _unitSelector(viewModel),
+            ),
+            SizedBox(height: 20.h),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.spaceBetween,
+              children: [
+                Spacer(flex: 1),
+                Expanded(
+                  flex: 3,
+                  child: Consumer(
+                    builder: (context, viewModel, child) {
+                      return Text.rich(
+                        TextSpan(
+                          children: [
+                            TextSpan(
+                              text:
+                                  viewModel.isHeightCm ? viewModel.selectedHeight?.round().toString() : viewModel.selectedHeight?.toStringAsFixed(1),
+                              style: TextStyle(
+                                fontSize: 90.f,
+                                color: AppColors.textColor,
+                                height: 1,
+                              ),
+                            ),
+                            TextSpan(
+                              text: viewModel.isHeightCm ? 'cm' : 'ft',
+                              style: TextStyle(
+                                fontWeight: FontWeight.w700,
+                                fontSize: 24.f,
+                              ),
+                            ),
+                          ],
+                        ),
+                      ).paddingOnly(bottom: 100.h, left: 20.w);
+                    },
+                  ),
+                ),
+                Expanded(
+                  child: HeightScale(
+                    enableHaptic: true,
+                    enableSound: true,
+                    minValue: minValue,
+                    maxValue: maxValue,
+                    initialHeight: viewModel.selectedHeight ?? 100,
+                    isCm: viewModel.isHeightCm,
+                    onHeightChanged: (newHeight) {
+                      log("height: $newHeight");
+                      viewModel.setHeight(newHeight, viewModel.isHeightCm);
+                    },
+                  ),
+                ),
+              ],
             ),
-            SizedBox(width: 8.w),
-            Text(widget.isCm ? 'cm' : 'ft', style: TextStyle(fontWeight: FontWeight.w700, fontSize: 24.f)).paddingOnly(bottom: 10.h, left: 8.w),
           ],
-        ),
-      ],
+        );
+      },
     );
   }
 }
-
-class _RulerPainter extends CustomPainter {
-  @override
-  void paint(Canvas canvas, Size size) {
-    final paintTick = Paint()..color = const Color(0xFF222222);
-    final paintSmall = Paint()..color = const Color(0xFF222222).withValues(alpha: 0.6);
-
-    final width = size.width;
-    final start = 120;
-    final end = 210;
-    final steps = end - start;
-    for (int i = 0; i <= steps; i++) {
-      final x = (i / steps) * width;
-      if (i % 10 == 0) {
-        canvas.drawLine(Offset(x, size.height * 0.1), Offset(x, size.height * 0.6), paintTick);
-      } else if (i % 5 == 0) {
-        canvas.drawLine(Offset(x, size.height * 0.2), Offset(x, size.height * 0.5), paintSmall);
-      } else {
-        canvas.drawLine(Offset(x, size.height * 0.35), Offset(x, size.height * 0.5), paintSmall);
-      }
-    }
-  }
-
-  @override
-  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
-}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/pages/weight_selection_page.dart b/lib/presentation/symptoms_checker/user_info_selection/pages/weight_selection_page.dart
index 0319f4b..1d38a91 100644
--- a/lib/presentation/symptoms_checker/user_info_selection/pages/weight_selection_page.dart
+++ b/lib/presentation/symptoms_checker/user_info_selection/pages/weight_selection_page.dart
@@ -1,36 +1,22 @@
+import 'dart:developer';
+
 import 'package:flutter/material.dart';
 import 'package:hmg_patient_app_new/core/app_export.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/symptoms_checker/symptoms_checker_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/weight_scale.dart';
 import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:provider/provider.dart';
 
 /// Weight selection page content
-class WeightSelectionPage extends StatefulWidget {
-  final double weight;
-  final bool isKg;
+class WeightSelectionPage extends StatelessWidget {
   final Function(double, bool) onWeightChanged;
 
-  const WeightSelectionPage({
-    super.key,
-    required this.weight,
-    required this.isKg,
-    required this.onWeightChanged,
-  });
-
-  @override
-  State createState() => _WeightSelectionPageState();
-}
-
-class _WeightSelectionPageState extends State {
-  late double weightValue;
+  const WeightSelectionPage({super.key, required this.onWeightChanged});
 
-  @override
-  void initState() {
-    super.initState();
-    weightValue = widget.weight;
-  }
-
-  Widget _unitSelector() {
+  Widget _unitSelector(SymptomsCheckerViewModel viewModel) {
+    bool isKg = viewModel.isWeightKg;
     return Container(
       height: 54.h,
       padding: EdgeInsets.all(4.h),
@@ -49,7 +35,7 @@ class _WeightSelectionPageState extends State {
                 curve: Curves.easeInOut,
                 width: tabWidth,
                 height: constraints.maxHeight,
-                margin: EdgeInsets.only(left: widget.isKg ? 0 : tabWidth + 8.w),
+                margin: EdgeInsets.only(left: isKg ? 0 : tabWidth + 8.w),
                 decoration: BoxDecoration(
                   color: AppColors.bottomNAVBorder,
                   borderRadius: BorderRadius.circular(7.r),
@@ -61,10 +47,10 @@ class _WeightSelectionPageState extends State {
                   Expanded(
                     child: GestureDetector(
                       onTap: () {
-                        if (!widget.isKg) {
+                        if (!isKg) {
                           // Convert from LBS to KG (1 lb = 0.453592 kg)
-                          final convertedWeight = weightValue / 2.20462;
-                          widget.onWeightChanged(convertedWeight, true);
+                          final convertedWeight = viewModel.selectedWeight! / 2.20462;
+                          Future.microtask(() => onWeightChanged(convertedWeight, true));
                         }
                       },
                       child: Container(
@@ -75,7 +61,7 @@ class _WeightSelectionPageState extends State {
                           style: TextStyle(
                             fontWeight: FontWeight.w700,
                             fontSize: 14.f,
-                            color: widget.isKg ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
+                            color: isKg ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
                           ),
                         ),
                       ),
@@ -84,10 +70,10 @@ class _WeightSelectionPageState extends State {
                   Expanded(
                     child: GestureDetector(
                       onTap: () {
-                        if (widget.isKg) {
+                        if (isKg) {
                           // Convert from KG to LBS (1 kg = 2.20462 lbs)
-                          final convertedWeight = weightValue * 2.20462;
-                          widget.onWeightChanged(convertedWeight, false);
+                          final convertedWeight = viewModel.selectedWeight! * 2.20462;
+                          Future.microtask(() => onWeightChanged(convertedWeight, false));
                         }
                       },
                       child: Container(
@@ -98,7 +84,7 @@ class _WeightSelectionPageState extends State {
                           style: TextStyle(
                             fontWeight: FontWeight.w700,
                             fontSize: 14.f,
-                            color: !widget.isKg ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
+                            color: !isKg ? AppColors.textColor : AppColors.textColor.withValues(alpha: 0.6),
                           ),
                         ),
                       ),
@@ -113,124 +99,64 @@ class _WeightSelectionPageState extends State {
     );
   }
 
-  Widget _weightSlider() {
-    return Column(
-      children: [
-        SizedBox(height: 18.h),
-        SizedBox(height: 12.h),
-        SizedBox(
-          height: 80.h,
-          child: Row(
-            children: [
-              Expanded(child: Container()),
-              Expanded(
-                flex: 6,
-                child: Stack(
-                  alignment: Alignment.center,
-                  children: [
-                    Positioned.fill(
-                      child: CustomPaint(
-                        painter: _WeightRulerPainter(),
-                      ),
-                    ),
-                    SliderTheme(
-                      data: SliderTheme.of(context).copyWith(
-                        trackHeight: 6.h,
-                        thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 0),
-                        overlayShape: const RoundSliderOverlayShape(overlayRadius: 0),
-                        activeTrackColor: AppColors.primaryRedColor,
-                        inactiveTrackColor: AppColors.lightRedButtonColor,
-                      ),
-                      child: Slider(
-                        min: 30,
-                        max: 150,
-                        value: weightValue,
-                        onChanged: (v) {
-                          setState(() => weightValue = v);
-                          widget.onWeightChanged(v, widget.isKg);
-                        },
-                      ),
-                    ),
-                    Positioned(
-                      right: 0,
-                      child: Container(
-                        width: 18.w,
-                        height: 18.h,
-                        decoration: BoxDecoration(
-                          color: AppColors.primaryRedColor,
-                          shape: BoxShape.rectangle,
-                          borderRadius: BorderRadius.circular(4.r),
-                        ),
-                      ),
-                    ),
-                  ],
-                ),
-              ),
-              Expanded(child: Container()),
-            ],
-          ),
-        ),
-      ],
-    );
-  }
-
   @override
   Widget build(BuildContext context) {
-    return Column(
-      crossAxisAlignment: CrossAxisAlignment.start,
-      children: [
-        SizedBox(height: 24.h),
-        Center(
-          child: Text(
-            'What is your weight?'.needTranslation,
-            style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
+    return Consumer(builder: (context, viewModel, child) {
+      bool isKg = viewModel.isWeightKg;
+      // Define min/max values based on unit
+      final minValue = isKg ? 10.0 : 22.0; // 10kg or 22lbs
+      final maxValue = isKg ? 200.0 : 440.0; // 200kg or 440lbs
+
+      return Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          SizedBox(height: 24.h),
+          Center(
+            child: Text(
+              'What is your weight?'.needTranslation,
+              style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor),
+            ),
+          ),
+          SizedBox(height: 24.h),
+          Padding(
+            padding: EdgeInsets.symmetric(horizontal: 24.w),
+            child: _unitSelector(viewModel),
           ),
-        ),
-        SizedBox(height: 20.h),
-        Padding(
-          padding: EdgeInsets.symmetric(horizontal: 24.w),
-          child: _unitSelector(),
-        ),
-        SizedBox(height: 90.h),
-        Row(
-          mainAxisAlignment: MainAxisAlignment.center,
-          crossAxisAlignment: CrossAxisAlignment.end,
-          children: [
-            Text(
-              weightValue.round().toString(),
-              style: TextStyle(fontSize: 100.f, color: AppColors.textColor, height: 1),
+          SizedBox(height: 60.h),
+          // Weight display centered
+          Center(
+            child: Row(
+              mainAxisSize: MainAxisSize.min,
+              crossAxisAlignment: CrossAxisAlignment.end,
+              children: [
+                Text(
+                  viewModel.selectedWeight!.round().toString(),
+                  style: TextStyle(fontSize: 100.f, color: AppColors.textColor, height: 1),
+                ),
+                SizedBox(width: 8.w),
+                Text(
+                  isKg ? 'kg' : 'lbs',
+                  style: TextStyle(fontWeight: FontWeight.w700, fontSize: 24.f),
+                ).paddingOnly(bottom: 10.h),
+              ],
             ),
-            SizedBox(width: 8.w),
-            Text(widget.isKg ? 'kg' : 'lbs', style: TextStyle(fontWeight: FontWeight.w700, fontSize: 24.f)).paddingOnly(bottom: 10.h, left: 8.w),
-          ],
-        ),
-      ],
-    );
-  }
-}
-
-class _WeightRulerPainter extends CustomPainter {
-  @override
-  void paint(Canvas canvas, Size size) {
-    final paintTick = Paint()..color = const Color(0xFF222222);
-    final paintSmall = Paint()..color = const Color(0xFF222222).withValues(alpha: 0.6);
-
-    final width = size.width;
-    final start = 30;
-    final end = 150;
-    final steps = end - start;
-    for (int i = 0; i <= steps; i++) {
-      final x = (i / steps) * width;
-      if (i % 10 == 0) {
-        canvas.drawLine(Offset(x, size.height * 0.1), Offset(x, size.height * 0.6), paintTick);
-      } else if (i % 5 == 0) {
-        canvas.drawLine(Offset(x, size.height * 0.2), Offset(x, size.height * 0.5), paintSmall);
-      } else {
-        canvas.drawLine(Offset(x, size.height * 0.35), Offset(x, size.height * 0.5), paintSmall);
-      }
-    }
+          ),
+          SizedBox(height: 40.h),
+          // Horizontal weight picker
+          WeightScale(
+            enableHaptic: true,
+            enableSound: true,
+            minValue: minValue,
+            maxValue: maxValue,
+            initialWeight: viewModel.selectedWeight!,
+            isKg: isKg,
+            onWeightChanged: (newWeight) {
+              log("weight: $newWeight");
+              Future.microtask(() => onWeightChanged(newWeight, isKg));
+            },
+          ),
+        ],
+      );
+    });
   }
-
-  @override
-  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
 }
diff --git a/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart b/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart
index 43d485a..725d78e 100644
--- a/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart
+++ b/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart
@@ -39,7 +39,6 @@ class _UserInfoFlowManagerState extends State {
   void initState() {
     super.initState();
     _viewModel = context.read();
-    // _viewModel.resetUserInfo();
   }
 
   @override
@@ -57,7 +56,6 @@ class _UserInfoFlowManagerState extends State {
         curve: Curves.easeInOut,
       );
     } else {
-      // Submit and navigate to next screen
       _submitUserInfo();
     }
   }
@@ -91,119 +89,165 @@ class _UserInfoFlowManagerState extends State {
     context.pop();
   }
 
-  Widget _buildProgressBar(int currentPage) {
-    return Row(
-      children: List.generate(4, (index) {
-        final isActive = index <= currentPage;
-        return Expanded(
-          child: Container(
-            height: 4.h,
-            margin: EdgeInsets.symmetric(horizontal: 6.w),
-            decoration: BoxDecoration(
-              color: isActive ? AppColors.primaryRedColor : AppColors.greyLightColor,
-              borderRadius: BorderRadius.circular(8.r),
-            ),
-          ),
+  Widget _buildProgressBar() {
+    return Consumer(
+      builder: (BuildContext context, viewModel, child) {
+        return Row(
+          children: List.generate(4, (index) {
+            final isCompleted = index < viewModel.userInfoCurrentPage;
+            final isCurrentStep = index == viewModel.userInfoCurrentPage;
+
+            return Expanded(
+              child: Padding(
+                padding: EdgeInsets.symmetric(horizontal: 6.w),
+                child: ClipRRect(
+                  borderRadius: BorderRadius.circular(8.r),
+                  child: Stack(
+                    children: [
+                      // Background (grey)
+                      Container(
+                        height: 4.h,
+                        decoration: BoxDecoration(
+                          color: AppColors.greyLightColor,
+                          borderRadius: BorderRadius.circular(8.r),
+                        ),
+                      ),
+                      // Animated red fill from left to right
+                      TweenAnimationBuilder(
+                        duration: const Duration(milliseconds: 400),
+                        curve: Curves.easeInOut,
+                        tween: Tween(
+                          begin: 0.0,
+                          end: isCompleted
+                              ? 1.0
+                              : isCurrentStep
+                                  ? 1.0
+                                  : 0.0,
+                        ),
+                        builder: (context, value, child) {
+                          return FractionallySizedBox(
+                            alignment: Alignment.centerLeft,
+                            widthFactor: value,
+                            child: Container(
+                              height: 4.h,
+                              decoration: BoxDecoration(
+                                color: AppColors.primaryRedColor,
+                                borderRadius: BorderRadius.circular(8.r),
+                                boxShadow: isCurrentStep && value > 0
+                                    ? [
+                                        BoxShadow(
+                                          color: AppColors.primaryRedColor.withValues(alpha: 0.4),
+                                          blurRadius: 8.r,
+                                          spreadRadius: 1.r,
+                                        ),
+                                      ]
+                                    : null,
+                              ),
+                            ),
+                          );
+                        },
+                      ),
+                    ],
+                  ),
+                ),
+              ),
+            );
+          }),
         );
-      }),
+      },
     );
   }
 
-  Widget _buildStickyBottomCard(bool isLastPage) {
-    return Container(
-      decoration: BoxDecoration(
-        color: AppColors.whiteColor,
-        borderRadius: BorderRadius.vertical(top: Radius.circular(24.r)),
-      ),
-      padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 16.h),
-      child: SafeArea(
-        top: false,
-        child: Row(
-          children: [
-            Expanded(
-              child: CustomButton(
-                text: "Previous".needTranslation,
-                onPressed: _onPrevious,
-                backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
-                borderColor: Colors.transparent,
-                textColor: AppColors.primaryRedColor,
-                fontSize: 16.f,
-              ),
-            ),
-            SizedBox(width: 12.w),
-            Expanded(
-              child: CustomButton(
-                text: isLastPage ? "Submit".needTranslation : "Next".needTranslation,
-                onPressed: _onNext,
-                backgroundColor: AppColors.primaryRedColor,
-                borderColor: AppColors.primaryRedColor,
-                textColor: AppColors.whiteColor,
-                fontSize: 16.f,
+  Widget _buildStickyBottomCard() {
+    return Consumer(builder: (BuildContext context, viewModel, child) {
+      bool isLastPage = viewModel.isUserInfoLastPage;
+      bool isFirstPage = viewModel.isUserInfoFirstPage;
+      return Container(
+        decoration: BoxDecoration(
+          color: AppColors.whiteColor,
+          borderRadius: BorderRadius.vertical(top: Radius.circular(24.r)),
+        ),
+        padding: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h),
+        child: SafeArea(
+          top: false,
+          child: Row(
+            children: [
+              if (!isFirstPage) ...[
+                Expanded(
+                  child: CustomButton(
+                    text: "Previous".needTranslation,
+                    onPressed: _onPrevious,
+                    backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
+                    borderColor: Colors.transparent,
+                    textColor: AppColors.primaryRedColor,
+                    fontSize: 16.f,
+                  ),
+                ),
+                SizedBox(width: 12.w),
+              ],
+              Expanded(
+                child: CustomButton(
+                  text: isLastPage ? "Submit".needTranslation : "Next".needTranslation,
+                  onPressed: _onNext,
+                  backgroundColor: AppColors.primaryRedColor,
+                  borderColor: AppColors.primaryRedColor,
+                  textColor: AppColors.whiteColor,
+                  fontSize: 16.f,
+                ),
               ),
-            ),
-          ],
+            ],
+          ),
         ),
-      ),
-    );
+      );
+    });
   }
 
   @override
   Widget build(BuildContext context) {
-    return Consumer(
-      builder: (context, viewModel, child) {
-        return Scaffold(
-          backgroundColor: AppColors.bgScaffoldColor,
-          body: Column(
-            children: [
-              Expanded(
-                child: CollapsingListView(
-                  title: _pageTitles[viewModel.userInfoCurrentPage].needTranslation,
-                  isLeading: true,
-                  child: Column(
-                    crossAxisAlignment: CrossAxisAlignment.start,
-                    children: [
-                      SizedBox(height: 24.h),
-                      _buildProgressBar(viewModel.userInfoCurrentPage),
-                      SizedBox(height: 24.h),
-                      SizedBox(
-                        height: 600.h,
-                        child: PageView(
-                          controller: _pageController,
-                          physics: const NeverScrollableScrollPhysics(), // Disable swipe
-                          onPageChanged: (index) {
-                            viewModel.setUserInfoPage(index);
-                          },
-                          children: [
-                            GenderSelectionPage(
-                              selectedGender: viewModel.selectedGender,
-                              onGenderSelected: viewModel.setGender,
-                            ),
-                            AgeSelectionPage(
-                              selectedAge: viewModel.selectedAge,
-                              onAgeSelected: viewModel.setAge,
-                            ),
-                            HeightSelectionPage(
-                              height: viewModel.selectedHeight ?? 178,
-                              isCm: viewModel.isHeightCm,
-                              onHeightChanged: viewModel.setHeight,
-                            ),
-                            WeightSelectionPage(
-                              weight: viewModel.selectedWeight ?? 70,
-                              isKg: viewModel.isWeightKg,
-                              onWeightChanged: viewModel.setWeight,
-                            ),
-                          ],
+    return Scaffold(
+      backgroundColor: AppColors.bgScaffoldColor,
+      body: Column(
+        children: [
+          Expanded(
+            child: CollapsingListView(
+              physics: NeverScrollableScrollPhysics(),
+              title: _pageTitles[_viewModel.userInfoCurrentPage].needTranslation,
+              isLeading: true,
+              child: Column(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  SizedBox(height: 24.h),
+                  _buildProgressBar(),
+                  SizedBox(height: 24.h),
+                  SizedBox(
+                    height: 600.h,
+                    child: PageView(
+                      controller: _pageController,
+                      physics: const NeverScrollableScrollPhysics(), // Disable swipe
+                      onPageChanged: (index) {
+                        _viewModel.setUserInfoPage(index);
+                      },
+                      children: [
+                        GenderSelectionPage(
+                          selectedGender: _viewModel.selectedGender,
+                          onGenderSelected: _viewModel.setGender,
                         ),
-                      ),
-                    ],
+                        AgeSelectionPage(
+                          selectedAge: _viewModel.selectedAge,
+                          onAgeSelected: _viewModel.setAge,
+                        ),
+                        HeightSelectionPage(),
+                        WeightSelectionPage(onWeightChanged: _viewModel.setWeight),
+                      ],
+                    ),
                   ),
-                ),
+                ],
               ),
-              _buildStickyBottomCard(viewModel.isUserInfoLastPage),
-            ],
+            ),
           ),
-        );
-      },
+          _buildStickyBottomCard(),
+        ],
+      ),
     );
   }
 }
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/custom_date_picker.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/custom_date_picker.dart
new file mode 100644
index 0000000..98051e0
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/widgets/custom_date_picker.dart
@@ -0,0 +1,235 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/triangle_indicator.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+
+class ThreeColumnDatePicker extends StatefulWidget {
+  final DateTime initialDate;
+  final ValueChanged? onDateChanged;
+
+  // Feedback config
+  final bool enableHaptic;
+  final bool enableSound;
+  final Duration feedbackDebounce;
+
+  const ThreeColumnDatePicker({
+    super.key,
+    required this.initialDate,
+    this.onDateChanged,
+    this.enableHaptic = true,
+    this.enableSound = true,
+    this.feedbackDebounce = const Duration(milliseconds: 80),
+  });
+
+  @override
+  State createState() => _ThreeColumnDatePickerState();
+}
+
+class _ThreeColumnDatePickerState extends State {
+  static const int yearRange = 100;
+  static const double _defaultItemExtent = 48.0; // will be scaled with .h
+
+  late final List _days;
+  late final List _months;
+  late final List _years;
+
+  late FixedExtentScrollController _dayController;
+  late FixedExtentScrollController _monthController;
+  late FixedExtentScrollController _yearController;
+
+  int _selectedDay = 0;
+  int _selectedMonth = 0;
+  int _selectedYearIndex = 0;
+
+  // Debounce timer used for playing feedback only after small pause
+  Timer? _feedbackTimer;
+
+  double get _itemExtent => _defaultItemExtent.h;
+
+  @override
+  void initState() {
+    super.initState();
+
+    _days = List.generate(31, (i) => (i + 1).toString().padLeft(2, '0'));
+    _months = const ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
+    final currentYear = DateTime.now().year;
+    _years = List.generate(yearRange, (i) => currentYear - i);
+
+    _selectedDay = (widget.initialDate.day - 1).clamp(0, _days.length - 1);
+    _selectedMonth = (widget.initialDate.month - 1).clamp(0, _months.length - 1);
+    _selectedYearIndex = _years.indexOf(widget.initialDate.year);
+    if (_selectedYearIndex == -1) _selectedYearIndex = 0;
+
+    _dayController = FixedExtentScrollController(initialItem: _selectedDay);
+    _monthController = FixedExtentScrollController(initialItem: _selectedMonth);
+    _yearController = FixedExtentScrollController(initialItem: _selectedYearIndex);
+  }
+
+  @override
+  void dispose() {
+    _feedbackTimer?.cancel();
+    _dayController.dispose();
+    _monthController.dispose();
+    _yearController.dispose();
+    super.dispose();
+  }
+
+  void _emitDate() {
+    final day = int.parse(_days[_selectedDay]);
+    final month = _selectedMonth + 1;
+    final year = _years[_selectedYearIndex];
+    final date = DateTime(year, month, day);
+    widget.onDateChanged?.call(date);
+  }
+
+  // Schedule haptic + sound feedback with debounce (prevents spamming during fling)
+  void _scheduleFeedback() {
+    if (!(widget.enableHaptic || widget.enableSound)) return;
+
+    _feedbackTimer?.cancel();
+    _feedbackTimer = Timer(widget.feedbackDebounce, () {
+      // Haptic
+      if (widget.enableHaptic) {
+        // selection click is lightweight and appropriate for wheel ticks
+        HapticFeedback.selectionClick();
+      }
+      // Sound
+      if (widget.enableSound) {
+        // simple system click - note: may be muted by device settings
+        SystemSound.play(SystemSoundType.click);
+      }
+    });
+  }
+
+  Widget _wheel({
+    required FixedExtentScrollController controller,
+    required int itemCount,
+    required Widget Function(int index, bool selected) itemBuilder,
+    required ValueChanged onSelectedItemChanged,
+    required int currentlySelectedIndex,
+  }) {
+    return Expanded(
+      child: SizedBox(
+        height: _itemExtent * 5, // show ~5 rows
+        child: ListWheelScrollView.useDelegate(
+          controller: controller,
+          itemExtent: _itemExtent,
+          physics: const BouncingScrollPhysics(),
+          diameterRatio: 2.2,
+          squeeze: 1.2,
+          perspective: 0.004,
+          // overAndUnderCenterOpacity: 0.6,
+          onSelectedItemChanged: (i) {
+            // update selected index, emit date and schedule feedback
+            onSelectedItemChanged(i);
+            _scheduleFeedback();
+          },
+          childDelegate: ListWheelChildBuilderDelegate(
+            builder: (context, index) {
+              if (index < 0 || index >= itemCount) return null;
+              final bool selected = index == currentlySelectedIndex;
+              return Center(child: itemBuilder(index, selected));
+            },
+            childCount: itemCount,
+          ),
+        ),
+      ),
+    );
+  }
+
+  Widget _styledText(String text, bool selected) {
+    return Text(
+      text,
+      textAlign: TextAlign.center,
+      style: TextStyle(
+        fontSize: selected ? 22.f : 20.f,
+        fontWeight: selected ? FontWeight.w600 : FontWeight.w500,
+        color: selected ? AppColors.textColor : AppColors.greyTextColor.withValues(alpha: 0.9),
+        height: 1.0,
+        letterSpacing: selected ? -0.02 * 30 : -0.02 * 18,
+      ),
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final pickerHeight = _itemExtent * 5;
+    final pointerSize = 20.w;
+    final pointerTop = (pickerHeight / 2) - (pointerSize / 2);
+
+    return LayoutBuilder(builder: (context, constraints) {
+      return SizedBox(
+        height: pickerHeight,
+        child: Stack(
+          children: [
+            Row(
+              children: [
+                // Day wheel
+                _wheel(
+                  controller: _dayController,
+                  itemCount: _days.length,
+                  currentlySelectedIndex: _selectedDay,
+                  onSelectedItemChanged: (i) {
+                    setState(() => _selectedDay = i);
+                    _emitDate();
+                  },
+                  itemBuilder: (index, selected) => _styledText(_days[index], selected),
+                ),
+
+                // Month wheel
+                _wheel(
+                  controller: _monthController,
+                  itemCount: _months.length,
+                  currentlySelectedIndex: _selectedMonth,
+                  onSelectedItemChanged: (i) {
+                    setState(() => _selectedMonth = i);
+                    _emitDate();
+                  },
+                  itemBuilder: (index, selected) => _styledText(_months[index], selected),
+                ),
+
+                // Year wheel
+                _wheel(
+                  controller: _yearController,
+                  itemCount: _years.length,
+                  currentlySelectedIndex: _selectedYearIndex,
+                  onSelectedItemChanged: (i) {
+                    setState(() => _selectedYearIndex = i);
+                    _emitDate();
+                  },
+                  itemBuilder: (index, selected) => _styledText(_years[index].toString(), selected),
+                ),
+              ],
+            ),
+
+            // subtle center overlay (optional — keeps layout consistent & highlights center row)
+            Positioned.fill(
+              child: IgnorePointer(
+                child: Center(
+                  child: SizedBox(
+                    height: _itemExtent,
+                  ),
+                ),
+              ),
+            ),
+
+            // left red triangular pointer aligned to center row
+            Positioned(
+              left: 0.w,
+              top: pointerTop,
+              child: TriangleIndicator(
+                pointerSize: pointerSize,
+                // your TriangleIndicator supports direction param; use left as in the original
+                // if your TriangleIndicator doesn't accept direction, remove the param
+                direction: TriangleDirection.left,
+              ),
+            ),
+          ],
+        ),
+      );
+    });
+  }
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/height_scale.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/height_scale.dart
new file mode 100644
index 0000000..29baf64
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/widgets/height_scale.dart
@@ -0,0 +1,169 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/triangle_indicator.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+
+class HeightScale extends StatefulWidget {
+  final double minValue;
+  final double maxValue;
+  final double initialHeight;
+  final bool isCm;
+  final ValueChanged? onHeightChanged;
+
+  // Feedback config
+  final bool enableHaptic;
+  final bool enableSound;
+  final Duration feedbackDebounce;
+
+  const HeightScale({
+    super.key,
+    required this.minValue,
+    required this.maxValue,
+    required this.initialHeight,
+    required this.isCm,
+    this.onHeightChanged,
+    this.enableHaptic = true,
+    this.enableSound = true,
+    this.feedbackDebounce = const Duration(milliseconds: 80),
+  });
+
+  @override
+  State createState() => _HeightScaleState();
+}
+
+class _HeightScaleState extends State {
+  late FixedExtentScrollController _scrollController;
+
+  // Debounce timer used for playing feedback only after small pause
+  Timer? _feedbackTimer;
+
+  // Get increment based on unit (CM = 1.0, FT = 0.1)
+  double get _increment => widget.isCm ? 1.0 : 0.1;
+
+  @override
+  void initState() {
+    super.initState();
+    int initialIndex = ((widget.initialHeight - widget.minValue) / _increment).round();
+    _scrollController = FixedExtentScrollController(initialItem: initialIndex);
+  }
+
+  // Schedule haptic + sound feedback with debounce (prevents spamming during fling)
+  void _scheduleFeedback() {
+    if (!(widget.enableHaptic || widget.enableSound)) return;
+
+    _feedbackTimer?.cancel();
+    _feedbackTimer = Timer(widget.feedbackDebounce, () {
+      // Haptic
+      if (widget.enableHaptic) {
+        // selection click is lightweight and appropriate for wheel ticks
+        HapticFeedback.selectionClick();
+      }
+      // Sound
+      if (widget.enableSound) {
+        // simple system click - note: may be muted by device settings
+        SystemSound.play(SystemSoundType.click);
+      }
+    });
+  }
+
+  @override
+  void dispose() {
+    _feedbackTimer?.cancel();
+    _scrollController.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final pointerSize = 20.w;
+    final pickerHeight = 300.h;
+    final pointerTop = (pickerHeight / 2) - (pointerSize / 2);
+
+    return SizedBox(
+      height: pickerHeight,
+      child: Stack(
+        children: [
+          // Scrollable wheel picker
+          ListWheelScrollView.useDelegate(
+            controller: _scrollController,
+            itemExtent: 10.h,
+            diameterRatio: 2.0,
+            squeeze: 1.2,
+            perspective: 0.001,
+            physics: const BouncingScrollPhysics(),
+            onSelectedItemChanged: (index) {
+              final selectedValue = widget.minValue + (index * _increment);
+              widget.onHeightChanged?.call(selectedValue);
+              _scheduleFeedback();
+            },
+            childDelegate: ListWheelChildBuilderDelegate(
+              childCount: ((widget.maxValue - widget.minValue) / _increment).round() + 1,
+              builder: (context, index) {
+                final height = widget.minValue + (index * _increment);
+
+                // For CM: main mark every 10, mid mark every 5
+                // For FT: main mark every 1.0 (10 ticks), mid mark every 0.5 (5 ticks)
+                final isMainMark = widget.isCm ? height % 10 == 0 : (height * 10).round() % 10 == 0;
+                final isMidMark = widget.isCm ? height % 5 == 0 : (height * 10).round() % 5 == 0;
+
+                return SizedBox(
+                  width: 100.w,
+                  child: Row(
+                    crossAxisAlignment: CrossAxisAlignment.center,
+                    mainAxisAlignment: MainAxisAlignment.end,
+                    children: [
+                      // Number label for main marks
+                      if (isMainMark)
+                        SizedBox(
+                          width: 30.w,
+                          child: Text(
+                            widget.isCm ? height.round().toString() : height.toStringAsFixed(1),
+                            style: TextStyle(
+                              fontSize: 11.f,
+                              color: AppColors.greyTextColor,
+                              fontWeight: FontWeight.w500,
+                              height: 1,
+                            ),
+                            textAlign: TextAlign.right,
+                          ),
+                        )
+                      else
+                        SizedBox(width: 30.w),
+                      SizedBox(width: 4.w),
+                      // Ruler mark
+                      Container(
+                        width: isMainMark
+                            ? 40.w
+                            : isMidMark
+                                ? 30.w
+                                : 25.w,
+                        height: isMainMark || isMidMark ? 2.5.h : 1.5.h,
+                        decoration: BoxDecoration(
+                          color: isMainMark
+                              ? AppColors.textColor
+                              : isMidMark
+                                  ? AppColors.textColorLight
+                                  : AppColors.textColorLight.withValues(alpha: 0.5),
+                          borderRadius: BorderRadius.circular(2.r),
+                        ),
+                      ),
+                    ],
+                  ),
+                );
+              },
+            ),
+          ),
+          // Triangle indicator pointing to selected value
+          Positioned(
+            right: 0,
+            top: pointerTop,
+            child: TriangleIndicator(pointerSize: pointerSize),
+          ),
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/triangle_indicator.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/triangle_indicator.dart
new file mode 100644
index 0000000..429279d
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/widgets/triangle_indicator.dart
@@ -0,0 +1,85 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+
+enum TriangleDirection { left, right, up, down }
+
+class TriangleIndicator extends StatelessWidget {
+  final double pointerSize;
+  final Color? color;
+  final TriangleDirection direction;
+
+  const TriangleIndicator({
+    super.key,
+    required this.pointerSize,
+    this.color,
+    this.direction = TriangleDirection.right,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return CustomPaint(
+      size: Size(pointerSize, pointerSize),
+      painter: _TrianglePainter(
+        color: color ?? AppColors.primaryRedColor,
+        direction: direction,
+      ),
+    );
+  }
+}
+
+class _TrianglePainter extends CustomPainter {
+  final Color color;
+  final TriangleDirection direction;
+
+  _TrianglePainter({required this.color, required this.direction});
+
+  @override
+  void paint(Canvas canvas, Size size) {
+    final paint = Paint()
+      ..color = color
+      ..style = PaintingStyle.fill
+      ..isAntiAlias = true;
+
+    final path = Path();
+    final w = size.width;
+    final h = size.height;
+
+    switch (direction) {
+      case TriangleDirection.right:
+        // apex on the right, base on the left
+        path.moveTo(0, h / 2);
+        path.lineTo(w, 0);
+        path.lineTo(w, h);
+        path.close();
+        break;
+      case TriangleDirection.left:
+        // apex on the left, base on the right
+        path.moveTo(w, h / 2);
+        path.lineTo(0, 0);
+        path.lineTo(0, h);
+        path.close();
+        break;
+      case TriangleDirection.up:
+        // apex on top, base on bottom
+        path.moveTo(w / 2, 0);
+        path.lineTo(0, h);
+        path.lineTo(w, h);
+        path.close();
+        break;
+      case TriangleDirection.down:
+        // apex on bottom, base on top
+        path.moveTo(w / 2, h);
+        path.lineTo(0, 0);
+        path.lineTo(w, 0);
+        path.close();
+        break;
+    }
+
+    canvas.drawPath(path, paint);
+  }
+
+  @override
+  bool shouldRepaint(covariant _TrianglePainter oldDelegate) {
+    return oldDelegate.color != color || oldDelegate.direction != direction;
+  }
+}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart
deleted file mode 100644
index 6e6d762..0000000
--- a/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:hmg_patient_app_new/core/app_export.dart';
-import 'package:hmg_patient_app_new/theme/colors.dart';
-
-/// Progress bar widget showing the current step in user info selection flow
-/// Total steps: 4 (Gender -> Age -> Height -> Weight)
-class UserInfoProgressBar extends StatelessWidget {
-  final int currentStep;
-  final int totalSteps;
-
-  const UserInfoProgressBar({
-    super.key,
-    required this.currentStep,
-    this.totalSteps = 4,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return Row(
-      children: List.generate(totalSteps, (index) {
-        final isActive = index < currentStep;
-        return Expanded(
-          child: Container(
-            height: 4.h,
-            margin: EdgeInsets.symmetric(horizontal: 6.w),
-            decoration: BoxDecoration(
-              color: isActive ? AppColors.primaryRedColor : AppColors.greyLightColor,
-              borderRadius: BorderRadius.circular(8.r),
-            ),
-          ),
-        );
-      }),
-    );
-  }
-}
-
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_selection_scaffold.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_selection_scaffold.dart
deleted file mode 100644
index 3390c31..0000000
--- a/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_selection_scaffold.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:hmg_patient_app_new/core/app_export.dart';
-import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/user_info_progress_bar.dart';
-import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart';
-import 'package:hmg_patient_app_new/theme/colors.dart';
-import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
-
-/// Base scaffold for user info selection flow pages
-/// Provides consistent layout with progress bar and sticky bottom card
-class UserInfoSelectionScaffold extends StatelessWidget {
-  final String title;
-  final int currentStep;
-  final Widget child;
-  final VoidCallback? onPrevious;
-  final VoidCallback? onNext;
-  final bool showPrevious;
-  final String? nextButtonText;
-  final bool isScrollable;
-
-  const UserInfoSelectionScaffold({
-    super.key,
-    required this.title,
-    required this.currentStep,
-    required this.child,
-    this.onPrevious,
-    this.onNext,
-    this.showPrevious = true,
-    this.nextButtonText,
-    this.isScrollable = true,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-      backgroundColor: AppColors.bgScaffoldColor,
-      body: Column(
-        children: [
-          Expanded(
-            child: CollapsingListView(
-              title: title,
-              isLeading: true,
-              child: Column(
-                crossAxisAlignment: CrossAxisAlignment.start,
-                children: [
-                  SizedBox(height: 24.h),
-                  UserInfoProgressBar(currentStep: currentStep),
-                  SizedBox(height: 24.h),
-                  isScrollable
-                      ? SingleChildScrollView(
-                          child: child,
-                        )
-                      : child,
-                ],
-              ),
-            ),
-          ),
-          UserInfoStickyBottomCard(
-            onPrevious: onPrevious,
-            onNext: onNext,
-            showPrevious: showPrevious,
-            nextButtonText: nextButtonText,
-          ),
-        ],
-      ),
-    );
-  }
-}
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart
deleted file mode 100644
index 10fd934..0000000
--- a/lib/presentation/symptoms_checker/user_info_selection/widgets/user_info_sticky_bottom_card.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:hmg_patient_app_new/core/app_export.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/theme/colors.dart';
-import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
-
-/// Sticky bottom card with Previous/Next navigation buttons
-class UserInfoStickyBottomCard extends StatelessWidget {
-  final VoidCallback? onPrevious;
-  final VoidCallback? onNext;
-  final bool showPrevious;
-  final String? nextButtonText;
-
-  const UserInfoStickyBottomCard({
-    super.key,
-    this.onPrevious,
-    this.onNext,
-    this.showPrevious = true,
-    this.nextButtonText,
-  });
-
-  @override
-  Widget build(BuildContext context) {
-    return Container(
-      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
-        color: AppColors.whiteColor,
-        borderRadius: 24.r,
-      ),
-      child: Column(
-        mainAxisSize: MainAxisSize.min,
-        children: [
-          SizedBox(height: 16.h),
-          Row(
-            children: [
-              if (showPrevious) ...[
-                Expanded(
-                  child: CustomButton(
-                    text: "Previous".needTranslation,
-                    onPressed: onPrevious ?? () => context.pop(),
-                    backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
-                    borderColor: Colors.transparent,
-                    textColor: AppColors.primaryRedColor,
-                    fontSize: 16.f,
-                  ),
-                ),
-                SizedBox(width: 12.w),
-              ],
-              Expanded(
-                child: CustomButton(
-                  text: nextButtonText ?? "Next".needTranslation,
-                  onPressed: onNext ?? () {},
-                  backgroundColor: AppColors.primaryRedColor,
-                  borderColor: AppColors.primaryRedColor,
-                  textColor: AppColors.whiteColor,
-                  fontSize: 16.f,
-                ),
-              ),
-            ],
-          ),
-          SizedBox(height: 24.h),
-        ],
-      ).paddingSymmetrical(24.w, 0),
-    );
-  }
-}
-
diff --git a/lib/presentation/symptoms_checker/user_info_selection/widgets/weight_scale.dart b/lib/presentation/symptoms_checker/user_info_selection/widgets/weight_scale.dart
new file mode 100644
index 0000000..8526a52
--- /dev/null
+++ b/lib/presentation/symptoms_checker/user_info_selection/widgets/weight_scale.dart
@@ -0,0 +1,180 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:hmg_patient_app_new/core/app_export.dart';
+import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/widgets/triangle_indicator.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+
+class WeightScale extends StatefulWidget {
+  final double minValue;
+  final double maxValue;
+  final double initialWeight;
+  final bool isKg;
+  final ValueChanged? onWeightChanged;
+
+  // Feedback config
+  final bool enableHaptic;
+  final bool enableSound;
+  final Duration feedbackDebounce;
+
+  const WeightScale({
+    super.key,
+    required this.minValue,
+    required this.maxValue,
+    required this.initialWeight,
+    required this.isKg,
+    this.onWeightChanged,
+    this.enableHaptic = true,
+    this.enableSound = true,
+    this.feedbackDebounce = const Duration(milliseconds: 80),
+  });
+
+  @override
+  State createState() => _WeightScaleState();
+}
+
+class _WeightScaleState extends State {
+  late ScrollController _scrollController;
+
+  // Debounce timer used for playing feedback only after small pause
+  Timer? _feedbackTimer;
+
+  int? _lastReportedIndex;
+  final double _itemWidth = 8.0; // Width per weight unit
+
+  @override
+  void initState() {
+    super.initState();
+    int initialIndex = (widget.initialWeight - widget.minValue).round();
+    final initialOffset = initialIndex * _itemWidth;
+    _scrollController = ScrollController(initialScrollOffset: initialOffset);
+    _scrollController.addListener(_onScroll);
+  }
+
+  void _onScroll() {
+    if (!_scrollController.hasClients) return;
+
+    final offset = _scrollController.offset;
+    final index = (offset / _itemWidth).round();
+    final maxIndex = (widget.maxValue - widget.minValue).round();
+
+    if (index != _lastReportedIndex && index >= 0 && index <= maxIndex) {
+      _lastReportedIndex = index;
+      final selectedValue = widget.minValue + index;
+      widget.onWeightChanged?.call(selectedValue);
+      _scheduleFeedback();
+    }
+  }
+
+  // Schedule haptic + sound feedback with debounce (prevents spamming during fling)
+  void _scheduleFeedback() {
+    if (!(widget.enableHaptic || widget.enableSound)) return;
+
+    _feedbackTimer?.cancel();
+    _feedbackTimer = Timer(widget.feedbackDebounce, () {
+      // Haptic
+      if (widget.enableHaptic) {
+        // selection click is lightweight and appropriate for wheel ticks
+        HapticFeedback.selectionClick();
+      }
+      // Sound
+      if (widget.enableSound) {
+        // simple system click - note: may be muted by device settings
+        SystemSound.play(SystemSoundType.click);
+      }
+    });
+  }
+
+  @override
+  void dispose() {
+    _feedbackTimer?.cancel();
+    _scrollController.removeListener(_onScroll);
+    _scrollController.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    final pointerSize = 20.h;
+    final pickerHeight = 100.h;
+    final itemCount = (widget.maxValue - widget.minValue).round() + 1;
+
+    return SizedBox(
+      height: pickerHeight,
+      child: Stack(
+        alignment: Alignment.center,
+        children: [
+          // Horizontal scrollable ruler with gradient fade
+          ListView.builder(
+            controller: _scrollController,
+            scrollDirection: Axis.horizontal,
+            physics: const BouncingScrollPhysics(),
+            padding: EdgeInsets.symmetric(horizontal: MediaQuery.of(context).size.width / 2),
+            itemCount: itemCount,
+            itemBuilder: (context, index) {
+              final weight = (widget.minValue + index).round();
+              final isMainMark = weight % 10 == 0;
+              final isMidMark = weight % 5 == 0;
+
+              return SizedBox(
+                width: _itemWidth,
+                child: Stack(
+                  alignment: Alignment.bottomCenter,
+                  clipBehavior: Clip.none,
+                  children: [
+                    // Ruler mark (vertical line)
+                    Positioned(
+                      bottom: 0,
+                      child: Container(
+                        width: isMainMark || isMidMark ? 2.5.w : 1.5.w,
+                        height: isMainMark
+                            ? 40.h
+                            : isMidMark
+                                ? 30.h
+                                : 25.h,
+                        decoration: BoxDecoration(
+                          color: isMainMark
+                              ? AppColors.textColor
+                              : isMidMark
+                                  ? AppColors.textColorLight
+                                  : AppColors.textColorLight.withValues(alpha: 0.5),
+                          borderRadius: BorderRadius.circular(2.r),
+                        ),
+                      ),
+                    ),
+                    // Number label for main marks
+                    if (isMainMark)
+                      Positioned(
+                        bottom: 45.h,
+                        child: Text(
+                          weight.toString(),
+                          style: TextStyle(
+                            fontSize: 11.f,
+                            color: AppColors.greyTextColor,
+                            fontWeight: FontWeight.w500,
+                            height: 1,
+                          ),
+                          textAlign: TextAlign.center,
+                          maxLines: 1,
+                          overflow: TextOverflow.visible,
+                        ),
+                      ),
+                  ],
+                ),
+              );
+            },
+          ),
+          // Triangle indicator pointing to selected value
+          Positioned(
+            bottom: 0,
+            child: TriangleIndicator(
+              pointerSize: pointerSize,
+              direction: TriangleDirection.up,
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart
index ad8e743..7329de9 100644
--- a/lib/widgets/appbar/collapsing_list_view.dart
+++ b/lib/widgets/appbar/collapsing_list_view.dart
@@ -27,6 +27,7 @@ class CollapsingListView extends StatelessWidget {
   bool isClose;
   bool isLeading;
   VoidCallback? leadingCallback;
+  ScrollPhysics? physics;
 
   CollapsingListView({
     super.key,
@@ -43,6 +44,7 @@ class CollapsingListView extends StatelessWidget {
     this.isLeading = true,
     this.trailing,
     this.leadingCallback,
+    this.physics,
   });
 
   @override
@@ -53,6 +55,7 @@ class CollapsingListView extends StatelessWidget {
       body: Column(
         children: [
           CustomScrollView(
+            physics: physics,
             slivers: [
               SliverAppBar(
                 automaticallyImplyLeading: false,
@@ -119,11 +122,18 @@ class CollapsingListView extends StatelessWidget {
                                         color: AppColors.blackColor,
                                         letterSpacing: -0.5),
                                   ).expanded,
-                                  if (logout != null) actionButton(context, t, title: "Logout".needTranslation, icon: AppAssets.logout).onPress(logout!),
-                                  if (report != null) actionButton(context, t, title: "Feedback".needTranslation, icon: AppAssets.report_icon).onPress(report!),
-                                  if (history != null) actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon).onPress(history!),
-                                  if (instructions != null) actionButton(context, t, title: "Instructions".needTranslation, icon: AppAssets.requests).onPress(instructions!),
-                                  if (requests != null) actionButton(context, t, title: "Requests".needTranslation, icon: AppAssets.insurance_history_icon).onPress(requests!),
+                                  if (logout != null)
+                                    actionButton(context, t, title: "Logout".needTranslation, icon: AppAssets.logout).onPress(logout!),
+                                  if (report != null)
+                                    actionButton(context, t, title: "Feedback".needTranslation, icon: AppAssets.report_icon).onPress(report!),
+                                  if (history != null)
+                                    actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon)
+                                        .onPress(history!),
+                                  if (instructions != null)
+                                    actionButton(context, t, title: "Instructions".needTranslation, icon: AppAssets.requests).onPress(instructions!),
+                                  if (requests != null)
+                                    actionButton(context, t, title: "Requests".needTranslation, icon: AppAssets.insurance_history_icon)
+                                        .onPress(requests!),
                                   if (search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(search!).paddingOnly(right: 24),
                                   if (trailing != null) trailing!,
                                 ],

From 2f26e12fd37bdb92200b6322533201d4ace94f4b Mon Sep 17 00:00:00 2001
From: haroon amjad 
Date: Thu, 11 Dec 2025 17:13:07 +0300
Subject: [PATCH 13/55] update

---
 lib/features/my_appointments/my_appointments_view_model.dart | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart
index c4b8687..7dfef90 100644
--- a/lib/features/my_appointments/my_appointments_view_model.dart
+++ b/lib/features/my_appointments/my_appointments_view_model.dart
@@ -92,7 +92,7 @@ class MyAppointmentsViewModel extends ChangeNotifier {
     isTamaraDetailsLoading = true;
     isAppointmentPatientShareLoading = true;
     isEyeMeasurementsAppointmentsLoading = true;
-    isAppointmentQueueDetailsLoading = true;
+
     notifyListeners();
   }
 

From fbe124f6ee76c8df0b6667cc4c11b166315468c0 Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Sun, 14 Dec 2025 09:00:57 +0300
Subject: [PATCH 14/55] Complete UserInfo Selection Module

---
 .../symptoms_checker_view_model.dart          | 13 +++-
 .../symptoms_checker/user_info_selection.dart | 12 ++--
 .../user_info_flow_manager.dart               | 71 ++++++++++++-------
 3 files changed, 65 insertions(+), 31 deletions(-)

diff --git a/lib/features/symptoms_checker/symptoms_checker_view_model.dart b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
index 1b43fc2..fe66cf7 100644
--- a/lib/features/symptoms_checker/symptoms_checker_view_model.dart
+++ b/lib/features/symptoms_checker/symptoms_checker_view_model.dart
@@ -38,6 +38,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
 
   // User Info Flow State
   int _userInfoCurrentPage = 0;
+  bool _isSinglePageEditMode = false; // Track if editing single page or full flow
   String? _selectedGender;
   DateTime? _dateOfBirth;
   int? _selectedAge;
@@ -53,6 +54,8 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   // User Info Getters
   int get userInfoCurrentPage => _userInfoCurrentPage;
 
+  bool get isSinglePageEditMode => _isSinglePageEditMode;
+
   String? get selectedGender => _selectedGender;
 
   DateTime? get dateOfBirth => _dateOfBirth;
@@ -275,6 +278,7 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
     _tooltipOrganId = null;
     // Reset user info flow
     _userInfoCurrentPage = 0;
+    _isSinglePageEditMode = false;
     _selectedGender = null;
     _dateOfBirth = null;
     _selectedAge = null;
@@ -288,8 +292,15 @@ class SymptomsCheckerViewModel extends ChangeNotifier {
   // User Info Flow Methods
 
   /// Set current page in user info flow
-  void setUserInfoPage(int page) {
+  void setUserInfoPage(int page, {bool isSinglePageEdit = false}) {
     _userInfoCurrentPage = page;
+    _isSinglePageEditMode = isSinglePageEdit;
+    notifyListeners();
+  }
+
+  /// Set single page edit mode
+  void setSinglePageEditMode(bool isSingleEdit) {
+    _isSinglePageEditMode = isSingleEdit;
     notifyListeners();
   }
 
diff --git a/lib/presentation/symptoms_checker/user_info_selection.dart b/lib/presentation/symptoms_checker/user_info_selection.dart
index 9a66a65..91f3d36 100644
--- a/lib/presentation/symptoms_checker/user_info_selection.dart
+++ b/lib/presentation/symptoms_checker/user_info_selection.dart
@@ -165,7 +165,7 @@ class _UserInfoSelectionScreenState extends State {
                                 title: "Gender".needTranslation,
                                 subTitle: genderText,
                                 onTap: () {
-                                  viewModel.setUserInfoPage(0);
+                                  viewModel.setUserInfoPage(0, isSinglePageEdit: true);
                                   context.navigateWithName(AppRoutes.userInfoFlowManager);
                                 },
                                 trailingIcon: AppAssets.edit_icon,
@@ -178,7 +178,7 @@ class _UserInfoSelectionScreenState extends State {
                                 subTitle: ageText,
                                 iconColor: AppColors.greyTextColor,
                                 onTap: () {
-                                  viewModel.setUserInfoPage(1);
+                                  viewModel.setUserInfoPage(1, isSinglePageEdit: true);
                                   context.navigateWithName(AppRoutes.userInfoFlowManager);
                                 },
                                 trailingIcon: AppAssets.edit_icon,
@@ -190,7 +190,7 @@ class _UserInfoSelectionScreenState extends State {
                                 title: "Height".needTranslation,
                                 subTitle: heightText,
                                 onTap: () {
-                                  viewModel.setUserInfoPage(2);
+                                  viewModel.setUserInfoPage(2, isSinglePageEdit: true);
                                   context.navigateWithName(AppRoutes.userInfoFlowManager);
                                 },
                                 trailingIcon: AppAssets.edit_icon,
@@ -202,7 +202,7 @@ class _UserInfoSelectionScreenState extends State {
                                 title: "Weight".needTranslation,
                                 subTitle: weightText,
                                 onTap: () {
-                                  viewModel.setUserInfoPage(3);
+                                  viewModel.setUserInfoPage(3, isSinglePageEdit: true);
                                   context.navigateWithName(AppRoutes.userInfoFlowManager);
                                 },
                                 trailingIcon: AppAssets.edit_icon,
@@ -240,7 +240,7 @@ class _UserInfoSelectionScreenState extends State {
                     icon: AppAssets.edit_icon,
                     iconColor: AppColors.primaryRedColor,
                     onPressed: () {
-                      context.read().setUserInfoPage(0);
+                      context.read().setUserInfoPage(0, isSinglePageEdit: false);
                       context.navigateWithName(AppRoutes.userInfoFlowManager);
                     },
                     backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
@@ -254,7 +254,7 @@ class _UserInfoSelectionScreenState extends State {
                   child: CustomButton(
                     text: "Yes, It is".needTranslation,
                     icon: AppAssets.tickIcon,
-                    iconColor: AppColors.whiteColor,
+                    iconColor: hasEmptyFields ? AppColors.greyTextColor : AppColors.whiteColor,
                     onPressed: hasEmptyFields
                         ? () {} // Empty function for disabled state
                         : () => context.navigateWithName(AppRoutes.organSelectorPage),
diff --git a/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart b/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart
index 725d78e..523470e 100644
--- a/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart
+++ b/lib/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart
@@ -24,7 +24,7 @@ class UserInfoFlowManager extends StatefulWidget {
 }
 
 class _UserInfoFlowManagerState extends State {
-  final PageController _pageController = PageController();
+  late PageController _pageController;
   late SymptomsCheckerViewModel _viewModel;
 
   // Page titles
@@ -39,6 +39,8 @@ class _UserInfoFlowManagerState extends State {
   void initState() {
     super.initState();
     _viewModel = context.read();
+    // Initialize PageController with the current page from ViewModel
+    _pageController = PageController(initialPage: _viewModel.userInfoCurrentPage);
   }
 
   @override
@@ -48,6 +50,13 @@ class _UserInfoFlowManagerState extends State {
   }
 
   void _onNext() {
+    // If in single page edit mode, just save and go back
+    if (_viewModel.isSinglePageEditMode) {
+      context.pop();
+      return;
+    }
+
+    // Otherwise, continue with normal flow
     if (_viewModel.userInfoCurrentPage < 3) {
       _viewModel.nextUserInfoPage();
       _pageController.animateToPage(
@@ -162,6 +171,8 @@ class _UserInfoFlowManagerState extends State {
     return Consumer(builder: (BuildContext context, viewModel, child) {
       bool isLastPage = viewModel.isUserInfoLastPage;
       bool isFirstPage = viewModel.isUserInfoFirstPage;
+      bool isSingleEdit = viewModel.isSinglePageEditMode;
+
       return Container(
         decoration: BoxDecoration(
           color: AppColors.whiteColor,
@@ -170,33 +181,44 @@ class _UserInfoFlowManagerState extends State {
         padding: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h),
         child: SafeArea(
           top: false,
-          child: Row(
-            children: [
-              if (!isFirstPage) ...[
-                Expanded(
-                  child: CustomButton(
-                    text: "Previous".needTranslation,
-                    onPressed: _onPrevious,
-                    backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
-                    borderColor: Colors.transparent,
-                    textColor: AppColors.primaryRedColor,
-                    fontSize: 16.f,
-                  ),
-                ),
-                SizedBox(width: 12.w),
-              ],
-              Expanded(
-                child: CustomButton(
-                  text: isLastPage ? "Submit".needTranslation : "Next".needTranslation,
+          child: isSingleEdit
+              ? // Single page edit mode - show only Save button
+              CustomButton(
+                  text: "Save".needTranslation,
                   onPressed: _onNext,
                   backgroundColor: AppColors.primaryRedColor,
                   borderColor: AppColors.primaryRedColor,
                   textColor: AppColors.whiteColor,
                   fontSize: 16.f,
+                )
+              : // Complete flow mode - show Previous/Next buttons
+              Row(
+                  children: [
+                    if (!isFirstPage) ...[
+                      Expanded(
+                        child: CustomButton(
+                          text: "Previous".needTranslation,
+                          onPressed: _onPrevious,
+                          backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.11),
+                          borderColor: Colors.transparent,
+                          textColor: AppColors.primaryRedColor,
+                          fontSize: 16.f,
+                        ),
+                      ),
+                      SizedBox(width: 12.w),
+                    ],
+                    Expanded(
+                      child: CustomButton(
+                        text: isLastPage ? "Submit".needTranslation : "Next".needTranslation,
+                        onPressed: _onNext,
+                        backgroundColor: AppColors.primaryRedColor,
+                        borderColor: AppColors.primaryRedColor,
+                        textColor: AppColors.whiteColor,
+                        fontSize: 16.f,
+                      ),
+                    ),
+                  ],
                 ),
-              ),
-            ],
-          ),
         ),
       );
     });
@@ -217,8 +239,9 @@ class _UserInfoFlowManagerState extends State {
                 crossAxisAlignment: CrossAxisAlignment.start,
                 children: [
                   SizedBox(height: 24.h),
-                  _buildProgressBar(),
-                  SizedBox(height: 24.h),
+                  // Only show progress bar in complete flow mode
+                  if (!_viewModel.isSinglePageEditMode) _buildProgressBar(),
+                  if (!_viewModel.isSinglePageEditMode) SizedBox(height: 24.h),
                   SizedBox(
                     height: 600.h,
                     child: PageView(

From 5fd1905d8cb7acd071f75e1419418e7f1defa85d Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Sun, 14 Dec 2025 09:05:35 +0300
Subject: [PATCH 15/55] Complete UserInfo Selection Module

---
 lib/presentation/hmg_services/services_page.dart | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart
index ab70265..a3f286a 100644
--- a/lib/presentation/hmg_services/services_page.dart
+++ b/lib/presentation/hmg_services/services_page.dart
@@ -244,7 +244,7 @@ class ServicesPage extends StatelessWidget {
                                 fit: BoxFit.contain,
                               ),
                               Utils.buildImgWithAssets(
-                                icon: AppAssets.male_img,
+                                icon: AppAssets.maleImg,
                                 height: 28.h,
                                 width: 28.w,
                                 border: 1,

From 449c338c46afc1b5ff948ff7c60741f903d20455 Mon Sep 17 00:00:00 2001
From: faizatflutter 
Date: Sun, 14 Dec 2025 09:56:42 +0300
Subject: [PATCH 16/55] refactor

---
 lib/presentation/hmg_services/services_page.dart | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart
index a3f286a..85ccdac 100644
--- a/lib/presentation/hmg_services/services_page.dart
+++ b/lib/presentation/hmg_services/services_page.dart
@@ -73,7 +73,14 @@ class ServicesPage extends StatelessWidget {
       true,
       route: AppRoutes.eReferralPage,
     ),
-    HmgServicesComponentModel(3, "Blood Donation".needTranslation, "".needTranslation, AppAssets.blood_donation_icon, bgColor: AppColors.bloodDonationCardColor, true, route: null, onTap: () async {
+    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) {

From f28762a5c55127e756490f9bc59cce6ebcf3ff29 Mon Sep 17 00:00:00 2001
From: Sultan khan 
Date: Sun, 14 Dec 2025 10:01:05 +0300
Subject: [PATCH 17/55] last appointment rated done.

---
 lib/core/dependencies.dart                    |   4 +
 .../authentication/authentication_repo.dart   |   2 +-
 .../appointment_rating_view_model.dart        | 134 ++++++++++
 .../req_model/appointment_rate_req_model.dart | 100 ++++++++
 .../appointment_details_resp_model.dart       |  64 +++++
 .../rate_appointment_resp_model.dart          | 160 ++++++++++++
 .../my_appointments/my_appointments_repo.dart | 184 +++++++++++++-
 .../my_appointments_view_model.dart           |   4 +
 lib/main.dart                                 |   4 +
 .../widgets/appointment_card.dart             |   7 +-
 lib/presentation/home/landing_page.dart       |  50 +++-
 .../rate_appointment_clinic.dart              | 213 ++++++++++++++++
 .../rate_appointment_doctor.dart              | 234 ++++++++++++++++++
 .../rate_appointment/widget/doctor_row.dart   |  96 +++++++
 14 files changed, 1243 insertions(+), 13 deletions(-)
 create mode 100644 lib/features/my_appointments/appointment_rating_view_model.dart
 create mode 100644 lib/features/my_appointments/models/req_model/appointment_rate_req_model.dart
 create mode 100644 lib/features/my_appointments/models/resp_models/appointment_details_resp_model.dart
 create mode 100644 lib/features/my_appointments/models/resp_models/rate_appointment_resp_model.dart
 create mode 100644 lib/presentation/rate_appointment/rate_appointment_clinic.dart
 create mode 100644 lib/presentation/rate_appointment/rate_appointment_doctor.dart
 create mode 100644 lib/presentation/rate_appointment/widget/doctor_row.dart

diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart
index 2a5c749..cba52c6 100644
--- a/lib/core/dependencies.dart
+++ b/lib/core/dependencies.dart
@@ -27,6 +27,7 @@ import 'package:hmg_patient_app_new/features/location/location_repo.dart';
 import 'package:hmg_patient_app_new/features/location/location_view_model.dart';
 import 'package:hmg_patient_app_new/features/medical_file/medical_file_repo.dart';
 import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/appointment_rating_view_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
@@ -137,6 +138,9 @@ class AppDependencies {
     getIt.registerLazySingleton(
         () => MyAppointmentsViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt()));
 
+    getIt.registerLazySingleton(
+            () => AppointmentRatingViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt()));
+
     getIt.registerLazySingleton(
       () => PayfortViewModel(
         payfortRepo: getIt(),
diff --git a/lib/features/authentication/authentication_repo.dart b/lib/features/authentication/authentication_repo.dart
index 6ecf4b1..7fdec14 100644
--- a/lib/features/authentication/authentication_repo.dart
+++ b/lib/features/authentication/authentication_repo.dart
@@ -266,7 +266,7 @@ class AuthenticationRepoImp implements AuthenticationRepo {
       newRequest.forRegisteration = newRequest.isRegister ?? false;
       newRequest.isRegister = false;
       //silent login case removed token and login token
-      if(newRequest.logInTokenID.isEmpty && newRequest.isSilentLogin == true) {
+      if(newRequest.logInTokenID.isEmpty && newRequest.isSilentLogin == true && (newRequest.loginType==1 || newRequest.loginType==4)) {
         newRequest.logInTokenID = null;
         newRequest.deviceToken = null;
       }
diff --git a/lib/features/my_appointments/appointment_rating_view_model.dart b/lib/features/my_appointments/appointment_rating_view_model.dart
new file mode 100644
index 0000000..a192df1
--- /dev/null
+++ b/lib/features/my_appointments/appointment_rating_view_model.dart
@@ -0,0 +1,134 @@
+// dart
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_state.dart';
+import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/appointment_details_resp_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart';
+import 'package:hmg_patient_app_new/services/error_handler_service.dart';
+
+import 'models/resp_models/rate_appointment_resp_model.dart';
+
+class AppointmentRatingViewModel extends ChangeNotifier {
+  final MyAppointmentsRepo myAppointmentsRepo;
+  final ErrorHandlerService errorHandlerService;
+  final AppState appState;
+  List appointmentRatedList = [];
+  AppointmentDetails? appointmentDetails;
+  AppointmentRatingViewModel({
+    required this.myAppointmentsRepo,
+    required this.errorHandlerService,
+    required this.appState,
+  });
+
+
+  String title = "";
+  String subTitle = "";
+  bool isRateClinic = false;
+
+  Future getLastRatingAppointment({Function(dynamic)? onSuccess, Function(String)? onError}) async {
+    final result = await myAppointmentsRepo.getLastRatingAppointment();
+
+    result.fold(
+          (failure) async => await errorHandlerService.handleError(failure: failure),
+          (apiResponse) {
+        if (apiResponse.messageStatus == 2) {
+          onError?.call(apiResponse.errorMessage ?? 'Unknown error');
+        } else if (apiResponse.messageStatus == 1) {
+          appointmentRatedList = apiResponse.data ?? [];
+          notifyListeners();
+          if (onSuccess != null) {
+            onSuccess(apiResponse.data);
+          }
+        }
+      },
+    );
+  }
+
+  Future getAppointmentDetails(int appointmentID, int projectID, {Function(dynamic)? onSuccess, Function(String)? onError}) async {
+    final result = await myAppointmentsRepo.getAppointmentDetails(appointmentID, projectID);
+
+    result.fold(
+          (failure) async => await errorHandlerService.handleError(failure: failure),
+          (apiResponse) {
+        if (apiResponse.messageStatus == 2) {
+          onError?.call(apiResponse.errorMessage ?? 'Unknown error');
+        } else if (apiResponse.messageStatus == 1) {
+          appointmentDetails = apiResponse.data ?? AppointmentDetails();
+          notifyListeners();
+          if (onSuccess != null) {
+            onSuccess(apiResponse.data);
+          }
+        }
+      },
+    );
+  }
+  Future submitDoctorRating( {required int docRate, required String docNote,Function(dynamic)? onSuccess, Function(String)? onError}) async {
+    final result = await myAppointmentsRepo.sendDoctorRate(
+       docRate,
+      appointmentDetails!.appointmentNo!,
+      appointmentDetails!.projectID!,
+      appointmentDetails!.doctorID!,
+      appointmentDetails!.clinicID!,
+      docNote,
+      appointmentDetails!.appointmentDate!,
+        appointmentDetails!.doctorName,
+        appointmentDetails!.projectName,
+      appointmentDetails!.clinicName
+        );
+
+    result.fold(
+          (failure) async => await errorHandlerService.handleError(failure: failure),
+          (apiResponse) {
+        if (apiResponse.messageStatus == 2) {
+          onError?.call(apiResponse.errorMessage ?? 'Unknown error');
+        } else if (apiResponse.messageStatus == 1) {
+
+          notifyListeners();
+          if (onSuccess != null) {
+           // onSuccess(apiResponse.data);
+          }
+        }
+      },
+    );
+  }
+
+  Future submitClinicRating( { required int clinicRate, required String clinicNote, Function(dynamic)? onSuccess, Function(String)? onError}) async {
+    final result = await myAppointmentsRepo.sendAppointmentRate(
+        clinicRate,
+        appointmentDetails!.appointmentNo!,
+        appointmentDetails!.projectID!,
+        appointmentDetails!.doctorID!,
+        appointmentDetails!.clinicID!,
+        clinicNote
+    );
+
+    result.fold(
+          (failure) async => await errorHandlerService.handleError(failure: failure),
+          (apiResponse) {
+        if (apiResponse.messageStatus == 2) {
+          onError?.call(apiResponse.errorMessage ?? 'Unknown error');
+        } else if (apiResponse.messageStatus == 1) {
+
+          notifyListeners();
+          if (onSuccess != null) {
+            // onSuccess(apiResponse.data);
+          }
+        }
+      },
+    );
+  }
+
+  void setSubTitle(String value) {
+    this.subTitle = value;
+    notifyListeners();
+  }
+
+  void setTitle(String value) {
+    this.title = value;
+    notifyListeners();
+  }
+  void setClinicOrDoctor(bool value){
+    this.isRateClinic = value;
+    notifyListeners();
+  }
+}
diff --git a/lib/features/my_appointments/models/req_model/appointment_rate_req_model.dart b/lib/features/my_appointments/models/req_model/appointment_rate_req_model.dart
new file mode 100644
index 0000000..91070f2
--- /dev/null
+++ b/lib/features/my_appointments/models/req_model/appointment_rate_req_model.dart
@@ -0,0 +1,100 @@
+class AppointmentRate {
+  int? rate;
+  int? appointmentNo;
+  int? projectID;
+  int? doctorID;
+  int? clinicID;
+  String? note;
+  String? mobileNumber;
+  int? createdBy;
+  int? editedBy;
+  double? versionID;
+  int? channel;
+  int? languageID;
+  String? iPAdress;
+  String? generalid;
+  int? patientOutSA;
+  String? sessionID;
+  bool? isDentalAllowedBackend;
+  int? deviceTypeID;
+  int? patientID;
+  String? tokenID;
+  int? patientTypeID;
+  int? patientType;
+
+  AppointmentRate(
+      {this.rate,
+        this.appointmentNo,
+        this.projectID,
+        this.doctorID,
+        this.clinicID,
+        this.note,
+        this.mobileNumber,
+        this.createdBy,
+        this.editedBy,
+        this.versionID,
+        this.channel,
+        this.languageID,
+        this.iPAdress,
+        this.generalid,
+        this.patientOutSA,
+        this.sessionID,
+        this.isDentalAllowedBackend,
+        this.deviceTypeID,
+        this.patientID,
+        this.tokenID,
+        this.patientTypeID,
+        this.patientType});
+
+  AppointmentRate.fromJson(Map json) {
+    rate = json['Rate'];
+    appointmentNo = json['AppointmentNo'];
+    projectID = json['ProjectID'];
+    doctorID = json['DoctorID'];
+    clinicID = json['ClinicID'];
+    note = json['Note'];
+    mobileNumber = json['MobileNumber'];
+    createdBy = json['CreatedBy'];
+    editedBy = json['EditedBy'];
+    versionID = json['VersionID'];
+    channel = json['Channel'];
+    languageID = json['LanguageID'];
+    iPAdress = json['IPAdress'];
+    generalid = json['generalid'];
+    patientOutSA = json['PatientOutSA'];
+    sessionID = json['SessionID'];
+    isDentalAllowedBackend = json['isDentalAllowedBackend'];
+    deviceTypeID = json['DeviceTypeID'];
+    patientID = json['PatientID'];
+    tokenID = json['TokenID'];
+    patientTypeID = json['PatientTypeID'];
+    patientType = json['PatientType'];
+  }
+
+  Map toJson() {
+    final Map data = new Map();
+    data['Rate'] = this.rate;
+    data['AppointmentNo'] = this.appointmentNo;
+    data['ProjectID'] = this.projectID;
+    data['DoctorID'] = this.doctorID;
+    data['ClinicID'] = this.clinicID;
+    data['Note'] = this.note;
+    data['MobileNumber'] = this.mobileNumber;
+    data['CreatedBy'] = this.createdBy;
+    data['EditedBy'] = this.editedBy;
+    data['VersionID'] = this.versionID;
+    data['Channel'] = this.channel;
+    data['LanguageID'] = this.languageID;
+    data['IPAdress'] = this.iPAdress;
+    data['generalid'] = this.generalid;
+    data['PatientOutSA'] = this.patientOutSA;
+    data['SessionID'] = this.sessionID;
+    data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
+    data['DeviceTypeID'] = this.deviceTypeID;
+    data['PatientID'] = this.patientID;
+    data['TokenID'] = this.tokenID;
+    data['PatientTypeID'] = this.patientTypeID;
+    data['PatientType'] = this.patientType;
+    return data;
+  }
+}
diff --git a/lib/features/my_appointments/models/resp_models/appointment_details_resp_model.dart b/lib/features/my_appointments/models/resp_models/appointment_details_resp_model.dart
new file mode 100644
index 0000000..2900bce
--- /dev/null
+++ b/lib/features/my_appointments/models/resp_models/appointment_details_resp_model.dart
@@ -0,0 +1,64 @@
+class AppointmentDetails {
+  String? setupID;
+  int? projectID;
+  int? patientID;
+  int? appointmentNo;
+  int? clinicID;
+  int? doctorID;
+  dynamic startTime;
+  dynamic endTime;
+  dynamic appointmentDate;
+  dynamic clinicName;
+  dynamic doctorImageURL;
+  dynamic doctorName;
+  dynamic projectName;
+
+  AppointmentDetails(
+      {this.setupID,
+        this.projectID,
+        this.patientID,
+        this.appointmentNo,
+        this.clinicID,
+        this.doctorID,
+        this.startTime,
+        this.endTime,
+        this.appointmentDate,
+        this.clinicName,
+        this.doctorImageURL,
+        this.doctorName,
+        this.projectName});
+
+  AppointmentDetails.fromJson(Map json) {
+    setupID = json['SetupID'];
+    projectID = json['ProjectID'];
+    patientID = json['PatientID'];
+    appointmentNo = json['AppointmentNo'];
+    clinicID = json['ClinicID'];
+    doctorID = json['DoctorID'];
+    startTime = json['StartTime'];
+    endTime = json['EndTime'];
+    appointmentDate = json['AppointmentDate'];
+    clinicName = json['ClinicName'];
+    doctorImageURL = json['DoctorImageURL'];
+    doctorName = json['DoctorName'];
+    projectName = json['ProjectName'];
+  }
+
+  Map toJson() {
+    final Map data = new Map();
+    data['SetupID'] = this.setupID;
+    data['ProjectID'] = this.projectID;
+    data['PatientID'] = this.patientID;
+    data['AppointmentNo'] = this.appointmentNo;
+    data['ClinicID'] = this.clinicID;
+    data['DoctorID'] = this.doctorID;
+    data['StartTime'] = this.startTime;
+    data['EndTime'] = this.endTime;
+    data['AppointmentDate'] = this.appointmentDate;
+    data['ClinicName'] = this.clinicName;
+    data['DoctorImageURL'] = this.doctorImageURL;
+    data['DoctorName'] = this.doctorName;
+    data['ProjectName'] = this.projectName;
+    return data;
+  }
+}
diff --git a/lib/features/my_appointments/models/resp_models/rate_appointment_resp_model.dart b/lib/features/my_appointments/models/resp_models/rate_appointment_resp_model.dart
new file mode 100644
index 0000000..877b7bc
--- /dev/null
+++ b/lib/features/my_appointments/models/resp_models/rate_appointment_resp_model.dart
@@ -0,0 +1,160 @@
+class RateAppointmentRespModel {
+  String? setupID;
+  int? projectID;
+  int? appointmentNo;
+  String? appointmentDate;
+  String? appointmentDateN;
+  int? appointmentType;
+  String? bookDate;
+  int? patientType;
+  int? patientID;
+  int? clinicID;
+  int? doctorID;
+  String? endDate;
+  String? startTime;
+  String? endTime;
+  int? status;
+  int? visitType;
+  int? visitFor;
+  int? patientStatusType;
+  int? companyID;
+  int? bookedBy;
+  String? bookedOn;
+  int? confirmedBy;
+  String? confirmedOn;
+  int? arrivalChangedBy;
+  String? arrivedOn;
+  int? editedBy;
+  String? editedOn;
+  dynamic doctorName;
+  String? doctorNameN;
+  String? statusDesc;
+  String? statusDescN;
+  bool? vitalStatus;
+  dynamic vitalSignAppointmentNo;
+  int? episodeID;
+  String? doctorTitle;
+  bool? isAppoitmentLiveCare;
+
+  RateAppointmentRespModel(
+      {this.setupID,
+        this.projectID,
+        this.appointmentNo,
+        this.appointmentDate,
+        this.appointmentDateN,
+        this.appointmentType,
+        this.bookDate,
+        this.patientType,
+        this.patientID,
+        this.clinicID,
+        this.doctorID,
+        this.endDate,
+        this.startTime,
+        this.endTime,
+        this.status,
+        this.visitType,
+        this.visitFor,
+        this.patientStatusType,
+        this.companyID,
+        this.bookedBy,
+        this.bookedOn,
+        this.confirmedBy,
+        this.confirmedOn,
+        this.arrivalChangedBy,
+        this.arrivedOn,
+        this.editedBy,
+        this.editedOn,
+        this.doctorName,
+        this.doctorNameN,
+        this.statusDesc,
+        this.statusDescN,
+        this.vitalStatus,
+        this.vitalSignAppointmentNo,
+        this.episodeID,
+        this.doctorTitle,
+        this.isAppoitmentLiveCare});
+
+  RateAppointmentRespModel.fromJson(Map json) {
+    try {
+      setupID = json['SetupID'];
+      projectID = json['ProjectID'];
+      appointmentNo = json['AppointmentNo'];
+      appointmentDate = json['AppointmentDate'];
+      appointmentDateN = json['AppointmentDateN'];
+      appointmentType = json['AppointmentType'];
+      bookDate = json['BookDate'];
+      patientType = json['PatientType'];
+      patientID = json['PatientID'];
+      clinicID = json['ClinicID'];
+      doctorID = json['DoctorID'];
+      endDate = json['EndDate'];
+      startTime = json['StartTime'];
+      endTime = json['EndTime'];
+      status = json['Status'];
+      visitType = json['VisitType'];
+      visitFor = json['VisitFor'];
+      patientStatusType = json['PatientStatusType'];
+      companyID = json['CompanyID'];
+      bookedBy = json['BookedBy'];
+      bookedOn = json['BookedOn'];
+      confirmedBy = json['ConfirmedBy'];
+      confirmedOn = json['ConfirmedOn'];
+      arrivalChangedBy = json['ArrivalChangedBy'];
+      arrivedOn = json['ArrivedOn'];
+      editedBy = json['EditedBy'];
+      editedOn = json['EditedOn'];
+      doctorName = json['DoctorName'];
+      doctorNameN = json['DoctorNameN'];
+      statusDesc = json['StatusDesc'];
+      statusDescN = json['StatusDescN'];
+      vitalStatus = json['VitalStatus'];
+      vitalSignAppointmentNo = json['VitalSignAppointmentNo'];
+      episodeID = json['EpisodeID'];
+      doctorTitle = json['DoctorTitle'];
+      isAppoitmentLiveCare = json['IsAppoitmentLiveCare'];
+    } catch (e) {
+      print(e);
+    }
+  }
+
+  Map toJson() {
+    final Map data = new Map();
+    data['SetupID'] = this.setupID;
+    data['ProjectID'] = this.projectID;
+    data['AppointmentNo'] = this.appointmentNo;
+    data['AppointmentDate'] = this.appointmentDate;
+    data['AppointmentDateN'] = this.appointmentDateN;
+    data['AppointmentType'] = this.appointmentType;
+    data['BookDate'] = this.bookDate;
+    data['PatientType'] = this.patientType;
+    data['PatientID'] = this.patientID;
+    data['ClinicID'] = this.clinicID;
+    data['DoctorID'] = this.doctorID;
+    data['EndDate'] = this.endDate;
+    data['StartTime'] = this.startTime;
+    data['EndTime'] = this.endTime;
+    data['Status'] = this.status;
+    data['VisitType'] = this.visitType;
+    data['VisitFor'] = this.visitFor;
+    data['PatientStatusType'] = this.patientStatusType;
+    data['CompanyID'] = this.companyID;
+    data['BookedBy'] = this.bookedBy;
+    data['BookedOn'] = this.bookedOn;
+    data['ConfirmedBy'] = this.confirmedBy;
+    data['ConfirmedOn'] = this.confirmedOn;
+    data['ArrivalChangedBy'] = this.arrivalChangedBy;
+    data['ArrivedOn'] = this.arrivedOn;
+    data['EditedBy'] = this.editedBy;
+    data['EditedOn'] = this.editedOn;
+    data['DoctorName'] = this.doctorName;
+    data['DoctorNameN'] = this.doctorNameN;
+    data['StatusDesc'] = this.statusDesc;
+    data['StatusDescN'] = this.statusDescN;
+    data['VitalStatus'] = this.vitalStatus;
+    data['VitalSignAppointmentNo'] = this.vitalSignAppointmentNo;
+    data['EpisodeID'] = this.episodeID;
+    data['DoctorTitle'] = this.doctorTitle;
+    data['IsAppoitmentLiveCare'] = this.isAppoitmentLiveCare;
+    return data;
+  }
+}
diff --git a/lib/features/my_appointments/my_appointments_repo.dart b/lib/features/my_appointments/my_appointments_repo.dart
index 87ec10d..72ed332 100644
--- a/lib/features/my_appointments/my_appointments_repo.dart
+++ b/lib/features/my_appointments/my_appointments_repo.dart
@@ -8,6 +8,7 @@ import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart';
 import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart';
 import 'package:hmg_patient_app_new/core/utils/date_util.dart';
 import 'package:hmg_patient_app_new/core/utils/utils.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/rate_appointment_resp_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart' show HospitalsModel;
@@ -15,6 +16,9 @@ import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart';
 import 'package:hmg_patient_app_new/services/logger_service.dart';
 
+import 'models/req_model/appointment_rate_req_model.dart';
+import 'models/resp_models/appointment_details_resp_model.dart';
+
 abstract class MyAppointmentsRepo {
   Future>>> getPatientAppointments({required bool isActiveAppointment, required bool isArrivedAppointments, bool isForEyeMeasurement = false});
 
@@ -58,6 +62,15 @@ abstract class MyAppointmentsRepo {
 
   Future>> sendAskDocCallRequest(
       {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, required String requestType, required String remarks, required String userMobileNumber});
+
+  Future>>> getLastRatingAppointment();
+
+  Future>> getAppointmentDetails(int appointmentID, int projectID);
+
+
+  Future>> sendAppointmentRate(int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note);
+
+  Future>> sendDoctorRate(int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note, String appoDate, String docName, String projectName, String clinicName);
 }
 
 class MyAppointmentsRepoImp implements MyAppointmentsRepo {
@@ -67,7 +80,8 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo {
   MyAppointmentsRepoImp({required this.loggerService, required this.apiClient});
 
   @override
-  Future>>> getPatientAppointments({required bool isActiveAppointment, required bool isArrivedAppointments, bool isForEyeMeasurement = false}) async {
+  Future>>> getPatientAppointments(
+      {required bool isActiveAppointment, required bool isArrivedAppointments, bool isForEyeMeasurement = false}) async {
     Map mapDevice = {
       "IsActiveAppointment": isActiveAppointment,
       "IsComingFromCOC": false,
@@ -176,7 +190,9 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo {
         "AppointmentNo": appointmentNo,
         "PaymentMethodName": paymentMethodName,
         "PaymentAmount": payedAmount == 0 ? "0" : payedAmount.toString(),
-        "PaymentDate": payedAmount == 0 ? "" : "/Date(${DateTime.now().millisecondsSinceEpoch})/",
+        "PaymentDate": payedAmount == 0 ? "" : "/Date(${DateTime
+            .now()
+            .millisecondsSinceEpoch})/",
         "PaymentReferenceNumber": payedAmount == 0 ? "" : paymentReference,
         "ProjectID": projectID,
         "PatientID": patientID,
@@ -746,4 +762,166 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo {
       return Left(UnknownFailure(e.toString()));
     }
   }
-}
+
+  @override
+  Future>>> getLastRatingAppointment() async {
+    Map mapDevice = {};
+    try {
+      GenericApiModel>? apiResponse;
+      Failure? failure;
+      await apiClient.post(IS_LAST_APPOINTMENT_RATED, onFailure: (error, statusCode, {messageStatus, failureType}) {
+        failure = failureType;
+      }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+        try {
+          final list = response['IsLastAppoitmentRatedList'];
+
+          final lstRatingAppointmentList = list.map((item) => RateAppointmentRespModel.fromJson(item as Map)).toList().cast();
+
+          apiResponse = GenericApiModel>(
+            messageStatus: messageStatus,
+            statusCode: statusCode,
+            errorMessage: null,
+            data: lstRatingAppointmentList,
+          );
+        } catch (e) {
+          failure = DataParsingFailure(e.toString());
+        }
+      }, body: mapDevice);
+      if (failure != null) return Left(failure!);
+      if (apiResponse == null) return Left(ServerFailure("Unknown error"));
+      return Right(apiResponse!);
+    } catch (e) {
+      return Left(UnknownFailure(e.toString()));
+    }
+  }
+
+  @override
+  Future>> getAppointmentDetails(int appointmentID, int projectID) async {
+    Map mapDevice = {
+      "AppointmentNumber": appointmentID,
+      "ProjectID": projectID,
+    };
+    try {
+      GenericApiModel? apiResponse;
+      Failure? failure;
+      await apiClient.post(GET_APPOINTMENT_DETAILS_BY_NO, onFailure: (error, statusCode, {messageStatus, failureType}) {
+        failure = failureType;
+      }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+        try {
+          final list = response['AppointmentDetails'];
+
+          final appointmentDetails = AppointmentDetails.fromJson(list);
+
+          apiResponse = GenericApiModel(
+            messageStatus: messageStatus,
+            statusCode: statusCode,
+            errorMessage: null,
+            data: appointmentDetails,
+          );
+        } catch (e) {
+          failure = DataParsingFailure(e.toString());
+        }
+      }, body: mapDevice);
+      if (failure != null) return Left(failure!);
+      if (apiResponse == null) return Left(ServerFailure("Unknown error"));
+      return Right(apiResponse!);
+    } catch (e) {
+      return Left(UnknownFailure(e.toString()));
+    }
+  }
+
+
+  @override
+  Future>>  sendAppointmentRate(int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note) async {
+
+    AppointmentRate appointmentRate = AppointmentRate();
+    appointmentRate.rate = rate;
+    appointmentRate.appointmentNo = appointmentNo;
+    appointmentRate.projectID = projectID;
+    appointmentRate.doctorID = doctorID;
+    appointmentRate.clinicID = clinicID;
+    appointmentRate.note = note;
+    appointmentRate.createdBy = 2;
+    appointmentRate.editedBy = 2;
+
+
+    try {
+      GenericApiModel? apiResponse;
+      Failure? failure;
+      await apiClient.post(NEW_RATE_APPOINTMENT_URL, onFailure: (error, statusCode, {messageStatus, failureType}) {
+        failure = failureType;
+      }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+        try {
+          final list = response['AppointmentRated'];
+
+          apiResponse = GenericApiModel(
+            messageStatus: messageStatus,
+            statusCode: statusCode,
+            errorMessage: null,
+            data: list,
+          );
+        } catch (e) {
+          failure = DataParsingFailure(e.toString());
+        }
+      }, body: appointmentRate.toJson());
+      if (failure != null) return Left(failure!);
+      if (apiResponse == null) return Left(ServerFailure("Unknown error"));
+      return Right(apiResponse!);
+    } catch (e) {
+      return Left(UnknownFailure(e.toString()));
+    }
+  }
+
+  @override
+  Future>>  sendDoctorRate(int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note, String appoDate, String docName, String projectName, String clinicName) async {
+    Map request;
+
+    request = {
+      "DoctorID": doctorID,
+      "Rate": rate,
+      "ClinicID": clinicID,
+      "ProjectID": projectID,
+      "AppointmentNo": appointmentNo,
+      "Note": note,
+      // "MobileNumber": authenticatedUserObject.user!.mobileNumber,
+      "AppointmentDate": appoDate,
+      "DoctorName": docName,
+      "ProjectName": projectName,
+      "COCTypeName": 1,
+      // "PatientName": authenticatedUserObject.user!.firstName! + " " + authenticatedUserObject.user!.lastName!,
+      // "PatientOutSA": authenticatedUserObject.user!.outSA,
+      // "PatientTypeID": authenticatedUserObject.user!.patientType,
+      "ClinicName": clinicName,
+      // "PatientIdentificationID": authenticatedUserObject.user!.patientIdentificationNo
+    };
+
+    try {
+      GenericApiModel? apiResponse;
+      Failure? failure;
+      await apiClient.post(NEW_RATE_DOCTOR_URL, onFailure: (error, statusCode, {messageStatus, failureType}) {
+        failure = failureType;
+      }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+        try {
+          final list = response['AppointmentRated'];
+
+          // final appointmentDetails = AppointmentDetails.fromJson(list);
+
+          apiResponse = GenericApiModel(
+            messageStatus: messageStatus,
+            statusCode: statusCode,
+            errorMessage: null,
+            data: list,
+          );
+        } catch (e) {
+          failure = DataParsingFailure(e.toString());
+        }
+      }, body: request);
+      if (failure != null) return Left(failure!);
+      if (apiResponse == null) return Left(ServerFailure("Unknown error"));
+      return Right(apiResponse!);
+    } catch (e) {
+      return Left(UnknownFailure(e.toString()));
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart
index fa1ad22..0958c8e 100644
--- a/lib/features/my_appointments/my_appointments_view_model.dart
+++ b/lib/features/my_appointments/my_appointments_view_model.dart
@@ -37,6 +37,9 @@ class MyAppointmentsViewModel extends ChangeNotifier {
   DateTime? start = null;
   DateTime? end = null;
 
+
+
+
   List patientAppointmentsHistoryList = [];
   List filteredAppointmentList = [];
 
@@ -679,4 +682,5 @@ class MyAppointmentsViewModel extends ChangeNotifier {
       },
     );
   }
+
 }
diff --git a/lib/main.dart b/lib/main.dart
index 1af80b6..c8fa667 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -21,6 +21,7 @@ import 'package:hmg_patient_app_new/features/lab/history/lab_history_viewmodel.d
 import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart';
 import 'package:hmg_patient_app_new/features/location/location_view_model.dart';
 import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/appointment_rating_view_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
 import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart';
@@ -104,6 +105,9 @@ void main() async {
         ChangeNotifierProvider(
           create: (_) => getIt.get(),
         ),
+        ChangeNotifierProvider(
+          create: (_) => getIt.get(),
+        ),
         ChangeNotifierProvider(
           create: (_) => getIt.get(),
         ),
diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart
index 3cf56a6..61174c0 100644
--- a/lib/presentation/appointments/widgets/appointment_card.dart
+++ b/lib/presentation/appointments/widgets/appointment_card.dart
@@ -38,7 +38,7 @@ class AppointmentCard extends StatelessWidget {
   final MedicalFileViewModel? medicalFileViewModel;
   final ContactUsViewModel? contactUsViewModel;
   final BookAppointmentsViewModel bookAppointmentsViewModel;
-
+  final bool isForRate;
   const AppointmentCard({
     super.key,
     required this.patientAppointmentHistoryResponseModel,
@@ -51,6 +51,7 @@ class AppointmentCard extends StatelessWidget {
     this.isForFeedback = false,
     this.medicalFileViewModel,
     this.contactUsViewModel,
+    this.isForRate =false
   });
 
   @override
@@ -63,11 +64,11 @@ class AppointmentCard extends StatelessWidget {
         child: Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
-            _buildHeader(context, appState),
+          isForRate ? SizedBox():  _buildHeader(context, appState),
             SizedBox(height: 16.h),
             _buildDoctorRow(context),
             SizedBox(height: 16.h),
-            _buildActionArea(context, appState),
+            isForRate ? SizedBox():   _buildActionArea(context, appState),
           ],
         ),
       ),
diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart
index 1007547..6e0de4c 100644
--- a/lib/presentation/home/landing_page.dart
+++ b/lib/presentation/home/landing_page.dart
@@ -20,6 +20,7 @@ import 'package:hmg_patient_app_new/features/emergency_services/emergency_servic
 import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart';
 import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart';
 import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/appointment_rating_view_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart';
 import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
 import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart';
@@ -39,6 +40,7 @@ import 'package:hmg_patient_app_new/presentation/home/widgets/small_service_card
 import 'package:hmg_patient_app_new/presentation/home/widgets/welcome_widget.dart';
 import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
 import 'package:hmg_patient_app_new/presentation/profile_settings/profile_settings.dart';
+import 'package:hmg_patient_app_new/presentation/rate_appointment/rate_appointment_doctor.dart';
 import 'package:hmg_patient_app_new/services/cache_service.dart';
 import 'package:hmg_patient_app_new/theme/colors.dart';
 import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
@@ -64,7 +66,7 @@ class _LandingPageState extends State {
   late MyAppointmentsViewModel myAppointmentsViewModel;
   late PrescriptionsViewModel prescriptionsViewModel;
   final CacheService cacheService = GetIt.instance();
-
+  late AppointmentRatingViewModel appointmentRatingViewModel;
   late InsuranceViewModel insuranceViewModel;
   late ImmediateLiveCareViewModel immediateLiveCareViewModel;
   late BookAppointmentsViewModel bookAppointmentsViewModel;
@@ -76,6 +78,7 @@ class _LandingPageState extends State {
   void initState() {
     authVM = context.read();
     habibWalletVM = context.read();
+    appointmentRatingViewModel = context.read();
     // myAppointmentsViewModel = context.read();
     // prescriptionsViewModel = context.read();
     // insuranceViewModel = context.read();
@@ -99,6 +102,17 @@ class _LandingPageState extends State {
         immediateLiveCareViewModel.initImmediateLiveCare();
         immediateLiveCareViewModel.getPatientLiveCareHistory();
         emergencyServicesViewModel.checkPatientERAdvanceBalance();
+        appointmentRatingViewModel.getLastRatingAppointment(onSuccess: (response) {
+          if (appointmentRatingViewModel.appointmentRatedList.isNotEmpty) {
+            appointmentRatingViewModel.getAppointmentDetails(appointmentRatingViewModel.appointmentRatedList.last.appointmentNo!, appointmentRatingViewModel.appointmentRatedList.last.projectID!,
+                onSuccess: ((response) {
+                  appointmentRatingViewModel.setClinicOrDoctor(false);
+                  appointmentRatingViewModel.setTitle("Rate Doctor".needTranslation);
+                  appointmentRatingViewModel.setSubTitle("How was your last visit with doctor?".needTranslation);
+              openLastRating();
+            }));
+          }
+        });
       }
     });
     super.initState();
@@ -271,17 +285,14 @@ class _LandingPageState extends State {
                                           )
                                     : Container(
                                         width: double.infinity,
-                                        decoration: RoundedRectangleBorder()
-                                            .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true),
+                                        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true),
                                         child: Padding(
                                           padding: EdgeInsets.all(12.h),
                                           child: Column(
                                             children: [
                                               Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h),
                                               SizedBox(height: 12.h),
-                                              "You do not have any upcoming appointment. Please book an appointment"
-                                                  .needTranslation
-                                                  .toText12(isCenter: true),
+                                              "You do not have any upcoming appointment. Please book an appointment".needTranslation.toText12(isCenter: true),
                                               SizedBox(height: 12.h),
                                               CustomButton(
                                                 text: LocaleKeys.bookAppo.tr(context: context),
@@ -595,4 +606,31 @@ class _LandingPageState extends State {
       },
     );
   }
+
+  openLastRating() {
+    showCommonBottomSheetWithoutHeight(
+      context,
+      titleWidget: Selector(
+        selector: (_, vm) => vm.title,
+        builder: (context, title, child) {
+          final displayTitle = title ?? '';
+          return Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              displayTitle.toText20(weight: FontWeight.w600),
+              (context.select((vm) => vm.subTitle) ?? '').toText12(),
+            ],
+          );
+        },
+      ),
+      isCloseButtonVisible: true,
+      child: StatefulBuilder(
+        builder: (context, setState) {
+
+          return RateAppointmentDoctor();
+        },
+      ),
+      isFullScreen: false,
+    );
+  }
 }
diff --git a/lib/presentation/rate_appointment/rate_appointment_clinic.dart b/lib/presentation/rate_appointment/rate_appointment_clinic.dart
new file mode 100644
index 0000000..a33628e
--- /dev/null
+++ b/lib/presentation/rate_appointment/rate_appointment_clinic.dart
@@ -0,0 +1,213 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:hmg_patient_app_new/core/utils/size_utils.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/my_appointments/appointment_rating_view_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/rate_appointment/widget/doctor_row.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart';
+import 'package:provider/provider.dart';
+
+class RateAppointmentClinic extends StatefulWidget {
+
+ late final String? doctorNote;
+  late final int? doctorRate;
+
+  RateAppointmentClinic({this.doctorRate, this.doctorNote});
+
+  @override
+  _RateAppointmentClinicState createState() => _RateAppointmentClinicState();
+}
+
+class _RateAppointmentClinicState extends State {
+  final formKey = GlobalKey();
+  String note = "";
+  int rating = 5;
+  AppointmentRatingViewModel? appointmentRatingViewModel;
+  MyAppointmentsViewModel? myAppointmentsViewModel;
+
+  @override
+  Widget build(BuildContext context) {
+    myAppointmentsViewModel = Provider.of(context, listen: false);
+    appointmentRatingViewModel = Provider.of(context, listen: false);
+
+    // Make the sheet a fixed height and keep content scrollable while pinning buttons to bottom
+    final sheetHeight = ResponsiveExtension.screenHeight * 0.60;
+
+    return SizedBox(
+      height: sheetHeight,
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          // Scrollable content
+          Expanded(
+            child:  Padding(
+                padding: const EdgeInsets.only(top: 0.0, left: 0, right: 0),
+                child: Column(
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    // Doctor row
+                    Container(
+                      decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                        color: AppColors.whiteColor,
+                        borderRadius: 24.r,
+                        hasShadow: false,
+                      ),
+                      child: BuildDoctorRow(
+                        isForClinic: true,
+                        appointmentDetails: appointmentRatingViewModel!.appointmentDetails,
+                      ),
+                    ),
+                    SizedBox(height: 16),
+
+                    // Rate clinic box
+                    SizedBox(
+                      width: double.infinity,
+                      child: Container(
+                        decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                          color: AppColors.whiteColor,
+                          borderRadius: 24.r,
+                          hasShadow: false,
+                        ),
+                        child: Padding(
+                          padding: const EdgeInsets.all(12.0),
+                          child: Column(
+                            crossAxisAlignment: CrossAxisAlignment.start,
+                            children: [
+                              Text(
+                                "Rate Clinic",
+                                style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.64, height: 23 / 16),
+                              ),
+                              SizedBox(height: 12),
+                              Row(
+                                mainAxisAlignment: MainAxisAlignment.center,
+                                children: [
+                                  ...List.generate(
+                                    5,
+                                    (index) => rating == (index + 1)
+                                        ? Container(
+                                            margin: EdgeInsets.only(left: 3.0, right: 3.0),
+                                            child: IconButton(
+                                              onPressed: () {
+                                                setState(() {
+                                                  rating = index + 1;
+                                                });
+                                              },
+                                              iconSize: 35,
+                                              icon: SvgPicture.asset('assets/images/svg/rate_${index + 1}.svg', colorFilter: getColors(rating)),
+                                            ),
+                                          )
+                                        : IconButton(
+                                            onPressed: () {
+                                              setState(() {
+                                                rating = index + 1;
+                                              });
+                                            },
+                                            iconSize: 35,
+                                            icon: SvgPicture.asset('assets/images/svg/rate_${index + 1}.svg'),
+                                          ),
+                                  ),
+                                ],
+                              ),
+                            ],
+                          ),
+                        ),
+                      ),
+                    ),
+
+                    SizedBox(height: 12),
+
+                    // Extra content area (keeps any other widgets that were previously below)
+                    Container(
+                      padding: EdgeInsets.symmetric(vertical: 20),
+                      child: Row(
+                        mainAxisSize: MainAxisSize.min,
+                        children: [
+                          // Placeholder for in-content widgets if needed in future
+                        ],
+                      ),
+                    ),
+
+                    // Add bottom spacing so last content isn't obscured by the fixed buttons
+                    SizedBox(height: 12),
+                  ],
+                ),
+              ),
+
+          ),
+
+          // Bottom action buttons pinned to bottom of the sheet
+          SafeArea(
+            top: false,
+            child: Padding(
+              padding: const EdgeInsets.symmetric( vertical: 12.0),
+              child: Row(
+                children: [
+                  Expanded(
+                    child: CustomButton(
+                      text: "Back".needTranslation,
+                      backgroundColor: Color(0xffFEE9EA),
+                      borderColor: Color(0xffFEE9EA),
+                      textColor: Color(0xffED1C2B),
+                      onPressed: () {
+                        appointmentRatingViewModel!.setTitle("Rate Doctor".needTranslation);
+                        appointmentRatingViewModel!.setSubTitle("How was your last visit with doctor?".needTranslation);
+                        appointmentRatingViewModel!.setClinicOrDoctor(false);
+                        setState(() {
+
+                        });
+                      },
+                    ),
+                  ),
+                  SizedBox(width: 10),
+                  Expanded(
+                    child: CustomButton(
+                      text: "Submit".needTranslation,
+                      onPressed: () {
+
+                        submitRating();
+
+                      },
+                    ),
+                  ),
+                ],
+              ),
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+
+  ColorFilter getColors(int rating){
+
+    switch(rating){
+      case 5:
+      return  ColorFilter.mode(AppColors.bgGreenColor, BlendMode.srcIn);
+      case 4:
+        return  ColorFilter.mode(Colors.greenAccent, BlendMode.srcIn);
+      case 3:
+        return  ColorFilter.mode(AppColors.warningLightColor, BlendMode.srcIn);
+      case 2:
+        return  ColorFilter.mode(Colors.orange, BlendMode.srcIn);
+      case 1:
+        return  ColorFilter.mode(AppColors.primaryRedColor, BlendMode.srcIn);
+
+      default:
+        return ColorFilter.mode(AppColors.greyColor, BlendMode.srcIn);
+    }
+  }
+
+  submitRating() async{
+    LoaderBottomSheet.showLoader();
+   await appointmentRatingViewModel!.submitDoctorRating(docRate: widget.doctorRate!, docNote: widget.doctorNote!);
+   await  appointmentRatingViewModel!.submitClinicRating(clinicRate: rating, clinicNote: note);
+    LoaderBottomSheet.hideLoader();
+    Navigator.pop(context);
+  }
+
+}
diff --git a/lib/presentation/rate_appointment/rate_appointment_doctor.dart b/lib/presentation/rate_appointment/rate_appointment_doctor.dart
new file mode 100644
index 0000000..4bff683
--- /dev/null
+++ b/lib/presentation/rate_appointment/rate_appointment_doctor.dart
@@ -0,0 +1,234 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/utils/size_utils.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/book_appointments/book_appointments_view_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/appointment_rating_view_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
+import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart';
+import 'package:hmg_patient_app_new/presentation/rate_appointment/rate_appointment_clinic.dart';
+import 'package:hmg_patient_app_new/presentation/rate_appointment/widget/doctor_row.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart';
+import 'package:provider/provider.dart';
+
+class RateAppointmentDoctor extends StatefulWidget {
+
+  bool isFromRegistration;
+
+  RateAppointmentDoctor({Key? key, this.isFromRegistration = false}) : super(key: key);
+
+  @override
+  _RateAppointmentDoctorState createState() => _RateAppointmentDoctorState();
+}
+
+class _RateAppointmentDoctorState extends State {
+  final formKey = GlobalKey();
+  String note = "";
+  int rating = 5;
+
+  // ProjectViewModel? projectViewModel;
+  AppointmentRatingViewModel? appointmentRatingViewModel;
+  MyAppointmentsViewModel? myAppointmentsViewModel;
+
+  @override
+  void initState() {
+
+    super.initState();
+  }
+
+
+  @override
+  Widget build(BuildContext context) {
+
+    myAppointmentsViewModel = Provider.of(context, listen: false);
+    appointmentRatingViewModel = Provider.of(context, listen: false);
+
+    final sheetHeight = ResponsiveExtension.screenHeight * 0.60;
+
+    return Selector(
+        selector: (_, vm) => vm.isRateClinic,
+        builder: (context, isRateClinic, child) => isRateClinic
+            ? RateAppointmentClinic(doctorNote: note,  doctorRate: rating,)
+            : SizedBox(
+                height: sheetHeight,
+                child: Column(
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    // Scrollable main content
+                    Expanded(
+
+                        child: Padding(
+                          padding: const EdgeInsets.only(top: 0.0, left: 0, right: 0),
+                          child: Column(
+                            crossAxisAlignment: CrossAxisAlignment.start,
+                            children: [
+                              // Doctor row
+                              Container(
+                                  decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                                    color: AppColors.whiteColor,
+                                    borderRadius: 24.r,
+                                    hasShadow: false,
+                                  ),
+                                  child: BuildDoctorRow(
+                                    isForClinic: false,
+                                    appointmentDetails: appointmentRatingViewModel!.appointmentDetails,
+                                  )),
+
+                              SizedBox(height: 16),
+
+                              // Rating box
+                              Container(
+                                decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                                  color: AppColors.whiteColor,
+                                  borderRadius: 24.r,
+                                  hasShadow: false,
+                                ),
+                                width: double.infinity,
+                                child: Padding(
+                                  padding: const EdgeInsets.all(12.0),
+                                  child: Column(
+                                    crossAxisAlignment: CrossAxisAlignment.start,
+                                    children: [
+                                      Text(
+                                        "Please rate the doctor",
+                                        style: TextStyle(
+                                            fontSize: 16,
+                                            fontWeight: FontWeight.w600,
+                                            color: Color(0xff2B353E),
+                                            letterSpacing: -0.64,
+                                            height: 23 / 16),
+                                      ),
+                                      SizedBox(height: 12),
+                                      Row(
+                                        mainAxisAlignment: MainAxisAlignment.center,
+                                        children: [
+                                          ...List.generate(
+                                            5,
+                                            (index) => AnimatedSwitcher(
+                                              duration: Duration(milliseconds: 1000),
+                                              switchInCurve: Curves.elasticOut,
+                                              switchOutCurve: Curves.elasticIn,
+                                              transitionBuilder: (Widget child, Animation animation) {
+                                                return ScaleTransition(child: child, scale: animation);
+                                              },
+                                              child: Container(
+                                                key: ValueKey(rating),
+                                                child: IconButton(
+                                                    iconSize: 45.0,
+                                                    onPressed: () {
+                                                      setState(() {
+                                                        rating = index + 1;
+                                                      });
+                                                    },
+                                                    color: rating >= (index + 1)
+                                                        ? Color.fromRGBO(255, 186, 0, 1.0)
+                                                        : Colors.grey[400],
+                                                    icon: Icon(rating >= (index + 1) ? Icons.star : Icons.star)),
+                                              ),
+                                            ),
+                                          )
+                                        ],
+                                      ),
+                                    ],
+                                  ),
+                                ),
+                              ),
+
+                              SizedBox(height: 12),
+
+                              // Note text field
+                              Container(
+                                  decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+                                    color: AppColors.whiteColor,
+                                    borderRadius: 24.r,
+                                    hasShadow: false,
+                                  ),
+                                  child: Padding(
+                                      padding: EdgeInsets.all(16.0),
+                                      child: TextField(
+
+                                        maxLines: 5,
+                                        decoration: InputDecoration.collapsed(
+                                            hintText: "Notes".needTranslation,
+                                            hintStyle: TextStyle(
+                                                fontSize: 16,
+                                                fontWeight: FontWeight.w600,
+                                                color: Color(0xff2B353E),
+                                                letterSpacing: -0.64,
+                                                height: 23 / 16)),
+                                        onChanged: (value) {
+                                          setState(() {
+                                            note = value;
+                                          });
+                                        },
+                                      ))),
+
+                              SizedBox(height: 12),
+
+                              // Optional extra spacing so content doesn't touch buttons
+                              SizedBox(height: 12),
+                            ],
+                          ),
+                        ),
+
+                    ),
+
+                    // Bottom action buttons pinned to bottom
+                    SafeArea(
+                      top: false,
+                      child: Padding(
+                        padding: const EdgeInsets.symmetric(vertical: 12.0),
+                        child: Row(
+                          children: [
+                            Expanded(
+                              child: CustomButton(
+                                text: "Later".needTranslation,
+                                backgroundColor: Color(0xffFEE9EA),
+                                borderColor: Color(0xffFEE9EA),
+                                textColor: Color(0xffED1C2B),
+                                onPressed: () {
+                                  Navigator.pop(context);
+                                },
+                              ),
+                            ),
+                            SizedBox(width: 10),
+                            Expanded(
+                              child: CustomButton(
+                                text: "Next".needTranslation,
+                                onPressed: () {
+                                  // Set up clinic rating and show clinic rating view
+                                  appointmentRatingViewModel!.setTitle("Rate Clinic".needTranslation);
+                                  appointmentRatingViewModel!.setSubTitle("How was your appointment?".needTranslation);
+                                  appointmentRatingViewModel!.setClinicOrDoctor(true);
+
+                                  setState(() {});
+                                },
+                              ),
+                            ),
+                          ],
+                        ),
+                      ),
+                    ),
+                  ],
+                ),
+              ));
+
+    // DoctorList getDoctorObject(AppointmentRateViewModel model) {
+    //   DoctorList doctor = new DoctorList();
+    //
+    //   doctor.name = model.appointmentDetails.doctorName;
+    //   doctor.doctorImageURL = model.appointmentDetails.doctorImageURL;
+    //   doctor.clinicName = model.appointmentDetails.clinicName;
+    //   doctor.projectName = model.appointmentDetails.projectName;
+    //   doctor.date = model.appointmentDetails.appointmentDate;
+    //   doctor.actualDoctorRate = 5;
+    //
+    //   return doctor;
+    // }
+  }
+
+
+}
diff --git a/lib/presentation/rate_appointment/widget/doctor_row.dart b/lib/presentation/rate_appointment/widget/doctor_row.dart
new file mode 100644
index 0000000..f38e15d
--- /dev/null
+++ b/lib/presentation/rate_appointment/widget/doctor_row.dart
@@ -0,0 +1,96 @@
+
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_assets.dart';
+import 'package:hmg_patient_app_new/core/utils/date_util.dart';
+import 'package:hmg_patient_app_new/core/utils/size_utils.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/my_appointments/appointment_rating_view_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/appointment_details_resp_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/rate_appointment_resp_model.dart';
+import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
+
+class BuildDoctorRow extends StatelessWidget {
+  bool isForClinic = false;
+  AppointmentDetails? appointmentDetails;
+
+   BuildDoctorRow({super.key, required this.isForClinic, this.appointmentDetails});
+
+  @override
+  Widget build(BuildContext context) {
+
+   return Padding(padding: EdgeInsets.all(16),child:Row(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+       Image.network(
+         isForClinic ?  'https://hmgwebservices.com/Images/Hospitals/${appointmentDetails!.projectID}.jpg' : appointmentDetails!.doctorImageURL ,
+          width: 63.h,
+          height: 63.h,
+          fit: BoxFit.cover,
+        ).circle(100),
+        SizedBox(width: 16.h),
+        Expanded(
+          child: Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              (isForClinic  ? appointmentDetails!.projectName :   appointmentDetails!.doctorName)!.toString()
+                  .toText16(isBold: true, maxlines: 1),
+
+              SizedBox(height: 8.h),
+
+
+          isForClinic ?     Wrap(
+                  direction: Axis.horizontal,
+                  spacing: 3.h,
+                  runSpacing: 4.h,
+                  children: [
+                    AppCustomChipWidget(
+
+                      labelText:
+                      appointmentDetails!.clinicName.toString(),
+
+                    ),
+                    AppCustomChipWidget(
+                      icon: AppAssets.ic_date_filter,
+                      labelText:
+                      DateUtil.formatDateToDate(DateUtil.convertStringToDate(appointmentDetails!.appointmentDate), false),
+
+                    ),
+
+                    AppCustomChipWidget(
+                    icon: AppAssets.appointment_time_icon,
+                    labelText:
+                    appointmentDetails!.startTime.substring(0,  appointmentDetails!.startTime.length - 3),
+
+                  ),
+
+                  ]
+              ) :  Wrap(
+              direction: Axis.horizontal,
+              spacing: 3.h,
+              runSpacing: 4.h,
+              children: [
+                AppCustomChipWidget(
+
+                  labelText:
+                  appointmentDetails!.projectName.toString(),
+
+
+                ),
+                AppCustomChipWidget(
+
+                  labelText:
+                  appointmentDetails!.clinicName.toString(),
+
+                )
+
+              ]
+          )
+            ],
+          ),
+        ),
+      ],
+    ));
+  }
+
+}
\ No newline at end of file

From 1d49308cc73cc085b681b3e166d952ab7eedadbc Mon Sep 17 00:00:00 2001
From: Sultan khan 
Date: Sun, 14 Dec 2025 14:56:14 +0300
Subject: [PATCH 18/55] last appointment rated.

---
 .../rate_appointment_clinic.dart                |  7 +++----
 .../rate_appointment_doctor.dart                | 17 ++++-------------
 2 files changed, 7 insertions(+), 17 deletions(-)

diff --git a/lib/presentation/rate_appointment/rate_appointment_clinic.dart b/lib/presentation/rate_appointment/rate_appointment_clinic.dart
index a33628e..0913297 100644
--- a/lib/presentation/rate_appointment/rate_appointment_clinic.dart
+++ b/lib/presentation/rate_appointment/rate_appointment_clinic.dart
@@ -78,10 +78,9 @@ class _RateAppointmentClinicState extends State {
                           child: Column(
                             crossAxisAlignment: CrossAxisAlignment.start,
                             children: [
-                              Text(
-                                "Rate Clinic",
-                                style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.64, height: 23 / 16),
-                              ),
+
+                                "Rate Clinic".needTranslation.toText16(isBold: true),
+
                               SizedBox(height: 12),
                               Row(
                                 mainAxisAlignment: MainAxisAlignment.center,
diff --git a/lib/presentation/rate_appointment/rate_appointment_doctor.dart b/lib/presentation/rate_appointment/rate_appointment_doctor.dart
index 4bff683..782927d 100644
--- a/lib/presentation/rate_appointment/rate_appointment_doctor.dart
+++ b/lib/presentation/rate_appointment/rate_appointment_doctor.dart
@@ -92,15 +92,9 @@ class _RateAppointmentDoctorState extends State {
                                   child: Column(
                                     crossAxisAlignment: CrossAxisAlignment.start,
                                     children: [
-                                      Text(
-                                        "Please rate the doctor",
-                                        style: TextStyle(
-                                            fontSize: 16,
-                                            fontWeight: FontWeight.w600,
-                                            color: Color(0xff2B353E),
-                                            letterSpacing: -0.64,
-                                            height: 23 / 16),
-                                      ),
+
+                                      "Please rate the doctor".needTranslation.toText16(isBold: true),
+
                                       SizedBox(height: 12),
                                       Row(
                                         mainAxisAlignment: MainAxisAlignment.center,
@@ -150,7 +144,7 @@ class _RateAppointmentDoctorState extends State {
                                       padding: EdgeInsets.all(16.0),
                                       child: TextField(
 
-                                        maxLines: 5,
+                                        maxLines: 4,
                                         decoration: InputDecoration.collapsed(
                                             hintText: "Notes".needTranslation,
                                             hintStyle: TextStyle(
@@ -166,10 +160,7 @@ class _RateAppointmentDoctorState extends State {
                                         },
                                       ))),
 
-                              SizedBox(height: 12),
 
-                              // Optional extra spacing so content doesn't touch buttons
-                              SizedBox(height: 12),
                             ],
                           ),
                         ),

From d202aa84234ffc974b66569e5bee8bb26acaccd5 Mon Sep 17 00:00:00 2001
From: haroon amjad 
Date: Sun, 14 Dec 2025 15:36:13 +0300
Subject: [PATCH 19/55] Smartwatch integration started

---
 .../images/png/smartwatches/Apple-Watch-6.png | Bin 0 -> 133283 bytes
 .../png/smartwatches/apple-watch-1.jpeg       | Bin 0 -> 25125 bytes
 .../images/png/smartwatches/apple-watch-2.jpg | Bin 0 -> 19316 bytes
 .../images/png/smartwatches/apple-watch-3.jpg | Bin 0 -> 53438 bytes
 .../images/png/smartwatches/apple-watch-4.jpg | Bin 0 -> 61120 bytes
 .../images/png/smartwatches/apple-watch-5.jpg | Bin 0 -> 31231 bytes
 .../png/smartwatches/bloodoxygen_icon.svg     |   5 +
 .../images/png/smartwatches/calories_icon.svg |   3 +
 .../images/png/smartwatches/distance_icon.svg |   3 +
 .../images/png/smartwatches/galaxy_fit_3.jpg  | Bin 0 -> 47012 bytes
 .../png/smartwatches/galaxy_watch_7.webp      | Bin 0 -> 35172 bytes
 .../smartwatches/galaxy_watch_7_classic.jpg   | Bin 0 -> 193275 bytes
 .../png/smartwatches/galaxy_watch_8.jpg       | Bin 0 -> 32247 bytes
 .../smartwatches/galaxy_watch_8_classic.jpeg  | Bin 0 -> 67290 bytes
 .../png/smartwatches/galaxy_watch_ultra.jpg   | Bin 0 -> 88509 bytes
 .../png/smartwatches/heartrate_icon.svg       |   3 +
 assets/images/png/smartwatches/steps_icon.svg |   4 +
 assets/images/svg/daily_water_monitor.svg     |   5 +
 .../svg/health_calculators_services_icon.svg  |   3 +
 assets/images/svg/health_converters_icon.svg  |   4 +
 assets/images/svg/smartwatch_icon.svg         |   3 +
 ios/Runner/Info.plist                         |   2 +
 ios/Runner/Runner.entitlements                |   8 +
 lib/core/app_assets.dart                      |   4 +
 lib/core/dependencies.dart                    |   5 +
 .../health_provider.dart                      |  85 ++++
 .../health_service.dart                       | 166 +++++++
 .../smartwatch_health_data/health_utils.dart  | 109 ++++
 lib/main.dart                                 |   4 +
 .../book_appointment_page.dart                |   1 +
 .../hmg_services/services_page.dart           |  64 ++-
 .../hmg_services/services_view.dart           |   6 +-
 .../health_dashboard/health_dashboard.dart    | 422 ++++++++++++++++
 .../smartwatch_instructions_page.dart         | 464 ++++++++++++++++++
 .../smartwatches/widgets/health_chart.dart    |  87 ++++
 .../smartwatches/widgets/health_metric.dart   |  97 ++++
 .../widgets/health_metric_card.dart           | 151 ++++++
 lib/routes/app_routes.dart                    |   3 +
 pubspec.yaml                                  |   1 +
 39 files changed, 1709 insertions(+), 3 deletions(-)
 create mode 100644 assets/images/png/smartwatches/Apple-Watch-6.png
 create mode 100644 assets/images/png/smartwatches/apple-watch-1.jpeg
 create mode 100644 assets/images/png/smartwatches/apple-watch-2.jpg
 create mode 100644 assets/images/png/smartwatches/apple-watch-3.jpg
 create mode 100644 assets/images/png/smartwatches/apple-watch-4.jpg
 create mode 100644 assets/images/png/smartwatches/apple-watch-5.jpg
 create mode 100644 assets/images/png/smartwatches/bloodoxygen_icon.svg
 create mode 100644 assets/images/png/smartwatches/calories_icon.svg
 create mode 100644 assets/images/png/smartwatches/distance_icon.svg
 create mode 100644 assets/images/png/smartwatches/galaxy_fit_3.jpg
 create mode 100644 assets/images/png/smartwatches/galaxy_watch_7.webp
 create mode 100644 assets/images/png/smartwatches/galaxy_watch_7_classic.jpg
 create mode 100644 assets/images/png/smartwatches/galaxy_watch_8.jpg
 create mode 100644 assets/images/png/smartwatches/galaxy_watch_8_classic.jpeg
 create mode 100644 assets/images/png/smartwatches/galaxy_watch_ultra.jpg
 create mode 100644 assets/images/png/smartwatches/heartrate_icon.svg
 create mode 100644 assets/images/png/smartwatches/steps_icon.svg
 create mode 100644 assets/images/svg/daily_water_monitor.svg
 create mode 100644 assets/images/svg/health_calculators_services_icon.svg
 create mode 100644 assets/images/svg/health_converters_icon.svg
 create mode 100644 assets/images/svg/smartwatch_icon.svg
 create mode 100644 lib/features/smartwatch_health_data/health_provider.dart
 create mode 100644 lib/features/smartwatch_health_data/health_service.dart
 create mode 100644 lib/features/smartwatch_health_data/health_utils.dart
 create mode 100644 lib/presentation/smartwatches/health_dashboard/health_dashboard.dart
 create mode 100644 lib/presentation/smartwatches/smartwatch_instructions_page.dart
 create mode 100644 lib/presentation/smartwatches/widgets/health_chart.dart
 create mode 100644 lib/presentation/smartwatches/widgets/health_metric.dart
 create mode 100644 lib/presentation/smartwatches/widgets/health_metric_card.dart

diff --git a/assets/images/png/smartwatches/Apple-Watch-6.png b/assets/images/png/smartwatches/Apple-Watch-6.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e670506948c28b29fd685e943af24f85dec75a7
GIT binary patch
literal 133283
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	s;a%?0Jk)e=p
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�%yOR|8$D7
z76Z&pHo~yY`?+xunc8bnAVX##fBw&$$JqHdkAs-}Q(=-Z&}?FbKEN%98~Obe)di
zFPV&tT^M}-l~kJbZ7(euJE(S%pquwU0LMT$zxOcRpXBx5raXH(=RPNAkuFGNy$$05)K;Kj`<#ZMC3W}btV%w{b8jDOW
zJY9bx`YS&Q%MwU^ba&IViRm=baCT0ES9_-yla-2dGOa77EFe)#CHj~ePA#U~Q~^p)
zE>}W>52h5-Ay;GsO-D>aUQ8{>#B}NtV=DCW!s*IE?VZ$=oFdFAHMa~nQ&l(}Af>wk
z0Dou|N7Uh<0=w=)y(0JgPhQWMAuF#dGR(Z9+uf+A6-sq{gV`0{!*ogSh2wAvU&GYYJUA6GotJF)@%rHt0J&Mq`!ffg47Y3GUZa`$R13!eq?gqoRjk+dYBe%DV1UO$a$4g$I#1VY#$y|1&Nr-6&YeW
zO5aq))8Q0#-p(R^V^`|EKvPsTuQMI+z?TJeaNCrqHoFKN06NpvX`s#}@PTTIPAMUE
zz&R+C;6CQ*bS?2_PjzB>C9`%5Ri$O2)LkJ{!2e83!l=$c!b96J7E?3%6PVgtY_V0T
z_HHgM7%>$}A-kXym}36tUB?eTwmKgg(cmy?o)U|>qa#D9woH3H(_)WOVw%2wHs#^8
z#age4{81w_6&+6K@I4h&Q&8FyQ+7>xJ%*T0M#num<9k0$?BR-xqo%{h-Xr2WX=7t>
z)ik41OIkbTPkOOaE$M#o36dI);fxw!x*!%)aGbV;<1TXjfK*d+CLL7X-Dy-WtMD`o
zjM?Sgtwc#~MoPzgYYZ!73K-M7(A(y(#(VYMYtkzrlp;2#d#n6Ik(ihq9xaHNViW3u
z34^Kp{M}6~Bc`7vronB!lf7#1N~4l*Q%qSvvSR9%kRYcxo3hpm_q}kcwuV5Il2PB2
zDbJ=%c_F5jQs-!DD3$lUPSb{suLvYXt-R3X%R
zjqxFwuA+bH7JYxkVv_%bQ+~9VzNx-cQ>WtV2kG`oKh4clleuIy6CMm{DzUv>yV#Jp
zIO}BNw>_r!5@ULgf$5Xph!vgw`P5ztN592{oq^PI-bWt+V;Gc{i0RU!ySvB6ru(<#
zq)bi&Vv3hZyp>y(f>NqCW0X=+Q&O4+rH-0XPOX}@3&wmDWh-W6TAA_^RJ>^c$=dEI
zrVgfKEA-MWXidFT(;E+`ifFmm%Fp4?@M+n_bRyNr@1?f0ostpN#X@OurIZa@HAPrZ
ze|sg82U1;SbOMsfjcm?tMEAleeh3+LGv+|LwU|Q>#9}IcE~+axF5%zas%`XQuD)~I
z)3o!gl-y&J;?bc{3ag+}YK`|$Q%I>ms&`Eh=G6@7HS<+^oTAYC2%~uJI=*V=H*jV6
zFdGu^R8f-G=w!AnoVNPS7zt475z}Fqf>WV1f0>zP!!%gj=x#tLrJD0XOa~rKe-ir0
z*b2Qg^=2J4b>-9%%T#8sUYP6u`Bh9EgKr^OY~-ch3uY_n_)44ed+~w5AIF*x4XMP9
z1QJPN%HQUbh^lp0V&?g3*pbJzz0yg(FQ17<>9W-r&?*fJR`3lir=-yQY{LZp(YGHg
z=!a=z7no`@#w?}~OqEh5y}e0gQG+QXw5f~2msCy#(-ZQ$EF62v=QiG}Hyu8Dvl(N*D?3H@2wPeKlcCZ+XQV>cL{taph5b=p(`i2F`
zQ|KL+RgjI-Z%$;qnEI~^=R$uXN=#inT{*bSEuv7AEtGa9!bQC#j>j&FPM{QD*7^`5
zsZObu3r_#}Kd9+INHy^9XkJlBNnWj8xGe8p=Qf*5FAt*BNNL=BV|q77&%kN<9n>`S
z=8TmbMj<^xKu~**-gWEe)dG?)ryle05nrTTc6=vY_O>_@Z+9
zlYjmMm?8#%Dx~`|ivL&<^kT~S>WhA_*xcSQ@RVydr@|Q~zDa6s@EesYUrbThy
zKRrALp~g}K-he4MwPFgZpv4qQs;KIS6&y}&32F0A@3FDe8;ebkP(o5dE%=z=NrPYABVzec$6ul|ZQ8sH9vXW5twBQ^(M2M>m8XjK47OsqiA)
zg2dFdAqB^jVJ!ofrMfg@WL2mjqQ>8B9&`JYPEe{ZO6nEPslqDHoP<@wS;9s?p!uhs
zdl==SwY`*-jM`b8NEerb`ER%JSIzR)8fLVg6yo&TnJSn~+7TtAw>jDZwS77SUrLM#HIc
zu29Gdpru?mo~@RWJHwPOrIgO@N<${QfjB)$OV(VGPs#XO4sUQLmf==-cEa3a(+ZMN
z)t;kB*n%2Uf&g&N_l`!+lK&e4{@@}2?oLaW(NqVD!Fg2(uuEJ@p(Wxq>tn;#h
zZM8e4TxK$~`4)iMSO10K3aX(rIv-;J$?cjV#ytF!{)TUC
zr?V^mrryDrUR2uk^vZU;wvUdee@Hb|R20RUPBGq-%#}`k8!Tc2ntakwPVuzAaQxfY
z)$^wDE~$85dWsMoU9LN
zg^H3|jn5+8FTGXT8~0#pExl#gZn`dzo@)UKhf_|x2ZLzGc&GDPF^z<#Y~xe~_?|HR
z_J@BJBc@Ym$qcO?DWmezdy7sl?#ca_UYVDEUPny5nAWRO(oPBP(@WO_#`uH@8yF@XE=@o!gqaV!xYfG4dC+3b!;;!0XxC$h$4
zoNAedN}^g?yLkj4Qr_J)dEYhT9OOT$To6p3WhWLzSnF>ir&~Ul=A~10ymSsfubxdY
zq?ed338eOHsuF4;wUn}PdiP#I`j9?POou1Ez|zX84I`*iD|?sqB+Ih%>TBwCjP;GPZCm}h8B@9)_Kp-&
zF}$|{iS}PHFKM}WRA}YOTN5s&wzl+Ev79Z*iL^XxCwz8R@RrVPftX}xamdBc_(U9S
zPVgvI@U;A$wA@0OHxX}W$!v5?y%%J%u=M6z30d^in|E&(`or`mp<)V5H!Y^t*g!Fz
z-n5NVQ$bpqyj!mzeMlcc4T(i0yaqyb(i59g@0Aavj3i=e8TDqp#1xcP>j#-Ntc)Xi1=Gk!$A~FAG82oyG~n5Et9qt=&rvX)(;tE^=~_iWNpv+V
z3(!iJ)qEZoKWzim`!yI;mXw{q)QD2D-mdQSzAXxvHV?)%JN@;6{-f=%v^i6tG#+29
zJUg9}rtflF^4;7-Lb|8L@aS#RWnxONpj>Z_Jr+di=*2R&z6D9b?li@bRQ_7$^iNL-
z$+#Pq?zSI8gTtqOrSp&&L25_(LRe8F-YM@%-s>0z-#DBitldL`=hLdkH;{#`g+VSJ$f51YYZl
zYkTbu9Pzf)`^J}lIz3oy7u%ikRw7r(f=lRUTfqz?4OnT{w{OmQA*Pb?O7qAzWKPNx
zsfxH867h}{k+$CjQ(AgqLYjZt>%<)P2HvxRWHhF?h7Cbbue%$drgS&lM~K0}Bd3UH
zfU~K2GQjYI#d2CubUjGq)XdY)N&E1<>5xJSc18_a28U2eF|{c#)zpZo4!r;I|Cu}U
z-ejsMjHA|Fg;eb}vnGB_<1d#0(^_D2{@<9Ipr=Cd;+9>?Gsw0afL99H8F*7|a?
z+H+=d>ibfo%v|GPhE=@$l>jZFz0CSK$|?lggHpl8S@ro_7N|1CugFxZ9?2)$k7yk8
zXWgp&UcN4^#Va_#t;eaKCPPy&O1SCuD&O%mhE4Y=$f-t^pQNQ}RHnLx^xe@@U&J;O
zAG|DCFJdmH2|uR%Nn$&lPUO9wB9b{ZS0Rzu7JFVED-2mk!Om*2==$)TJ7VgyAel$P
zaW6$A1;;z@hE3b1~zsqBd23&)<=|8)VUnV7k3jx7Xk0
zy&C}hRo6q0O^0N>#BQbSog}_W0#cLE#43=ou+9_Hlu?<^>L8_eUXMi(uT!hH;t8gv
znubhz3
zP1%B!rVv8;$*w{A6ROV(N*U9r$EH%8J}vu@me?=IonA?K%{U?kU(LHH;d{M`M6X@)
z+*cFZxOy3ga)8e@V=9zFObtv0QlAGY^-3g|KK7(lDtf_c8n!lN&KT31*0JX(cDgMW
z7Ka-b{0vp~*rpwj$Ih%al78w3e-%s{N#WT@FC@!$`~1nuRw||3e4g@Ihb7g*Nj9G8
z!hUp~t2N74zuNUNI~+oL1#d0@LV^v5BqsLNEoQfqE*0;?w+~-YNxuq~IO7Geff8
z6*&!{bbIeWTN_L@m9wS_(}=cEy%;YPb*p!g3(3T^y%eTXdr_`^cym5-p{q!5-F~Ze
zTP*f(iXgXfTr0MKRzTKkaBAT(n^v@@=rlK%q3-b5S-K@#$k8|^Ux1|MJNh4a!wosrtf3OAS3~$NhyozK}ycX1d8d`JL!l<)*o9r!E~XT_65_0
zW`u`MDNLBHD$q^Tb?@koa455!(j;p?{bkl
z8+;qx}s{Rp+shRWYaSR}3Ot+)y
zAfeS;t@MJ_G#FFJgxmeSy%GrsC}+nn+7-zZY1;W6B+*)$3DPiKG)?!IYMlAM6>F
z?wH;NJ|2UG_ff=iui5R2cUMiFg=z{T-JtQOoHt#Z^@?k#Fd7v|Wt4HR+Ntuivq(r`
zG1!8V)R*+mj}j%;U~jmz{QXLY^Q!UM31Nyhul$q9;!va1_d4f{7}L;WQ=EYXrkwQh
zB~RkIhqb}yw>K~arJ|<5^yxQa8;g&gvVbXtsOeYBU>cTG@TotoWWbk?8qq1GN=%d7
z<~6+y6oTna3a8kjh{tGwgCEm5>l^F|rnb7sNsfgtN2!47cqJR#&s2w3PdD3DY9{sO
zw~qX*T7g_-(WP?EfC4U{TDmn`9G6dX@y?ntwP%e@F(E!um~zsq_N%b9fd>;zsqXM*
zSXC!HC`{FL;t*iMbnCO&MnbMRUH+I%Vtts>JA8>Mm~x>y8OCT#jnecRU78~3QzEq$
z5vJ%NRZ1t?EeJ+~T}bw!!juxhad~-6{TuH^Q{Br}L3fBsEjr3nIUe%f?SLP_6|cZ>
z>Wxyh+Cww-eo>*>XooQ6+H^+JyBem2|Bg-R23RzDp`@@0BG}phIi>3;U_Y8tIziO*
z^D?H`^pO1EvDoI~-Tk{+?-D7m-_08qRRvb4;#7{dX-bnsX+X{^M@`v-gbq?P@dEkv
z+HN*G!L%AwoGNYV0#h>0pBsC67lx)x=ANCyGe><3H^T6?-=r;b==laVj*Kq?F)dyW
z>-7;#y%I~-rq@~A|L9;UGZo=n-`_&o?X7wTv0!@J=u@Njdtmw(K>daLy#B&8ot~t-
z2;Vd&DHbF^4Y(7DjTrCcl#I21M@<)BNSs(xhzn_DOywzsX*!k3V4=S;jgg#JFij_3
zk3|%(zh}1I!pagVR~Ae%Q{9#baMr-%A;)zQ$pt$|B>x(~a@RRc!f2h;8l
zh-$6gY&3>22;VQf)AFuMm}aZgot3QjWETS&lGIBlds#j$tvZj9v1uQ>#xvg|;blzy
zl__6Hp%1Qc14&9#h$-j1GBthWt=I`#x
z(plpe)j@jprC3Dq-1D}#sMQNfz5e+%rG+&v*En|FC0j@arLwgQ2s&ry7;f6`@U|mr
zDnOg$>aPOHXcsGJAKx?b%`y#`s#&)5X7%8-N2l2GaoR4^vP;+HOZUF>7{*j?O+=%Y
zvWC6yutA#xwtMYALS@R7vhPTX>7MN9rSNxllPkvbG`9?Dk!aFjq3Ef
z+1cLvSrux4y}`oUUS&mnty>-++P3oaVzq9LPYrm)X0CQq{`1&A`?EYMtlH?6c}(}F
zghnrIDZ^c*zfiCNiTy`POq2ezYy3#+)t`{liJF4#)H9#OHW_a|C33pd27Ck1P?9=9
zlvzrwh0;_;=e$Q|Wh!F&qr!AMx%Fr)s(69qrxc*3mQH!Ir{yW8I3CWsG0&D0(;1Y?
z_gF4gtWFMXdjYknd7y2<;B=+1>u?&y3;B*-*X!6$jn2soTv+d~U2BLcb;U-nV0zf1
zB^DMndLg5KD9`;b+9#NpY;CyfYM8q2dBFnT5FYKlW5NO^e?61|UJ-c$!ku6&ZLcd=nmehrPO--{Hop(KUr
z9<+2Xm6iq)Q!0L5Xencwj;1t~$!Xi2SDV^oKp#)kv@=-^*l!Lix%*QZK%sirrFzY$
zrU99*oD5%gxODitXj$Yf#;cZX
zsxf6LWju9cxHu&Ys0ZxpAmNpK<1cm$6%rVdQIkZ6-t$g{%f3S9b-mH)l4f?|
z?sfUfa#JE1xWr&5}8o+kfz=S
zS%ZY2zwg`R6Pq~2W*(DC8IHk4#c6m*ryZp5hh>D)BN!Vpd~eKGvt0L5n&Oft+~yx$
zykI#cFCU<$mOtsGK8jcr)iuSE%5luAK5p&MTBEHC333nkHY4aPca3YR6slkbE{IbG0D0
zc2PiVtQBHeIi2l6Vm8e&%md`T*X@ii4&EV^T9Z
z?IGbit)-KkchW*iKDjY-gWOSZ@iVu$5KJk>LPVje;Sjx(^0KsspcIAafuhu0bq`Es
z9HSe(U*eLdDC3RKJDx619WAG(y&+#bYomX3-w4BLz*p8orM>wpZ2F8>{#2PmpVm4b
z-l!4rt>X;nQL*mtK{7i?gCnCWqFl%*MARY|F~Ac>>*J1R{-
zjBPmHeE%XNm?m}3iwNxYt}E*mNLNpL(J^LM2^kw0QxQ|2PtYt)6UiqcnwrW;#`QF&
zRZ~qhr<{9Qo8?q~9wO{MCAPyHI=ftokNG*MTEC8o;6gl12Z=H5;&@DwAXAV6Qx;R+
zfCMQ8mKi^#0)Zb>i0RSMR&3Mp_Inrm`*$%-YfJ+hzM`dJLo5zK5H40yE=*IPRAVZX
z8cDC@yvc}v?;m|Kp7lgc1J*Y%q|st(;T0jLD8c`vK2hboEU`;jYMcJVxM$sa`KQK|
z9lf-1wm#(26qrIuc{?wHZvzl
z8;(bwxB#Xq{MKIlug-!Rh-&!ESB{2jT!p`-7!^u!d`)s*a~LCHs^pY!kBRDdjP!c#
z6W5QaFE&c3%u9WL^pKod1LV55WUo4@H&5wK|3RBRSFYjg$gXf_BE{WC?_kuk$ant}
zWK=_{OH*n!a`+0DpWl0BZL3-o$cJ
zidoE*(xhmq+2{4;ykDlC{v;N0JQ=UKS;o{{-w>YCb@6JRK7Ej=wZLh!O{OTPTFW``
zGxvX=9NJs0G!;xyns)P;nlhwXOTR;t7mMy0QXPs`KsvGWQfaC;^l}_w_veP=?M!B$
zFcnTIfGBfH&){}1o@)!?)NuI+|Xq)9QcK
zbn|(yOikr*%)>->r0UUbrN)Bj*3ZYd*}rJ5aD9w9kD=0(3f+r@+Pk1CQ-t<5=q9h0
zQ+la%7o2K8uXvCs{&{lar76yvruGTdlmgYn^s9vzh_8oFiMvEj5H<5*mS53QE=+Y(
zJzy9EF%>mU?nHlGeDf(_x-Xb=q?bs0
z*Da|2W~-Iw);h6jJqu{NP5ET(3#ej0zJ
zsii5VR2oP^sfZ~;jbr|$?(BZsD55BCLLeki(EYqf`a;hKzZYV7yfnT%-z|udqW$CI-d23oun?RLh+Atzvj;8^^J)^BAM&M2{9eR
zO?%OgX+DTM5lycU)%n9mfBo>wA3y$i`V%3&>_G21OrJb)F>k#{kiD1)m@+eULhxHi
z80PD|GYFXWCg#1l15AzBX(v0a0euFh(Q3!=M|dvHF!NF-rt-fTwoK`!Zk)HBnjYZB
z!~lAIKgAiD8q?>u)8VQ)?Rx3eN4{vtoVbR}|JAWz+V02v`siesCQM6#X#`~w^EOV(
zRLPWrX_7fiSwZ^Byc&G$esIfF_z{tvf>ZH+&fwR&=(7JPhy>EaaIOJLgi;;zvd{}k
z<;KJS+S5sxYCv{$+5P)#CjfYLcJMWNRXH~j2kUhpX;UP(+@K=P3Ctf}j_%c?RC
z^tuK4|Lg{jd0*JJl+sQWr%8ip{%lGa_^wYelqHT*CZ$^z)U
zG$p2!Rph2C@5Quo)C~Z2aw54Y3cdBH;NM?AK+FsA#u%9r%pIb%QtzgqG|P~jl2XXJ
zunAv4x_Rv^NyJWtQwh==?v^94hzdZ<|*LG}W^5ndm
z_QFZKwz?U9di)(Rty9xKPmhOZ3lAxT?MGs!4pZbbROC
zv^O)o0;bw}zX_D4bLXaCwlIDC)2IkP+c4NJ
zilnyFlG!Q!G|MS)dVv(CSEX1{>M-@Y8@p!O9TfcBr>3J41HD0X=M8J8wsG1wHx=vT
z3mXBcjd|yDh3V`WVYgH^eljr?J}D_Z%61hi^kOIzeDkMGO?RsVYU~v0DTf>~
zH;m+yQ$V_cO=hd36p3j=sqcKnq!gGwB{hvquyej!@1*0C6JWXuHyy4t=54Ny*`S#B
z1emfPb98k2#5Q2hB7s!$Qm5RZXi5#KY%8n1G|NG$APz<4E8)%b*6k`Ir#kF~Snj!wz%B{LmkhF
zX}znFdFz`f+&lwR)ln}blY+2Q6onT_j&=-W%uB(~uno4Sf~lWI
z)|_T|3ZwNie?|cbpXEDhZIm`x3{wL_@q{qez|}`xv8sW7%*^^H{I;s>x6nU3;nrw#Sy|E8rr7CJr>6il
z_hMV-!cx+ez#4l2Qcr0K8E>Ysj(D}1${HlIw>1c+7x!%!!4LHk(}0}Pnj2g0D!a_!wv5N>{3Nqq%Yug}h@}JgVxif@$I~wMZxB)MTh`#K!umJ;D}#@uwZT->))q
zY9*Yia=e|L>oI@2GdnIYK*6LQWfz&%}k{iqxLrVnD>=CgOIv@&Q8(1DWg7Y6dVjbd9_F~WvAeDs>;16
zBMGT&%`B;_hN1+K06bgBNe@7nz8hw$oGkDY`P2RcfhH
z64wv10(>bW^{%X()KjWM-aL;P^5VmBTB}v(y_>x8&LFHlPKU>|(|(ZJSn5WM@;Xh9
zk1eHw=>yj`Jw2MkOe1%?+h1eK;Ulq9V(M@5&u5XbR(b$PNAm8=iiMf=z)bCILm4l{
zDI`bQpe$BR)TNNUWUlHbnqn%4>hPSDnii!n(}Sm)skkY23MMsiL9v#9=4dUDwu`Xnc8{}=bOF1l98fYT)Us&`^a_ZKunaYSc1S|CKb7O8qs~qLrTSmnt)boeHFK&{PI`S?Apwgw{Kg;Y4Mp
z;p`Ml@|PPk&I>bj4H;s3_!~0QMeNRZ^9@t)wlB2o%ZVw<$Wod_2O}>x1d!O*!_NuY
zn71f1jcF4dNP4RJGD+4s*oMcFv9AEBY*qQHACCA>ZJANY@gsHF*c@z8}{
ziFr*N{y6^D9^Pf0>@?^AzG}m;%G=`*cs!XXOn*DHC)m<5#!L|~RY4*mUi(nvyhVZw
z+C~TTQirMag7C{#?0S{G%EVcmQJsIIX$h&gw`->k*X0!PtI(<(lsTv}QXTMWN}C};
zC^`V9B8I$jBAjMwcM85e2(BBS)?x3st)L4)x%_@J+;n2q#q{vu#G0urAIo_qI3We5
zvTh!rm2N=;&M|z();t#H!xE-pKJ1F
zZ?-XoNDyTasf6;`f|L@|xH{YJL1sF*H8n}5G1Z*v{InJuGx_B(RgtiMU2B1dKuSsl
zQuV_*GxeD2K|yZ2m(;We17LOn|8^brj=M@%qUYgM9(@jXeay>BubXZ-x;KWI0@BWK
zoj9jBX$4FL*TzfZE~L=Nq&+weZe!lvN+^x-5#w{BI8{waC|9UnFg&>29K^GgTQSG*
znLilqmXGo{qMOz+FDC`rG`(v^;ZsxS?R{$q%|V$yfjVpj(Y@`@STj|*>BEP%8FN<3
z?4Nowmtv&?DLzY;w=hv&W(SOTYfwi~^?eVH##l40V_y68n37W?oa!o#`v(XqJymGE
zgvjSbgla2=n3l47WJNP=7m)O}`@5yRB)k{eO?}vVPAOpxLTvjNJss~IPoP%Nd;jMz
z(_vbfvhNTV%|7bm_n-2qzbBRp?2Fdu|G2Io~tlYGO7b!
zC!;8Z&J~dKq@XP5Enn$DJEj@ISLvy;RE_C+FNET^ElzvVOdVT+(gxFe_i=r(ASh)E
z$nOw@i+W5OFD(|1Qeyg+H`6%1){BsLuw9yrm?}PbQRj{G-o(7%bid(L5Up)>vIMMa2e!N4At>n
zkTNUPC0=?dV_teGXB+6IezxJw{=~diucy9dNmPYXdh3P2;_F(il_7B$TGMgcO;JMn
z=|m`nnrqffDO~D~Dc(nwEgwzeE~WK7MsXGXIttNVQ4-U3cSNP9s-td2yZzQPkWLR3ACTiJZ%NgY
zxGry!%Tr8IrY^HeD=R3ui%kHi9z|O1*+V99U0S)#1u=Ax^>?6iUd72sHXEE
z&SGV{Kf|jQ)rfvOTlM88twcVxC@nRmPCDLIO;eFJQ`vT(-0jJ1Lu)Y-Ii*-rk_Q7}
z{~H&Iu&&Et@mNETRpR_HgWiA1I}_f>i69CGSO`}*!hK)jvYlj%kTFBJ78nEzg1~|}
z1groFgoGkM0)7X-n120S^V~Id>>&f|uy4lg_H5Wq7JvJytIORNF1!RvsfeN3s5YTVhhwC44P0Q_#c7GRktz{Xk13tb1B=&;pEc)n_C-$G
z3#kHLQL0H(i+J%`77EHtvq_ZQyW#26U7V6c5sE{h@K{uVDS^fLKb_BkaN0bjP}@x}
zUSRr&V^E`0;^(-J1#y;@v(+T;9zx#ji407)?%S@PAz{9E9fIz*J*X
zQ2ORRy_AGDNg^~2rgBw_g^R2#?mS4%lxg020(-_#*PQbSq`j;=>~)DGssmJw6$PqS
zZofiIeUJR6?uE85AN2nqfM+0#AN*eMC)uO)qD|NrABG{2S}^#DK|9bq-lBGMCy568cCdn*MMFK
zZysW^h3uO84~DJD*mYBwLeWhxfzsnegX1E#PdyH9;Lf3=qj`Q1MLh2e6-Z3;F1Dv)
zrdtn|bKT=IQ%IN^GvFiP6jyGD>TR`~PKCHltN%`tlZsM54a0~xhX%}4d&h8ST1+wK
z4Z8V;W;shR`tkBLEN`)R``2jwccHLwT^~}7O<&;H^aWB%5>a}OF76-Aph|P7z+6l;
zQ`spYDCZi=mG~8{1Qw?bc4fkD{>32GsMO7sLdle`%+w7`
zotYk#mwidWK29HwoQBQ*A;KzF*Wq=A%hA9pJ-oR!nNILmp4SvP*Wfg49>A#>2y~|P
z4JvoV84#1w>JTCCooNnf4`#YEg=fK;K)SOoQcCIfTJfZ#Zcv~qp|g@t^1vEbWOhbg
z(eF0V-XNQh_EDPAOy#A-)UTq=n0ITUdf*}Y>7_RfRY~?bN$aol4b^lF^U8b4V
zp)_^Vk3s3N;@o*^oJn`Cr`HZ=2arnc@y1H`^B(IiFZ
zlU7mXi8D@V~8YT1OEpFq;>f
zH3MS8wsBl#scU1JxM}oK+%dw`a~c~NE3&-hL6k4%%@@~AWin>#@#~vq8%znMo>Rzi
z>e4!Wo;vdv9#KC0B54>*&AYu+xg%k!foV9N2dRKG9xXFHn9RBj-JCv4PA^=9rJ4jR
zUX3(>T~971Hh9<3W;xY(742wB>83_$a>JmddGdiad@M}Eb;uu;c?YJbKblWqmHS5b
z7qv?ubz@p3oX#!qbr2CFkE(~0a)dfW=agfVvfsz7)Wy6qQ|G2`t+H}5$@U&jp_fAG
z+r^8QE?#QX32a*$#*T*7jb`0zRMiBUO-I4{3NowizQ>eix*xsNQ`$sijQ5OEC}LV*
z!3Hq8f@xJxrQ|+TAl3vJAXUig
zho%HIiFvbW=6M~b`){5Rw3*Nc0n&GRi3E9
zla(;Mi{cfLZH^;8Wa`GIFw^<&Wb#K_4?etbXF$!iMb<66-eGpQ%avJryTQI9%(-s>f3JzQll;=a=do?>?w0lVpq(r6CM+x)5D6l
zx(-;Q6f8EkCF$fFQaKJyma1T;lq(c0>f5HUFfVnkE}fZDv{WDXD(>~5YH;3Wb-ZMu
zl-Tcs)Ke-<{Srtr)ApokHiZq^2RPksV!V$peEH?u=YuXt-eCujHEahAR~o?Bre)XU
zcAw?M|CCtIsmUlMfkk1XCf-_wT^OUft(Io$?)traK8b~Ssrz;oY0-V+rQS|`B1uD3
zPpbFTK4j&(b7%-sZ>1j7&NQ#gl$dg4dQk4&x;1q@uoKH{Fok;l_16QblBd-%J4~(e
zP&k~FKwisp-T3xDDtr>9O{rQ@G;~tL6d&QUfT>heD7jA-=4~)7r}VG*V?}?=n?XI9
zB$2ubD*DE#i9p7a9U@qAi1s2q#DK@%8Np7*+m$GogZLK*pftaZSSov*(g
zbzZ=VS263k6}q0@6FBbTm)zQW?RndOi`WS1v&Xnyc-Xo-fkIeo5UyyhiUZ4Nrg>tf
zIG_nV851T=cTn2k=S-!9)68?KA*$!gjZ}4JKeCC#$q#hBlM2$-x9l?b2O_N##sh`u^9zv1o;+RR_*FOjXs}y+^u(H_{-t(RG3g7{R
zQ`^17tC5-J@d;)Qch?suV(0<@5jQ3eZp2oy_6<-rLb!{Yie`GJQJS^PbZ0tddJWb<
zI?+tqp!#iGAV14Fcc^JW@jmHGdyUiwym^~ak7@hSm;>*oGSj{J4U>ByyhryS;Tu4u
zrC$8RiHc2*jk6L|7CVkNno
zns35i%$fQG63w(MCQ~LD5=al%Gg0a>jaLrTz7eX%s18+KO9Q{Yk}B4GYtKxn)Ui5m
z=cMUDUQ9oMWV-cXa@ttxOBY`M;QNn00;`0T60ef*J&|D%JcO_?K0!TW;YN<&eotX+#Nrnnc
z1!|HE>c-K(oZM^<<*ONbeAFk9!D+
zN$}z&jb~T{^WCKr7``x);S-J5WvarpH8|m^wP>Y3q?P1Vvp6XB)
zu-(kgC8K>M+MR`WPkL9Cf==#&$0|OMo1x$YM34+$&`Y3
z7YdMQralc*O=dMgnCbOBW;&2aN+Mss)-@@U>fxcON7NSrSL2*ivoRL*KChi)Rw|IL
zKPw3&)6F}`_;N+dc&B|5rfK+4>c#VK16H#7({~hY7WzJ*OMM;Ql4$O9U|F!22p&&y
z->5j%sIl*b3;4#i41MHlj?vbq`4)pEf$#OaW;`REb_;8a^wgv625;y84Oj7htF{_y|@I
zRLp~|f>i{;Z-Umhi0e;3eX-O}jRY^~^#FTx?X-3vEsTe?YQ-K|iPyoHp#W(NcQNve
zjLs_BCg{Y0&MVffiUdpB_N~Nqz;Df}w&_{FT8%7@?JOj8;uy;jT*n_Vu>{Y9S#U
zEH*Iv>8GE*8}upF&@1DWK9UHqr`QG2<0u}T+!C`QciDXTw{G3M26ZjM?M6Ef3K+Atf3DUKdYHI3>$mDCNhsv)gsl;Q4Repm8~
ztN0zliRtv8H0{@|!BCIsr%h55x8p0}jy$SL;3{6NMCT=}Tzmffmtn9;ZZVPtxkOhI
z!9dsn>aavO;rR+B4>a1Bv?Nf)55!u~{Q+ZdT?M*=CV
zu5u;{1-lIOo?Qfc0yUEQ3iL)$xO0z+GN?wDiO^EXS|nH}6GObWzvSKjHGMbo`x6PK
z-tFU0
zt{ZPl93?4L0!d>#v_*ODsjaE#!JB;1eUCC6-AWu4iUWEn0aP!$W+Or!q(ij~y`>FI
zASGLxrg`48mq3zkM)9B-D*v*0V@6V`*FY?U@hcy&UqHtJ-QFEoxEM9WEKQ6t-vTyZ
zm=q&|4id*5jx3f5v$tcfZbuGRADMvYmti>C6xbK>2Sp5FGBCj?dgudD`Y8})iiwC)
zRax3PA9ACpaxx3uqqJdB&c>Lj<$8w(skxEWx4w~A-$E>4y}NRE7}MtnX*f}BbQJSe86e?TnXZm*}ByejHpBh<-B9;*S)58ZnA@)~K=Aqu`{xc4Jf6DKo<~)2MVp
zqbeu#Y|MSz$N4x+NkBHnQfHOI-#%HQEz*fY;+mkg&bD*W5tzD7*b*~+m6S$I>+Lf(
zY3f0JV!Pho$0Di4)L@F3tf`+}f{E@4WNcJ56u-8E^bI2r{EYwe}*vab?N3OwjUy>bkr&cqykkQHgv-~qRJMBiF|@r-2CBa
z6j_kq%0Xlv5LXq(D%{wNE^K_$e3X&%e)9j2kp-6L!`fa&gZ))RbkdsLcNiC&zuKIN&>jlO3=q;LeH+V*rk
zN@b?)JTIj@Z>02K>PwZ4bkw^ZIu6wiN+ngXL6ICeV!D5UrF&?%}f57rMkbR^bf3yA&a{=DXd7$L|wH9|9kmHx_a
z2`VH|dRS-$%G8s}?dcQ>o_nZHQ0PY#?*Tuh9ID;&1`B{G?R+R@>u4`66HHcDNhVF}
zv#@N#u&%y!Cpv0PPNB-`aeyi7TEVE8ZQ=R`BSySQ*&Af8Y2y`$B(^wGmJL%9EN}r7
zPr_axvHBozTqT)Tm>ced7!WW}x8H2}8@B#bLsX2)PM70z3oK%kk+W85=?i5!GfdqW
zuPU#bOrhYt+aqRUGFOK*r2Hgdzu_pLxe96Cp=>uEvJ)TeDqqGsVMEAHsuM&`n3Al)rM5!
zDo7ol>p|*^?q#NQQ&EaFknT9!38WO%C$nl
zC%r;S+wdxbtbuDAB^(Z`Rgk?nHimz*zxq3ANU9MwF(s-N>&AwtBK@tJ-dWYAG@2=u
z-tP08Ci4v2h@yK@O4%TFoEp}2o%zZ_t%rT8NLK=+X{Og8Z4yYKMVdF8pF8Ubq(nF0
zdfUSbjOA7qqyea?d98pcF8I6%A(a~Uu}Kax%MO`X;@Za7_!Y}-HiOiq1*=2Bnt3hC
zi790tqvaKQ_J=R)IgCyNG^TxoBWlu|QOzbVChGS9F*`e0q>ZA|wDF-2!B
zdD;xqSyNXy!>e;^iGQX&SAV411`SO42wVRDF;kmJePRcs@*y`(Mk5h`I}`$@cz}eF
zFsgy+t*p{nNepWOw#hniNNXg=v+??xESR_wTym`o^I`jH`Xc!gtU!vd+w#iZI&cmO;Q@QB7EVU_SWyS`lI5llyFf+5&s>8m*Mhw_NN@cnk
zkkcS{d8O=>02W~+zD2i8m5FG}YO$C>9&T@wNL@~oq6qv2_%_m`F}H0^VC~!+u40O%+aiF
zjD;q8NvRqfA`5zvU&*opE*pteMN_zdjB=?8e}CDTCEUt!$(0nMmu)r0Xg(-?XfrQ&pBX8N2nQ|&w)-IR5L#gw)jfHqF*
z!&u^hsuz(|9<xESFqUEo6(`MaXv~y6K
zNbpMLzd@0Op!{f7L_Pp5sf}vqh-22}}?Cq$ysk
zKeE}FXr|R!eI9(RMU##fhlhv2vx8P?^~rp81g%8RA_B5tNHLy7WWJ)(BrZm%he%=47w4s;N#X=U+rnOEW?Os2w2V`if;)m$kqo%%i?rq5A6~JT+4rnkvt$(uVSEY-zeNPN7nAxZ;rN
zLqnBr+Dq^fV6$EW*e;w(f1zNShjEP7T~ZqKTB)C-w`{BZt-wYZv$Y`=rI5oko5D_P
zkDi;)$51Lb*&7q>rj$OPP@2RehY6;eGgBip-I78f??HY2|9v(_x@CJYpSgQ^NaB{3
zO8`kE0Ts&KT7IRN6*qnG(uaj6ueGF|SE1J9N!4bfqMR9Chw1ZeN(pMUHw8?ee0bBhx#s95W5N{rY41>43EPrxbu5L$LE;QEc970PEDn
zuz+XN*myU={?ppN{xE8FgA+)U8m7JrPrb)#hSc$m=k5
zWogxEV_r?sGAWRlDKIrN&FgEggxMJB_U%PE<3od|5OBr2D}h^#F=LZRp4X(^
z(<$Fe%~adQkklYjdL`5edfol-ahcDGnM7i7+JrR2Vt&j|6PyXnFv3#JBd{EM%UNBX
zi8{FyoNYk+81E$2&ND2Vh{iIr%WBMJypJDrX%b!BJ
z>fDG2*d#}znQOnBu9zv8*q(*AXEc0pc$k0v#n)xAfyxG=+9FjkujWjPy(`U3!RZY1
zZ>N$tC(i8ri_*wAMObX}V=IC1f+;{G)H$gzC8MNtQkaG<*oG+8nxDR+L3p0bDOpi1
zulD}eUtgXVhvk>=fA!;U-_OfaW7@m6%BvJHt*$^bMciAiaJszopNH25B{!o#{|B0-
z>RG8$Zi<%!wW==nieD>p?AO2o$f>N2O
zW@7+njCcdBEN$4m0*dZCpNCo)esC5v)}hzvQ@!+6%f3J9Mc~&Lu-XWm;XMGT$MisM
z>I(4l^4iN(EU23M0W)nrk$+mZ-%ZNTU_Rv-Y0ibGwq^OnBt(fvN`KOX*)fp0f8
zQ@N=tMVi2aY}}4w*i7AgjEA&WEjQg;!Bq8>Mfvi(FMb&HRldkhZKmE$yXyq=@(MN6
zplfbi)Jx+;t^j@6C}fzjKcv~Am3voGouJdrH!S96
zVHGir5)o1hRI)Mv>>#`AT+EDuE
zPj$VwkwrhzxLw#VHZ@4ORpLEcSF#@12B#DZHFrTS&;M(!t}cRGMUa}GmUmpn8JVYU
zSd_WPRLYE3el7xsp9A+9B*HE?)t`9hUitjbfl}(z@}z<3-unBQ`d!#8eT0IjE89%L
z>2BndLlE1yCn59y$Z4jY^Ap1~byKLwE+eM*&z+fiWyRGk!gNqn`zLkyNhBueTo69{4}ciKS7!eV0y5uX%(pErk8X1
zh9|G@pNz=}mbEQ^HmG!Q2IA}=l0t;5k~PAx}@!H1yn0wp}X7>
znz4z!sw`s_^({{zcmV+t@Bl&x2~~i^i>nQv07ELGx@X-(i~J1pYEz>
z*&DAf;^sd0{3`UCd0m8(e0l*Z2c&>dZ6NrYXGK}4|AWJBeeDMmClJD$uGYv)H2b8whi_umL~
zI%bp6R(j1gf2NPB;#BPP67nMsNiz8PB@FY{Qwsa!8mZhi5K|Gxu!2)cymvXxThcoxH<`6E>P6}=d9%Po!H=
zP4L{XH6)%!VQMfXs9=><-c1)u2&y+VMd#wD(d9QerC)v@rkM@fQfgU0@@A%#!}N}C
zjj7Uu*&>rT5*B6Pu8GsAgAQh$8EC;fb7t{XjVVjLdP7?<+eKXP(G&kP3PF>ILO@jr
z<((96hH1o;udMz0*QJww_0M&d#)Py5rqy9ynkjCsZCo~)X_3=oaEhpd`
zh;ZT-Hq1%Y&l+f6{q2_j@(-_n`R>Ob=2;oikoOk#qj}j(Wt-_dy$dHLZWbGqIFilT
zbeKvIW%SE4#`rh0dSTSh@KZ=}T4Se9n4HGP!%a?kW=vc|DY#^!x0%L`yjK2x^M~g0
z+mGW#ni!~yAur98GgFW%!k9Nn|NqAhZ>YDIoH|HXZkpe%m2VyQg?2v_)~hbsKZRM!
z$W3F)Qm-2I!cLR>L$913zFFJm-Walq%ZAR@4D0H*7iVmn-SuJ&e%oH1*IgzvZHglS
zRqL+FDwJdk%QRzKORbl|w`SG}w;D|8rV#AZCPxD=;XOLn`J>_jCvjCaisvqbUs;l<
zzhZaWOzEWv3d$v4jIr4$j=>w5?xhk(LM;hl{FS{j;_EJBu+e4##em7B`!
z)DE2&eC6~;NA9&iC{XP|q`prxhcGSjl2IYJjR$R_R!F?`5!fo9B*s);I|
zj64>qNA;L4#cJbf*c%4-hh36+Jyk>VGBz2%v30q;*lJbnB28f
zW7duhGTsXlb$8U09JLttj&YM)Whjt$e!CkmEzM0UC#Q7NrEG9-$Wia3*-bsAFwxGe
zF5EP=)NaTN38Q{a&|Pr^+w2ZDx?i)4*}{TT_Azr{=B^4y9VMofqN{o`deIarxv5N%
zxO8d;?OS$ux`>-FtxV{SS>e2{ogmy)Zf*lxHkoN{Y;cjs{Kke2_#S|^E>1HA
zqEr!4#suSd+6`W>2NFkOhx!D}-liV*W<7?u0#m-Ar`B;Q^Ccba9j*=NvnMt6Bd>%5
zOveJ@MpfQ9*Gx-h`gF?NH*)&iO{`krCtx(cF`9(Y?%3d1^zx7gnm^fvlRVK;3V&Z{H#?{nU$C3=+
z0H64_no@G=XTfQwVSH2@7#w2Ai!Vb|wMIPdwQJ2xG30$3OfkVGJ^uvbUd~XZ;tOas
zr{n7BYk;Z0d5z>UUDJT+rJ9|B)9kosJLOJ&OPLj>CTxpo$a_7eVfScT8|or2eye&1
zo5OTkj9D+8a^bs2@!+!L>L|1K|{R$qY&=iF@2e*Dgtmoa*HmTQfJMor>6GaFD>@
zqqA}^LAi{qDzv^rKg^3xWx7!rdVYrK@noj!aQb-RnQ4;9^>!bsFzX>Yj!|#347hD@
zQ!dJYQ*;@O@ArQ=*x`}hzGl2rhWC+E40+Ye6qHieVy4j@K7nl$y%4AR$WYdffNB1k
zVSExg6s<
zWW$>A-WzhtEvUSrs~L#ghjA|#W8|TJZmJ^=*Q_ErJMFEA#4K-QsgjL`duXPnWTtb>
z_yMU1^`qEK$%eI;*B6>ox!@I@6;H_?9A&|V4%LlTAX4gAk$|b~+fENp{3@?Luiq)$
zeMzWImKV~kRV2)7)1xWbuzn05oN82Qu5$A*9W$$bMi8Xd7m>Jj>e=Z$?rS?6JARhd
zVg%E@Eg=b}kTgINOuYcLN$*efqfO$yj?;jY+QeP(2RY3%z9mdY8Ok?&f+{d2s9ZXQ
zXs3N1`lLI4nvfyh{W8$1wV3)e?={1`=~O@3L@&+|!`CWq6fX{dSy5u%VQi#&(cao)
zKKXH4eTdk1;i%Vqj
zOcjn?B%(WCt1+h1RJC+q(32EwV2<}8m~1urkt8mzL!o7w6~4--o#}u
zrGw(77%BhANgWZRT$mxWTs_s8@LFr>?WwqG{{a4
zCT+!O5K)#H-(tkq^2$bpl^O%HDlFI#7=%zp$`xj(?;iA`w@Qh7=}5MZfUVtZXd%BB2P@=L-0|#(omf&H3B-7YADskUb-pENWnSnw9kp@UWWtA?T=`ty3Wfm
zZ!p!5w$aOv6{oOKI4Pc$o8pO+)3G)THBNfWt2wB
zOhIX7mDenuo9ai~=oxI6(SFJ@k_41MEgl`9f@w0+vuA4K_pBjFVvt*`xHk{^u8fZ&pDxZxV3dD+~R{ijg^!dRGcQN|XHPn=B0c-&l{Ycn>*8)*Ulnbpew8vohrU6scZAFT`kc~S&sXiKlZ^e9>3)D|5d)!xVGV#zh(0srV`EG>AJr
zsp64dF*W^&fI=Qrohu}zb&XY6<;~6?987AXcTR6A{FD~zwKbFCuf?WRpvkGKmA7`V
zPGcJVl%HYwaA9(qbLvHVM?!nH~+|+#)dO4W%^suKWuR2t?CrC-DrMkp4^cYoc
zN;{Rv{nS6ZlT$0iPs?!!MDi&C6tG4@XR#NHJd)O3^yW5HK~~=x;9!|IKg{M*aT`9a0*GIwYt&t8mCWwfyWvFCH(l+)isK
z#fTT?N+wmW2PPlDYlM%;j!t*elF@ALqNrw!TG&z
znjgic_aU#;#h`+fCP_enQ`>F%=qU!g_$nnEkm|ZWbt!|oIjs$x22t5n{jh@tw|?D7
z>cF00smv=4x==$mwe{UricO#Wo-66>qJ7~0D9!9}ltL>?lNF`$Qtm&g?V#doWyMr+
zdRa;~z)XY1bmVZCoTf47r$klJst-sNf~~w^@dvO>yjdzK9iW_KjIEuVLaK;_VlT(N
zCO&(mZTaY4y0E5aN(rgs#Zl@*8jF_CIj6QQrMj<*NM)p_A#Wdg?TKrTRJ7A-OcS*=
z6&Kno1s=;)-=5c2nHg-rRBaGfZu&F`j^1c_T+DfD%^+SXYnP<72x%5)S65dtFzsT<
zOH6sV6TP(9S0$Vpt8~rjYynOo4XL(NpvWiO>89XTpd1uas%k%*D)w@N_)=m8sP>*;
zwC&dr4MM5ZTk9yzu5!g)VCpFKR6fnLI57>T#=KN#?FLiWY5oT}t>5dWH`D-ExT|#J
zW=GXih_{%Csu-4niqVftg}nN=h?O+8$GDD>@14#684`shxTW
zcCQzoe2~#j{lG(@`J`C(rLRhcP_94}XC32<{>ou7-{_Fs#$xZhyeflLK%1U!KRtc-
zWDyK9F9oE)6kh87b0{xO)AZ^p2-;vO6H`s;ycBHU#B>_+_Mw-^DV9;mXPpvU>8q=f
zFLV3M=6i=S3YrSouGO4zU?T^nXAnjTUfp(jdiX+`^-C#dr3Ejw*18Z1y%a{8UgelZ
zwq^YY=B+aKx|yKFkEUQlUwUZTNU{Q^xdF5g4Ok3loKL
z%7QBbOQe{_iid76wRIVM<)*A7VIXI-llQhs@}8%?Q!3WxQyP&{&rLs1uhPJ_8SjG9
z`DzTpsp+MEXpER?c0O%i>s*|lE;70)uV9pz)`@)LP7Jw310LNgWPgQU>9tfHR!Z7n
z+PHWsvs1NMCf??=<`zuDK`4c#%}Hq)Q@Ux?a$ZVCIW>hCKjKu
zF(zi0(YCWy^IxFS7C7oHlzUA!dv`-hj}dF=6H*R&g;M;kB8KgeKcbn&?aN1AFG1b0
z0ibd%CYUCsJ&E~V;gqD3QTMc_1Wd3hho}NQ>|Q0T5FP=oDiZg#c*<%iJFXN!wb{wx
zM&YBgEHFJ|syD7ls3Fm2N=(}fc`Ya;ljZG-M3QS$|q3#3s?k0U2
z@ZZAcv;#^d)=(VsG8dxE6qL@B^lX}#_O1tKi!{(e#h0j7D5+tUHDH^R<4ZPy=%!+`
zgcdixwn?XUI`>kkA9>^6c@Vt5_Gj*uldD)NqkV`Azm)7QRg{WyN`tl|-Z?q-n`g7e
zOEaBL?;k{EP9p{D2AD!N=akO4+N_oGWcrxq8Xmb4Bn{~9AzCF3UdAKwVA7_H;5U=x>OLT4lg
z({>o?pRX&myWuD0*`I?bE%Uvcgh)t1sSJ7h>~zw+)NCkq*J6NZkDE4>n))gZdH1F7
zKRnc_N24|N^01#a5>5fC_-Ssg!<3?Wv>$;|-9XR@VuRAuOpP_@wHSs3Rs0BnsJx65
z(|zjutB2aAevwg3R7WnQn%=XI^|2WER*R{)ZE8=$>@*1(>KC3NE|~I6#WerzI56T}
zR>?l4TJdtwYd4rquu@}$QjICiw6DmU#fA-g6VI)vy@=9NAp#o^85I=y0tt#F6*%H5
z3#^s{VKO>#Sw?fZDUAHH$S;05ev;C>+V=_l0x2oQ4hfEVt(o|DPZXt+xYs99aK*Ha
zhp+8hf1KB)*GqLt$>I}mDmNPzO%pP>(omgNqf8ar4Y^}_wRnfU1eKU_e!A|t^4Alo
zh83k*h|>LG3P@9vOc5#7{XRu*R~58XIgRC`{fV5`9!B+pmD?7W+CH(C#48#C^BthF
zPs_HL@^E6!DXk*ovP_rKX1(;;CN`=Do@v)uxEe0Qf>dVJw?&>Ma
zy7RW&*D5>EOU>Mz%6|(-W-_4u5ib`^9es(-
zkDf{7^wUGwPn~2EkPWyhhzrq5HsxeE4W_jW{|1dU(Fgu#PwYJge-L&`*gfZPm(0TZ(Hk
zxG*xPFl7}O>oy~gYRf44X&cj(y;4?^?;REIU#0(wx63|)F#HL;2
zbtx5b`x-~QSytY}^3ikZ==P?r(xGxUy8+YYlJYjpU*(BuLPti}_zZ*Nfa_8LZTVC^Z8J>BrRgeqg>+YS=-LlrBOO(|>8Ed37Bprq3k$
z=`z5k8v3&6I}+32pH*9DS~rN8jsUgWV7ud|;B=7|h$BfruuOiy*0LmwDerzrMsqc%
zg!-&MA_yUJujZwTygrFL!Jk{7@5pITmfV6;UbtE_b^z=I3%O04GWY`z+cpHHn-WuS
z3gd8NgTG&=c_Lmqjx5vvx!Hoj*$(SBn_H&S&TOqBNnSPNE#h%8hoJ9H>vA}w6tI-%
zPT7~olLsl~lWv-1@U5bQ#kdY;o)arJpz`-*k^FiLO5c}F@d#fdVKG9b2?4Ednk(L^
ztzqYKsdiJHWCvY|~Hqj}6q40O7el2TRWWsSGHV49S7vB-NEx;(Ax
z;hYjpxmu?|3t^_o2Is7TqJt?YwJZZqUOlCqy7Nd
z6gW0&KqsCzKf_m58Xj$yW~(FD+!C+jrY&hov!uL;TTBl{muC&93e>^G5>Cqt?!+|Q
zvYT+Sn8cg|Ud$H3!HnvhPyF>!tuAJFzn$DvrXf@)C5c8Z0Fl@l!Bnuu8~DIC0Ur#P
z3AtntU;aW#sqTG*FP%PmJQt(<^!b~pLs1jN&j*5P-DlR4m{`IiAf~Ib#XbR6Qih7F
z#PFF#D*UMS6_FA}DeIYEMGdsr)|M=6DnFo%)OjJn1dvEj_{-WhYvf%GqA7k%>DMsu
z#FSpzU5im>DyZUMjNHbhm_yPZ*Pj|r^TCEn5Frq#M#NSy#Zz-1hiO59R-Q%fb<)7>
z)NS4CxG6X-{##@TAzgnFMRy!Y6384u#H;o->EP6lso_&@bxm97DSa*C7LT3}45}7@Bw&Qrx=XBQBVx^;JAA=Fs%{=79y@
zF|=Cs#K|dM<*pt;s(;oBPBpN>=_&N|vJ6kGaAOW^`;!qMS|i@X{D>MQEb^6aNuv4Y
z=i;$l&^R653ej%yXwfxOGK!l}T7HO2F^8vB(4oY>`{HC@8z@zw
zq-{A}c*ngir`ZOnw%5@}MJy8WrqsgGWt`rtR&i*fx?JmDe%0dtC)9E&1w=g~-YhPd
z9;&{3|93gUNqt1hGv1|+q>PrFhPK+kQ%P!b9UVrZpR~)pDvz{+mYfnp+957VV9iUX
z7LAV3f~$E$gDtmKtEK9+7>Hi_MJSC6rU$C;ufhwcnOan;pcTzKTnn3kXr>L;x!8JABLr<^x-!3%TA*MwKit^rWI
zc?-6K9F~PHHW2Is6=vF#YQWq)iIg6)nuQr8@h4!~IXYFlX}517F~y@3A%x@u)pc;Y
zG7^_hok9}q)$!A?b%sR(`6jOk<%|SyRZFvBi3LNTl!IQn>E??@`h_Fjq`ZlpvkzMD
zZXT+1MzLJv?*a@7o(fZ8)fV(tQaU=_tH-@4__EyFHWj$obP-TpR3d^JOnj(W<`a`o
zJ?5*XrM`|T40^cPBU9bn#s$;E*6m$cB9SynWRkDyjz5HBT~ETj=;R2w71bJ3jPK>3
zkF1awz7xbJr}Ib`hxy{Zs!*_)u&w~JHcYljt7D}aQ|9eSDHmc8^R_E#dj+K7
zHB@U&D3atqjeDVw{O1H!`DtS2m0QmZ8!i)v%pJ0%tE;;r1u4}|9to$ofYPi?qnExA
z9o;s`LGZaFPA%uIDxicrzI%iD&hd(ko*-h-CUH(sF*${y?ub(zsrM@3T?Y*n>l%0s
zsal93q^&ZqcxiPLDSbKmczR!BQD*Ac*FJI78*hAolZG(GRWL1l^V0yPtRq3NQ~D_<
zsB<$K#xzm?7Pv?rLXCMTHQrSx4dV;bQp6e*rTM4p*q`hL>GJHpUeZW+C#z`=bU-WG
zi!4xDc46ptE8O@0&Sr7ugz
zNIL9T7T;Fafj4%VdcuQvf(#YjCGHw3IOX84;k42EnVcrmD@g5sJ}9H)cy%S9*(m|z
zj++`7d#x0pIvsgAihz|yN?)Xouw`cFvQIWy>Pj%>(05uBGq;ZPFEITIN|~OU!$%2E
zn^N17W*cg=N?4tZ=Du)XMn*Yw5JV%TuR=e5c&Hih#l!9hl?T;G$tnF7L>0Dbn8Kgb
z6%>97P%-kw%j5|vZB#)@M4iTrf$=YkVt5P8N(rfC1OX{0r7cR!SUq}~YF1E}n4jk0
zbvLqHNoB&UObEVI9igYgyo)m7#=p4wF?Ac}8zajz!^^#t>ax8iRe{QZuiYNf1+=CV
zj1tm(Eu3Gf#kMZajFfjxDW&s)5@T-X?dhc#F>U{H_1*ir&bv{E$=+(aFIJa({eAOM
zaY4NomN=996r!81B#@F*8tO<$2~3uCoirDDFxC0rHl~T!N_E>KcMG_tw5Vf4
z-WRR!uRgJv*>p_ppfVE76mLEmR*}%e*RLK-^?n((U8EOOays5hA=gUDXjLtj%REm9
zMS;1L6LwNocxk2%q%iojyo;2+Y#p84)n%UUR@zM=7Li
zkR*NsHW^1!BVRi<($GBXrBZllwWf5L4&1C7i0?X#c8>z*dZ|!qs_Hx*VES5gdA{6a
zd~?t`C!M-03so@Pka|fq>}fW}P7^n+<9LqPDSTDUP_qG$5>(t7XmBdL>+$X~w@EVH
zNqLNuHdDQ44HYpgm&UODE7I}GP;1aBu+BfqW#1$=GlNnOrUr&uSRMp5vW^5T)J}1h
zlHjI#uozlIO(+d1F_npFZZQcR)n7E}8}F{9N=K;iN}@qoX_l6!v7yTA(#NZ1U4qd0
z2fkLF^+s1EroEKn+nP0|sP}pm95msfIK&Rrw*d<9&ttab>8>9EQ3RSeftT)doD3>oZuBDaPa+^uZNh
z^vVn;r(8oNsKfJvw(F(owv1{>A%{>NK0!#E8y8EnqRP)=iT73N_}xu?pR?w>!}S^K
zUNNcbpPb?bO0j|(&iDGyRn+agl$~}#wZn{*6H^tlpK7G^Qi@a3m2~N-QBuSmF|Sx3
z&&r48F8d_uzMzG;sozUssJPKiho4m38TX1{rZiM$2L)6Fllq7&3f?S4Liq#p8L6)B
zG8_m}*Jip&L#6daEFQgL9p9cJjh~~IwBuz|K_FsmIE
zxdq$BRAgP5ZKb@QxxgpZN*nRlD`}`Ksj8R{eC4{lzImuILv5}*$tLL|$O{a6{R3YV
zeWfjEV7p9sW7%Tju9+TKd{`
zbSrB!c|Jd;)_EqW4B{(B$!Y;qv3%-P7*oejK`CL?BVVypkUG1_Xc$u-h`4Z3Z9b%x
z=Hr~Kx5UD
zWwO`5Rh)!cp){QE4QG-T7&opNrQDX=bW~1MjkVJeRdj~7ep4WnkV=8Kq4ee?hIrqS
zj^AC>NF}Mf!%VF5>P82d^K~etqdJ5ZgAao8uAwrO)LNdQ6sRDA3BmDzLc;*n=QoLi
zf>MT#0I8|U_c3_%)^vFSP+OLo&z*VT265fREbUg2z$#{^*79IQj|OB1X->*aDd6C6
z+5)33JGxpFW|Va!ny64pNX1IilQ`ggdpi1fcJsiv!~Cgy0ID1KYSB@76GVr0@#Qp7
z7ib(mb<%?*)d@U+3)~g1KB-e!w{=p%6Bh+(QI)5+alrc~b^Lh+YQ5yRccyfb?HVe(
zB6;MDd-28YprbaSLgWDI*eOv37DSbedGRQ$_?1C^Ooe?d8Y$hh2ht?1)3cA?M7>e{
z&)(VeI1K|~Sn8H-OSf#O5IrFF(pw#=HA0aU<=lUe->^si{|(#2@RDha@g{so%+t*m
zS^<|wuR9()cdvFId*?+Jmd?C=QhKor2E6PjKlvNdbjl>^AgBn$sTlg6#o%{N&SQ%D
z17V6Z#VDL5ZEU;M+R=Z_-ErkbMVzvtc0N6aOJ;6LNC;Dy`pwfOen9a)NkdhMMA?^9
zEa-y)@HAV|SU4c)tRAWcy@@|e1C)NQp3USB_XG};)P(wOyItzSQe}k2<0gt~?J!a2
zTb7!hJcXfrgIQGC&a8A}2Y4#l9Z*%h$x~@-{3VzQSIK$^3GhoCos!SuZYZho)Yk3q
zb&m!m#Y45VS7)t-r*?)!#d|BDs<0JyiaAu{kA`;hEl^cx3fK@X{qj#DSULR!(Rm1o
zGkq{##@HEI4poJtY^m$CH&FR0Zx8Fbj|<1e9F3i?m;_A|vcgnP(}XL%3zbA2mvz+B
z)4)@^oDciXHJG
zDx#D}yBw$<+J`04laCj1kGaaEMfD7Fm9As1qU6ID=`EfiB}etm*w+x5L;KXHArpd+nG`NeJWTdEJ$CZ}mQ^3yZIt7uVD
z(D5=boW%{aW&NQjnivK-iX?UQ?x>O~MPuJ;wRe5raW_7FCQhd!N|SAatmiOS5wwAZ
zPNP86w5Xrt=vQ_rL03^`0x~LjSbK)VgE%F5Q;wR(w)Og`UrLqoa?<80EOqOwowbh;
zjWD{C7NQDMrL*D0mme%;$MHAdf`A>9)DX3obXDn0sq!*Y
zm+QTlOPydV2EJ%^xTzumBc@U5jx{xO&ID?%**Bb0-z}jadpL+lk*4?)x)HUeGXY0o
zX>+Mv`=p(L%9N&uY89qvFqbL|z%S${+k(m`41IZ-Ta>iqC2r|dg+Zc|58lxOP7H*U
zz)|6+a5Um2)j1etB8xY{)GN)=Op8=NVM<4&7H;AgWGaeF!PuV;f1?RP)Np{2WoGea
zBv64Y6(t{IN<&gWiZZRUtL1~v!6-ABdaPEqzs9}?78E}Pa*h;!(Up`0u3|%$Q1lIi
zTuldRsy!(kt71M>EN#g|Cu=U62t|xS(z?CcRrNt7RpzSvzIyFVeSUVqODKvbTUI~9
zBx*)egYT)hjZtdiPm>+`<~=1>ldD_Uz?7lLP8`h5P#4(N)$657s?2NZVYAv>T1PXs
zIJLZ{gmfLp$Vb$Gd3%S5Nt4?V5Xc64It^CX#2boB=!suTuOmM(hPl|b-QVjJj50rq
zx5wRT-#OQHET$CHX3P}b_?)jP44*{}IBLqBzL`kP>=>GPeYbcJH;_3cC@|PkzqYR3
zuCdAgzDsJ8Hk$4-1HG*jT`k5W;mtDZ*&9^^PB_*#6>XmN>_a=zn{e-
zglgSgug(tNMf1Xqd;^)mFBCQ6?Wl3FTeOu<8Ba~ZR2m6S;v_NQW5C6_*4!U-21fZq
zEFK=0_uJY%ld2?Z>6=h-Ax(1_am6+djmc|@CM7zJ5M?WLlYYi9L#(@AR?A1N8!3MR
znEK&R?Yyde-*-^8eAtWCr$W}Ou~?Pbn2@TdD5XhjiuzJC7H?%_h55kUDS?q#=j?WK
z)Cm~nFW`s2)n@fnhlOuc|1Fl3Zati-C2$KN4Svbeys4O0mAXozh~dB`hXI&=ady9}
zboUhHZva*OOpT3GHJzQX@1QIt)d@AxPdHdb&if{bv2Qk7Ve2%E{4Ux=M?L%1=AeUJ
z8N`;V?KR+Zxv#U$xy9+>J6QdBe&=9up27?--X&Te;0-8)73M+jA=*s1i~
zv#7RUi=-N2*0`f1+HL=_SP%^7>kGZhssxgI~Qha
zN^%s>kQ1t=U1eS6bZTgV2q*GX*ji8x4v!F%+>ECTmsm8qKfc#5q{>(J&S$q#7>L6w
zAb^7t2tjZ_+bSZbLZ$eEP{cV;uzmkm+3}2=QHUs&b}KdQd@V6J6y@^i=YMg(BA(W1
zqhfN^1?zJ6)D>1qs$@}}sY`II_H^A-XLWA(&}CyM=L__#==ro)RV_g(d}Vw)TLZ4P
z;~OxHW?>GMJ>|;#cJKU_gnV!f+1g_X+&lFdoXi;s1g>)f0MO$E9xy>601y>)e8@bpH_j|L@;M#aMH$D
z?lP54ysHJ?pRc(FCl%cAbpE
zyyGs#;iaNOTXE;Yo7ICe+am7KjoE#d38%&~1uQ#rj`%8%AgGSmr*
zF=~g4OjpFJDt#H#6}}ywx7B4;Wws&Qb_Np3Eej^|I80r*;&Gd+@BY(NPEpd64>Fdm
zrNo7UaG8l`bTi^=P|!0Z=-ISMteQ04ilV}I#`ASuS5=@?93?NtSXVEXabRHyl$Cu2
zTphXmK_+H$LH=^=-nOByoG3s+(XNO#Dro9jQdIacpsvj-SgSCKk{t7OG|(Ql#!{o0
zt>tL7V6nWYkas4WXv%(0h2|9P?HG}92^z&}4Tj2`i||A7z}GZwvTVHx~E{+
z_%^tRwaS7?A
z(9&-AXS02v7bUu+EC!PrF7m*iw7
ofRu9l`oBwlA=rUL>O@f{!?G{OU;@k3qD3HKPgg&ebxsLQ03m1ZDF6Tf

literal 0
HcmV?d00001

diff --git a/assets/images/png/smartwatches/apple-watch-1.jpeg b/assets/images/png/smartwatches/apple-watch-1.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..7262e7eb3411db962608de8ac9096b82bd3facdb
GIT binary patch
literal 25125
zcmbrl1z20}w=TGYJEd6h7AR7zI1~xA#fw|<7Kh;OfnqIMTuO1bl;Z9VMGM8PxCRXt
zZhq&Sd+yBn&z(6lv!7>WCt(BM%FbHrUGI9ohd&PsKnQ?|j)8%Jj){7}#KgqHCcwc)
z9mM$fxCA7`j~|l|laP>7&{C3;QInI9JbCtnnvRZvfq|5gk(rU6nUWS|JTPu2S9=Y>H>A4gBSrc5)e8G=%ELc3jiQY(7zqPe;gn*bPUuAad7eQ
z9|33}baXV-x={;9UFnbd8Gu28`S=;HG#07)M{GuCGQOa=92}L>X66=_R@OGQu5Rugo?hNQ
z!6Bhx;h(=m#3v*sC8wmOrRV157Zes1mz4gjuBol7Z)j}l>h9_7>mL{#nw*;cJu~}f
zZhmcj6U}0n}9+e%^3!2NGAu$k(Vo;x9p@d~BNN
z0}#l=1n>0%M}uv@%_()R9uxNCof}jr{0ztyL>2~0mX5jxu)tS>{e+uuJ$r7nBYChy
zxphY#fHo|Hb69ALHe7g}GD4}cYP~|LW6Az7>)>Q#%GM10MXyXA1v8BCBmMoP|SG%f+WF7PEBKn7NVvCs+d4)`svxtQ)KPg`zRlckjrdh
zv)^DF*q0RFAk)lzSBCx~V
z#&jpw#5}eEBcZ)m@EHKZ7j=xrzKCnPC%CRhd)PeyQ1#RY;NZ8KoXY#gY@EN1(*>d_
z8f^*p`)R}%#p$A1$D{oI=4SV{t1$)gKb<3hUlgNrS;!mkhGsY6&;wAG=?*>^>b|C)
z4jZr9)m^Jm6Md3RaLcjsXyL29`=~yF8}Eu@!(Dn4A-J!dv{1rl(f~$EL|z^UvsNM6sq(a^$U&SLF(RIRc{GYJ6zV
z(X$da03%4zt~c4x532Qr9^(Nw+ubWQ&`*wYX1^;0C8!4bc1_RB7*3eC&tYmOvk`ux
z>+<4<*!oq|x>Sr*K^8YKbwtG7CH41e=%bQD9tw`orkaL$-0@9|u-7p~e}dzr81lTy
zbo(>k4Rf^-fcfi7{!zbe_|#=suwwE?cN>!_8S5%CZ!JR5dlxOx0pl!~C@I
z{tCycc;T2>XUY-PD0!#o)swbqZBBH_$B7MHaIqM#tbQ3&9SL5||rlnX$
ztlc=a0(70lfxHSaBhd$AO1SOTYsRFJD**If1vyks<99$e3$*9i@$i80n4L?XTEc_K
zi87orqL2vf^ta-7U4gF_jPzxmQrztu_v_G`%KsG5$itG8eU=y#LNXxO^~SB-IfFs5
znXnV%W0e$x-W}t84v*UgQNo6&|LgwHSatQZT!!;;;x_O+gK#BecZoy2>bJm-AmOVc
znr4M*0nN9!N&Qu@5hXgAud&}^6)#MJO(+DjKzmFFBeOp5DhX#Yk598M^N{<<@SFoF
z>}3HR)=zhuxrk<|VEyrCF`HUqH4_0hEzkBIwykaP0
zZ;wXxJY5&BIIo2Hy!-*6^!g@qk{K>p4O{88u)^8Q_*->Qip|;ogB)(sw-Px&+XI=Y
zjvSe4k)YY4d9)&s@8-VKrVk;(=-g?VG6H$)7NU-9gv9
z1&ANL&;MceQZbM-c`OP$x;-Rz;9LN79U}9LeCf^-VFvSi2^XEb&=#i9jGqzSX;2D5
z#)!c-CL1)^Kw;@Nqw3YBfn@3Lrd3(Qrj>=n#xct$9}#MwwT`l7EeAd~KVqMFHyF4W
z@mY~j%;iTm;SWa={i4U<>F1h~k%5#8(cLE;=t3wu6ykBy294AiU=8D3M0L1}fr@3q$~hm%D$
znS{Fg_8v^hf89R0js|=eXz^AhdHi%vR=O)hzQ6wHSvr)zU^D*XjN!fzx$c|QEx2yX
zb)R>qTfD0=Z%xloKe3$<V;JRDYMl*GuabPq4adEyDm(N6hoyO
z!0t{Ce*D?bzv8>9N%LZ{>fE6j^Bae@2nql9r;yZT30t##!<+g|c{kszW8qCH67Ns3
zFSWwu8j)uKT2OPt2f(}iI30)_Aq
z3AZn{Z~Kwg+32W?rEI`IkDzVP<8-Vv_xt0?Kze5ST1I*HF9k;Rpzuu{#_?KVDkOxS*h*hUWXYCe_923Ms
zpO0sl+o_Jhu18Ct)lihnQ9v*_<^`dpV?uDRFRI`wteKw*!l(`VsO1uFCCB3?bP1m^
zXlOw@lmUOjHGfi-ljHCMH;ES@%%nudCtrPtwih$v{grL($!gTF1>sDcK9sS3?Cxtz
z0gDQbFGpO6+cAQV2Ewb+ug_t>Od>L|W&-FCL;KzOlSkISZhb?aD5b`D473|>R1LtU
zZcZP7dEqtpqMjA>VF;caeX}XGJ>M$)Y$Fu~2Atu+J5Ii8*xNMeWdf0NRFwY
zO!pNBs0r(iLr5!q>2fI48r^orK^i+^?nlNa9Iy%`p|+v>Lnfi!pRuWQ;AZwx4v}?f
zka~w*VF=9~QJDPeimVu8VaRi*4`*uiSHu0qafYwd98Z;(OrwK@7k;8@kbp%i_r44E3}|JKMg-%oR%S8(rZ
zPCJ;@Ro8qe%(N1DKOw6ZJFbRh72~IuGrC783yceT*9I2U_<
zhOSuVI?~$Gtv>(*iJ)V`B5UaRqXguAf$V%h_<|bh*>f*`#MUj+E9>@J9US8b-HwE=
z3;|blRTJ2EJv7L>g10k1Ja-Sk1Mrvp0iZq+hL3KGet7_nH{ULcHXV~?T`d8=`})>%
z55U*J2cR7vDbNkc_h^rW2STI0aN(oh&(Eqnbn?
zpJapJ@13uD0yc~XZXc6AxZqrnpNSz(4@K*P>OHvc!7uhDA9?LvU*r|+xv<80JOB+Z
znswNT?Rx|F|yO*Ua>8a0THwZ38JoDN?YvG^?Y+Z)JU$jD=42
z`I96JQnTCc=fs_7_+{E-Ir}n&OMhv~C_~I46#7wfJ!-o+lPAB#z9ZwlPEk0CNyVMN
zqNF6?pDrzpy~mjyK;M_bVH;&9Bay;wh*ea7MpweC5CJ4v8LobMF|A?sRmLjrb$rna
zCu?*U+^WtpE(pZy+jE)i`KqT)OkYH=$O{~WK}kXM)1cV$9ZDhZ^hK&?N7(9G<=mg2
zl1?@^a}+rLl)^b8H23<}?VD6f$Q$r+xDOn;=sS*PQx6KCr%U6>aQHRX8)=PL0Uvuom`jeG((3
z*HzO}4?yfUx5QW%(R){w=0G-Pyx=usleMj{2F0N%ryji!TaHl4M9|pcLGrSJLiOfA
z1GBs4TzG@{EN1!JU5+po(e;nbAN!`JUrL65B1Y)C21uF(zn@=@nGZpeUl{rh!e!y_
zzk2UU2D;Ea*x%@b&jvE4Urg^cx#BA=LP-Ik!3O}1_FfvM2#W)o+skghL8Lk7F3J}O
zLaZ>gzUOSvB%ZC%JOHn54*o6YVxz7=-({)(JOCcTBlb5^rQpjhnU%GbEm?C3=Paus&^Lqv3{Sb>c2`&{=QwA5*IGC2cI$g9`nGPCm$OP_XQ&(1Kq13nt)iiNLPV0Y}LgMW2#MT-7
zjp>!Rntw?y6SZ)K
z_&U1UTR}X}DsqRM$|dx4V|&hwbfT?n3Im2-T^4cGD7%*-!j^wg8G)SQfPU=a+lr}~
zAF!w-dSh!p6?WUUso5j_>%^RZqS&gzK3mqx6rN7O~$!&!0dX4YqFWvoFKSQGD9c6_k~SU
zm9tV>{RG>EIW#olH-!XtgZ`f4j(1i{?g1
z{R7lr@uo27@6}*jC$2X}eoT{bpXWRLk~N`lkNOxzPx^RR*N{;~t!)p$C<>A3PfRat
zO0X}}2kId_RciahzsY}%bqW^L)o}uCr9RPR5ct#Yvp6O200>QIc$5R4i$pH`M$4g3
zC@^l-u%Dfvq6*s2K=9MA88*Xz{y`e)e)$;|b@!qT+OJB$7?U2)d&dVk7y{UGBY^ET
zW-kv03NK>AlfSF>)0_oC3P=i$)B4pvsBg9LFu}~M#)4s=SthIX=9}L}3It#@9Mm7Z
zfQ|9Y&vrpiBK#n~sh`y8?RD6`{NS9jF8u)be}b-Rfi^KTOutKK;|%1Ht+TU%cxBnG
zvoU&~ksWBP2Qu~QPyPLa)Z1B-ti?os`sr0nB4}J+Q7dNpm`wk^S>bFv0J*TOi5zp*
zsxWaW)9Fo2yEedh*+~W(vlf1q=xSVY65bn+0QWUnw$m`Ypb|1HMvBmcGo&yr;++z6
z?%wpww33^!BX|Gm8ssZdN$n9k>I3)uHJKb`)|DUP%)_*ZX<)J%e8ig?vr))FPp`?tdM#!J*
zXZxp=jpA3ZJg^S_juBMGO(l}|SMZmQy4E3BQ~xY|(Hkq!->
z;nIygxh(a`nMP81?ap>1pVc(C)Ysu(F31oB|B7-{&xi_i&dS*+aBKfrne+HgEkU{&
zdT#Q_=4|&gcrj^c8;;cy)lZ_kmjIL5iH|>;^o*~qbH1A^XKb9bO5O9hgca}1TgG}r
zndbwND><`87I0h}t1bj%{`5=hQ*VYe=~Vd^{K6Zya%Luyz^fw9*lJa@#gp6`Gif*J
z8C@wMrKO#%xKnumzNj9ooJ`5w!k~i7C5$(J4>eIA81*T8z{ZD5!98eAWl_k}j7{9a_blo4?|JOG;+
zW)kuuV2#>geXkYy*#J%xui_k~^zwj7bx)3|9Lyo?|oWK>%>H1sJ7bqH2&wd-xEE^RS=Ah
z#Qye8X2ggpXFv^Tw$q=a8P8nJbxLq2U3;=Jx&J=>`WQ)KL_I2O!uiS0k*#M-aO`H}
z)7z5$noqB0X2MICtuMzMKf3x=xu%*s3X(;A%JUR|xyPI2E+GT>q;y)#7TikN7|kpy
z|HH8NIp4&Ye27Up1s_BUwyyNHzV=Nsjad_z6A!V(nv!TnN8vcjV18V-eTil&rWKO-N~FB&~u$|*RC}O;@MKTyvE(B
zlp9zH{(vL{U3)Vy(I@6>V0!(v{@Zu)+<*>*jeS9O$_5J2AW_X{45W$RRgwW%*m}jt
zO#gW?`YM48WZN4%l6FO2Vg2Xh=*Nx)W~^HK1p;0vvKBLn!9&LsM0j%lN-?t5^>xF5
zVS0i|$da{Y@#eUrNpZO{+V(RX3GZxTR}}igI&qAxxi?yj6jhyr1s>yPJccfbd_2E`
zHJiG}3&uU+dx`m;_LGE60Ax4*3nSj*r3-vaXTNbI>c;^Agj
zj@JbKTI1N|6H>W>|9mz6Pew=<^SZ=R1TY`R?t#|m6x`>)BYR1MPv=wZQnHR@aqr*H
zMl1_injIUpM_-VZ?E7q$jy9~=dh(<1wS7cCM{7`sd7tG2e0rmw&>klD$u#Ucm5QEXn1pnvXr<4acop9B
za`TLBE4QTY$89$OCX@67p+B$z;sR@g@OvmRqFrug!?dvPl0638M6-3zuQ%ydOgoeC
zsf3cs?i}O5lc9$5=J`q=VZZ~>Jv(mv$7m=8?fnxz?^x;-AclxWLTr1o1wN|Sm*X=`
zDECJ_l=*llzWG##wqRs|(KaZM4j||EEH<3^8z-TEavAHtP8iVrW{UCg@`~Z}7CaS@
zr3lqI-2;HGO`kk;daT+OcGI^7F({^0Aea!|(Be>79CeU(C1dHjV$s5C@T?v}%Ixaitta`_8yb5_rmJ_s#|lT%yXO@qWP6n9QHRXxwj_FQPSd!eTyu^a^ZNW-
zy><-);$!n|7)77U=i@NP{S{F=;PVV%seR00UPWv}6wN%4jq5hN!syO=pS6BN4aCY$
zn!KOhsH=VCZO}44f&N!Wgzu>Y|CKS=2{K;c$Cafo(_6oxcv4qU%G*)%Gu=hi{xfPc
zr_lntten-AMi8&-iH{~2chtSyXjbf$N6{0W3|)cXSN6;{OhhZbB{#oE%q^=ARp#_m
z-wagXTyLa2nq{wI$NNYt2+!i`|>P>%rYZ489|66*bS>21?!3q!Rr18!{H
z&%y|ub*O5lx2w&f1Zuay
z)t(V6Jt$0knA4QldYQOlnvpP!$-u-=x^W6q`PX?ymAG#Scl7FaM;$xU$u67r<3yIa
z{SmOOveX~H$Fn3Rb}4Pz@xIqTUu4~Rx&wZ4#mSKhwO`t<67l`z2k(_X^b^eTJvm%U
zw(2yk$}y`UNC^5vq;P1E`P_LckrvcZEG||F$s}(`(46cx5IoGEF|~O*RO0~nhn&b?
z(7kve%GRcQV+a|!hz*~WBu7-ND)EHtuXpAn5|ly;BLgCUG;cB05^zuJO^l3Jdz7DO
z8A8*fVf><5r>-UNe6O9}kbX0K*)&EB*{>PKh{V6269~oS(_q&xv
zi2cW0X%-$qQMChAZPnv8F{1BqqvM0ATS414Nna?bS0}eyJAt{l`d1C#HRP{=1L&c<
zL@Q(uM&-3Fi}1C#Ik{R}4t6Z@`oaab$=6?d`ZE^kv-t8h@|X8@>bw2qOb(jAC&b~c0c3Ybz7R62710#Wu?HL;E5cM4N@0%tJ1S}
zd%}^8j$CyKcF#U7n!I~EDcf)BZM_&mwd#Dpu`F(1=B3mj`81(-h4jK5e$}H(6|5Q+
zTWxdyTib^*>WbV&lm5*8`U)$=;C+k}LxDuIk%}cm1RL
zsamn2q%`qy^pm}9F7EcGW~le>9KWZ6jK0C;1HeB-h{v}cyc?yNLzM*CA#%+dPvETG
zqfq|_4W(`!d_uZtH+IW}YB@EHo!1aZ3)sijsc%TKw?VqwzMhRJ&N2=8I+gsQaf4EG
zB%z?`I`}c4BVZ0Xjj5F^a3<_6El)|enB$f-IVceha38dpZ~UgL5V9rw2iM)G#|%cd
zUk2Hata!;#XPfZiYmdE>SIYf1KnM>Bzt4u74-Wn}>!yWeeJ~3GqjvZy8oi(^(R}fsE)NaH4
zu{{>UrNzGA=L|9kU}OeQwwhdmfAV>08o+57p*>?777@~%G5R85K==I!KX?ec0`UF%
z51j>zdjK4d$-Zz45My?-;?SrysrjD91^LUYHIjvauux05uwx
zDFQ%l@>goZagfHm(DTk?wXGx?Nbrs|y5-_(L@#_=tYWnRJ;}ak2cpCBS4;BQ=fzz<
z*;2ixVmgHbHgwi5VVdBDs=t22=f_6B;#i&#q@Nj)U;
zI&Ea0gU*Q$a$rJfaC+ruD~}))<)vcY6Mnj&SL8NlyXb)A3Fh5EC~j)7yfT#C(k*qftraK`9sswIsxBrT+NMk
zH`B>Y6~E%vIh2h@-p&eX7WBM+yZ9|Gh$h@wZ+wA2C)k1)
z;r$Q5T)j+e$H^WlRi9r*s!cr`?fp6M%W(s+I8_+QgE4qH@0u_w3^2{KHQvVt2+{P^
zBV5;qM;5c^@|K1c2eP5XranKAq>BU|WFYv)Ung0dJ)Ay?QmkVWoq#z84B2nb$9f!b
z^&Wtnfo01otH%#OiK+K@07-iHrfR#fe@I!1MB??*3th>JyfrZ4ekS+qVGRS(ZuK5@
zbZ3{$qaCqo`iQ({dQ8Bqn_yO$WMSbA^ORyIQ;Z-@N#JZqZ=fZH$NJq{}_dg%`3~foj)?MPq=y0B2
znGGIBoIvLxm+8~uCYM=wh{rbP4*+pSzq1dn!g08hSiaR%nPV2`@ok)r#
z3Bu7CbGbCT*SVySnntD9^x*jTO0E$W>nE|XLb*eoTvBSIf4|v^EF+1y+;_4m!1(+9
z0GBXp{fXqoXuJe_?RR~rGD_V1shx{A%0+IH-sb66={EEVv`3yE&r@&WeP)V6xC9TC
zOzJ271h}&_rg7^cIBf6)nj6?NVsQ2|IT&mF_=_RbI;|GP)|8Y&H|2c6kmpsB)&ao|
zVrQD#V5{de#`7kQSzoz^ZoVhYd@DAzx%yEjAu15
z%pN-vJSz%4R380ZTTI12O8Xu)UkyaoUU2R;%hO?_l@lkre^YA5hs?fuKC>FvXia*v|z_4P30??nf7z2!G#FAY0HeJY&tRI^Pcrrc)4HBvkpezNkdF
z$U{Z7NNYw1jl+h+Fs51*ECe85l7)8bMV@97iES4TR#tbta;RRv4Pv{^ixS
zV+63?$9n-l-cAi@+ICjg_}R353-21DZO$9Y7HChU8Sm0~er>|}${tp8hrYG|#YKSM
zom^C>Jsw&zv%%St-TUP~$UIAU!oP-@5}0eRtC7wn*Q1%E+n{~F)RYh(hd#zyMz8u~
zy;X}q4Q)b(3^d?p1qYqfceOv>ALzBHo%(w!f5<_InqbB9&2Hs#lT!V{;@>xM3Rp}p
z`H2uE|0JqA?Jm#w)KhEe*}XPootc3P&}w{FQmRuC=5{Vv;Ce-<#L4l
zP}#_(6fqfz0Genx(%-0e&6yO4j04InHn{oO*r>caWH^p~CTo*cfE7rW{%(>~Asv{g
z_sdOB-i@4Z3hR8~}FEyK3{yt9tpCgM1LAoCHom$pUp@>sIBD+J_
zDfiPh9X{Z?rYgYyI7SyAE^=1Q)`l{hSheO
z9NLd5|M3E={jHrjzn(Pv6CUcSJ1N*0hk<8v=478Bi&9x?j+$7CQ~ON&TQjw|QXZKn
z457fQ|B{7)*&dS`k9_+2gI+5H;fBT
zhS$O2Evz}J1$#*JAG4VTVX2D)dkh!^+*CA$B7b$?t&kxJjh&0{n6$>ck|~g7#uA1`
zKIB%zC>&JkJX<&`q!y`oDvr5F#ZiXHDnV%Kz?GK0gx{vfPPQbfJ3gc0BRH}{lNzJD
zwQLl9rCTEFkWaQ~Xs~l-T&S$~=gYkak*va
z&+R@jlP|_Jjs#vw>yD50I_uoN64sxX(SN{>UiuED506cR+Nz@41fU@rp}E%5@m*U_
zjt`qqFYSw>Q?QFH!q%|mDB09mrfP(H
z_C|tnY*<7rn;RqgggH(Ne}giDrhz9}1^%PC*6jpf%dzly6&JGwKZ>oBCN=6T#%DI_
z?k&7OLfpUdyH&4#dCHZvhb#_0tz?76}~C+32(&2vNQNU0MZN7*G$tewRZi*k*G<}0)f=+nXj1EUXJhEPLS;%
zD{U&j_?o>MLw|(@n*M7}Uz>Fu;9k3GMDi8i^Bd23Ks~%GFkJOJ7T?qAXop6*8U|`TQhm*#
zs%2MIA`YhC59;>;()YV=p0_3#MYHs%VEK(zS03Cu>qCDgXL7gk>`^wX539Hk=Xh$P
zM(kDV$&ajI3!4?keAwX64eo;-W#q@Qssj5JD1?k$_?DR+`Y&Bh>H4S)ia96+G=v2
zzqbkx6b|YrIAdr+$$uzt^G9{~vX1IE<-YHy1J&tjw#6AflV8Fs0DY`L+lEA+sgS&B
zHH>Mk*HZrMo)JJ5Za0IEp2=o0d57qz@OGvu_e&KOJ~njC?w>{~I=>5Ctq4Y)sxBY%
zg)Cik1tE0x%=7CYG>UZw2JTV*8^a7fOV!u90-%*UqDccoMDJP|S3z!FgYc9OW~dVJ
zov(%es0n{SZyUXhgZm1VDixl`?q#`e(3!m4Moj?u`M~bK%<7)By_(jPKQXQ?744|4
zN;kZJG`sDPJCbhE)Oa2B@!Os^_*dJ?eX%=f(cR-&6l`AR^ni?+2+3&PkeU#Ap#Z#>
zx(^X1AP3u{=9&r3)w5{=|2eLB>ORdK^(}fa>Y6a7gNOqZ?T9EeAylx*gM}Z$7&FDl
zslP1>y-g8|Q6xCYHk)j`Dlaxjcsp}@+>A{5y8M?1HF!3h=F`c2<`WwI?gCv6L)FN!
z3)Oqklg+|l=Oq)5cBj4-|CQQ(!Fa4DeeRUc0I!tUSCzY;356NCu`F|FOP(sCI;ej2
zvMjR15|P%-EZ_P)h;*&s^C^>NO>mEXUjb}i*Jq~6ZC3Xxp2{jQ%E4?08z2hwK>N8|
zV3ui1SsBd8T5O04)>=TQi6NYxvHm0_T43eTk`2XtkB$ZQr@;h=jiZSHe1{Nx}1{R=*20Pn1%jw;-9Rq5kXp%lT$fgRAx!5
zra^Y&MtqApIP4@VJYymWo+9m_sW9a>k*Ha!lUEBvCmFLCt`ZAh{Sz@6hMMkWeiWsD
zaP^6_d~;EuN+6e}^P?7$TJd`;UFNN^619?%Sx>UQa$9W?LRhV3sxadXEsQa*4H|8_
zIYfMHc9Kn$wNATi9N#_PDtGz1isAtv;O0?WgSm@lNtWiQ1(ZTM?_4YHD{(7W>(giU
z7~087rJkO+BfuJ4Ymb?lUfCH%
z2DoL-mE2$5?Z10@&X6Qdk_p@uqjO6LP(0BA>refxjrn8lf^18?OIXfKV+rIkIGqzL
zupwN!SgQM8)H7vlr1+zgIx5*i1pTZW(Wah$!+I%nf;;W*jeKhBWH~=j+m>3{BGAx1
z`~ZNkt*=-o10^F7AJ>!|F%gtXC!1|ELO+7|W3O%4Hy7ZhPy$^gsono7$CTccqQ}3r
zvPA>qdily@W1VTArTXOaRx{jrC%1uT{&Kl2HwvD|9>x`?wRq>)_;xDMaT|QXwoI1F
zJCA6yoHlUprX9yzA(dHcs2P2ERlJr_O9Xm_M%hC0VVmEJS6)!mpGU*M4)U~
zS;OXHa4Xeh?x4${FCS+>VsLw=UXtpL1I`+gy43Zha3{`utYj&=ijB_0ZBY&ecnbEx
zwVbAn6o1xe`V9Ym02CK;uMNM)i(l+f5qg3t%f)dEY%hJRf?$=kB8MN?p}rgztlvDf
zF41E|Zf0>VYVn3z1=U#+j>?hi=H&;n7x?ET%*B~?B&5`nes5NT|19l65eK|bxTcPQ
zdxeDOl|EK5WJ>6C@yAuX4vK81i-zFMH^?>LB|y_tMlWL{=iX(T<4zm>PC{}Z-cd!
zP)Bk54Q1i3OG=8%S<2IE8?J8qx2y50n|iM*@@#IBeg_Ye!5sN}#z-A>UdRtf^tuk&
zY9}&@iR{g~9i?n6R4LfF;5(KE#Nn^^rGiWEB;-arnqpCJr%or^Y_L8W{G9xIr6SXpxmdvb9uuWi{UX>L_B%yo
z>bL&smSeTSKsO^T!645x5$JH#hbM&V@vj*g>$y25T1ry|iLs5Dmb0!KGv!i)eNuwM
zpf2Y-m4z>NWz#JZ^kme)FrvsIMUviqUVJC)qr++@FJg8kfb1u=W0+g3sFwjmBnSO|
z8vRCh_-3^IGNwJ>#$RUij^xMXGVVPHR{j+eBqu!?Nbx_>cbn*ay8udSc_+O7WTT_G
zHhxm)!uk&%G755Fdp&!3IfYW?h2F^KMSW8?qTHbu!oJ1>5I-~n^HFgO^gb!bRs%3a
z@YtoY0X!!%kP2ELz}}(8KEwu+5tVsbga`Osl;j$wM`P*-iHriaUS@CF;5=Uhj)`{j
zgndHx(ddVWbtH#Cth*+;lEmX~s3hiPr8+J!(50^@RmDnM_p0iOmH8gB?l`Bx>wYV3
z9r@dStugW5FB$!Mc4?#FU&YVVY$#3SI(S}JgYp4*a;Lyp#co}9sdV`Bk6}qcFhTN2h3O5z>w1=lk-2;_Gn(@}?jR;kg7IN#Cgq$J#AYoa-e1Ov}
zH8IXjo;mqIO5_PMvEg}f8@u0oIAwIotq8`Xz>||_lZPtP^RFD4XxcK^&MTpv9?P`N
zaOOt{m|DZs`KNe+DXHcxr`PIo*i?1|>y5j-@v_dp_-Dzt{S~9&4&_scNfrJn2p3NWAZcLN#I+_rMX8RHmyLerM#ROBTa>YKLkxtQeSWEAxo(bssd
zQ0n8x0GY1flDn(R6uA3?=NZ8*`Fov9cGb8$HW7@d_&fv|YFYS>
zE8){1iF7_{q9ai+q2Xd~C*4+x#oG6P65HMRJ_`~kYrd)q`68EYu01H`|0-%$z`HCx
zeMN7OJJwx{Z(e23R8Ls8l4yph-l6Tcyl$&p=ICINXF*cU?gK#d;c&dMklP&g`oun`
zdD_liYRfk@?+!m|7CW!5jcW9`|UMLs(f$-oo?0*x2xRng;5{0yLVJ2VWBVdb^1
zuWTW~2VIC0PtO|gkX%+0uM>pq4&(f?Xov0
zFUyd_HS5E&#i8V6Z#r*NN$+qn*C~HwRH@5xwMjX{juQJ>WzcfG?d@Oadsf<
z2Y1#3Ksxq#4}TPZrQNb{Ak^RLCLk69jpxsB$zjI!
zx9|2?RS>M}SeoIDU$}JlnMxl3Mr-u73WZdgA6Tr;QT+a@tk*O6Gb^9p;|dW)c9gSb
zQCkwlz;kCdUyUbN;{k5|Ea!fj_dx|{%q9T7^-#<1~aFo%X
zX#VI*-CA-C`t16UoQ9Lktjujs?4sPZFg-)lV{&l8qc-3hQa_sZAYAbG9m@$PQWE~g
zrttU{tWq0v{Prw=+Q26E2$l}z*_vfA=
zW97me{WG_!{8LU1@2avNa_FEGaUn5tSMAIK+t8cY{HRe?tYQ@3mOiO-TX%azd$80jOCReCH#Wl8tFCX1)tz)GUqAaQ)c=BpNdi~fIem;S
z;--+=eZKvL!*a-L@l$p2k2h0R5S%nE6A3`))8ciK5dNa01>kSXPdmFOK!TA4SxQzBsvVB3wBIGx&1}sIf~~W1XZmHA9Og{4
z@hS@9@ygH1@`@|tmA{jV>Z1~3kWib|7t4$ou7ht`p6(2T%3i-hGAjH*Cyy5>ZffTk
zeB^Vm?|*Yb&tH7-F`DSHZ14|Y@?ZBSRza6^|HB-h^Z-;-AM*V9{7(gF;d#`8Xw84N
z$z^KuZGk2h#Wj_|ethe#?^PYDwquYEGI(^C{B{EY$*6I4E*X_{-BKLQDq(4&=|4Tc
z5=Bx2hYx_I*hiL}b^CW0D+G8@EVH{_Uw3b-gHgz)7uNboCH1j-+Sy)N2*bc^$@qWn
zIxrT!H6I{dW%&VacecwzJ^(xj-KyD8yC@QEfnLA3Y0iiecP#N
zHIO1ESwl9U8T#}efGs0x0~CRz@YuV8P&@XdO3dh92+~f&Q5rkTIq!1VuN{B(blMBGMPQkHDj&{`4GuP_ysg
zgDkA44NO?4H|vhYOEm$J#-snz>tcGT9;OxJv=Hao*scg3l}8QlRWXU)zn*QTzIMDE
zpY|K0^nxg2M;hQq7SbQ>MLq!8f`H#ddE0)%MR_AJOXW)4epo5DH5zMi(lWb_mffqD
z7Lp;f5%G$lJLssX?w(K^6a1(VuCz{+LpZea^7&cU>oUW!tB=|$sTc&H74pqC0XR|4
zI*ino{@HKy6;EH@xDN5BNHY4Nm)KLw)mgAscYDmD7SEA44+&pYP$E60@%xKO=
z7i)Nli>x&@x92Zae(juR&2LC6lWxTPJRv@}S1@Z2i3yQ!*??m;GGO->B2?Fj(pY=I
zgezl(uiswj`^x=PFf)ISLm2f*F*A>`89I;N>q8lN$8d72RXxp=Wn4F@Tv&v6I`L!x
zzkP8vtH8TH`cAJBF>LJb+N0YJY4eI_V(G{;C13-bjU{ynWZn_J64b7sq>|98Y@MDh
zRbH9wtEJYor%KPLJKGcH*Xz9WwMv?Q;^}ZYUiG5!I4CH~wn9n4cwR?`7tc*94Y(?t
zuFK<#_~1^BW|0zc^JcZSK4G;}i1#wG#C)t6+xh_*N0mRm
z|(O)9v_n1V|>)$uzz;hMU_uDjDzL}^U7NjSNBY*BV
z#~C?l^J~xkKxbunP>Dp>Ldy?qEpU(5)kDN}m=}q>R(o;rpM{b9O!)As_;btiwF)+{
zFm*@*-z}rrb*(?Y2}Qutd_yxLCEt24zzD2-Mr(yA@OuEBXA@^8YIfwStC9gAr3g$m
z6y)|`BU_UKP`3Xc$U7Ic9K07jZ{pOSmc4|Hh-Bjvb#W*#i`#2J(oRlz_*EAFrc|_(
zD*fG=G%JhFgO>(8sj-RsD5W&iC5S%#60x#SD{`|0`+z$CfDovVJ_@c3&AFU>iqz`e%2hZe!tDKKSMd
ztVUH4p?Mhz@;f}4C6gF@Iq~$lyP!pV(=;7D*F02y>c2vkVHBiPmS90z*;<`
zz?ftaCKn-t5^B8|@|UJV=`yI;&>g#%*|Xk^i@(Y5Ez(161avTX-jYIExXbn1#KVj=
zN2FJ}i~%<`{Kj;5KVX^tR%`1%>s~6Dp$Wx$LW=ee-^0eIx!(I5)86gvE*~wq)wSu|
zeZ8)!+FhaGsWF0TpYVj$j9N||Q25wUR2zkjIEhE)L^4=tGkY8xUc`pA&=L1WwiE6f
z^Qf;i+Z4s#S}yUi;DqEDn){6aV~QK}Iga{Uc|mSAzHC}HdX*{7o?8phj!AdX&5?--
zFHOyp%5O!8bUMh}6rG0V9}s^=(_75)UPMwDv^jQ|?v$UjSN}i~ui?bav%HC`cW-&v
z@rU2ki$jdeRxw{4&1qsIuukFM&F8)~7c-;w7E_zE8ltIv0`rxj~a(G4-Zq
z-Ezyc@7Y~8_LV`iJ5DK55qx8z44S?EA1&|}^tv5da5l6U0@2!R5#Cmp?T>798U~V&
zUIqjnfwN(SdOvY5wo<96n?H~k9*5K(3M);uXs@-ZtbIs7^>W}Gro|Th#o?*rP`e!f
zKB-1T^rny28Tb80Ns7QbO;chXmp`p7(qA-skL7_W6-DGi%M7l{M>m?z!&!DwKn+4eoQ9-7>*A
zF}y7dweOeY?c09H67Un5_ooauVx5+3`jQ%=M>lb$x6M2lkdak@0Bd&M%!kr#D#7OdZicN$qXTXZsH2
z6)0ZV)>Xd8VE5NosO&lJM2r>*C4i>S1ksAVq7-q^nTUay5)SGB<8>Dqj{IL{43)4LnLszH*cpltZ`mn3%ep~|3I71@
zIL6T(0NOa>I2V8ZSXXca|a6}k^8&I_xH
znB0$Gif01SJD
zPIGc)?e2oCqO_H6kxh(@aWeIl3{c70AX5n@ab(6`3&NGJUY)JR7=*YuxBtV!ka_RC
z#C7oL2vvg?QKQw8k|n|qnN6EYmufucSF{o8tZaWhBt~QLfybPKBS;Fz)h+*2TtHz(
z%kP^F`(6Y{#=_I7$VlVaE%K7y%HUm4mVr49!HGbXCIKD2n=
zqaGlFLe0fOE~eWB_uyurtk(Z7O2a_-P@_%4UkY_Ece%KYW=|Wpt^=J=Z^*`x6TLa1
zN(EhxPF3z?+}Hmxe2Qio)A{zHU1GUwd2v&jRF+ig>-z9|+zS$FL92Z6vzoozC@Vn-
zU?X$hWao3CnN_K}CarTMJbGXDW59KfP59QK)9(HHC;4(|MbiT|e$H5~Q0wW<1)!`f
z1o8}gUL@%7x)j#q8aV|Ft0^x5qP*l(YHZ(huy(JR<4CH6RQyNo_SsP^#*XAvhle02
zwRcbMsxljgZ~vj7?>s4N+~8|_S@)=)$fP{3BR4>S!pO{^eT>}9_E@lVI0l+&OVFA5
z+52px0!6V%qi~xW=MC$-EV_vj3_1wI-1|&MGvf@pq5#2zpYl7*I{Sl-`mY<=C-}T#
z@lSg1hjKGgc-*+xkQwx$5CP`%4k>PELR%nvuFbt0T|mxMmp2C52AF+uPM>$;61eoEKN~-L?<~^ez0e{${`YDUV_Sk
zIYfRujqEwJ!|R8|o+eOcX@P;S&2A>)cP8#o0sb7MQh_r-A)?n0suPZ%2^?g1HIV8s88ePLHk^Fzwq()k3Nap#;m$IP_pI4E8a
zT2JV1VW1ERK`y|08jm9AnW7u`Mapi?%Z71Z7-U}|-gLfdqK+LnB>Eb#AP`$RW?q`usD#vA`n%C{(H=CHpfDtOM(QG$};3^5f>GoB|33#tL
z0>}2&VjEDcqS6Xy2V6(S8d&c>h{=|E|A(j-&&xnrU%#Xhq~5#AA<^++Bxo
z!Mz?eJK+AX3)zVelueP?3t3tOfYRlBW$fTcAN~
zCp=2d2#>9+S;sm;>bdQz(i=;?q)hca7OEur}fP$$SH6?$Z
z4A9NH)^Q9U0*sD&ig~ooovB8*R#yL=@=LpiDc47iPZ5+!&OMu5nfHSImP$?;OKqI<
z%@L4pI`+ld?PwUQjKOV6tq*bqodHRTh}vljH=nndF(0
zo7-{*Pgw(Fi_fh^Q-VtZumFJQqLQ5*!<0INn3T$$s@JG|Lr}~ekornC>aNb`7H2Mf
zUqP|gLTJ!r(rWi@Q$KhvWpWU#Lt@pplJ}aM0v^OW11c~&kQcT;9nM+g^26krQfHB5Fz0;B;@U1!^W-_Hw=&GsYNsi@`zy8WcUS3mLMWO
zZLB12C{&8S!Dgi=04^*Wldy9R*7K?ukNGU^xe);ZFr#&B=onhJO|ip!;)l{#`}k1R
z^k*eY+_xag!0e0f*Im&0U%vPMA^2?IK3l1^^(W)BpQdMOtaOxx0kwQU$)^g=y*EJv
zZT0b@rDmTj`P39*ZL!`KD95cH_f$KRR~trOsnMRlJ()76L3+o4_d(J=lz*z(bm!))
zX%+GG_w1@cEAE?5qk=7@1sv@j{F+E=o-zF7RFPzQ6gG_kA~npA6i-Zk_J(mL8ZR)_
zOcw~BBI_tbjz)a~haL#Zvg|=iJiMLrbB*&Z4))@}Mns@Dqa951_|p1pg>Ei+E$8$)
zq$?KYIT*YhBTRP(#RJku#*Tts+^}7;E~uR5vMF(4;lg%}g>B=rfU|G4@Fdsd8a(
z_%-1A>}!^Y?1K5~;-brUAG0Mb0=%~?!*4E3_q2zY;y&P=EbbaCUrjv#9DS>rN%(eW
zyDI*iiI59&gE976&A?11xtnOcFIz|5-?t6@C)~ThX?GXoG1lO=ANBu$QUAJ~|32pv
z?PTIgLq5hoSD4sKUhg{NpdG1sKZ5}Q9)Lu$k&Meh;Op3S@6au3j&L*}&-WALKGY_8t1f03vPW0qk)|#OghLAQOICL#
z@+_Ol8r)<>|8v0s)S{#Bdg|qhhiBz6@qV<
z!d!X9+R!(e|NdThi!KhCi2inh0271+v9L_M6Hmz>s*|W$U}2ej=hO)@H1@_mRkerN
z;w$ABuq82wog%L3XYvZ!wN}7r1dZeE>BNqSA%te+ohgUA}&}H6=DJVOzgb*+cv6S?vzH55alZcm%e(_BSYs
zjr2P@cu7F9-P1?MNVmT-J@!E@tEGS{d`{^E0sbd{60(`+8OdWl?=iD+H{T-dHK%
zz>OXGX0aA=@~<1~b3<)SRaNr#x^*b2)=$o;R|N>`1pl{zlF-=Spc_kQR}^MPUtf8A
zU(_kDt^1(AJves1;NtyRx2r`)3bDh?dc%*Tjm(#JcajE;e#IEY)`@Q}R+4lW;ke*9
zlO0djY$NBIF?Lx(uXP<+)2J&DUCRf&R}aWQ8>QMM8^<(~`@E+aqxA$?ZMltsk}~=-
z!#@d7#^wx)0`?d~JQ&lD
zLf;l?WVy`*QvST+q)2!B_-8!z$~+KN=31bLpZt==09v@C`-_II=K64z)=}v_6A@vT
zHG@5V*Ql7sAW`M9ROAvpVNf59Syze`G35f0e6}5u;i=O_TA~?U&TV?m=d^edS^2-V
z=_kFF)6))I@-*P|kdAIf3}yb7g&&+7R*9+!5gP&SB*c{U<^9zdAMl^%|_s1N6>Nr&s_a+Z}Q%
zSNC-lQ^$p92LXZOohT%BB*mBgNiltu~3v%NFe$loJE
z^&TvzL}w0)Cp@M;sjRnYcRPCdC&bC`flm~~7<9a>pL>7+>Ho9B0
zZbAqz)kfVnURS@>tXK$IxF!TST5etv$6TX*&uPc$TpIH^>BH&`Zz>r0ujrI(ogm^S
z{j2Xyd?7J_)sC&cKf!WGRC&=I&c4V|x4kgUI^Yf6<2!siwY(TM_$gO|Wr4dnD$=k%
z(prWw-6w!_-!G^v)L^KtHsS2ZAQSmgM2#~#*@OGe`%|t!YSL<+A!E0a#}N)>phET+
zMVijc1tnbO_7a-*ptj5&wh0{#{0C%POoH}NZD4!Qx>9;kyT|&YBfJgPo$rU9?;WfB
zBxLy%QOZHfeVlsw$qZ5FiO+uwUPhftD{O2%Z5jmId(VN@K^w?1zi(*0o;RngN{;+&
zZ8=nUFj|f(Jyt$V)$hkP3w=j|+jieNMpdc2Q#ZesytDmQu(c4#T@lvAr{30v)gRxj
ze0)z(0*A4AOSo6}Bg;}su4SBu&~iUp2O3n{{sEQi;$)@@1<^MCgMkZnv#|NiTMTacS
zl~HbQ(!&>>UXctr31Pnrp0ai+xqn~+UA7%AhKQFD!t)N=Q%}Ez?oXpyd=qbDzu(@^
zuUYk?i=yxk_jO0>=J;x&re>VUjP1`5)mi@ZTwMDl+hMhrD&i=B50EN>D|Xy}KoZWM
z*^8Me?^$#Yd#O9};fy^{H0VnzbA;(I{z$5`?EpwxtS;}5NeE?UFJw1^APF8Ys_~`L
z6V+61MNlNQ3ocvO;C?pAu-!pHFFB@;_b1-KzWH{qCokfRnwQTthYdQD6ILx#cjQ>$
zHCiZ@C`VtFe4AO~IT@*zOq#$=|7;+C5h$O$e4=fb{WPQ|cxET{A<~Dh=Ux1LUr&IsNX@)EpnT@J~cE&?p}EQu=Wp_{E7
zJzU&{I!>?LQ{GzBixfMs8GP6s5LKmdrC~C$FP`Ci=CFg!UlbdyHi|tVC}$x9r5KH$
zYEn6*81Mh^y0dpRAF7rUchp@@P)-miO->f|CXe9B07x!w^hMM#NC{7LHuE!V-adC?
z6Q+=^Mc64kMVlrs9^zS`UQ#Q;r=gsx5g8yJ1Ueb=2Gvui-=G{{R%8P*IBC0NMt@9{
zh)n;umIL9zW={t4ZzVSwU&J&^`zKX7u}uspIZ;V+`tf!Q?yR*Fx`=o5b3|}5zI^?P
zmU1-_288Z_Ww^aohL~p1FNW)3i$Doh!Gz;o#A3VmW8E?*&h-=XXYGugfN6D0@>%jX
zexZ(FJSt@nB*g0+K;Eb=UxH=4vkB!Xck;&ts#3GAM;+iV!Le?M<|+S92mT+TYyOV3
z!DB4FzQWyhKzXS#EZ1JteddFfmoR>3FEi&M+dQlIOA`|9S$Ts3=SH<3RK4Uu?{6p&!X-VNhj`5^mAQ}5X}
zA95%LS}_%VNq)S;#zwQ##K!1h{b+u+>`F}g{6l~*xPTT9Ig?W`(aJa=DGvA({#vr1
z3qNIx;oTBj@+zoMrvRCRn&njqtddu~D~UOEo^{Hf4V3-!j{(R4c6m8g73Au+JeS_H
zMSYO4VCr|m+HQ$27n+T3#;U;cJNqP(mTlKi>oFJladIwP<`>U8p3iulm)&`*)%Lle
zY9UXx{+t#si>b)^NR2a@n=^4r3}w&$%4(Mg?
z`Hprv;l)q$7HmKEyM`6GycZ`1y>Y4GsPAdIb@RKR@NLM>Gz7`9kD>IL;=?}hcxG47aUI)y+45dnzuBZ8G3Wp
z$y*>(2276b#!A8sx?<&u5g$-z)fZN%Zd|N%Kn+6|7^@L{S{8@n^p!k}ZJz^ZIdqCz
z0)tU?rw{#*(|v5IB*{#PpBzi#NFA$5XK^zmn=Zcb
z&5!uae
z-41f_Tp6BxGb!2~XGI)%_i;h3Bk#s0uY+A)oU{9^EOzwcs(CyWT4yi)B)S0K?8Gbc
zq@$+RzgI5rYkS_06(5@2FM)iYH01~FI~&uF;|v+bF+ix5{mj-58(9}g-H!2%*#apJ
zF+BCIF3GT-I_F*Q$($P@JE{ldd?}W~+FQ@{4=KxTMlNTFZ0L-0Nvc{t?qHjeoj)dCOTb#zN=Qw7kly4^`S;XfLxvDW17k
z48I8OFqeUgJK2!J9aGk;tDHMFuAYN+TXv0TM#IUdH0^e8mof)m-I5Q_W7&(@MlH$TbVK
zk7|&j=HL~J8AwO6%{nS8oc~lcjE@NU@eanBQ5Rz{^G1tg{bi&-BlTLA~qNMyF=6PGDY;)s2XMm;}WGWxuV@bXbn3%ZO6P+zHnlB3hqht9IX#3T9L
zMGbqhkGpvA->MtL+4tXn_nfODRY`fapB5wBdS%yIy8_H(o#lN7744^=C&mz)K1|XJ1zz6^2<=WRFv5=&2k)AQ
zzI815sP?*jByB%`+hJP}god=?h)0_%d_{BQpHa0YD>3H+K-+8nvfn>HX1Wvr)cd4-yGw+*Gz#98CqnQBD!$elG1zka3zTsKV&}@zh{t^l#9|GE#K&QZtG1
zzJtrPO(ANq@Yaankuiq%_{t2P)fHR6s0f4bz_T8WS*FSpXW88#M8y^06uwvf;FIFQ
z*H8t-1=+;)VETZv#BB#=mERz9Kykkdz1|?OoK}aVH)k2y7x6lF%ywDl+lG+A72EVB
z4%MD7`%zDv1=ll^#^E9@9$W(2QVa07!FWCWrMD7p6LEd>J>wh`@4W{+EroaU53+I}
P{AbP4e{W9c@0tGsz$kVB

literal 0
HcmV?d00001

diff --git a/assets/images/png/smartwatches/apple-watch-2.jpg b/assets/images/png/smartwatches/apple-watch-2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f688f74028e8939dcc1f392624c632699b8a5277
GIT binary patch
literal 19316
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
UAr!8g;rM+o|Mr33-Tc$P03ke%uK)l5

literal 0
HcmV?d00001

diff --git a/assets/images/png/smartwatches/apple-watch-3.jpg b/assets/images/png/smartwatches/apple-watch-3.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b68c1cedd4001fe739100fb5a0f4e3615333c54f
GIT binary patch
literal 53438
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
kRV4W0ri3Mp5*)V4*N-bJif57r?ut^fc4

literal 0
HcmV?d00001

diff --git a/assets/images/png/smartwatches/apple-watch-4.jpg b/assets/images/png/smartwatches/apple-watch-4.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2fc19b67f823b59219a4345684991aab97b917ea
GIT binary patch
literal 61120
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%0ACbR(;~
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

V5zNh6!!x| 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


0f~%g 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 G{r>>%Cf6_k literal 0 HcmV?d00001 diff --git a/assets/images/png/smartwatches/galaxy_watch_8.jpg b/assets/images/png/smartwatches/galaxy_watch_8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7fd474611b90ce3588307999bac8bf473a01992f GIT binary patch literal 32247 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 ON8ta{2vGet_J06wL9PV= literal 0 HcmV?d00001 diff --git a/assets/images/png/smartwatches/galaxy_watch_8_classic.jpeg b/assets/images/png/smartwatches/galaxy_watch_8_classic.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6e840966a9e417d5886be4647b3476db571026c9 GIT binary patch literal 67290 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­rwv_?mx^q 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/smartwatches/galaxy_watch_ultra.jpg b/assets/images/png/smartwatches/galaxy_watch_ultra.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e401d732047fd3ec4c7f23dc6abfbc892d8d3187 GIT binary patch literal 88509 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/smartwatches/heartrate_icon.svg b/assets/images/png/smartwatches/heartrate_icon.svg new file mode 100644 index 0000000..dac05ef --- /dev/null +++ b/assets/images/png/smartwatches/heartrate_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/png/smartwatches/steps_icon.svg b/assets/images/png/smartwatches/steps_icon.svg new file mode 100644 index 0000000..4af073a --- /dev/null +++ b/assets/images/png/smartwatches/steps_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/daily_water_monitor.svg b/assets/images/svg/daily_water_monitor.svg new file mode 100644 index 0000000..b5f057d --- /dev/null +++ b/assets/images/svg/daily_water_monitor.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/health_calculators_services_icon.svg b/assets/images/svg/health_calculators_services_icon.svg new file mode 100644 index 0000000..9f30d08 --- /dev/null +++ b/assets/images/svg/health_calculators_services_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/health_converters_icon.svg b/assets/images/svg/health_converters_icon.svg new file mode 100644 index 0000000..225ad01 --- /dev/null +++ b/assets/images/svg/health_converters_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/smartwatch_icon.svg b/assets/images/svg/smartwatch_icon.svg new file mode 100644 index 0000000..162ab36 --- /dev/null +++ b/assets/images/svg/smartwatch_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 8f2ef94..ab9828e 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -71,6 +71,8 @@ This app requires contacts access to show incoming virtual consultation request. NSFaceIDUsageDescription This app requires Face ID to allow biometric authentication for app login. + NSHealthClinicalHealthRecordsShareUsageDescription + This App need access to HealthKit to read heart rate & other data from your smart watch. NSHealthShareUsageDescription This App need access to HealthKit to read heart rate & other data from your smart watch. NSHealthUpdateUsageDescription diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 319178a..2c37e77 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -4,6 +4,14 @@ aps-environment development + com.apple.developer.healthkit + + com.apple.developer.healthkit.access + + health-records + + com.apple.developer.healthkit.background-delivery + com.apple.developer.in-app-payments merchant.com.hmgwebservices diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index f5d0fe5..aa8d26e 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -202,6 +202,10 @@ class AppAssets { static const String insurance_approval_icon = '$svgBasePath/insurance_approval_icon.svg'; static const String invoices_list_icon = '$svgBasePath/invoices_list_icon.svg'; static const String ancillary_orders_list_icon = '$svgBasePath/ancillary_orders_list_icon.svg'; + static const String daily_water_monitor_icon = '$svgBasePath/daily_water_monitor.svg'; + static const String health_calculators_services_icon = '$svgBasePath/health_calculators_services_icon.svg'; + static const String health_converters_icon = '$svgBasePath/health_converters_icon.svg'; + static const String smartwatch_icon = '$svgBasePath/smartwatch_icon.svg'; //bottom navigation// static const String homeBottom = '$svgBasePath/home_bottom.svg'; diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index 4c17de6..054819e 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -39,6 +39,7 @@ import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_mo import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart'; import 'package:hmg_patient_app_new/features/radiology/radiology_repo.dart'; import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; +import 'package:hmg_patient_app_new/features/smartwatch_health_data/health_provider.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_repo.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart'; @@ -232,6 +233,10 @@ class AppDependencies { () => BloodDonationViewModel(bloodDonationRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt(), dialogService: getIt(), appState: getIt()), ); + getIt.registerLazySingleton( + () => HealthProvider(), + ); + // Screen-specific VMs → Factory // getIt.registerFactory( // () => BookAppointmentsViewModel( diff --git a/lib/features/smartwatch_health_data/health_provider.dart b/lib/features/smartwatch_health_data/health_provider.dart new file mode 100644 index 0000000..fc9dacc --- /dev/null +++ b/lib/features/smartwatch_health_data/health_provider.dart @@ -0,0 +1,85 @@ +import 'package:flutter/foundation.dart'; +import 'package:health/health.dart'; +import 'package:hmg_patient_app_new/features/smartwatch_health_data/health_service.dart'; + +class HealthProvider with ChangeNotifier { + final HealthService _healthService = HealthService(); + Map> healthData = {}; + bool isLoading = false; + String? error; + String selectedTimeRange = '7D'; + int selectedTabIndex = 0; + + void onTabChanged(int index) { + selectedTabIndex = index; + notifyListeners(); + } + + Future fetchHealthData() async { + isLoading = true; + error = null; + notifyListeners(); + healthData.clear(); + try { + final authorized = await _healthService.requestAuthorization(); + if (!authorized) { + error = 'Health data access not authorized'; + isLoading = false; + notifyListeners(); + return; + } + + final startTime = _getStartDate(); + final endTime = DateTime.now(); + + healthData = await _healthService.getAllHealthData(startTime, endTime); + + isLoading = false; + notifyListeners(); + } catch (e) { + error = 'Error fetching health data: $e'; + isLoading = false; + notifyListeners(); + } + } + + Future refreshMetric(HealthDataType type) async { + try { + final startTime = _getStartDate(); + final endTime = DateTime.now(); + + final data = await _healthService.getSpecificHealthData( + type, + startTime, + endTime, + ); + + healthData[type] = data; + notifyListeners(); + } catch (e) { + print('Error refreshing metric $type: $e'); + } + } + + void updateTimeRange(String range) { + selectedTimeRange = range; + fetchHealthData(); + } + + DateTime _getStartDate() { + switch (selectedTimeRange) { + case '1D': + return DateTime.now().subtract(const Duration(days: 1)); + case '7D': + return DateTime.now().subtract(const Duration(days: 7)); + case '1M': + return DateTime.now().subtract(const Duration(days: 30)); + case '3M': + return DateTime.now().subtract(const Duration(days: 90)); + case '1Y': + return DateTime.now().subtract(const Duration(days: 365)); + default: + return DateTime.now().subtract(const Duration(days: 7)); + } + } +} diff --git a/lib/features/smartwatch_health_data/health_service.dart b/lib/features/smartwatch_health_data/health_service.dart new file mode 100644 index 0000000..c5dca48 --- /dev/null +++ b/lib/features/smartwatch_health_data/health_service.dart @@ -0,0 +1,166 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:health/health.dart'; +import 'package:permission_handler/permission_handler.dart'; + +import 'health_utils.dart'; + +class HealthService { + static final HealthService _instance = HealthService._internal(); + + factory HealthService() => _instance; + + HealthService._internal(); + + final Health health = Health(); + + final List _healthMetrics = [ + HealthDataType.HEART_RATE, + // HealthDataType.STEPS, + // HealthDataType.BLOOD_OXYGEN, + // HealthDataType.BLOOD_PRESSURE_SYSTOLIC, + // HealthDataType.BLOOD_PRESSURE_DIASTOLIC, + // HealthDataType.BODY_TEMPERATURE, + // HealthDataType.DISTANCE_WALKING_RUNNING, + // HealthDataType.ACTIVE_ENERGY_BURNED, + ]; + + final List _healthMetricsAndroid = [ + HealthDataType.HEART_RATE, + HealthDataType.STEPS, + HealthDataType.BLOOD_OXYGEN, + // HealthDataType.BLOOD_PRESSURE_SYSTOLIC, + // HealthDataType.BLOOD_PRESSURE_DIASTOLIC, + // HealthDataType.BODY_TEMPERATURE, + HealthDataType.DISTANCE_DELTA, + HealthDataType.ACTIVE_ENERGY_BURNED, + HealthDataType.BASAL_ENERGY_BURNED, + HealthDataType.TOTAL_CALORIES_BURNED + ]; + + final List _healthPermissions = [ + HealthDataType.HEART_RATE, + HealthDataType.STEPS, + HealthDataType.BLOOD_OXYGEN, + // HealthDataType.BLOOD_PRESSURE_SYSTOLIC, + // HealthDataType.BLOOD_PRESSURE_DIASTOLIC, + // HealthDataType.BODY_TEMPERATURE, + Platform.isAndroid ? HealthDataType.DISTANCE_DELTA : HealthDataType.DISTANCE_WALKING_RUNNING, + HealthDataType.ACTIVE_ENERGY_BURNED, + HealthDataType.BASAL_ENERGY_BURNED, + HealthDataType.TOTAL_CALORIES_BURNED + ]; + + final List _healthMetricsCumulative = [ + HealthDataType.BLOOD_OXYGEN, + HealthDataType.STEPS, + Platform.isAndroid ? HealthDataType.DISTANCE_DELTA : HealthDataType.DISTANCE_WALKING_RUNNING, + HealthDataType.ACTIVE_ENERGY_BURNED, + HealthDataType.BASAL_ENERGY_BURNED, + HealthDataType.TOTAL_CALORIES_BURNED + ]; + + Future requestAuthorization() async { + try { + final types = (Platform.isAndroid) ? dataTypesAndroid : _healthPermissions; + final granted = await health.requestAuthorization(types); + await Permission.activityRecognition.request(); + await Permission.location.request(); + // request access to read historic data + await Health().requestHealthDataHistoryAuthorization(); + // await authorize(); + return granted; + } catch (e) { + print('Authorization error: $e'); + return false; + } + } + + Future>> getAllHealthData( + DateTime startTime, + DateTime endTime, + ) async { + final Map> allData = {}; + + try { + for (var type in _healthMetricsCumulative) { + try { + final data = await health.getHealthIntervalDataFromTypes( + startDate: startTime, + endDate: endTime, + types: [type], + interval: 86400, + ); + + if (type == HealthDataType.BLOOD_OXYGEN) { + for (var point in data) { + if (point.value is NumericHealthValue) { + final numericValue = (point.value as NumericHealthValue).numericValue; + point.value = NumericHealthValue( + numericValue: numericValue * 100, + ); + } + } + } + + if (type == HealthDataType.DISTANCE_WALKING_RUNNING) { + for (var point in data) { + if (point.value is NumericHealthValue) { + final numericValue = (point.value as NumericHealthValue).numericValue; + point.value = NumericHealthValue( + numericValue: numericValue / 1000, + ); + } + } + } + + allData[type] = data; + } catch (e) { + print('Error fetching $type: $e'); + allData[type] = []; + } + } + + for (var type in Platform.isIOS ? _healthMetrics : _healthMetricsAndroid) { + try { + final data = await health.getHealthDataFromTypes( + startTime: startTime, + endTime: endTime, + types: [type], + // includeManualEntry: false + // interval: 86400, + ); + + allData[type] = data; + } catch (e) { + print('Error fetching $type: $e'); + allData[type] = []; + } + } + } catch (e) { + print('Error fetching health data: $e'); + } + + return allData; + } + + Future> getSpecificHealthData( + HealthDataType type, + DateTime startTime, + DateTime endTime, + ) async { + try { + final data = await health.getHealthDataFromTypes( + startTime: startTime, + endTime: endTime, + types: [type], + ); + return data; + } catch (e) { + print('Error fetching $type: $e'); + return []; + } + } +} diff --git a/lib/features/smartwatch_health_data/health_utils.dart b/lib/features/smartwatch_health_data/health_utils.dart new file mode 100644 index 0000000..3d3588e --- /dev/null +++ b/lib/features/smartwatch_health_data/health_utils.dart @@ -0,0 +1,109 @@ +import 'package:health/health.dart'; + +/// Data types available on iOS via Apple Health. +const List dataTypesIOS = [ + HealthDataType.ACTIVE_ENERGY_BURNED, + HealthDataType.APPLE_STAND_TIME, + HealthDataType.APPLE_STAND_HOUR, + HealthDataType.APPLE_MOVE_TIME, + HealthDataType.AUDIOGRAM, + HealthDataType.BASAL_ENERGY_BURNED, + HealthDataType.BLOOD_GLUCOSE, + HealthDataType.BLOOD_OXYGEN, + HealthDataType.BLOOD_PRESSURE_DIASTOLIC, + HealthDataType.BLOOD_PRESSURE_SYSTOLIC, + HealthDataType.BODY_FAT_PERCENTAGE, + HealthDataType.BODY_MASS_INDEX, + HealthDataType.BODY_TEMPERATURE, + HealthDataType.DIETARY_CARBS_CONSUMED, + HealthDataType.DIETARY_CAFFEINE, + HealthDataType.DIETARY_ENERGY_CONSUMED, + HealthDataType.DIETARY_FATS_CONSUMED, + HealthDataType.DIETARY_PROTEIN_CONSUMED, + HealthDataType.ELECTRODERMAL_ACTIVITY, + HealthDataType.FORCED_EXPIRATORY_VOLUME, + HealthDataType.HEART_RATE, + HealthDataType.HEART_RATE_VARIABILITY_SDNN, + HealthDataType.HEIGHT, + HealthDataType.INSULIN_DELIVERY, + HealthDataType.RESPIRATORY_RATE, + HealthDataType.PERIPHERAL_PERFUSION_INDEX, + HealthDataType.STEPS, + HealthDataType.WAIST_CIRCUMFERENCE, + HealthDataType.WEIGHT, + HealthDataType.FLIGHTS_CLIMBED, + HealthDataType.DISTANCE_WALKING_RUNNING, + HealthDataType.WALKING_SPEED, + HealthDataType.MINDFULNESS, + HealthDataType.SLEEP_AWAKE, + HealthDataType.SLEEP_ASLEEP, + HealthDataType.SLEEP_IN_BED, + HealthDataType.SLEEP_LIGHT, + HealthDataType.SLEEP_DEEP, + HealthDataType.SLEEP_REM, + HealthDataType.WATER, + HealthDataType.EXERCISE_TIME, + HealthDataType.WORKOUT, + HealthDataType.HEADACHE_NOT_PRESENT, + HealthDataType.HEADACHE_MILD, + HealthDataType.HEADACHE_MODERATE, + HealthDataType.HEADACHE_SEVERE, + HealthDataType.HEADACHE_UNSPECIFIED, + HealthDataType.LEAN_BODY_MASS, + + // note that a phone cannot write these ECG-based types - only read them + // HealthDataType.ELECTROCARDIOGRAM, + // HealthDataType.HIGH_HEART_RATE_EVENT, + // HealthDataType.IRREGULAR_HEART_RATE_EVENT, + // HealthDataType.LOW_HEART_RATE_EVENT, + // HealthDataType.RESTING_HEART_RATE, + // HealthDataType.WALKING_HEART_RATE, + // HealthDataType.ATRIAL_FIBRILLATION_BURDEN, + + HealthDataType.NUTRITION, + HealthDataType.GENDER, + HealthDataType.BLOOD_TYPE, + HealthDataType.BIRTH_DATE, + HealthDataType.MENSTRUATION_FLOW, + HealthDataType.WATER_TEMPERATURE, + HealthDataType.UNDERWATER_DEPTH, + HealthDataType.UV_INDEX, +]; + +/// Data types available on Android via the Google Health Connect API. +const List dataTypesAndroid = [ + HealthDataType.ACTIVE_ENERGY_BURNED, + // HealthDataType.BASAL_ENERGY_BURNED, + // HealthDataType.BLOOD_GLUCOSE, + HealthDataType.BLOOD_OXYGEN, + // HealthDataType.BLOOD_PRESSURE_DIASTOLIC, + // HealthDataType.BLOOD_PRESSURE_SYSTOLIC, + // HealthDataType.BODY_FAT_PERCENTAGE, + // HealthDataType.HEIGHT, + // HealthDataType.WEIGHT, + // HealthDataType.LEAN_BODY_MASS, + // HealthDataType.BODY_MASS_INDEX, + // HealthDataType.BODY_TEMPERATURE, + HealthDataType.HEART_RATE, + // HealthDataType.HEART_RATE_VARIABILITY_RMSSD, + HealthDataType.STEPS, + HealthDataType.DISTANCE_DELTA, + // HealthDataType.SPEED, + HealthDataType.RESPIRATORY_RATE, + // HealthDataType.SLEEP_ASLEEP, + // HealthDataType.SLEEP_AWAKE_IN_BED, + // HealthDataType.SLEEP_AWAKE, + // HealthDataType.SLEEP_DEEP, + // HealthDataType.SLEEP_LIGHT, + // HealthDataType.SLEEP_OUT_OF_BED, + // HealthDataType.SLEEP_REM, + // HealthDataType.SLEEP_UNKNOWN, + // HealthDataType.SLEEP_SESSION, + // HealthDataType.WATER, + // HealthDataType.WORKOUT, + HealthDataType.RESTING_HEART_RATE, + // HealthDataType.FLIGHTS_CLIMBED, + // HealthDataType.NUTRITION, + HealthDataType.TOTAL_CALORIES_BURNED, + // HealthDataType.MENSTRUATION_FLOW, +]; \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 30714c6..409503e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -28,6 +28,7 @@ import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart'; import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; +import 'package:hmg_patient_app_new/features/smartwatch_health_data/health_provider.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart'; import 'package:hmg_patient_app_new/routes/app_routes.dart'; @@ -153,6 +154,9 @@ void main() async { ), ChangeNotifierProvider( create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), ) ], child: MyApp()), ), diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart index 0e60a28..a27e76d 100644 --- a/lib/presentation/book_appointment/book_appointment_page.dart +++ b/lib/presentation/book_appointment/book_appointment_page.dart @@ -118,6 +118,7 @@ class _BookAppointmentPageState extends State { : myAppointmentsVM.patientMyDoctorsList.isEmpty ? SizedBox() : Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ if (appState.isAuthenticated) ...[], "Recent Visits".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0.h), diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 85ccdac..1d4131a 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -120,6 +120,45 @@ class ServicesPage extends StatelessWidget { // ) ]; + late final List hmgHealthToolServices = [ + HmgServicesComponentModel( + 11, + "Daily Water Monitor".needTranslation, + "".needTranslation, + AppAssets.daily_water_monitor_icon, + bgColor: AppColors.whiteColor, + true, + route: AppRoutes.eReferralPage, + ), + HmgServicesComponentModel( + 11, + "Health\nCalculators".needTranslation, + "".needTranslation, + AppAssets.health_calculators_services_icon, + bgColor: AppColors.whiteColor, + true, + route: AppRoutes.eReferralPage, + ), + HmgServicesComponentModel( + 5, + "Health\nConverters".needTranslation, + "".needTranslation, + AppAssets.health_converters_icon, + bgColor: AppColors.whiteColor, + true, + route: AppRoutes.comprehensiveCheckupPage, + ), + HmgServicesComponentModel( + 11, + "Smart\nWatches".needTranslation, + "".needTranslation, + AppAssets.smartwatch_icon, + bgColor: AppColors.whiteColor, + true, + route: AppRoutes.smartWatches, + ), + ]; + @override Widget build(BuildContext context) { bloodDonationViewModel = Provider.of(context); @@ -149,7 +188,7 @@ class ServicesPage extends StatelessWidget { itemCount: hmgServices.length, padding: EdgeInsets.zero, itemBuilder: (BuildContext context, int index) { - return ServiceGridViewItem(hmgServices[index], index, false); + return ServiceGridViewItem(hmgServices[index], index, false, isHealthToolIcon: false); }, ), SizedBox(height: 24.h), @@ -298,6 +337,29 @@ class ServicesPage extends StatelessWidget { ], ), SizedBox(height: 24.h), + "Health Tools".needTranslation.toText18(isBold: true), + SizedBox(height: 16.h), + GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 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, + ); + }, + ), + SizedBox(height: 24.h), "Support Services".needTranslation.toText18(isBold: true), SizedBox(height: 16.h), Column( diff --git a/lib/presentation/hmg_services/services_view.dart b/lib/presentation/hmg_services/services_view.dart index b24b0b4..3f0c44e 100644 --- a/lib/presentation/hmg_services/services_view.dart +++ b/lib/presentation/hmg_services/services_view.dart @@ -13,8 +13,10 @@ class ServiceGridViewItem extends StatelessWidget { final int index; final bool isHomePage; final bool isLocked; + final bool isHealthToolIcon; final Function? onTap; - const ServiceGridViewItem(this.hmgServiceComponentModel, this.index, this.isHomePage, {super.key, this.isLocked = false, this.onTap}); + + const ServiceGridViewItem(this.hmgServiceComponentModel, this.index, this.isHomePage, {super.key, this.isLocked = false, this.onTap, this.isHealthToolIcon = false}); @override Widget build(BuildContext context) { @@ -42,7 +44,7 @@ class ServiceGridViewItem extends StatelessWidget { padding: EdgeInsets.all(12.h), child: Utils.buildSvgWithAssets( icon: hmgServiceComponentModel.icon, - iconColor: AppColors.whiteColor, + iconColor: isHealthToolIcon ? null : AppColors.whiteColor, fit: BoxFit.contain, ), ), diff --git a/lib/presentation/smartwatches/health_dashboard/health_dashboard.dart b/lib/presentation/smartwatches/health_dashboard/health_dashboard.dart new file mode 100644 index 0000000..7ede201 --- /dev/null +++ b/lib/presentation/smartwatches/health_dashboard/health_dashboard.dart @@ -0,0 +1,422 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/smartwatch_health_data/health_provider.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/smartwatches/widgets/health_metric.dart'; +import 'package:hmg_patient_app_new/presentation/smartwatches/widgets/health_metric_card.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/custom_tab_bar.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:provider/provider.dart'; +import 'package:health/health.dart'; +import 'package:intl/intl.dart'; + +class HealthDashboard extends StatefulWidget { + const HealthDashboard({Key? key}) : super(key: key); + + @override + _HealthDashboardState createState() => _HealthDashboardState(); +} + +class _HealthDashboardState extends State with SingleTickerProviderStateMixin { + late TabController _tabController; + final dateFormat = DateFormat('MMM dd, yyyy'); + final timeFormat = DateFormat('hh:mm a'); + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 2, vsync: this); + Future.microtask( + () async { + await Health().configure(); + context.read().fetchHealthData(); + }, + ); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Consumer( + builder: (context, healthProvider, child) { + return SingleChildScrollView( + child: Column( + children: [ + SizedBox(height: 96.h), + CustomTabBar( + activeTextColor: Color(0xffED1C2B), + activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), + tabs: [ + CustomTabBarModel(null, "Overview".needTranslation), + CustomTabBarModel(null, "Details".needTranslation), + ], + onTabChange: (index) { + healthProvider.onTabChanged(index); + }, + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 24.h), + getSelectedTabData(healthProvider.selectedTabIndex, healthProvider).paddingSymmetrical(24.w, 0), + ], + ), + ); + }, + ), + floatingActionButton: FloatingActionButton( + onPressed: () => context.read().fetchHealthData(), + tooltip: 'Refresh health data', + child: Icon(Icons.refresh), + ), + ); + } + + Widget getSelectedTabData(int index, HealthProvider healthProvider) { + switch (index) { + case 0: + return _buildOverviewTab(healthProvider); + case 1: + return _buildDetailsTab(healthProvider); + default: + SizedBox.shrink(); + } + return Container(); + } + + Widget _buildOverviewTab(HealthProvider healthProvider) { + if (healthProvider.isLoading) { + return _buildLoadingState(); + } + + if (healthProvider.error != null) { + return _buildErrorState(healthProvider.error!); + } + return CustomScrollView( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + slivers: [ + SliverToBoxAdapter( + child: _buildTimeRangeSelector(healthProvider), + ), + SliverPadding( + padding: EdgeInsets.symmetric(vertical: 12.w), + sliver: SliverGrid( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 16, + crossAxisSpacing: 16, + childAspectRatio: 0.62, + ), + delegate: SliverChildBuilderDelegate( + (context, index) { + final metric = HealthMetrics.metrics[index]; + return HealthMetricCard( + metric: metric, + data: healthProvider.healthData[metric.type] ?? [], + onTap: () => _showMetricDetails(context, metric, healthProvider), + ); + }, + childCount: HealthMetrics.metrics.length, + ), + ), + ), + ], + ); + } + + Widget _buildDetailsTab(HealthProvider healthProvider) { + return ListView.builder( + padding: const EdgeInsets.all(16), + itemCount: HealthMetrics.metrics.length, + shrinkWrap: true, + itemBuilder: (context, index) { + final metric = HealthMetrics.metrics[index]; + final data = healthProvider.healthData[metric.type] ?? []; + + return Card( + color: AppColors.whiteColor, + margin: EdgeInsets.only(bottom: 16), + child: ExpansionTile( + leading: Icon( + metric.icon, + color: metric.color, + size: 32.h, + ), + // title: Text(metric.name), + title: (getIt.get().isArabic() ? metric.nameAr : metric.nameEn).toText14(isBold: true), + subtitle: Text( + data.isEmpty ? LocaleKeys.noDataAvailable.tr(context: context) : '${_getValueAsDouble(data.last.value, metric.type).toStringAsFixed(1)} ${metric.unit}', + ), + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + metric.description.toText13(), + SizedBox(height: 16.h), + if (data.isNotEmpty) ...[ + Text( + 'History', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ), + SizedBox(height: 8), + ...data.reversed + .take(5) + .map((point) => Padding( + padding: const EdgeInsets.only(bottom: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + dateFormat.format(point.dateFrom), + style: TextStyle(color: Colors.grey[600]), + ), + Text( + '${_getValueAsDouble(point.value, metric.type).toStringAsFixed(1)} ${metric.unit}', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ], + ), + )) + .toList(), + ], + ], + ), + ), + ], + ), + ); + }, + ); + } + + Widget _buildTimeRangeSelector(HealthProvider provider) { + return Container( + height: 40, + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + for (final range in ['1D', '7D', '1M', '3M', '1Y']) + Padding( + padding: const EdgeInsets.only(right: 8), + child: ChoiceChip( + label: Text(range), + labelStyle: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + checkmarkColor: AppColors.primaryRedColor, + selected: provider.selectedTimeRange == range, + selectedColor: AppColors.secondaryLightRedColor, + onSelected: (selected) { + if (selected) { + provider.updateTimeRange(range); + } + }, + ), + ), + ], + ), + ); + } + + Widget _buildLoadingState() { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator(), + SizedBox(height: 16), + Text('Loading health data...'), + ], + ), + ); + } + + Widget _buildErrorState(String error) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.error_outline, + size: 48, + color: Colors.red, + ), + SizedBox(height: 16), + Text( + 'Error loading health data', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 8), + Text( + error, + textAlign: TextAlign.center, + style: TextStyle(color: Colors.grey[600]), + ), + SizedBox(height: 24), + ElevatedButton( + onPressed: () => context.read().fetchHealthData(), + child: Text('Try Again'), + ), + ], + ), + ); + } + + void _showMetricDetails( + BuildContext context, + HealthMetricInfo metric, + HealthProvider provider, + ) { + final data = provider.healthData[metric.type] ?? []; + + showModalBottomSheet( + context: context, + isScrollControlled: true, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (context) => DraggableScrollableSheet( + initialChildSize: 0.7, + minChildSize: 0.5, + maxChildSize: 0.95, + expand: false, + builder: (context, scrollController) => Container( + padding: EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Container( + width: 40, + height: 4, + margin: EdgeInsets.only(bottom: 16), + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(2), + ), + ), + ), + Row( + children: [ + Icon(metric.icon, color: metric.color, size: 30), + SizedBox(width: 16), + (getIt.get().isArabic() ? metric.nameAr : metric.nameEn).toText24(isBold: true), + // Text( + // metric.name, + // style: TextStyle( + // fontSize: 24, + // fontWeight: FontWeight.bold, + // ), + // ), + ], + ), + SizedBox(height: 16), + Text( + metric.description, + style: TextStyle( + color: Colors.grey[600], + fontSize: 16, + ), + ), + SizedBox(height: 24), + Text( + 'Healthy Range', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 8), + '${metric.minHealthyValue} - ${metric.maxHealthyValue} ${metric.unit}'.toText16(isBold: true, color: AppColors.primaryRedColor), + // Text( + // '${metric.minHealthyValue} - ${metric.maxHealthyValue} ${metric.unit}', + // style: TextStyle( + // color: mainPurple, + // fontSize: 16, + // ), + // ), + SizedBox(height: 24), + if (data.isNotEmpty) ...[ + Text( + 'History', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 16), + Expanded( + child: ListView.builder( + controller: scrollController, + itemCount: data.length, + itemBuilder: (context, index) { + final point = data[data.length - 1 - index]; + final value = _getValueAsDouble(point.value, metric.type); + return Card( + child: ListTile( + title: Text( + '${value.toStringAsFixed(1)} ${metric.unit}', + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text( + // dateFormat.format(point.dateFrom), + Utils.getMonthDayYearDateFormatted(point.dateFrom) + // dateFormat.format(point.dateFrom), + ), + trailing: Icon( + value >= metric.minHealthyValue && value <= metric.maxHealthyValue ? Icons.check_circle : Icons.warning, + color: value >= metric.minHealthyValue && value <= metric.maxHealthyValue ? AppColors.textColor : Colors.orange, + ), + ), + ); + }, + ), + ), + ] else + Center( + child: Text( + 'No data available', + style: TextStyle(color: Colors.grey[600]), + ), + ), + ], + ), + ), + ), + ); + } + + // Add this helper method to the _HealthDashboardState class + double _getValueAsDouble(HealthValue value, HealthDataType type) { + if (value is NumericHealthValue) { + // if(type == HealthDataType.BLOOD_OXYGEN) { + // return (value.numericValue.toDouble() * 100); + // } else { + return value.numericValue.toDouble(); + // } + } + return 0.0; + } +} diff --git a/lib/presentation/smartwatches/smartwatch_instructions_page.dart b/lib/presentation/smartwatches/smartwatch_instructions_page.dart new file mode 100644 index 0000000..357f5f5 --- /dev/null +++ b/lib/presentation/smartwatches/smartwatch_instructions_page.dart @@ -0,0 +1,464 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:health/health.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.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/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/smartwatches/health_dashboard/health_dashboard.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/routes/custom_page_route.dart'; + +class SmartwatchInstructionsPage extends StatelessWidget { + const SmartwatchInstructionsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: LocaleKeys.smartWatches.tr(), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: SingleChildScrollView( + child: Platform.isIOS ? getIOSInstructionsUI(context) : getAndroidInstructionsUI(context), + ), + ), + ), + ); + } + + Widget getAndroidInstructionsUI(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Supported Smart Watches".needTranslation.toText20(isBold: true), + SizedBox(height: 16.h), + Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/galaxy_watch_ultra.jpg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Galaxy Watch Ultra", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + Expanded( + child: Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/galaxy_watch_8_classic.jpeg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Galaxy Watch 8 Classic", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(top: 15.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/galaxy_watch_8.jpg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Container( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Galaxy Watch 8", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + Expanded( + child: Container( + margin: EdgeInsets.only(top: 15.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/galaxy_watch_7_classic.jpg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Galaxy Watch 7 Classic", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(top: 15.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/galaxy_watch_7.webp", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Galaxy Watch 7", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + Expanded( + child: Container( + margin: EdgeInsets.only(top: 15.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/galaxy_fit_3.jpg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Galaxy Fit3", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + ], + ), + ), + SizedBox(height: 12), + "Please make sure that your Samsung Watch is connected to your Phone, is actively synced & updated.".needTranslation.toText14(isBold: true), + SizedBox(height: 12), + "Before syncing data, please make sure that you have followed the instructions properly.".needTranslation.toText14(isBold: true), + SizedBox(height: 12), + InkWell( + onTap: () { + showInstructionsDialog(context); + }, + child: "View watch instructions".needTranslation.toText12(isBold: true, color: AppColors.textColor, isUnderLine: true)), + SizedBox( + height: 130.h, + ), + CustomButton( + text: LocaleKeys.confirm.tr(context: context), + onPressed: () async { + await Health().getHealthConnectSdkStatus().then((val) { + print('Health Connect SDK Status: $val'); + if (val == HealthConnectSdkStatus.sdkAvailable) { + // Navigator.of(context).push( + // FadePage( + // page: HealthDashboard(), // Replace with the actual vital signs page + // // page: HealthApp(), // Replace with the actual vital signs page + // ), + // ); + } else { + // Utils.showAppDialog(context, LocaleKeys.error.tr(context: context), LocaleKeys.healthConnectNotInstalled.tr(), () { + // Navigator.pop(context); + // Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=com.google.android.apps.healthdata"); + // launchUrl(uri, mode: LaunchMode.externalApplication); + // }); + // return; + } + }); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ), + // DefaultButton( + // LocaleKeys.confirm.tr(context: context), + // () async { + // await Health().getHealthConnectSdkStatus().then((val) { + // print('Health Connect SDK Status: $val'); + // if (val == HealthConnectSdkStatus.sdkAvailable) { + // Navigator.of(context).push( + // FadePage( + // page: HealthDashboard(), // Replace with the actual vital signs page + // // page: HealthApp(), // Replace with the actual vital signs page + // ), + // ); + // } else { + // Utils.showAppDialog(context, LocaleKeys.error.tr(context: context), LocaleKeys.healthConnectNotInstalled.tr(), () { + // Navigator.pop(context); + // Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=com.google.android.apps.healthdata"); + // launchUrl(uri, mode: LaunchMode.externalApplication); + // }); + // return; + // } + // }); + // }, + // ) + ], + ); + } + + Widget getIOSInstructionsUI(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Supported Smart Watches".needTranslation.toText20(isBold: true), + SizedBox(height: 16.h), + Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/apple-watch-1.jpeg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Container( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Apple Watch Series 5", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + Expanded( + child: Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/apple-watch-2.jpg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Container( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Apple Watch Series 6", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(top: 15.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/apple-watch-3.jpg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Container( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Apple Watch Series 7", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + Expanded( + child: Container( + margin: EdgeInsets.only(top: 15.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/apple-watch-4.jpg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Container( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Apple Watch Series 8", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(top: 15.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/apple-watch-5.jpg", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Container( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Apple Watch Series 9", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + Expanded( + child: Container( + margin: EdgeInsets.only(top: 15.0), + child: Row( + children: [ + Image.asset("assets/images/png/smartwatches/Apple-Watch-6.png", width: 70.0, height: 70.0), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Container( + width: MediaQuery.of(context).size.width * 0.21, + child: Text("Apple Watch Series 10", overflow: TextOverflow.clip, style: TextStyle(fontSize: 12.0)), + ), + ) + ], + ), + ), + ), + ], + ), + ), + SizedBox(height: 12), + "Please make sure that your Apple Watch is connected to your iPhone, is actively synced & updated.".toText14(isBold: true), + SizedBox(height: 12), + "Before syncing data, please make sure that you have followed the instructions properly.".toText14(isBold: true), + SizedBox(height: 12), + InkWell( + onTap: () { + showInstructionsDialog(context); + }, + child: "View watch instructions".toText12(isBold: true, color: AppColors.textColor, isUnderLine: true), + ), + SizedBox( + height: 130.h, + ), + CustomButton( + text: LocaleKeys.confirm.tr(context: context), + onPressed: () async { + Navigator.of(context).push( + CustomPageRoute( + page: HealthDashboard(), + ), + ); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 50.h, + iconColor: AppColors.whiteColor, + iconSize: 18.h, + ), + ], + ); + } + + showInstructionsDialog(BuildContext context) { + showGeneralDialog( + barrierColor: Colors.black.withOpacity(0.5), + transitionBuilder: (context, a1, a2, widget) { + final curvedValue = Curves.easeInOutBack.transform(a1.value) - 1.0; + return Transform( + transform: Matrix4.translationValues(0.0, curvedValue * 200, 0.0), + child: Opacity( + opacity: a1.value, + child: Dialog( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 350.0, + padding: EdgeInsets.all(21), + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "SmartWatch Tracker".toText18(), + IconButton( + icon: Icon( + Icons.close, + color: Color(0xff2E303A), + ), + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (Platform.isIOS + ? "Make sure that you have installed 'Health' App & 'Watch' App from Apple Store." + : "Please make sure that your Samsung Watch is connected to your Phone, is actively synced & updated.") + .needTranslation + .toText14(), + SizedBox(height: 12), + ], + ) + ], + ), + ), + ], + ), + ), + ), + ); + }, + transitionDuration: Duration(milliseconds: 500), + barrierDismissible: true, + barrierLabel: '', + context: context, + pageBuilder: (context, animation1, animation2) { + return SizedBox(); + //Chanbged By Aamir + }); + } +} diff --git a/lib/presentation/smartwatches/widgets/health_chart.dart b/lib/presentation/smartwatches/widgets/health_chart.dart new file mode 100644 index 0000000..fe6ae78 --- /dev/null +++ b/lib/presentation/smartwatches/widgets/health_chart.dart @@ -0,0 +1,87 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +class HealthChart extends StatelessWidget { + final List spots; + final String title; + final Color gradientColor; + + const HealthChart({ + Key? key, + required this.spots, + required this.title, + required this.gradientColor, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + height: 200, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 5, + blurRadius: 7, + offset: const Offset(0, 3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 16), + Expanded( + child: LineChart( + LineChartData( + gridData: FlGridData(show: false), + titlesData: FlTitlesData(show: false), + borderData: FlBorderData(show: false), + minX: 0, + maxX: spots.length.toDouble() - 1, + minY: spots.map((e) => e.y).reduce((a, b) => a < b ? a : b), + maxY: spots.map((e) => e.y).reduce((a, b) => a > b ? a : b), + lineBarsData: [ + LineChartBarData( + spots: spots, + isCurved: true, + gradient: LinearGradient( + colors: [ + gradientColor.withOpacity(0.5), + gradientColor, + ], + ), + barWidth: 3, + isStrokeCapRound: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient( + colors: [ + gradientColor.withOpacity(0.1), + gradientColor.withOpacity(0.2), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/smartwatches/widgets/health_metric.dart b/lib/presentation/smartwatches/widgets/health_metric.dart new file mode 100644 index 0000000..13e65ad --- /dev/null +++ b/lib/presentation/smartwatches/widgets/health_metric.dart @@ -0,0 +1,97 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:health/health.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class HealthMetricInfo { + final HealthDataType type; + final String nameEn; + final String nameAr; + final String unit; + final Color color; + final IconData icon; + final String description; + final double minHealthyValue; + final double maxHealthyValue; + final String svgIcon; + + const HealthMetricInfo( + {required this.type, + required this.nameEn, + required this.nameAr, + required this.unit, + required this.color, + required this.icon, + required this.description, + required this.minHealthyValue, + required this.maxHealthyValue, + required this.svgIcon}); +} + +class HealthMetrics { + static final metrics = [ + HealthMetricInfo( + type: HealthDataType.HEART_RATE, + nameEn: "Heart Rate", + nameAr: "معدل النبض", + unit: 'BPM', + color: AppColors.primaryRedColor, + icon: Icons.favorite, + description: "Your heart rate indicates how many times your heart beats per minute".needTranslation, + minHealthyValue: 60, + maxHealthyValue: 100, + svgIcon: "assets/images/smartwatches/heartrate_icon.svg"), + HealthMetricInfo( + type: HealthDataType.BLOOD_OXYGEN, + nameEn: "Blood Oxygen", + nameAr: "أكسجين الدم", + unit: '%', + // color: Colors.blue, + color: Color(0xff3A3558), + icon: Icons.air, + description: "Blood oxygen level indicates how much oxygen your red blood cells are carrying".needTranslation, + minHealthyValue: 95, + maxHealthyValue: 100, + svgIcon: "assets/images/smartwatches/bloodoxygen_icon.svg"), + HealthMetricInfo( + type: HealthDataType.STEPS, + nameEn: "Steps", + nameAr: "خطوات", + unit: 'steps', + // color: Colors.green, + color: Color(0xff3263B8), + icon: Icons.directions_walk, + description: "Number of steps taken throughout the day".needTranslation, + minHealthyValue: 7000, + maxHealthyValue: 15000, + svgIcon: "assets/images/smartwatches/steps_icon.svg"), + HealthMetricInfo( + type: Platform.isIOS ? HealthDataType.ACTIVE_ENERGY_BURNED : HealthDataType.TOTAL_CALORIES_BURNED, + nameEn: "Active Calories", + nameAr: "السعرات الحرارية النشطة", + unit: 'kcal', + color: Color(0xffD59E95), + icon: Icons.local_fire_department, + description: "Calories burned during physical activity".needTranslation, + minHealthyValue: 300, + maxHealthyValue: 1000, + svgIcon: "assets/images/smartwatches/calories_icon.svg"), + HealthMetricInfo( + type: Platform.isIOS ? HealthDataType.DISTANCE_WALKING_RUNNING : HealthDataType.DISTANCE_DELTA, + nameEn: "Distance Covered", + nameAr: "المسافة المغطاة", + unit: 'KMs', + // color: mainPurple, + color: Color(0xff6A46F5), + icon: Icons.directions_run, + description: "Distance covered throughout the day".needTranslation, + minHealthyValue: 3, + maxHealthyValue: 10, + svgIcon: "assets/images/smartwatches/distance_icon.svg"), + // Add more metrics as needed + ]; +} diff --git a/lib/presentation/smartwatches/widgets/health_metric_card.dart b/lib/presentation/smartwatches/widgets/health_metric_card.dart new file mode 100644 index 0000000..023f41b --- /dev/null +++ b/lib/presentation/smartwatches/widgets/health_metric_card.dart @@ -0,0 +1,151 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:health/health.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/smartwatches/widgets/health_metric.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class HealthMetricCard extends StatelessWidget { + final HealthMetricInfo metric; + final List data; + final VoidCallback onTap; + + const HealthMetricCard({ + Key? key, + required this.metric, + required this.data, + required this.onTap, + }) : super(key: key); + + // Helper method to convert HealthValue to double + double _getValueAsDouble(HealthValue value, HealthDataType type) { + if (value is NumericHealthValue) { + return value.numericValue.toDouble(); + } + return 0.0; + } + + @override + Widget build(BuildContext context) { + final latestValue = data.isNotEmpty ? _getValueAsDouble(data.last.value, data.last.type) : 0.0; + final isHealthy = latestValue >= metric.minHealthyValue && latestValue <= metric.maxHealthyValue; + + return Card( + color: AppColors.whiteColor, + elevation: 4, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(20), + child: Container( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SvgPicture.asset( + metric.svgIcon, + height: 30.h, + width: 30.h, + fit: BoxFit.contain, + // color: color, + ), + // Icon( + // metric.icon, + // color: metric.color, + // size: 30, + // ), + if (data.isNotEmpty) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 4, + ), + decoration: BoxDecoration( + color: isHealthy ? Colors.green[100] : Color(0xffD7D2F3), + borderRadius: BorderRadius.circular(12), + ), + child: Text( + isHealthy ? "Healthy".needTranslation : 'Warning'.needTranslation, + style: TextStyle( + color: isHealthy ? Colors.green[700] : AppColors.blackColor, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + const SizedBox(height: 16), + (getIt.get().isArabic() ? metric.nameAr : metric.nameEn).toText18(isBold: true, maxlines: 1), + // Text( + // metric.name, + // style: const TextStyle( + // fontSize: 18, + // fontWeight: FontWeight.bold, + // ), + // ), + const SizedBox(height: 8), + Text( + data.isEmpty ? LocaleKeys.noDataAvailable.tr(context: context) : '${latestValue.toStringAsFixed(metric.type == HealthDataType.STEPS ? 0 : 1)} ${metric.unit}', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: metric.color, + ), + ), + if (data.isNotEmpty) ...[ + const SizedBox(height: 16), + SizedBox( + height: 100, + child: LineChart( + LineChartData( + gridData: FlGridData(show: false), + titlesData: FlTitlesData(show: false), + borderData: FlBorderData(show: false), + lineBarsData: [ + LineChartBarData( + spots: _convertToSpots(data), + isCurved: true, + color: metric.color, + barWidth: 3, + isStrokeCapRound: true, + dotData: FlDotData(show: false), + belowBarData: BarAreaData( + show: true, + color: metric.color.withOpacity(0.1), + ), + ), + ], + ), + ), + ), + ], + ], + ), + ), + ), + ); + } + + List _convertToSpots(List data) { + if (data.isEmpty) return []; + + return List.generate( + data.length, + (index) => FlSpot( + index.toDouble(), + _getValueAsDouble(data[index].value, data[index].type), + ), + ); + } +} diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index 183c2a0..f356310 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -9,6 +9,7 @@ import 'package:hmg_patient_app_new/presentation/e_referral/new_e_referral.dart' import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; +import 'package:hmg_patient_app_new/presentation/smartwatches/smartwatch_instructions_page.dart'; import 'package:hmg_patient_app_new/presentation/symptoms_checker/organ_selector_screen.dart'; import 'package:hmg_patient_app_new/presentation/symptoms_checker/possible_conditions_screen.dart'; import 'package:hmg_patient_app_new/presentation/symptoms_checker/risk_factors_screen.dart'; @@ -32,6 +33,7 @@ class AppRoutes { static const String homeHealthCarePage = '/homeHealthCarePage'; static const String zoomCallPage = '/zoomCallPage'; static const String bloodDonationPage = '/bloodDonationPage'; + static const String smartWatches = '/smartWatches'; //appointments static const String bookAppointmentPage = '/bookAppointmentPage'; @@ -69,6 +71,7 @@ class AppRoutes { bookAppointmentPage: (context) => BookAppointmentPage(), userInfoSelection: (context) => UserInfoSelectionScreen(), userInfoFlowManager: (context) => UserInfoFlowManager(), + smartWatches: (context) => SmartwatchInstructionsPage(), // }; diff --git a/pubspec.yaml b/pubspec.yaml index c4fa97b..ecfc5ef 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -114,6 +114,7 @@ flutter: - assets/images/svg/ - assets/images/png/ - assets/images/png/zoom/ + - assets/images/png/smartwatches/ - assets/animations/ - assets/animations/lottie/ From eff6cbbaad0e51e7ccb16b113598d761f69b6e80 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 15 Dec 2025 09:17:17 +0300 Subject: [PATCH 20/55] updates & fixes --- .../appointments/appointment_queue_page.dart | 2 +- .../appointment_checkin_bottom_sheet.dart | 4 +- .../hmg_services/services_page.dart | 3 +- lib/presentation/home/landing_page.dart | 2 +- .../smartwatches/huawei_health_example.dart | 1563 +++++++++++++++++ lib/routes/app_routes.dart | 3 + pubspec.yaml | 1 + 7 files changed, 1573 insertions(+), 5 deletions(-) create mode 100644 lib/presentation/smartwatches/huawei_health_example.dart diff --git a/lib/presentation/appointments/appointment_queue_page.dart b/lib/presentation/appointments/appointment_queue_page.dart index d9e5832..d8acac6 100644 --- a/lib/presentation/appointments/appointment_queue_page.dart +++ b/lib/presentation/appointments/appointment_queue_page.dart @@ -72,7 +72,7 @@ class AppointmentQueuePage extends StatelessWidget { myAppointmentsVM.currentPatientQueueDetails.queueNo!.toText32(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), SizedBox(height: 8.h), CustomButton( - text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus, myAppointmentsVM.currentPatientQueueDetails.roomNo!), + text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus, myAppointmentsVM.currentPatientQueueDetails.roomNo ?? ""), onPressed: () {}, backgroundColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus), borderColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus).withValues(alpha: 0.01), diff --git a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart index cd43b17..1fbd22e 100644 --- a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart +++ b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart @@ -148,8 +148,8 @@ class AppointmentCheckinBottomSheet extends StatelessWidget { checkInType: 2, onSuccess: (apiResponse) { LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight(context, title: "Success".needTranslation, child: Utils.getSuccessWidget(loadingText: LocaleKeys.success.tr()), callBackFunc: () { - myAppointmentsViewModel.getPatientAppointmentQueueDetails(appointmentNo: patientAppointmentHistoryResponseModel.appointmentNo, patientID: patientAppointmentHistoryResponseModel.patientID); + showCommonBottomSheetWithoutHeight(context, title: "Success".needTranslation, child: Utils.getSuccessWidget(loadingText: LocaleKeys.success.tr()), callBackFunc: () async { + await myAppointmentsViewModel.getPatientAppointmentQueueDetails(appointmentNo: patientAppointmentHistoryResponseModel.appointmentNo, patientID: patientAppointmentHistoryResponseModel.patientID); Navigator.of(context).pop(); Navigator.pushAndRemoveUntil( context, diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 1d4131a..56519af 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -155,7 +155,8 @@ class ServicesPage extends StatelessWidget { AppAssets.smartwatch_icon, bgColor: AppColors.whiteColor, true, - route: AppRoutes.smartWatches, + // route: AppRoutes.smartWatches, + route: AppRoutes.huaweiHealthExample, ), ]; diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index 1c1a77d..f9ea1ee 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -325,7 +325,7 @@ class _LandingPageState extends State { ) : SizedBox(height: 12.h), SizedBox(height: 8.h), CustomButton( - text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus, myAppointmentsVM.currentPatientQueueDetails.roomNo!), + text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus, myAppointmentsVM.currentPatientQueueDetails.roomNo ?? ""), onPressed: () {}, backgroundColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus), borderColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus).withValues(alpha: 0.01), diff --git a/lib/presentation/smartwatches/huawei_health_example.dart b/lib/presentation/smartwatches/huawei_health_example.dart new file mode 100644 index 0000000..4163d8b --- /dev/null +++ b/lib/presentation/smartwatches/huawei_health_example.dart @@ -0,0 +1,1563 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:huawei_health/huawei_health.dart'; + +const String packageName = 'com.ejada.hmg'; + +class HuaweiHealthExample extends StatefulWidget { + const HuaweiHealthExample({Key? key}) : super(key: key); + + @override + State createState() => _HuaweiHealthExampleState(); +} + +class _HuaweiHealthExampleState extends State { + /// Styles + static const TextStyle cardTitleTextStyle = TextStyle( + fontWeight: FontWeight.w500, + fontSize: 18, + ); + static const EdgeInsets componentPadding = EdgeInsets.all(8.0); + + /// Text Controllers for showing the logs of different modules + final TextEditingController _activityTextController = TextEditingController(); + final TextEditingController _dataTextController = TextEditingController(); + final TextEditingController _settingTextController = TextEditingController(); + final TextEditingController _autoRecorderTextController = TextEditingController(); + final TextEditingController _consentTextController = TextEditingController(); + final TextEditingController _healthTextController = TextEditingController(); + + /// Data controller reference to initialize at startup. + late DataController _dataController; + + String? accessToken = ''; + + @override + void initState() { + super.initState(); + if (!mounted) return; + // Initialize Event Callbacks + AutoRecorderController.autoRecorderStream.listen(_onAutoRecorderEvent); + // Initialize a DataController + initDataController(); + } + + /// Prints the specified text on both the console and the specified text controller. + void log( + String methodName, + TextEditingController controller, + LogOptions logOption, { + String? result = '', + String? error = '', + }) { + String log = ''; + switch (logOption) { + case LogOptions.call: + log = '$methodName called'; + break; + case LogOptions.success: + log = '$methodName [Success: $result] '; + break; + case LogOptions.error: + log = '$methodName [Error: $error] [Error Description: ${HiHealthStatusCodes.getStatusCodeMessage(error ?? '')}]'; + break; + case LogOptions.custom: + log = methodName; // Custom text + break; + } + debugPrint(log); + setState(() { + controller.text = '$log\n${controller.text}'; + }); + } + + /// Authorizes Huawei Health Kit for the user, with defined scopes. + void signIn() async { + // List of scopes to ask for authorization. + // + // Note: These scopes should also be authorized on the Huawei Developer Console. + final List scopes = [ + Scope.HEALTHKIT_ACTIVITY_READ, + Scope.HEALTHKIT_ACTIVITY_WRITE, + Scope.HEALTHKIT_BLOODGLUCOSE_READ, + Scope.HEALTHKIT_BLOODGLUCOSE_WRITE, + Scope.HEALTHKIT_CALORIES_READ, + Scope.HEALTHKIT_CALORIES_WRITE, + Scope.HEALTHKIT_DISTANCE_READ, + Scope.HEALTHKIT_DISTANCE_WRITE, + Scope.HEALTHKIT_HEARTRATE_READ, + Scope.HEALTHKIT_HEARTRATE_WRITE, + Scope.HEALTHKIT_HEIGHTWEIGHT_READ, + Scope.HEALTHKIT_HEIGHTWEIGHT_WRITE, + Scope.HEALTHKIT_LOCATION_READ, + Scope.HEALTHKIT_LOCATION_WRITE, + Scope.HEALTHKIT_PULMONARY_READ, + Scope.HEALTHKIT_PULMONARY_WRITE, + Scope.HEALTHKIT_SLEEP_READ, + Scope.HEALTHKIT_SLEEP_WRITE, + Scope.HEALTHKIT_SPEED_READ, + Scope.HEALTHKIT_SPEED_WRITE, + Scope.HEALTHKIT_STEP_READ, + Scope.HEALTHKIT_STEP_WRITE, + Scope.HEALTHKIT_STRENGTH_READ, + Scope.HEALTHKIT_STRENGTH_WRITE, + Scope.HEALTHKIT_BODYFAT_READ, + Scope.HEALTHKIT_BODYFAT_WRITE, + Scope.HEALTHKIT_NUTRITION_READ, + Scope.HEALTHKIT_NUTRITION_WRITE, + Scope.HEALTHKIT_BLOODPRESSURE_READ, + Scope.HEALTHKIT_BLOODPRESSURE_WRITE, + Scope.HEALTHKIT_BODYTEMPERATURE_READ, + Scope.HEALTHKIT_BODYTEMPERATURE_WRITE, + Scope.HEALTHKIT_OXYGENSTATURATION_READ, + Scope.HEALTHKIT_OXYGENSTATURATION_WRITE, + Scope.HEALTHKIT_REPRODUCTIVE_READ, + Scope.HEALTHKIT_REPRODUCTIVE_WRITE, + Scope.HEALTHKIT_ACTIVITY_RECORD_READ, + Scope.HEALTHKIT_ACTIVITY_RECORD_WRITE, + Scope.HEALTHKIT_HEARTRATE_REALTIME, + Scope.HEALTHKIT_STEP_REALTIME, + Scope.HEALTHKIT_HEARTHEALTH_WRITE, + Scope.HEALTHKIT_HEARTHEALTH_READ, + Scope.HEALTHKIT_STRESS_WRITE, + Scope.HEALTHKIT_STRESS_READ, + Scope.HEALTHKIT_OXYGEN_SATURATION_WRITE, + Scope.HEALTHKIT_OXYGEN_SATURATION_READ, + Scope.HEALTHKIT_HISTORYDATA_OPEN_WEEK, + Scope.HEALTHKIT_HISTORYDATA_OPEN_MONTH, + Scope.HEALTHKIT_HISTORYDATA_OPEN_YEAR, + ]; + try { + AuthHuaweiId? result = await HealthAuth.signIn(scopes); + debugPrint( + 'Granted Scopes for User(${result?.displayName}): ${result?.grantedScopes?.toString()}', + ); + showSnackBar( + 'Authorization Success.', + color: Colors.green, + ); + setState(() => accessToken = result?.accessToken); + } on PlatformException catch (e) { + debugPrint('Error on authorization, Error:${e.toString()}'); + showSnackBar( + 'Error on authorization, Error:${e.toString()}, Error Description: ' + '${HiHealthStatusCodes.getStatusCodeMessage(e.message ?? '')}', + ); + } + } + + // ActivityRecordsController + // + /// Adds an ActivityRecord with an ActivitySummary, time range is 2 hours from now. + Future addActivityRecord() async { + log( + 'addActivityRecord', + _activityTextController, + LogOptions.call, + ); + DateTime startTime = DateTime.now().subtract(const Duration(hours: 2)); + DateTime endTime = DateTime.now(); + // Build an ActivityRecord object + ActivityRecord activityRecord = ActivityRecord( + startTime: startTime, + endTime: endTime, + id: 'ActivityRecordId0', + name: 'AddActivityRecord', + activityTypeId: HiHealthActivities.running, + description: 'This is a test for ActivityRecord', + activitySummary: ActivitySummary( + paceSummary: PaceSummary( + avgPace: 247.27626, + bestPace: 212.0, + britishPaceMap: { + '102802480': 365.0, + }, + britishPartTimeMap: { + '1.0': 263.0, + }, + partTimeMap: { + '1.0': 456.0, + }, + paceMap: { + '1.0': 263.0, + }, + ), + dataSummary: [ + SamplePoint( + dataType: DataType.DT_CONTINUOUS_DISTANCE_TOTAL, + startTime: startTime.add(Duration(seconds: 1)), + endTime: endTime.subtract(Duration(seconds: 1)), + fieldValueOptions: FieldFloat(Field.FIELD_DISTANCE, 400), + timeUnit: TimeUnit.MILLISECONDS, + ), + SamplePoint( + dataType: DataType.POLYMERIZE_CONTINUOUS_SPEED_STATISTICS, + fieldValueOptions: FieldFloat(Field.FIELD_AVG, 60.0), + startTime: startTime.add(Duration(seconds: 1)), + endTime: endTime.subtract(Duration(seconds: 1)), + timeUnit: TimeUnit.MILLISECONDS, + ) + ..setFieldValue(Field.FIELD_MIN, 40.0) + ..setFieldValue(Field.FIELD_MAX, 80.0), + ]), + ); + + // Build the dataCollector object + DataCollector dataCollector = DataCollector( + dataGenerateType: DataGenerateType.DATA_TYPE_RAW, + dataType: DataType.DT_INSTANTANEOUS_STEPS_RATE, + name: 'AddActivityRecord1923', + ); + + // You can use sampleSets to add more sample points to the sampling dataset. + // Build a list of sampling point objects and add it to the sampling dataSet + List samplePoints = [ + SamplePoint( + dataCollector: dataCollector, + startTime: startTime.add(Duration(seconds: 1)), + endTime: endTime.subtract(Duration(seconds: 1)), + fieldValueOptions: FieldFloat(Field.FIELD_STEP_RATE, 10.0), + timeUnit: TimeUnit.MILLISECONDS, + ), + ]; + SampleSet sampleSet = SampleSet( + dataCollector, + samplePoints, + ); + + try { + await ActivityRecordsController.addActivityRecord( + ActivityRecordInsertOptions( + activityRecord: activityRecord, + sampleSets: [ + sampleSet, + ], + ), + ); + log( + 'addActivityRecord', + _activityTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'addActivityRecord', + _activityTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Obtains saved ActivityRecords between yesterday and now, + /// with the DT_CONTINUOUS_STEPS_DELTA data type + void getActivityRecord() async { + log( + 'getActivityRecord', + _activityTextController, + LogOptions.call, + ); + // Create start time that will be used to read activity record. + DateTime startTime = DateTime.now().subtract(const Duration(days: 1)); + + // Create end time that will be used to read activity record. + DateTime endTime = DateTime.now().add(const Duration(hours: 3)); + + ActivityRecordReadOptions activityRecordReadOptions = ActivityRecordReadOptions( + activityRecordId: "ActivityRecordId0", + activityRecordName: null, + startTime: startTime, + endTime: endTime, + timeUnit: TimeUnit.MILLISECONDS, + dataType: DataType.DT_INSTANTANEOUS_STEPS_RATE, + ); + try { + List result = await ActivityRecordsController.getActivityRecord( + activityRecordReadOptions, + ); + log( + 'getActivityRecord', + _activityTextController, + LogOptions.success, + result: '[IDs: ${result.map((ActivityRecord e) => e.id).toList()}]', + ); + } on PlatformException catch (e) { + log( + 'getActivityRecord', + _activityTextController, + LogOptions.error, + result: e.message, + ); + } + } + + /// Starts the ActivityRecord with the id:`ActivityRecordRun1` + void beginActivityRecord() async { + try { + log( + 'beginActivityRecord', + _activityTextController, + LogOptions.call, + ); + // Build an ActivityRecord object + ActivityRecord activityRecord = ActivityRecord( + id: 'ActivityRecordRun0', + name: 'BeginActivityRecord', + description: 'This is ActivityRecord begin test!', + activityTypeId: HiHealthActivities.running, + startTime: DateTime.now().subtract(const Duration(hours: 1)), + ); + await ActivityRecordsController.beginActivityRecord( + activityRecord, + ); + log( + 'beginActivityRecord', + _activityTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'beginActivityRecord', + _activityTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Stops the ActivityRecord with the id:`ActivityRecordRun1` + void endActivityRecord() async { + try { + log( + 'endActivityRecord', + _activityTextController, + LogOptions.call, + ); + final List result = await ActivityRecordsController.endActivityRecord( + 'ActivityRecordRun0', + ); + // Return the list of activity records that have stopped + log( + 'endActivityRecord', + _activityTextController, + LogOptions.success, + result: result.toString(), + ); + } on PlatformException catch (e) { + log( + 'endActivityRecord', + _activityTextController, + LogOptions.error, + result: e.message, + ); + } + } + + /// Ends all the ongoing activity records. + /// + /// Result list will be null if there is no ongoing activity record. + void endAllActivityRecords() async { + try { + log( + 'endAllActivityRecords', + _activityTextController, + LogOptions.call, + ); + // Return the list of activity records that have stopped + List result = await ActivityRecordsController.endAllActivityRecords(); + log( + 'endAllActivityRecords', + _activityTextController, + LogOptions.success, + result: '[IDs: ${result.map((ActivityRecord e) => e.id).toList()}]', + ); + } on PlatformException catch (e) { + log( + 'endAllActivityRecords', + _activityTextController, + LogOptions.error, + result: e.message, + ); + } + } + + // + // + // End of ActivityRecordsController Methods + + // DataController Methods + // + // + /// Initializes a DataController instance with a list of HiHealtOptions. + void initDataController() async { + if (!mounted) return; + log( + 'init', + _dataTextController, + LogOptions.call, + ); + try { + _dataController = await DataController.init(); + log( + 'init', + _dataTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'init', + _dataTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Clears all the data inserted by the app. + void clearAll() async { + log('clearAll', _dataTextController, LogOptions.call); + try { + await _dataController.clearAll(); + log('clearAll', _dataTextController, LogOptions.success); + } on PlatformException catch (e) { + log('clearAll', _dataTextController, LogOptions.error, error: e.message); + } + } + + /// Deletes DT_CONTINUOUS_STEPS_DELTA type data by the specified time range. + void delete() async { + log( + 'delete', + _dataTextController, + LogOptions.call, + ); + // Build the dataCollector object + DataCollector dataCollector = DataCollector( + dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, + dataGenerateType: DataGenerateType.DATA_TYPE_RAW, + dataStreamName: 'STEPS_DELTA', + ); + + // Build the time range for the deletion: start time and end time. + DeleteOptions deleteOptions = DeleteOptions( + dataCollectors: [dataCollector], + startTime: DateTime.parse('2020-10-10 08:00:00'), + endTime: DateTime.parse('2020-10-10 12:30:00'), + ); + + // Call the api with the constructed DeleteOptions instance. + try { + _dataController.delete(deleteOptions); + log( + 'delete', + _dataTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'delete', + _dataTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Inserts a sampling set with the DT_CONTINUOUS_STEPS_DELTA data type at the + /// specified start and end dates. + void insert() async { + log( + 'insert', + _dataTextController, + LogOptions.call, + ); + // Build the dataCollector object + DataCollector dataCollector = DataCollector( + dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, + dataStreamName: 'STEPS_DELTA', + dataGenerateType: DataGenerateType.DATA_TYPE_RAW, + ); + // You can use sampleSets to add more sampling points to the sampling dataset. + SampleSet sampleSet = SampleSet( + dataCollector, + [ + SamplePoint( + dataCollector: dataCollector, + startTime: DateTime.parse('2020-10-10 12:00:00'), + endTime: DateTime.parse('2020-10-10 12:12:00'), + fieldValueOptions: FieldInt( + Field.FIELD_STEPS_DELTA, + 100, + ), + ), + ], + ); + // Call the api with the constructed sample set. + try { + _dataController.insert(sampleSet); + log( + 'insert', + _dataTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'insert', + _dataTextController, + LogOptions.error, + error: e.message, + ); + } + } + + // Reads the user data between the specified start and end dates. + void read() async { + log( + 'read', + _dataTextController, + LogOptions.call, + ); + // Build the dataCollector object + DataCollector dataCollector = DataCollector( + dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, + dataGenerateType: DataGenerateType.DATA_TYPE_RAW, + dataStreamName: 'STEPS_DELTA', + ); + + // Build the time range for the query: start time and end time. + ReadOptions readOptions = ReadOptions( + dataCollectors: [ + dataCollector, + ], + startTime: DateTime.parse('2020-10-10 12:00:00'), + endTime: DateTime.parse('2020-10-10 12:12:00'), + )..groupByTime(10000); + + // Call the api with the constructed ReadOptions instance. + try { + ReadReply? readReply = await _dataController.read(readOptions); + log( + 'read', + _dataTextController, + LogOptions.success, + result: readReply.toString(), + ); + } on PlatformException catch (e) { + log( + 'read', + _dataTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Reads the daily summation between the dates: `2020.10.02` to `2020.12.15` for multiple data types. + /// Note that the time format is different for this method. + void readDailySummationList() async { + log( + 'readDailySummationList', + _dataTextController, + LogOptions.call, + ); + try { + List? sampleSets = await _dataController.readDailySummationList( + [DataType.DT_CONTINUOUS_STEPS_DELTA, DataType.DT_CONTINUOUS_CALORIES_BURNT], + 20201002, + 20201003, + ); + log( + 'readDailySummationList', + _dataTextController, + LogOptions.success, + result: sampleSets.toString(), + ); + } on PlatformException catch (e) { + log( + 'readDailySummationList', + _dataTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Reads the steps summation for today. + void readTodaySummation() async { + log( + 'readTodaySummation', + _dataTextController, + LogOptions.call, + ); + try { + SampleSet? sampleSet = await _dataController.readTodaySummation( + DataType.DT_CONTINUOUS_STEPS_DELTA, + ); + log( + 'readTodaySummation', + _dataTextController, + LogOptions.success, + result: sampleSet.toString(), + ); + } on PlatformException catch (e) { + log( + 'readTodaySummation', + _dataTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Updates DT_CONTINUOUS_STEPS_DELTA for the specified dates. + void update() async { + log( + 'update', + _dataTextController, + LogOptions.call, + ); + + // Build the dataCollector object + DataCollector dataCollector = DataCollector( + dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, + dataStreamName: 'STEPS_DELTA', + dataGenerateType: DataGenerateType.DATA_TYPE_RAW, + ); + + // You can use sampleSets to add more sampling points to the sampling dataset. + SampleSet sampleSet = SampleSet( + dataCollector, + [ + SamplePoint( + dataCollector: dataCollector, + startTime: DateTime.parse('2020-12-12 09:00:00'), + endTime: DateTime.parse('2020-12-12 09:05:00'), + fieldValueOptions: FieldInt( + Field.FIELD_STEPS_DELTA, + 120, + ), + ), + ], + ); + + // Build a parameter object for the update. + // Note: (1) The start time of the modified object updateOptions can not be greater than the minimum + // value of the start time of all sample data points in the modified data sample set + // (2) The end time of the modified object updateOptions can not be less than the maximum value of the + // end time of all sample data points in the modified data sample set + UpdateOptions updateOptions = UpdateOptions( + startTime: DateTime.parse('2020-12-12 08:00:00'), + endTime: DateTime.parse('2020-12-12 09:25:00'), + sampleSet: sampleSet, + ); + try { + await _dataController.update(updateOptions); + log( + 'update', + _dataTextController, + LogOptions.success, + result: sampleSet.toString(), + ); + } on PlatformException catch (e) { + log( + 'update', + _dataTextController, + LogOptions.error, + error: e.message, + ); + } + } + + // + // + // End of DataController Methods + + // SettingController Methods + // + /// Adds a custom DataType with the FIELD_ALTITUDE. + void addDataType() async { + log( + 'addDataType', + _settingTextController, + LogOptions.call, + ); + try { + // The name of the created data type must be prefixed with the package name + // of the app. Otherwise, the creation fails. If the same data type is tried to + // be added again an exception will be thrown. + DataTypeAddOptions options = DataTypeAddOptions( + '$packageName.myCustomDataType', + [ + const Field.newIntField('myIntField'), + Field.FIELD_ALTITUDE, + ], + ); + final DataType dataTypeResult = await SettingController.addDataType( + options, + ); + log( + 'addDataType', + _settingTextController, + LogOptions.success, + result: dataTypeResult.toString(), + ); + } on PlatformException catch (e) { + log( + 'addDataType', + _settingTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Reads the inserted data type on the [addDataType] method. + void readDataType() async { + log( + 'readDataType', + _settingTextController, + LogOptions.call, + ); + try { + final DataType dataTypeResult = await SettingController.readDataType( + '$packageName.myCustomDataType', + ); + log( + 'readDataType', + _settingTextController, + LogOptions.success, + result: dataTypeResult.toString(), + ); + } on PlatformException catch (e) { + log( + 'readDataType', + _settingTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Disables the Health Kit function, cancels user authorization, and cancels + /// all data records. (The task takes effect in 24 hours.) + void disableHiHealth() async { + log( + 'disableHiHealth', + _settingTextController, + LogOptions.call, + ); + try { + await SettingController.disableHiHealth(); + log( + 'disableHiHealth', + _settingTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'disableHiHealth', + _settingTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Checks the user privacy authorization to Health Kit. Redirects the user to + /// the Authorization screen if the permissions are not given. + void checkHealthAppAuthorization() async { + log( + 'checkHealthAppAuthorization', + _settingTextController, + LogOptions.call, + ); + try { + await SettingController.checkHealthAppAuthorization(); + log( + 'checkHealthAppAuthorization', + _settingTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'checkHealthAppAuthorization', + _settingTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Checks the user privacy authorization to Health Kit. If authorized `true` + /// value would be returned. + void getHealthAppAuthorization() async { + log( + 'getHealthAppAuthorization', + _settingTextController, + LogOptions.call, + ); + try { + final bool result = await SettingController.getHealthAppAuthorization(); + log( + 'getHealthAppAuthorization', + _settingTextController, + LogOptions.success, + result: result.toString(), + ); + } on PlatformException catch (e) { + log( + 'getHealthAppAuthorization', + _settingTextController, + LogOptions.error, + error: e.message, + ); + } + } + + void requestAuth() async { + final HealthKitAuthResult res = await SettingController.requestAuthorizationIntent( + [ + Scope.HEALTHKIT_STEP_READ, + Scope.HEALTHKIT_STEP_WRITE, + Scope.HEALTHKIT_HEIGHTWEIGHT_READ, + Scope.HEALTHKIT_HEIGHTWEIGHT_WRITE, + Scope.HEALTHKIT_HEARTRATE_READ, + Scope.HEALTHKIT_HEARTRATE_WRITE, + Scope.HEALTHKIT_ACTIVITY_RECORD_READ, + Scope.HEALTHKIT_ACTIVITY_RECORD_WRITE, + Scope.HEALTHKIT_HEARTHEALTH_READ, + Scope.HEALTHKIT_HEARTHEALTH_WRITE, + ], + true, + ); + debugPrint(res.authAccount?.accessToken); + } + + // + // + // End of SettingController Methods + + // AutoRecorderController Methods + // + // + // Callback function for AutoRecorderStream event. + void _onAutoRecorderEvent(SamplePoint? res) { + log( + '[AutoRecorderEvent] obtained, SamplePoint Field Value is ${res?.fieldValues?.toString()}', + _autoRecorderTextController, + LogOptions.custom, + ); + } + + /// Starts an Android Foreground Service to count the steps of the user. + /// The steps will be emitted to the AutoRecorderStream. + void startRecord() async { + log( + 'startRecord', + _autoRecorderTextController, + LogOptions.call, + ); + try { + await AutoRecorderController.startRecord( + DataType.DT_CONTINUOUS_STEPS_TOTAL, + NotificationProperties( + title: 'HMS Flutter Health Demo', + text: 'Counting steps', + subText: 'this is a subtext', + ticker: 'this is a ticker', + showChronometer: true, + ), + ); + log( + 'startRecord', + _autoRecorderTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'startRecord', + _autoRecorderTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Ends the Foreground service and stops the step count events. + void stopRecord() async { + log( + 'endRecord', + _autoRecorderTextController, + LogOptions.call, + ); + try { + await AutoRecorderController.stopRecord( + DataType.DT_CONTINUOUS_STEPS_TOTAL, + ); + log( + 'endRecord', + _autoRecorderTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'endRecord', + _autoRecorderTextController, + LogOptions.error, + error: e.message, + ); + } + } + + // + // + // End of AutoRecorderController Methods + + // ConsentController Methods + // + /// Obtains the application id from the agconnect-services.json file. + void getAppId() async { + log( + 'getAppId', + _consentTextController, + LogOptions.call, + ); + try { + final String appId = await ConsentsController.getAppId(); + log( + 'getAppId', + _consentTextController, + LogOptions.success, + result: appId, + ); + } on PlatformException catch (e) { + log( + 'getAppId', + _consentTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Gets the granted permission scopes for the app. + void getScopes() async { + log( + 'getScopes', + _consentTextController, + LogOptions.call, + ); + try { + final String appId = await ConsentsController.getAppId(); + final ScopeLangItem scopeLangItem = await ConsentsController.getScopes( + 'en-gb', + appId, + ); + log( + 'getScopes', + _consentTextController, + LogOptions.success, + result: scopeLangItem.toString(), + ); + } on PlatformException catch (e) { + log( + 'getScopes', + _consentTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Revokes all the permissions that authorized for this app. + void revoke() async { + log( + 'revoke', + _consentTextController, + LogOptions.call, + ); + try { + final String appId = await ConsentsController.getAppId(); + await ConsentsController.revoke(appId); + log( + 'revoke', + _consentTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'revoke', + _consentTextController, + LogOptions.error, + error: e.message, + ); + } + } + + /// Revokes the distance read/write permissions for the app. + void revokeWithScopes() async { + log( + 'revokeWithScopes', + _consentTextController, + LogOptions.call, + ); + try { + // Obtain the application id. + final String appId = await ConsentsController.getAppId(); + // Call the revokeWithScopes method with desired scopes. + await ConsentsController.revokeWithScopes( + appId, + [ + Scope.HEALTHKIT_DISTANCE_WRITE, + Scope.HEALTHKIT_DISTANCE_READ, + ], + ); + log( + 'revokeWithScopes', + _consentTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'revokeWithScopes', + _consentTextController, + LogOptions.error, + error: e.message, + ); + } + } + + // + // + // End of ConsentController Methods + + // HealthController Methods + // + void addHealthRecord() async { + log( + 'addHealthRecord', + _healthTextController, + LogOptions.call, + ); + try { + final DateTime startTime = DateTime(2023, 5, 11); + final DateTime endTime = DateTime(2023, 5, 13); + + DataCollector contDataCollector = DataCollector( + dataStreamName: 'contDataCollector', + packageName: packageName, + dataType: DataType.POLYMERIZE_CONTINUOUS_HEART_RATE_STATISTICS, + dataGenerateType: DataGenerateType.DATA_TYPE_RAW, + ); + + DataCollector instDataCollector = DataCollector( + dataStreamName: 'instDataCollector', + packageName: packageName, + dataType: DataType.DT_INSTANTANEOUS_HEART_RATE, + dataGenerateType: DataGenerateType.DATA_TYPE_RAW, + ); + + List subDataDetails = [ + SampleSet(instDataCollector, [ + SamplePoint( + dataCollector: instDataCollector, + ) + ..setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS) + ..setFieldValue(Field.FIELD_BPM, 88.0) + ]) + ]; + + List subDataSummary = [ + SamplePoint( + dataCollector: contDataCollector, + ) + ..setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS) + ..setFieldValue(Field.FIELD_AVG, 90.0) + ..setFieldValue(Field.FIELD_MAX, 100.0) + ..setFieldValue(Field.FIELD_MIN, 80.0) + ..setFieldValue(Field.LAST, 85.0) + ]; + + final HealthRecord healthRecord = HealthRecord( + startTime: startTime, + endTime: endTime, + metadata: 'Data', + dataCollector: DataCollector( + dataStreamName: 'such as step count', + packageName: packageName, + dataType: HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA, + dataGenerateType: DataGenerateType.DATA_TYPE_RAW, + ), + ) + ..setSubDataSummary(subDataSummary) + ..setSubDataDetails(subDataDetails) + ..setFieldValue(HealthFields.FIELD_THRESHOLD, 42.0) + ..setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 48.0) + ..setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 42.0) + ..setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 45.0); + + final String? result = await HealthRecordController.addHealthRecord( + HealthRecordInsertOptions( + healthRecord: healthRecord, + ), + ); + log( + 'addHealthRecord', + _healthTextController, + LogOptions.success, + result: result.toString(), + ); + } on PlatformException catch (e) { + log( + 'addHealthRecord', + _healthTextController, + LogOptions.error, + error: e.message, + ); + } + } + + void getHealthRecord() async { + log( + 'getHealthRecord', + _healthTextController, + LogOptions.call, + ); + try { + final DateTime startTime = DateTime(2023, 5, 11); + final DateTime endTime = DateTime(2023, 5, 13); + + HealthRecordReply result = await HealthRecordController.getHealthRecord( + HealthRecordReadOptions( + packageName: packageName, + ) + ..setSubDataTypeList( + [ + DataType.DT_INSTANTANEOUS_HEART_RATE, + ], + ) + ..setTimeInterval( + startTime, + endTime, + TimeUnit.MILLISECONDS, + ) + ..readByDataType( + HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA, + ) + ..readHealthRecordsFromAllApps(), + ); + log( + 'getHealthRecord', + _healthTextController, + LogOptions.success, + result: result.healthRecords[0].toJson(), + ); + } on PlatformException catch (e) { + log( + 'getHealthRecord', + _healthTextController, + LogOptions.error, + error: e.message, + ); + } + } + + void updateHealthRecord() async { + log( + 'updateHealthRecord', + _healthTextController, + LogOptions.call, + ); + try { + final DateTime startTime = DateTime(2022, 10, 11); + final DateTime endTime = DateTime(2022, 10, 12); + final HealthRecord healthRecord = HealthRecord( + startTime: startTime, + endTime: endTime, + metadata: 'Data', + dataCollector: DataCollector( + dataStreamName: 'such as step count', + packageName: packageName, + dataType: HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA, + dataGenerateType: DataGenerateType.DATA_TYPE_RAW, + ), + ) + ..setFieldValue(HealthFields.FIELD_THRESHOLD, 41.9) + ..setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 49.1) + ..setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 41.1) + ..setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 45.1); + await HealthRecordController.updateHealthRecord( + HealthRecordUpdateOptions( + healthRecord: healthRecord, + healthRecordId: '', + ), + ); + log( + 'updateHealthRecord', + _healthTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'updateHealthRecord', + _healthTextController, + LogOptions.error, + error: e.message, + ); + } + } + + void deleteHealthRecord() async { + log( + 'deleteHealthRecord', + _healthTextController, + LogOptions.call, + ); + try { + await HealthRecordController.deleteHealthRecord( + HealthRecordDeleteOptions( + startTime: DateTime.now().subtract(const Duration(days: 14)), + endTime: DateTime.now(), + )..setHealthRecordIds( + [ + '', + ], + ), + ); + log( + 'deleteHealthRecord', + _healthTextController, + LogOptions.success, + ); + } on PlatformException catch (e) { + log( + 'deleteHealthRecord', + _healthTextController, + LogOptions.error, + error: e.message, + ); + } + } + + // + // + // End of HealthController Methods + + // App's widgets. + // + // + Widget expansionCard({ + required String titleText, + required List children, + }) { + return Card( + margin: componentPadding, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + child: ExpansionTile( + title: Text( + titleText, + style: cardTitleTextStyle, + ), + children: children, + ), + ); + } + + Widget loggingArea( + TextEditingController moduleTextController, + ) { + return Column( + children: [ + Container( + margin: componentPadding, + padding: const EdgeInsets.all(8.0), + height: 200, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(5.0), + border: Border.all(color: Colors.black12), + ), + child: TextField( + readOnly: true, + maxLines: 15, + controller: moduleTextController, + decoration: const InputDecoration( + enabledBorder: InputBorder.none, + ), + ), + ), + TextButton( + child: const Text('Clear Log'), + onPressed: () => setState(() { + moduleTextController.text = ''; + }), + ) + ], + ); + } + + void showSnackBar( + String text, { + Color color = Colors.blue, + }) { + final SnackBar snackBar = SnackBar( + content: Text(text), + backgroundColor: color, + action: SnackBarAction( + label: 'Close', + textColor: Colors.white, + onPressed: () { + ScaffoldMessenger.of(context).removeCurrentSnackBar(); + }, + ), + ); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.white, + title: const Text( + 'Huawei Health Kit', + style: TextStyle( + color: Colors.blue, + fontWeight: FontWeight.bold, + ), + ), + centerTitle: true, + elevation: 0.0, + actions: [ + IconButton( + onPressed: requestAuth, + icon: const Icon(Icons.ac_unit), + ), + ], + ), + body: Builder( + builder: (BuildContext context) { + return ListView( + physics: const BouncingScrollPhysics( + parent: AlwaysScrollableScrollPhysics(), + ), + children: [ + // Sign In Widgets + Card( + margin: componentPadding, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Padding( + padding: componentPadding, + child: Text( + 'Tap to SignIn button to obtain the HMS Account to complete ' + 'login and authorization, and then use other buttons ' + 'to try the related API functions.', + textAlign: TextAlign.center, + ), + ), + const Padding( + padding: componentPadding, + child: Text( + 'Note: If the login page is not displayed, change the package ' + 'name, AppID, and configure the signature file by referring ' + 'to the developer guide on the official website.', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.blue, + ), + ), + ), + Container( + padding: componentPadding, + width: double.infinity, + child: OutlinedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Colors.blue, + ), + ), + child: const Text( + 'SignIn', + style: TextStyle( + color: Colors.white, + ), + ), + onPressed: () => signIn(), + ), + ), + ], + ), + ), + + // ActivityRecordsController + expansionCard( + titleText: 'ActivityRecords Controller', + children: [ + loggingArea(_activityTextController), + ListTile( + title: const Text('AddActivityRecord'), + onTap: () => addActivityRecord(), + ), + ListTile( + title: const Text('GetActivityRecord'), + onTap: () => getActivityRecord(), + ), + ListTile( + title: const Text('beginActivityRecord'), + onTap: () => beginActivityRecord(), + ), + ListTile( + title: const Text('endActivityRecord'), + onTap: () => endActivityRecord(), + ), + ListTile( + title: const Text('endAllActivityRecords'), + onTap: () => endAllActivityRecords(), + ), + ], + ), + // DataController Widgets + expansionCard( + titleText: 'DataController', + children: [ + loggingArea(_dataTextController), + ListTile( + title: const Text('readTodaySummation'), + onTap: () => readTodaySummation(), + ), + ListTile( + title: const Text('readDailySummationList'), + onTap: () => readDailySummationList(), + ), + ListTile( + title: const Text('insert'), + onTap: () => insert(), + ), + ListTile( + title: const Text('read'), + onTap: () => read(), + ), + ListTile( + title: const Text('update'), + onTap: () => update(), + ), + ListTile( + title: const Text('delete'), + onTap: () => delete(), + ), + ListTile( + title: const Text('clearAll'), + onTap: () => clearAll(), + ), + ], + ), + // SettingController Widgets. + expansionCard( + titleText: 'SettingController', + children: [ + loggingArea(_settingTextController), + ListTile( + title: const Text('addDataType'), + onTap: () => addDataType(), + ), + ListTile( + title: const Text('readDataType'), + onTap: () => readDataType(), + ), + ListTile( + title: const Text('disableHiHealth'), + onTap: () => disableHiHealth(), + ), + ListTile( + title: const Text('checkHealthAppAuthorization'), + onTap: () => checkHealthAppAuthorization(), + ), + ListTile( + title: const Text('getHealthAppAuthorization'), + onTap: () => getHealthAppAuthorization(), + ), + ], + ), + // AutoRecorderController Widgets + expansionCard( + titleText: 'AutoRecorderController', + children: [ + loggingArea(_autoRecorderTextController), + ListTile( + title: const Text('startRecord'), + onTap: () => startRecord(), + ), + ListTile( + title: const Text('stopRecord'), + onTap: () => stopRecord(), + ), + ], + ), + // Consent Controller Widgets + expansionCard( + titleText: 'ConsentController', + children: [ + loggingArea(_consentTextController), + ListTile( + title: const Text('getAppId'), + onTap: () => getAppId(), + ), + ListTile( + title: const Text('getScopes'), + onTap: () => getScopes(), + ), + ListTile( + title: const Text('revoke'), + onTap: () => revoke(), + ), + ListTile( + title: const Text('revokeWithScopes'), + onTap: () => revokeWithScopes(), + ), + ], + ), + + // Health Controller Widgets + expansionCard( + titleText: 'HealthController', + children: [ + loggingArea(_healthTextController), + ListTile( + title: const Text('addHealthRecord'), + onTap: () => addHealthRecord(), + ), + ListTile( + title: const Text('getHealthRecord'), + onTap: () => getHealthRecord(), + ), + ListTile( + title: const Text('updateHealthRecord'), + onTap: () => updateHealthRecord(), + ), + ListTile( + title: const Text('deleteHealthRecord'), + onTap: () => deleteHealthRecord(), + ), + ], + ), + ], + ); + }, + ), + ); + } +} + +/// Options for logging. +enum LogOptions { + call, + success, + error, + custom, +} diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index f356310..61f0af2 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -9,6 +9,7 @@ import 'package:hmg_patient_app_new/presentation/e_referral/new_e_referral.dart' import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; +import 'package:hmg_patient_app_new/presentation/smartwatches/huawei_health_example.dart'; import 'package:hmg_patient_app_new/presentation/smartwatches/smartwatch_instructions_page.dart'; import 'package:hmg_patient_app_new/presentation/symptoms_checker/organ_selector_screen.dart'; import 'package:hmg_patient_app_new/presentation/symptoms_checker/possible_conditions_screen.dart'; @@ -34,6 +35,7 @@ class AppRoutes { static const String zoomCallPage = '/zoomCallPage'; static const String bloodDonationPage = '/bloodDonationPage'; static const String smartWatches = '/smartWatches'; + static const String huaweiHealthExample = '/huaweiHealthExample'; //appointments static const String bookAppointmentPage = '/bookAppointmentPage'; @@ -72,6 +74,7 @@ class AppRoutes { userInfoSelection: (context) => UserInfoSelectionScreen(), userInfoFlowManager: (context) => UserInfoFlowManager(), smartWatches: (context) => SmartwatchInstructionsPage(), + huaweiHealthExample: (context) => HuaweiHealthExample(), // }; diff --git a/pubspec.yaml b/pubspec.yaml index ecfc5ef..5590c9e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -86,6 +86,7 @@ dependencies: location: ^8.0.1 gms_check: ^1.0.4 huawei_location: ^6.14.2+301 + huawei_health: ^6.16.0+300 intl: ^0.20.2 flutter_widget_from_html: ^0.17.1 huawei_map: From 335e6a6649b5acdfd1128d2e01503f246ab4c005 Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Mon, 15 Dec 2025 10:00:47 +0300 Subject: [PATCH 21/55] Health Calculators --- assets/images/svg/activity.svg | 6 + assets/images/svg/age_icon.svg | 9 + assets/images/svg/bmi.svg | 5 + assets/images/svg/bmr.svg | 4 + assets/images/svg/calories.svg | 4 + assets/images/svg/gender_icon.svg | 4 + assets/images/svg/general_health.svg | 5 + assets/images/svg/height.svg | 4 + assets/images/svg/ibw.svg | 5 + assets/images/svg/trade_down_red.svg | 3 + assets/images/svg/trade_down_yellow.svg | 3 + assets/images/svg/weight.svg | 4 + assets/images/svg/women_health.svg | 4 + lib/core/app_assets.dart | 14 + lib/core/dependencies.dart | 35 +- lib/core/enums.dart | 46 +- lib/core/utils/calender_utils_new.dart | 3 +- lib/main.dart | 4 + .../health_calculator_detailed_page.dart | 142 ++++ .../health_calculator_result.dart | 428 ++++++++++++ .../health_calculator_view_model.dart | 657 ++++++++++++++++++ .../health_calculators_page.dart | 170 +++++ .../health_calculators/widgets/bf.dart | 642 +++++++++++++++++ .../health_calculators/widgets/bmi.dart | 309 ++++++++ .../health_calculators/widgets/bmr.dart | 523 ++++++++++++++ .../health_calculators/widgets/calories.dart | 524 ++++++++++++++ .../health_calculators/widgets/crabs.dart | 198 ++++++ .../health_calculators/widgets/dduedate.dart | 72 ++ .../widgets/health_card.dart | 57 ++ .../health_calculators/widgets/ibw.dart | 393 +++++++++++ .../health_calculators/widgets/ovulation.dart | 186 +++++ .../hmg_services/services_page.dart | 14 +- .../hmg_services/services_view.dart | 2 +- lib/routes/app_routes.dart | 6 +- lib/widgets/input_widget.dart | 3 + 35 files changed, 4455 insertions(+), 33 deletions(-) create mode 100644 assets/images/svg/activity.svg create mode 100644 assets/images/svg/age_icon.svg create mode 100644 assets/images/svg/bmi.svg create mode 100644 assets/images/svg/bmr.svg create mode 100644 assets/images/svg/calories.svg create mode 100644 assets/images/svg/gender_icon.svg create mode 100644 assets/images/svg/general_health.svg create mode 100644 assets/images/svg/height.svg create mode 100644 assets/images/svg/ibw.svg create mode 100644 assets/images/svg/trade_down_red.svg create mode 100644 assets/images/svg/trade_down_yellow.svg create mode 100644 assets/images/svg/weight.svg create mode 100644 assets/images/svg/women_health.svg create mode 100644 lib/presentation/health_calculators/health_calculator_detailed_page.dart create mode 100644 lib/presentation/health_calculators/health_calculator_result.dart create mode 100644 lib/presentation/health_calculators/health_calculator_view_model.dart create mode 100644 lib/presentation/health_calculators/health_calculators_page.dart create mode 100644 lib/presentation/health_calculators/widgets/bf.dart create mode 100644 lib/presentation/health_calculators/widgets/bmi.dart create mode 100644 lib/presentation/health_calculators/widgets/bmr.dart create mode 100644 lib/presentation/health_calculators/widgets/calories.dart create mode 100644 lib/presentation/health_calculators/widgets/crabs.dart create mode 100644 lib/presentation/health_calculators/widgets/dduedate.dart create mode 100644 lib/presentation/health_calculators/widgets/health_card.dart create mode 100644 lib/presentation/health_calculators/widgets/ibw.dart create mode 100644 lib/presentation/health_calculators/widgets/ovulation.dart diff --git a/assets/images/svg/activity.svg b/assets/images/svg/activity.svg new file mode 100644 index 0000000..7e1c342 --- /dev/null +++ b/assets/images/svg/activity.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/age_icon.svg b/assets/images/svg/age_icon.svg new file mode 100644 index 0000000..8acfad3 --- /dev/null +++ b/assets/images/svg/age_icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/bmi.svg b/assets/images/svg/bmi.svg new file mode 100644 index 0000000..7ee99db --- /dev/null +++ b/assets/images/svg/bmi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/bmr.svg b/assets/images/svg/bmr.svg new file mode 100644 index 0000000..6b797e4 --- /dev/null +++ b/assets/images/svg/bmr.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/calories.svg b/assets/images/svg/calories.svg new file mode 100644 index 0000000..9f8d2b5 --- /dev/null +++ b/assets/images/svg/calories.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/gender_icon.svg b/assets/images/svg/gender_icon.svg new file mode 100644 index 0000000..4573125 --- /dev/null +++ b/assets/images/svg/gender_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/general_health.svg b/assets/images/svg/general_health.svg new file mode 100644 index 0000000..0102df1 --- /dev/null +++ b/assets/images/svg/general_health.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/height.svg b/assets/images/svg/height.svg new file mode 100644 index 0000000..f275d34 --- /dev/null +++ b/assets/images/svg/height.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/ibw.svg b/assets/images/svg/ibw.svg new file mode 100644 index 0000000..2f11ca4 --- /dev/null +++ b/assets/images/svg/ibw.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/trade_down_red.svg b/assets/images/svg/trade_down_red.svg new file mode 100644 index 0000000..7c77c8e --- /dev/null +++ b/assets/images/svg/trade_down_red.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/trade_down_yellow.svg b/assets/images/svg/trade_down_yellow.svg new file mode 100644 index 0000000..93c6805 --- /dev/null +++ b/assets/images/svg/trade_down_yellow.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/weight.svg b/assets/images/svg/weight.svg new file mode 100644 index 0000000..6c42c17 --- /dev/null +++ b/assets/images/svg/weight.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/women_health.svg b/assets/images/svg/women_health.svg new file mode 100644 index 0000000..5eca669 --- /dev/null +++ b/assets/images/svg/women_health.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index f3ff8fd..c9aabc6 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -178,7 +178,21 @@ class AppAssets { static const String doctor_profile_rating_icon = '$svgBasePath/doctor_profile_rating_icon.svg'; static const String doctor_profile_reviews_icon = '$svgBasePath/doctor_profile_reviews_icon.svg'; static const String waiting_appointment_icon = '$svgBasePath/waitingAppo.svg'; + static const String bmi = '$svgBasePath/bmi.svg'; + static const String bmr = '$svgBasePath/bmr.svg'; + static const String calories = '$svgBasePath/calories.svg'; + static const String ibw = '$svgBasePath/ibw.svg'; + static const String general_health = '$svgBasePath/general_health.svg'; + static const String women_health = '$svgBasePath/women_health.svg'; + static const String height = '$svgBasePath/height.svg'; + static const String weight = '$svgBasePath/weight.svg'; + static const String activity = '$svgBasePath/activity.svg'; + static const String age = '$svgBasePath/age_icon.svg'; + static const String gender = '$svgBasePath/gender_icon.svg'; + + static const String trade_down_yellow = '$svgBasePath/trade_down_yellow.svg'; + static const String trade_down_red = '$svgBasePath/trade_down_red.svg'; //bottom navigation// static const String homeBottom = '$svgBasePath/home_bottom.svg'; diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index 30b4ab7..753ab11 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -39,6 +39,7 @@ import 'package:hmg_patient_app_new/features/radiology/radiology_repo.dart'; import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; @@ -123,19 +124,14 @@ class AppDependencies { getIt.registerLazySingleton(() => LabViewModel(labRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt())); getIt.registerLazySingleton( - () => RadiologyViewModel( - radiologyRepo: getIt(), - errorHandlerService: getIt(), - navigationService: getIt() - ), + () => RadiologyViewModel(radiologyRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()), ); getIt.registerLazySingleton(() => PrescriptionsViewModel(prescriptionsRepo: getIt(), errorHandlerService: getIt(), navServices: getIt())); getIt.registerLazySingleton(() => InsuranceViewModel(insuranceRepo: getIt(), errorHandlerService: getIt())); - getIt.registerLazySingleton( - () => MyAppointmentsViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); + getIt.registerLazySingleton(() => MyAppointmentsViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); getIt.registerLazySingleton( () => PayfortViewModel( @@ -160,12 +156,7 @@ class AppDependencies { getIt.registerLazySingleton( () => BookAppointmentsViewModel( - bookAppointmentsRepo: getIt(), - errorHandlerService: getIt(), - navigationService: getIt(), - myAppointmentsViewModel: getIt(), - locationUtils: getIt(), - dialogService: getIt()), + bookAppointmentsRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt(), myAppointmentsViewModel: getIt(), locationUtils: getIt(), dialogService: getIt()), ); getIt.registerLazySingleton( @@ -179,13 +170,7 @@ class AppDependencies { getIt.registerLazySingleton( () => AuthenticationViewModel( - authenticationRepo: getIt(), - cacheService: getIt(), - navigationService: getIt(), - dialogService: getIt(), - appState: getIt(), - errorHandlerService: getIt(), - localAuthService: getIt()), + authenticationRepo: getIt(), cacheService: getIt(), navigationService: getIt(), dialogService: getIt(), appState: getIt(), errorHandlerService: getIt(), localAuthService: getIt()), ); getIt.registerLazySingleton(() => ProfileSettingsViewModel()); @@ -199,13 +184,7 @@ class AppDependencies { getIt.registerLazySingleton( () => EmergencyServicesViewModel( - locationUtils: getIt(), - navServices: getIt(), - emergencyServicesRepo: getIt(), - appState: getIt(), - errorHandlerService: getIt(), - appointmentRepo: getIt(), - dialogService: getIt()), + locationUtils: getIt(), navServices: getIt(), emergencyServicesRepo: getIt(), appState: getIt(), errorHandlerService: getIt(), appointmentRepo: getIt(), dialogService: getIt()), ); getIt.registerLazySingleton( @@ -216,6 +195,8 @@ class AppDependencies { () => ContactUsViewModel(contactUsRepo: getIt(), appState: getIt(), errorHandlerService: getIt()), ); + getIt.registerLazySingleton(() => HealthCalcualtorViewModel()); + getIt.registerLazySingleton( () => TodoSectionViewModel(todoSectionRepo: getIt(), errorHandlerService: getIt()), ); diff --git a/lib/core/enums.dart b/lib/core/enums.dart index 4151bed..47be218 100644 --- a/lib/core/enums.dart +++ b/lib/core/enums.dart @@ -32,6 +32,50 @@ enum AppEnvironmentTypeEnum { dev, uat, preProd, qa, staging, prod } enum FamilyFileEnum { active, inactive, blocked, deleted, pending, rejected } +enum HealthCalculatorEnum { general, women } + +enum HealthCalculatorsTypeEnum { bmi, calories, bmr, idealBodyWeight, bodyFat, crabsProteinFat, ovulation, deliveryDueDate } + +extension HealthCalculatorExtenshion on HealthCalculatorsTypeEnum { + String get displayName { + AppState appState = getIt.get(); + bool isArabic = appState.getLanguageID() == 1 ? true : false; + switch (this) { + case HealthCalculatorsTypeEnum.bmi: + return isArabic ? "حاسبة مؤشر كتلة الجسم" : "BMI Calculator"; + case HealthCalculatorsTypeEnum.calories: + return isArabic ? "حاسبة السعرات الحرارية" : "Calories Calculator"; + case HealthCalculatorsTypeEnum.bmr: + return isArabic ? "حاسبة معدل الأيض الأساسي" : "BMR Calculator"; + case HealthCalculatorsTypeEnum.idealBodyWeight: + return isArabic ? "الوزن المثالي للجسم" : "Ideal Body Weight Calculator"; + case HealthCalculatorsTypeEnum.bodyFat: + return isArabic ? "حاسبة الدهون في الجسم" : "Body Fat Calculator"; + case HealthCalculatorsTypeEnum.crabsProteinFat: + return isArabic ? "حاسبة البروتين والدهون في سرطان البحر" : "Crabs Protein & Fat Calculator"; + case HealthCalculatorsTypeEnum.ovulation: + return isArabic ? "فترة الإباضة" : "Ovulation Period"; + case HealthCalculatorsTypeEnum.deliveryDueDate: + return isArabic ? "تاريخ استحقاق التسليم" : "Delivery Due Date"; + } + } + + static LoginTypeEnum? fromValue(int value) { + switch (value) { + case 1: + return LoginTypeEnum.sms; + case 2: + return LoginTypeEnum.fingerprint; + case 3: + return LoginTypeEnum.face; + case 4: + return LoginTypeEnum.whatsapp; + default: + return null; + } + } +} + extension CalenderExtension on CalenderEnum { int get toInt { switch (this) { @@ -172,7 +216,7 @@ extension FamilyFileEnumExtenshion on FamilyFileEnum { return isArabic ? 'محذوف' : 'Deleted'; case FamilyFileEnum.pending: return isArabic ? 'قيد الانتظار' : 'Pending'; - case FamilyFileEnum.rejected: + case FamilyFileEnum.rejected: return isArabic ? 'مرفوض' : 'Rejected'; } } diff --git a/lib/core/utils/calender_utils_new.dart b/lib/core/utils/calender_utils_new.dart index 05448b1..7455273 100644 --- a/lib/core/utils/calender_utils_new.dart +++ b/lib/core/utils/calender_utils_new.dart @@ -43,7 +43,8 @@ class CalenderUtilsNew { description: description, startDate: scheduleDateTime!, endDate: scheduleDateTime!.add(Duration(minutes: 30)), - reminderMinutes: reminderMinutes); + // reminderMinutes: reminderMinutes + ); return eventResult.isNotEmpty; // } diff --git a/lib/main.dart b/lib/main.dart index 1af80b6..23ccfae 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -28,6 +28,7 @@ import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_mo import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart'; import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/routes/app_routes.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; @@ -145,6 +146,9 @@ void main() async { ), ChangeNotifierProvider( create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), ) ], child: MyApp()), ), diff --git a/lib/presentation/health_calculators/health_calculator_detailed_page.dart b/lib/presentation/health_calculators/health_calculator_detailed_page.dart new file mode 100644 index 0000000..ae7d46b --- /dev/null +++ b/lib/presentation/health_calculators/health_calculator_detailed_page.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.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/presentation/health_calculators/health_calculator_result.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/bf.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/bmi.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/bmr.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/calories.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/crabs.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/dduedate.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/ibw.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/ovulation.dart'; +import 'package:hmg_patient_app_new/services/dialog_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/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; + +class HealthCalculatorDetailedPage extends StatefulWidget { + HealthCalculatorsTypeEnum calculatorType; + + HealthCalculatorDetailedPage({super.key, required this.calculatorType}); + + @override + State createState() => _HealthCalculatorDetailedPageState(); +} + +class _HealthCalculatorDetailedPageState extends State { + dynamic calculatedResult; + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (_) => HealthCalcualtorViewModel(), + child: Consumer(builder: (context, provider, _) { + return CollapsingListView( + title: widget.calculatorType.displayName, + bottomChild: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.only(topLeft: Radius.circular(24.r), topRight: Radius.circular(24.r))), + padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.h), + child: CustomButton( + text: "Calculate".needTranslation, + onPressed: () { + if (calculatedResult == null) return; + DialogService dialogService = getIt.get(); + Navigator.of(context).push(CustomPageRoute( + page: HealthCalculatorResultPage(calculatorType: widget.calculatorType, calculatedResult: calculatedResult), + )); + }, + icon: null, + fontSize: 16.f, + backgroundColor: calculatedResult == null ? AppColors.bgRedLightColor : AppColors.primaryRedColor, + borderColor: calculatedResult == null ? AppColors.bgRedLightColor : AppColors.primaryRedColor, + borderRadius: 12.r, + fontWeight: FontWeight.w500)), + child: getCalculatorWidget( + type: widget.calculatorType, + onCalculate: (result) { + // result may be directly provided by widget, but prefer provider maps if available + switch (widget.calculatorType) { + case HealthCalculatorsTypeEnum.bmi: + calculatedResult = provider.bmiResultMap ?? result; + break; + case HealthCalculatorsTypeEnum.calories: + case HealthCalculatorsTypeEnum.bmr: + calculatedResult = provider.caloriesResultMap ?? result; + break; + case HealthCalculatorsTypeEnum.idealBodyWeight: + calculatedResult = provider.ibwResultMap ?? result; + break; + case HealthCalculatorsTypeEnum.bodyFat: + calculatedResult = provider.bodyFatResultMap ?? result; + break; + case HealthCalculatorsTypeEnum.crabsProteinFat: + calculatedResult = provider.macrosResultMap ?? result; + break; + case HealthCalculatorsTypeEnum.ovulation: + calculatedResult = provider.ovulationResult ?? result; + break; + case HealthCalculatorsTypeEnum.deliveryDueDate: + calculatedResult = provider.deliveryResult ?? result; + break; + } + setState(() {}); + }, + ).paddingSymmetrical(20.w, 24.h), + ); + }), + ); + } + + Widget getCalculatorWidget({required HealthCalculatorsTypeEnum type, required Function(dynamic result) onCalculate}) { + switch (widget.calculatorType) { + case HealthCalculatorsTypeEnum.bmi: + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + child: BMIWidget(onChange: onCalculate), + ); + + case HealthCalculatorsTypeEnum.calories: + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + child: CaloriesWidget(onChange: onCalculate), + ); + case HealthCalculatorsTypeEnum.bmr: + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + child: BMRWidget(onChange: onCalculate), + ); + case HealthCalculatorsTypeEnum.idealBodyWeight: + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + child: IdealBodyWeightWidget(onChange: onCalculate), + ); + case HealthCalculatorsTypeEnum.bodyFat: + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + child: BodyFatWidget(onChange: onCalculate), + ); + case HealthCalculatorsTypeEnum.crabsProteinFat: + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + child: CrabsWidget(onChange: onCalculate), + ); + case HealthCalculatorsTypeEnum.ovulation: + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + child: OvulationWidget(onChange: onCalculate), + ); + case HealthCalculatorsTypeEnum.deliveryDueDate: + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + child: DeliveryDueDWidget(onChange: onCalculate), + ); + } + } +} diff --git a/lib/presentation/health_calculators/health_calculator_result.dart b/lib/presentation/health_calculators/health_calculator_result.dart new file mode 100644 index 0000000..5315a89 --- /dev/null +++ b/lib/presentation/health_calculators/health_calculator_result.dart @@ -0,0 +1,428 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; + +class HealthCalculatorResultPage extends StatelessWidget { + HealthCalculatorsTypeEnum calculatorType; + dynamic calculatedResult; + + HealthCalculatorResultPage({super.key, required this.calculatorType, this.calculatedResult}); + + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: "Your ${calculatorType.name.toCamelCase}", + child: getCalculatorResultWidget(type: calculatorType, calculatedResult: calculatedResult).paddingSymmetrical(18.w, 24.h), + ); + } + + Widget getCalculatorResultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { + switch (calculatorType) { + case HealthCalculatorsTypeEnum.bmi: + return resultWidget(type: calculatorType, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.calories: + return resultWidget(type: calculatorType, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.bmr: + return resultWidget(type: calculatorType, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.idealBodyWeight: + return resultWidget(type: calculatorType, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.bodyFat: + return resultWidget(type: calculatorType, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.crabsProteinFat: + return resultWidget(type: calculatorType, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.ovulation: + return resultWidget(type: calculatorType, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.deliveryDueDate: + return resultWidget(type: calculatorType, calculatedResult: calculatedResult); + } + } + + Widget resultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { + print(calculatedResult); + return Column( + children: [ + if (type == HealthCalculatorsTypeEnum.bmi) ...[ + if (calculatedResult["bmiCategory"] == "Normal") ...[ + CalorieWidget( + title: calculatedResult["bmiCategory"], + calories: calculatedResult["bmiResult"], + description: + 'Your BMI is within the healthy range. Continue a balanced diet, regular physical activity, and routine checkups to maintain good health. Monitor any significant changes over time.', + color: Colors.green, + icon: Icons.scale, + hide: true, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["bmiCategory"] == "Underweight") ...[ + CalorieWidget( + title: calculatedResult["bmiCategory"], + calories: calculatedResult["bmiResult"], + description: + 'BMI suggests you are underweight. Consider increasing calorie intake with nutrient-dense foods, include resistance training to build muscle, and consult a healthcare professional to check for underlying causes.', + color: Colors.orange, + hide: true, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["bmiCategory"] == "Overweight") ...[ + CalorieWidget( + title: calculatedResult["bmiCategory"], + calories: calculatedResult["bmiResult"], + description: + 'BMI indicates overweight. Aim for gradual, sustainable weight loss through a modest calorie deficit, regular physical activity, and healthier food choices. Seek medical advice before major lifestyle changes.', + color: Colors.red, + hide: true, + icon: Icons.warning_rounded, + ), + ] + ] else if (type == HealthCalculatorsTypeEnum.calories) ...[ + if (calculatedResult["calorieRange"] == "Normal") ...[ + CalorieWidget( + title: calculatedResult["calorieRange"], + calories: calculatedResult["calories"], + description: + 'Estimated daily calories to maintain your current weight given your activity level and metabolism. Use this as a baseline: increase slightly for muscle gain, or create a small deficit for gradual weight loss. Track progress and adjust every 2–4 weeks.', + color: Colors.green, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["calorieRange"] == "Low") ...[ + CalorieWidget( + title: calculatedResult["calorieRange"], + calories: calculatedResult["calories"], + description: + 'A moderate calorie reduction designed for steady, sustainable weight loss (typically 0.25–0.5 kg per week). Combine with resistance training and adequate protein to preserve muscle. Avoid extreme cuts and consult a professional if you have medical conditions.', + color: Colors.orange, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["calorieRange"] == "High") ...[ + CalorieWidget( + title: calculatedResult["calorieRange"], + calories: calculatedResult["calories"], + description: + 'A large calorie reduction that may produce faster weight loss but can be hard to sustain and increase risk of nutrient deficiencies, fatigue, or muscle loss. Not recommended long-term; seek guidance from a healthcare or nutrition professional before continuing.', + color: Colors.red, + icon: Icons.warning_rounded, + ), + ] + ] else if (type == HealthCalculatorsTypeEnum.bmr) ...[ + if (calculatedResult["bmrRange"] == "Normal") ...[ + CalorieWidget( + title: calculatedResult["bmrRange"], + calories: calculatedResult["bmr"], + description: + 'Your Basal Metabolic Rate (BMR) is within the expected range for your profile. BMR is the energy your body needs at rest to maintain vital functions (breathing, circulation, temperature). Use this value as the baseline for estimating total daily energy needs by applying an activity multiplier. Maintain a balanced diet and regular physical activity to support metabolic health.', + color: Colors.green, + hide: true, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["bmrRange"] == "Low") ...[ + CalorieWidget( + title: calculatedResult["bmrRange"], + calories: calculatedResult["bmr"], + description: + 'Your BMR is lower than typical for your profile. Possible causes include lower lean muscle mass, age-related metabolic decline, or metabolic adaptation from prolonged calorie restriction. Consider focusing on resistance training to build/maintain muscle, ensure adequate protein and micronutrient intake, and consult a healthcare professional if this is unexpected.', + color: Colors.orange, + hide: true, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["bmrRange"] == "High") ...[ + CalorieWidget( + title: calculatedResult["bmrRange"], + calories: calculatedResult["bmr"], + description: + 'Your BMR is higher than average for your profile. This can reflect greater lean mass, younger age, or a naturally higher metabolic rate, meaning you burn more energy at rest. Use this information to tailor calorie targets: higher needs for maintenance or muscle gain, moderate deficit for weight loss. Seek medical advice if you notice rapid unexplained changes.', + color: Colors.red, + hide: true, + icon: Icons.warning_rounded, + ), + ] + ] else if (type == HealthCalculatorsTypeEnum.idealBodyWeight) ...[ + if (calculatedResult["status"] == "Normal") ...[ + CalorieWidget( + title: calculatedResult["status"], + calories: calculatedResult["ibw"], + hide: true, + description: (() { + final diff = calculatedResult["difference"]; + if (diff is num) { + if (diff == 0) { + return 'Your weight is at the ideal target. Maintain your current habits — balanced diet and regular activity — to keep this.'; + } else if (diff > 0) { + return 'You are below the ideal weight by ${diff.toStringAsFixed(1)} kg. Aim to gradually increase weight with a modest calorie surplus, nutrient-dense foods, and resistance training.'; + } else { + return 'You are above the ideal weight by ${diff.abs().toStringAsFixed(1)} kg. Aim for a gradual, sustainable weight reduction through a moderate calorie deficit, increased activity, and balanced nutrition.'; + } + } + return 'Your weight is close to the ideal range. Maintain a balanced diet and regular activity; follow personalized advice from a healthcare professional if needed.'; + })(), + color: Colors.green, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["status"] == "Underweight") ...[ + CalorieWidget( + title: calculatedResult["status"], + calories: calculatedResult["ibw"], + hide: true, + description: (() { + final diff = calculatedResult["difference"]; + if (diff is num) { + return 'You are below the ideal weight by ${diff.toStringAsFixed(1)} kg. Focus on increasing calorie intake with nutrient-dense foods, prioritize protein and resistance training to build healthy mass, and consider consulting a healthcare professional.'; + } + return 'You appear underweight compared to the ideal. Consider increasing calorie intake with nutrient-dense foods and resistance training; seek professional guidance if needed.'; + })(), + color: Colors.orange, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["status"] == "Overweight") ...[ + CalorieWidget( + title: calculatedResult["status"], + calories: calculatedResult["ibw"], + hide: true, + description: (() { + final diff = calculatedResult["difference"]; + if (diff is num) { + return 'You are above the ideal weight by ${diff.abs().toStringAsFixed(1)} kg. Aim for a gradual, sustainable weight loss strategy — moderate calorie deficit, regular physical activity, and balanced nutrition. Consult a professional before major changes.'; + } + return 'You appear above the ideal weight. Consider a gradual, sustainable calorie deficit combined with activity and balanced nutrition; consult a professional if needed.'; + })(), + color: Colors.red, + icon: Icons.warning_rounded, + ), + ] + ] else if (type == HealthCalculatorsTypeEnum.crabsProteinFat) ...[ + if (calculatedResult["dietType"] == "Very Low Crabs") ...[ + CalorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'Very low‑carb (ketogenic) approach: minimal carbohydrates, higher fat and moderate protein. May support rapid weight loss and improved blood sugar control for some, but can be hard to sustain and may cause nutrient gaps. Monitor hydration/electrolytes and consult a professional for long‑term use.'; + if (total is num) { + return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown: Carbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + } + return base; + })(), + color: Colors.orange, + hide: true, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["dietType"] == "Low Crabs") ...[ + CalorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'Low‑carb, higher‑protein plan: reduced carbohydrates with increased protein to support satiety and muscle maintenance. Helpful for weight management and glycemic control when balanced with vegetables and healthy fats. Ensure adequate fiber and micronutrients.'; + if (total is num) { + return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + } + return base; + })(), + color: Colors.orange, + hide: true, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["dietType"] == "Moderate Crabs") ...[ + CalorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'Moderate carbohydrate intake with balanced protein and fats: provides steady energy for daily activity and exercise while allowing flexibility. Suitable for many people aiming for sustainable weight management and performance.'; + if (total is num) { + return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + } + return base; + })(), + color: Colors.green, + hide: true, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["dietType"] == "USDA Guidelines ") ...[ + CalorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'USDA‑based balanced pattern: emphasizes fruits, vegetables, whole grains, lean proteins, and limited added sugars and saturated fats. Evidence‑based framework for general health, nutrient adequacy, and chronic disease prevention.'; + if (total is num) { + return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + } + return base; + })(), + color: Colors.green, + hide: true, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["dietType"] == "Zone Diet") ...[ + CalorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'Zone Diet (~40% carbs / 30% protein / 30% fat): emphasizes hormonal balance and portion control. May improve body composition and energy for some, but requires planning; personalize with a nutrition professional.'; + if (total is num) { + return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + } + return base; + })(), + color: Colors.orange, + hide: true, + icon: Icons.warning_rounded, + ), + ] + ] + ], + ); + } +} + +class CalorieWidget extends StatelessWidget { + final String title; + final dynamic calories; + final String description; + final Color color; + final IconData icon; + final bool hide; + + const CalorieWidget({super.key, required this.title, required this.calories, required this.description, required this.color, required this.icon, this.hide = false}); + + @override + Widget build(BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + padding: EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + ('${calories.toStringAsFixed(0)}').toText32(color: getTextColor(), isBold: true), + SizedBox(width: 10.w), + hide ? SizedBox() : 'kcal/day'.toText12(color: AppColors.inputLabelTextColor, isBold: true, fontWeight: FontWeight.w600) + ], + ), + _buildStatusIcon() + ], + ), + SizedBox(height: 16.h), + title.toText16(color: AppColors.textColor, weight: FontWeight.w600), + SizedBox(height: 8.h), + Text( + description, + style: TextStyle( + fontSize: 14, + color: Colors.grey[700], + height: 1.5, + ), + textAlign: TextAlign.start, + ), + ], + ), + ); + } + // + // Widget _buildStatusIcon() { + // if (title == 'Maintenance Calories' || title == 'Normal' || title == 'Ideal Weight') { + // return Utils.buildSvgWithAssets(icon: AppAssets.checkmark_icon, width: 24.w, height: 24.h); + // } else if (title == 'Moderate Deficit' || title == 'Low' || title == 'Underweight') { + // return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_yellow, width: 24.w, height: 24.h); + // } else if (title == 'Aggressive Deficit' || title == 'High' || title == 'Overweight' || title == "Obese") { + // return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_red, width: 24.w, height: 24.h); + // } else { + // return SizedBox(); + // } + // } + // + // Color getTextColor() { + // if (title == 'Maintenance Calories' || title == 'Normal' || title == 'Ideal Weight') { + // return AppColors.successColor; + // } else if (title == 'Moderate Deficit' || title == 'Low' || title == 'Underweight') { + // return AppColors.warningColor; + // } else if (title == 'Aggressive Deficit' || title == 'High' || title == 'Overweight' || title == "Obese") { + // return AppColors.errorColor; + // } else { + // return Colors.black; + // } + // } + + Widget _buildStatusIcon() { + final key = title.trim(); + if (key == 'Maintenance Calories' || key == 'Normal' || key == 'Ideal Weight' || key == 'Moderate Crabs' || key == 'USDA Guidelines') { + return Utils.buildSvgWithAssets(icon: AppAssets.checkmark_icon, width: 24.w, height: 24.h); + } else if (key == 'Moderate Deficit' || key == 'Low' || key == 'Underweight' || key == 'Very Low Crabs' || key == 'Low Crabs' || key == 'Zone Diet') { + return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_yellow, width: 24.w, height: 24.h); + } else if (key == 'Aggressive Deficit' || key == 'High' || key == 'Overweight' || key == "Obese") { + return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_red, width: 24.w, height: 24.h); + } else { + return SizedBox(); + } + } + + Color getTextColor() { + final key = title.trim(); + if (key == 'Maintenance Calories' || key == 'Normal' || key == 'Ideal Weight' || key == 'Moderate Crabs' || key == 'USDA Guidelines') { + return AppColors.successColor; + } else if (key == 'Moderate Deficit' || key == 'Low' || key == 'Underweight' || key == 'Very Low Crabs' || key == 'Low Crabs' || key == 'Zone Diet') { + return AppColors.warningColor; + } else if (key == 'Aggressive Deficit' || key == 'High' || key == 'Overweight' || key == "Obese") { + return AppColors.errorColor; + } else { + return Colors.black; + } + } +} diff --git a/lib/presentation/health_calculators/health_calculator_view_model.dart b/lib/presentation/health_calculators/health_calculator_view_model.dart new file mode 100644 index 0000000..aa6c157 --- /dev/null +++ b/lib/presentation/health_calculators/health_calculator_view_model.dart @@ -0,0 +1,657 @@ +import 'dart:math'; + +import 'package:flutter/foundation.dart'; + +class HealthCalcualtorViewModel extends ChangeNotifier { + // BMI + double? bmiResult; + String? bmiCategory; + + // BMR / Calories + double? bmrResult; + double? caloriesResult; + String? bmrRange; + String? calorieRange; + + // IBW + double? ibwResult; + double? weightDifference; + String? weightStatus; + + // Body Fat + double? bodyFatResult; + String? bodyFatCategory; + + // Crabs/Protein/Fat + double? carbsCalories; + double? proteinCalories; + double? fatCalories; + double? carbsGrams; + double? proteinGrams; + double? fatGrams; + String? dietType; + + // Ovulation + Map? ovulationResult; + + // Delivery + Map? deliveryResult; + + // Generic helpers + + void calculateBMI({required String heightText, required String weightText, required String heightUnit, required String weightUnit}) { + if (heightText.trim().isEmpty || weightText.trim().isEmpty) { + bmiResult = null; + bmiCategory = null; + notifyListeners(); + return; + } + + try { + double height = double.parse(heightText.trim()); + double weight = double.parse(weightText.trim()); + + double heightInMeters = _convertHeightToMeters(height, heightUnit); + double weightInKg = _convertWeightToKg(weight, weightUnit); + + if (heightInMeters <= 0 || weightInKg <= 0) { + bmiResult = null; + bmiCategory = null; + notifyListeners(); + return; + } + + double bmi = weightInKg / (heightInMeters * heightInMeters); + String category = _getBMICategory(bmi); + + bmiResult = bmi; + bmiCategory = category; + notifyListeners(); + } catch (e) { + bmiResult = null; + bmiCategory = null; + notifyListeners(); + } + } + + double _convertHeightToMeters(double height, String unit) { + switch (unit) { + case 'cm': + return height / 100; + case 'm': + return height; + case 'ft': + return height * 0.3048; + case 'in': + return height * 0.0254; + default: + return height / 100; + } + } + + double _convertWeightToKg(double weight, String unit) { + switch (unit) { + case 'kg': + return weight; + case 'lb': + return weight * 0.453592; + default: + return weight; + } + } + + String _getBMICategory(double bmi) { + if (bmi < 18.5) { + return 'Underweight'; + } else if (bmi >= 18.5 && bmi < 25) { + return 'Normal'; + } else if (bmi >= 25 && bmi < 30) { + return 'Overweight'; + } else { + return 'Obese'; + } + } + + // BMR / Calories (shared logic) + void calculateBMRAndCalories({required String heightText, required String weightText, required String ageText, required String heightUnit, required String weightUnit, required String gender, required String activityLevel, bool forCaloriesOnly = false}) { + if (heightText.trim().isEmpty || weightText.trim().isEmpty || ageText.trim().isEmpty) { + bmrResult = null; + caloriesResult = null; + bmrRange = null; + calorieRange = null; + notifyListeners(); + return; + } + + try { + double height = double.parse(heightText.trim()); + double weight = double.parse(weightText.trim()); + int age = int.parse(ageText.trim()); + + if (age < 11 || age > 120) { + bmrResult = null; + caloriesResult = null; + bmrRange = null; + calorieRange = null; + notifyListeners(); + return; + } + + double heightInCm = _convertHeightToCm(height, heightUnit); + double weightInKg = _convertWeightToKg(weight, weightUnit); + + if (heightInCm <= 0 || weightInKg <= 0) { + bmrResult = null; + caloriesResult = null; + bmrRange = null; + calorieRange = null; + notifyListeners(); + return; + } + + double bmr = _calculateBMR(heightInCm, weightInKg, age, gender); + double activityMultiplier = _getActivityMultiplier(activityLevel); + double calories = bmr * activityMultiplier; + + bmrResult = bmr; + caloriesResult = calories; + + // ranges + if (bmr < 1200) { + bmrRange = 'Low'; + } else if (bmr < 1600) { + bmrRange = 'Normal'; + } else if (bmr < 2000) { + bmrRange = 'High'; + } else { + bmrRange = 'Very High'; + } + + if (calories < 1800) { + calorieRange = 'Low'; + } else if (calories < 2500) { + calorieRange = 'Normal'; + } else if (calories < 3200) { + calorieRange = 'High'; + } else { + calorieRange = 'High'; + } + + notifyListeners(); + } catch (e) { + bmrResult = null; + caloriesResult = null; + bmrRange = null; + calorieRange = null; + notifyListeners(); + } + } + + double _convertHeightToCm(double height, String unit) { + switch (unit) { + case 'cm': + return height; + case 'm': + return height * 100; + case 'ft': + return height * 30.48; + case 'in': + return height * 2.54; + default: + return height; + } + } + + double _calculateBMR(double heightCm, double weightKg, int age, String gender) { + if (gender == "Male") { + return 88.362 + (13.397 * weightKg) + (4.799 * heightCm) - (5.677 * age); + } else { + return 447.593 + (9.247 * weightKg) + (3.098 * heightCm) - (4.330 * age); + } + } + + double _getActivityMultiplier(String activityLevel) { + switch (activityLevel) { + case "Almost Inactive (no exercise)": + return 1.2; + case "Lightly active": + return 1.375; + case "Lightly active (1-3) days per week": + return 1.55; + case "Super active (very hard exercise)": + return 1.725; + default: + return 1.375; + } + } + + // IBW + void calculateIBW({required String heightText, required String weightText, required String heightUnit, required String weightUnit, required String bodyFrameSize}) { + if (heightText.trim().isEmpty || weightText.trim().isEmpty) { + ibwResult = null; + weightDifference = null; + weightStatus = null; + notifyListeners(); + return; + } + + try { + double height = double.parse(heightText.trim()); + double weight = double.parse(weightText.trim()); + + double heightInCm = _convertHeightToCm(height, heightUnit); + double weightInKg = _convertWeightToKg(weight, weightUnit); + + if (heightInCm <= 0 || weightInKg <= 0) { + ibwResult = null; + weightDifference = null; + weightStatus = null; + notifyListeners(); + return; + } + + double ibw = _calculateIBWValue(heightInCm); + double adjusted = _applyFrameSizeAdjustment(ibw, bodyFrameSize); + double difference = weightInKg - adjusted; + String status = _getWeightStatus(difference); + + ibwResult = adjusted; + weightDifference = difference; + weightStatus = status; + notifyListeners(); + } catch (e) { + ibwResult = null; + weightDifference = null; + weightStatus = null; + notifyListeners(); + } + } + + double _calculateIBWValue(double heightCm) { + double baseHeight = 152.4; + double baseWeight = 50.0; + double heightMultiplier = 2.3; + + if (heightCm <= baseHeight) { + return baseWeight - ((baseHeight - heightCm) * 0.5); + } + + return baseWeight + ((heightCm - baseHeight) * heightMultiplier / 2.54); + } + + double _applyFrameSizeAdjustment(double ibw, String selectedBodyFrameSize) { + switch (selectedBodyFrameSize) { + case "Small (fingers overlaps)": + return ibw * 0.9; + case "Medium (fingers touch)": + return ibw; + case "Large (fingers don't touch)": + return ibw * 1.1; + default: + return ibw; + } + } + + String _getWeightStatus(double difference) { + if (difference.abs() < 2) { + return 'Normal'; + } else if (difference > 0) { + return 'Overweight'; + } else { + return 'Underweight'; + } + } + + // Body Fat + void calculateBodyFat({required String heightText, required String neckText, required String waistText, required String hipText, required String heightUnit, required String neckUnit, required String waistUnit, required String hipUnit, required String gender}) { + if (heightText.trim().isEmpty || neckText.trim().isEmpty || waistText.trim().isEmpty) { + bodyFatResult = null; + bodyFatCategory = null; + notifyListeners(); + return; + } + + if (gender == "Female" && hipText.trim().isEmpty) { + bodyFatResult = null; + bodyFatCategory = null; + notifyListeners(); + return; + } + + try { + double height = double.parse(heightText.trim()); + double neck = double.parse(neckText.trim()); + double waist = double.parse(waistText.trim()); + double hip = gender == "Female" ? double.parse(hipText.trim()) : 0; + + double heightInCm = _convertHeightToCm(height, heightUnit); + double neckInCm = _convertLengthToCm(neck, neckUnit); + double waistInCm = _convertLengthToCm(waist, waistUnit); + double hipInCm = gender == "Female" ? _convertLengthToCm(hip, hipUnit) : 0; + + if (heightInCm <= 0 || neckInCm <= 0 || waistInCm <= 0) { + bodyFatResult = null; + bodyFatCategory = null; + notifyListeners(); + return; + } + + double bodyFat = _calculateBodyFatPercentage(heightInCm, neckInCm, waistInCm, hipInCm, gender == "Male"); + String category = _getBodyFatCategory(bodyFat, gender == "Male"); + + bodyFatResult = bodyFat; + bodyFatCategory = category; + notifyListeners(); + } catch (e) { + bodyFatResult = null; + bodyFatCategory = null; + notifyListeners(); + } + } + + double _convertLengthToCm(double length, String unit) { + switch (unit) { + case 'cm': + return length; + case 'm': + return length * 100; + case 'ft': + return length * 30.48; + case 'in': + return length * 2.54; + default: + return length; + } + } + + double _calculateBodyFatPercentage(double heightCm, double neckCm, double waistCm, double hipCm, bool isMale) { + if (isMale) { + double waistMinusNeck = waistCm - neckCm; + if (waistMinusNeck <= 0) return 0; + double log10WaistNeck = _log10(waistMinusNeck); + double log10Height = _log10(heightCm); + double bodyDensity = 1.0324 - (0.19077 * log10WaistNeck) + (0.15456 * log10Height); + double bodyFat = (495 / bodyDensity) - 450; + return bodyFat.clamp(0, 100); + } else { + double waistHipMinusNeck = waistCm + hipCm - neckCm; + if (waistHipMinusNeck <= 0) return 0; + double log10WaistHipNeck = _log10(waistHipMinusNeck); + double log10Height = _log10(heightCm); + double bodyDensity = 1.29579 - (0.35004 * log10WaistHipNeck) + (0.22100 * log10Height); + double bodyFat = (495 / bodyDensity) - 450; + return bodyFat.clamp(0, 100); + } + } + + double _log10(double x) { + return (x <= 0) ? 0 : (log(x) / log(10)); + } + + String _getBodyFatCategory(double bodyFat, bool isMale) { + if (isMale) { + if (bodyFat < 6) return 'Essential Fat'; + if (bodyFat < 14) return 'Athletes'; + if (bodyFat < 18) return 'Fitness'; + if (bodyFat < 25) return 'Average'; + return 'Obese'; + } else { + if (bodyFat < 14) return 'Essential Fat'; + if (bodyFat < 21) return 'Athletes'; + if (bodyFat < 25) return 'Fitness'; + if (bodyFat < 32) return 'Average'; + return 'Obese'; + } + } + + // Crabs / Macros + void calculateMacros({required String caloriesText, required String selectedDietType}) { + if (caloriesText.trim().isEmpty) { + carbsCalories = null; + proteinCalories = null; + fatCalories = null; + carbsGrams = null; + proteinGrams = null; + fatGrams = null; + dietType = null; + notifyListeners(); + return; + } + + try { + double totalCalories = double.parse(caloriesText.trim()); + if (totalCalories <= 0) { + carbsCalories = null; + proteinCalories = null; + fatCalories = null; + carbsGrams = null; + proteinGrams = null; + fatGrams = null; + dietType = null; + notifyListeners(); + return; + } + + Map macroPercentages = _getMacroPercentages(selectedDietType); + double carbsPercent = macroPercentages['carbs']!; + double proteinPercent = macroPercentages['protein']!; + double fatPercent = macroPercentages['fat']!; + + double cCalories = totalCalories * (carbsPercent / 100); + double pCalories = totalCalories * (proteinPercent / 100); + double fCalories = totalCalories * (fatPercent / 100); + + double cGrams = cCalories / 4; + double pGrams = pCalories / 4; + double fGrams = fCalories / 9; + + carbsCalories = cCalories; + proteinCalories = pCalories; + fatCalories = fCalories; + carbsGrams = cGrams; + proteinGrams = pGrams; + fatGrams = fGrams; + dietType = selectedDietType; + notifyListeners(); + } catch (e) { + carbsCalories = null; + proteinCalories = null; + fatCalories = null; + carbsGrams = null; + proteinGrams = null; + fatGrams = null; + dietType = null; + notifyListeners(); + } + } + + Map _getMacroPercentages(String dietType) { + switch (dietType) { + case "Very Low Crabs": + return {'carbs': 5, 'protein': 30, 'fat': 65}; + case "Low Crabs": + return {'carbs': 20, 'protein': 35, 'fat': 45}; + case "Moderate Crabs": + return {'carbs': 40, 'protein': 30, 'fat': 30}; + case "USDA Guidelines ": + return {'carbs': 55, 'protein': 15, 'fat': 30}; + case "Zone Diet": + return {'carbs': 40, 'protein': 30, 'fat': 30}; + default: + return {'carbs': 40, 'protein': 30, 'fat': 30}; + } + } + + // Ovulation + DateTime? _parseCustomDate(String dateString) { + try { + List parts = dateString.split(' '); + if (parts.length >= 3) { + int day = int.parse(parts[0]); + String month = parts[1].replaceAll(',', ''); + int year = int.parse(parts[2]); + + Map months = { + 'January': 1, + 'February': 2, + 'March': 3, + 'April': 4, + 'May': 5, + 'June': 6, + 'July': 7, + 'August': 8, + 'September': 9, + 'October': 10, + 'November': 11, + 'December': 12, + 'Jan': 1, + 'Feb': 2, + 'Mar': 3, + 'Apr': 4, + 'Jun': 6, + 'Jul': 7, + 'Aug': 8, + 'Sep': 9, + 'Oct': 10, + 'Nov': 11, + 'Dec': 12, + }; + + int? monthNum = months[month]; + if (monthNum != null) { + return DateTime(year, monthNum, day); + } + } + return null; + } catch (e) { + return null; + } + } + + DateTime? _tryParseDate(String dateString) { + try { + // try ISO like + return DateTime.tryParse(dateString) ?? _parseCustomDate(dateString); + } catch (e) { + return null; + } + } + + String _formatDate(DateTime? date) { + if (date == null) return ''; + String day = date.day.toString().padLeft(2, '0'); + return '$day ${_getMonthName(date.month)}, ${date.year}'; + } + + String _getMonthName(int month) { + const List months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + return months[month - 1]; + } + + String _determineCyclePhase(int daysSincePeriod, int follicularPhase, int cycleLength) { + int normalizedDay = daysSincePeriod % cycleLength; + + if (normalizedDay < follicularPhase - 1) { + return 'Follicular Phase'; + } else if (normalizedDay < follicularPhase + 2) { + return 'Ovulation'; + } else if (normalizedDay < cycleLength) { + return 'Luteal Phase'; + } else { + return 'Menstruation'; + } + } + + void calculateOvulation({required String dateText, required String cycleLengthText, required String lutealPhaseText}) { + if (dateText.trim().isEmpty || cycleLengthText.trim().isEmpty || lutealPhaseText.trim().isEmpty) { + ovulationResult = null; + notifyListeners(); + return; + } + + DateTime? parsedDate = _tryParseDate(dateText); + if (parsedDate == null) { + ovulationResult = null; + notifyListeners(); + return; + } + + try { + int cycleLength = int.parse(cycleLengthText.trim()); + int lutealPhase = int.parse(lutealPhaseText.trim()); + + if (cycleLength < 16 || cycleLength > 40 || lutealPhase < 8 || lutealPhase > 16) { + ovulationResult = null; + notifyListeners(); + return; + } + + if (cycleLength <= lutealPhase) { + ovulationResult = null; + notifyListeners(); + return; + } + + int follicularPhase = cycleLength - lutealPhase; + DateTime ovulationDate = parsedDate.add(Duration(days: follicularPhase - 1)); + DateTime fertileStart = ovulationDate.subtract(Duration(days: 5)); + DateTime fertileEnd = ovulationDate.add(Duration(days: 1)); + int daysSincePeriod = DateTime.now().difference(parsedDate).inDays; + String cyclePhase = _determineCyclePhase(daysSincePeriod, follicularPhase, cycleLength); + + ovulationResult = { + 'lastPeriodDate': _formatDate(parsedDate), + 'ovulationDate': _formatDate(ovulationDate), + 'fertileWindowStart': _formatDate(fertileStart), + 'fertileWindowEnd': _formatDate(fertileEnd), + 'cycleLength': cycleLength, + 'lutealPhase': lutealPhase, + 'follicularPhase': follicularPhase, + 'cyclePhase': cyclePhase, + 'nextPeriodDate': _formatDate(parsedDate.add(Duration(days: cycleLength))), + }; + + notifyListeners(); + } catch (e) { + ovulationResult = null; + notifyListeners(); + } + } + + // Delivery due date + void calculateDueDate({required String isoDateString}) { + if (isoDateString.trim().isEmpty) { + deliveryResult = null; + notifyListeners(); + return; + } + + DateTime? lmp; + try { + lmp = DateTime.tryParse(isoDateString) ?? _tryParseDate(isoDateString); + } catch (e) { + lmp = null; + } + + if (lmp == null) { + deliveryResult = null; + notifyListeners(); + return; + } + + DateTime dueDate = lmp.add(Duration(days: 280)); + String dueDateStr = _formatDate(dueDate); + String lmpStr = _formatDate(lmp); + + deliveryResult = {'lmpDate': lmpStr, 'dueDate': dueDateStr, 'lmpDateTime': lmp, 'dueDateTime': dueDate}; + notifyListeners(); + } + + // expose map-like results for widgets to forward to parent + Map? get bmiResultMap => bmiResult == null ? null : {'bmiResult': bmiResult, 'bmiCategory': bmiCategory}; + Map? get caloriesResultMap => caloriesResult == null ? null : {'calories': caloriesResult, 'bmr': bmrResult, 'calorieRange': calorieRange, 'bmrRange': bmrRange}; + Map? get ibwResultMap => ibwResult == null ? null : {'ibw': ibwResult, 'difference': weightDifference, 'status': weightStatus}; + Map? get bodyFatResultMap => bodyFatResult == null ? null : {'fatPercentage': bodyFatResult, 'fatCategory': bodyFatCategory}; + Map? get macrosResultMap => carbsCalories == null ? null : {'totalCalories': carbsCalories! + proteinCalories! + fatCalories!, 'carbsGrams': carbsGrams, 'carbsCalories': carbsCalories, 'proteinGrams': proteinGrams, 'proteinCalories': proteinCalories, 'fatGrams': fatGrams, 'fatCalories': fatCalories, 'dietType': dietType}; +} + diff --git a/lib/presentation/health_calculators/health_calculators_page.dart b/lib/presentation/health_calculators/health_calculators_page.dart new file mode 100644 index 0000000..ab37c2c --- /dev/null +++ b/lib/presentation/health_calculators/health_calculators_page.dart @@ -0,0 +1,170 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/hmg_services/hmg_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_all_orders_resp_model.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_services_resp_model.dart'; +import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/cmc_order_detail_page.dart'; +import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/cmc_selection_review_page.dart'; +import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/widgets/cmc_ui_selection_helper.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_detailed_page.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/health_card.dart'; +import 'package:hmg_patient_app_new/presentation/hmg_services/services_view.dart'; +import 'package:hmg_patient_app_new/services/dialog_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/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/media_viewer/full_screen_image_viewer.dart'; +import 'package:hmg_patient_app_new/widgets/radio_list_tile_widget.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; +import 'package:shimmer/shimmer.dart'; + +class HealthCalculatorsPage extends StatefulWidget { + const HealthCalculatorsPage({super.key}); + + @override + State createState() => _HealthCalculatorsPageState(); +} + +class _HealthCalculatorsPageState extends State { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + DialogService dialogService = getIt.get(); + return CollapsingListView( + title: "Health Calculators".needTranslation, + child: Column( + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.general_health, height: 40.h, width: 40.w, fit: BoxFit.none), + SizedBox(width: 12.w), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "General Health".needTranslation.toText16(weight: FontWeight.w600), + "Related To BMI, calories, body fat, etc to stay updated with your health.".needTranslation.toText12(fontWeight: FontWeight.w500, color: Color(0xFF8F9AA3)) + ], + ), + ), + SizedBox( + width: 12.w, + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), + ], + ).paddingAll(16.w)) + .onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Calculator".needTranslation, + message: "", + child: showCalculatorsItems(type: HealthCalculatorEnum.general), + onOkPressed: () {}, + ); + }), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.women_health, height: 40.h, width: 40.w, fit: BoxFit.none), + SizedBox(width: 12.w), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "Women's Health".needTranslation.toText16(weight: FontWeight.w600), + "Related To periods, ovulation, pregnancy, and other topics.".needTranslation.toText12(fontWeight: FontWeight.w500, color: Color(0xFF8F9AA3)) + ], + ), + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), + ], + ).paddingAll(16.w)) + .onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Calculator".needTranslation, + message: "", + child: showCalculatorsItems(type: HealthCalculatorEnum.women), + onOkPressed: () {}, + ); + }), + ], + ).paddingSymmetrical(20.w, 24.h)); + } + + Widget showCalculatorsItems({required HealthCalculatorEnum type}) { + return GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, // 4 icons per row + crossAxisSpacing: 16.w, + mainAxisSpacing: 16.w, + childAspectRatio: 0.80), + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: type == HealthCalculatorEnum.general ? generalHealthServices.length : womenHealthServices.length, + padding: EdgeInsets.zero, + itemBuilder: (BuildContext context, int index) { + return HealthCard( + icon: type == HealthCalculatorEnum.general ? generalHealthServices[index].icon : womenHealthServices[index].icon, + labelText: type == HealthCalculatorEnum.general ? generalHealthServices[index].title : womenHealthServices[index].title, + onTap: () { + Navigator.of(context).push( + CustomPageRoute( + page: HealthCalculatorDetailedPage( + calculatorType: type == HealthCalculatorEnum.general ? generalHealthServices[index].type : womenHealthServices[index].type, + ), + ), + ); + }, + ); + }, + ); + } + + final List generalHealthServices = [ + HealthComponentModel(title: "BMI\nCalculator".needTranslation, icon: AppAssets.bmi, type: HealthCalculatorsTypeEnum.bmi), + HealthComponentModel(title: "Calories\nCalculator".needTranslation, icon: AppAssets.calories, type: HealthCalculatorsTypeEnum.calories), + HealthComponentModel(title: "BMR\nCalculator".needTranslation, icon: AppAssets.bmr, type: HealthCalculatorsTypeEnum.bmr), + HealthComponentModel(title: "Ideal Body\nWeight".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.idealBodyWeight), + HealthComponentModel(title: "Body Fat\nCalculator".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.bodyFat), + HealthComponentModel(title: "Carbs\nProtein & Fat".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.crabsProteinFat), + ]; + + final List womenHealthServices = [ + HealthComponentModel(title: "Ovulation\nPeriod".needTranslation, icon: AppAssets.locate_me, type: HealthCalculatorsTypeEnum.ovulation), + HealthComponentModel(title: "Delivery\nDue Date".needTranslation, icon: AppAssets.activeCheck, type: HealthCalculatorsTypeEnum.deliveryDueDate), + ]; +} + +class HealthComponentModel { + String title; + String? subTitle; + String icon; + Color? iconColor; + Color? bgColor; + Color? textColor; + HealthCalculatorsTypeEnum type; + + HealthComponentModel({required this.title, this.subTitle, required this.icon, this.iconColor, this.bgColor, this.textColor, required this.type}); +} diff --git a/lib/presentation/health_calculators/widgets/bf.dart b/lib/presentation/health_calculators/widgets/bf.dart new file mode 100644 index 0000000..bbab9a5 --- /dev/null +++ b/lib/presentation/health_calculators/widgets/bf.dart @@ -0,0 +1,642 @@ +import 'package:flutter/material.dart'; +import 'dart:math'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; + +class BodyFatWidget extends StatefulWidget { + Function(dynamic result)? onChange; + + BodyFatWidget({super.key, required this.onChange}); + + @override + _BodyFatWidgetState createState() => _BodyFatWidgetState(); +} + +class _BodyFatWidgetState extends State { + final TextEditingController _heightController = TextEditingController(); + final TextEditingController _neckController = TextEditingController(); + final TextEditingController _waistController = TextEditingController(); + final TextEditingController _hipController = TextEditingController(); + final List _heightUnits = ['cm', 'm', 'ft', 'in']; + String selectedHeightUnit = 'cm'; + String selectedNeckUnit = 'in'; + String selectedWaistUnit = 'in'; + String selectedHipUnit = 'in'; + String selectedGender = "Male"; + + @override + void initState() { + super.initState(); + _heightController.addListener(_onInputChanged); + _neckController.addListener(_onInputChanged); + _waistController.addListener(_onInputChanged); + _hipController.addListener(_onInputChanged); + } + + @override + void dispose() { + _heightController.removeListener(_onInputChanged); + _neckController.removeListener(_onInputChanged); + _waistController.removeListener(_onInputChanged); + _hipController.removeListener(_onInputChanged); + _heightController.dispose(); + _neckController.dispose(); + _waistController.dispose(); + _hipController.dispose(); + super.dispose(); + } + + void _onInputChanged() { + final provider = Provider.of(context, listen: false); + provider.calculateBodyFat( + heightText: _heightController.text, + neckText: _neckController.text, + waistText: _waistController.text, + hipText: _hipController.text, + heightUnit: selectedHeightUnit, + neckUnit: selectedNeckUnit, + waistUnit: selectedWaistUnit, + hipUnit: selectedHipUnit, + gender: selectedGender, + ); + if (widget.onChange != null) widget.onChange!(provider.bodyFatResultMap); + } + + @override + Widget build(BuildContext context) { + DialogService dialogService = getIt(); + + return Consumer(builder: (context, provider, _) { + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.gender, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Select Gender".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedGender.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + ], + ), + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down), + SizedBox(width: 4.w), + ], + ).paddingSymmetrical(0.w, 16.w).onPress(() { + List _genders = ["Male", "Female"]; + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Gender".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _genders.length, + itemBuilder: (context, index) { + final unit = _genders[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedGender, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedGender = value; + }); + _onInputChanged(); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toCamelCase.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedGender = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Height".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _heightController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '175', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedHeightUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _heightUnits.length, + itemBuilder: (context, index) { + final unit = _heightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedHeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedHeightUnit = value; + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedHeightUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Neck".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _neckController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '7', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black87, + height: 1.0, + ), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedNeckUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _heightUnits.length, + itemBuilder: (context, index) { + final unit = _heightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedNeckUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedNeckUnit = value; + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedNeckUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Waist".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _waistController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '30', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black87, + height: 1.0, + ), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedWaistUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _heightUnits.length, + itemBuilder: (context, index) { + final unit = _heightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedWaistUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedWaistUnit = value; + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedWaistUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Hip".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _hipController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '0', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black87, + height: 1.0, + ), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedHipUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _heightUnits.length, + itemBuilder: (context, index) { + final unit = _heightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedHeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedHipUnit = value; + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedHipUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), + SizedBox(width: 12.w), + Expanded( + child: "Estimate the total body fat based on the size.".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + ), + ); + }); + } +} diff --git a/lib/presentation/health_calculators/widgets/bmi.dart b/lib/presentation/health_calculators/widgets/bmi.dart new file mode 100644 index 0000000..be87d0d --- /dev/null +++ b/lib/presentation/health_calculators/widgets/bmi.dart @@ -0,0 +1,309 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; + +class BMIWidget extends StatefulWidget { + Function(dynamic result)? onChange; + + BMIWidget({super.key, required this.onChange}); + + @override + _BMIWidgetState createState() => _BMIWidgetState(); +} + +class _BMIWidgetState extends State { + final TextEditingController _heightController = TextEditingController(); + final TextEditingController _weightController = TextEditingController(); + final List _heightUnits = ['cm', 'm', 'ft', 'in']; + final List _weightUnits = ['kg', 'lb']; + String selectedHeightUnit = 'cm'; + String selectedWeightUnit = 'kg'; + + @override + void initState() { + super.initState(); + _heightController.addListener(_onInputChanged); + _weightController.addListener(_onInputChanged); + } + + @override + void dispose() { + _heightController.removeListener(_onInputChanged); + _weightController.removeListener(_onInputChanged); + _heightController.dispose(); + _weightController.dispose(); + super.dispose(); + } + + void _onInputChanged() { + final provider = Provider.of(context, listen: false); + provider.calculateBMI(heightText: _heightController.text, weightText: _weightController.text, heightUnit: selectedHeightUnit, weightUnit: selectedWeightUnit); + // notify parent + if (widget.onChange != null) widget.onChange!(provider.bmiResultMap); + } + + @override + Widget build(BuildContext context) { + DialogService dialogService = getIt(); + + return Consumer(builder: (context, provider, _) { + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Height".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _heightController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '175', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedHeightUnit.toUpperCase().toText12(fontWeight: FontWeight.w600, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _heightUnits.length, + itemBuilder: (context, index) { + final unit = _heightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedHeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedHeightUnit = value; + _onInputChanged(); + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedHeightUnit = unit; + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Weight".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _weightController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '75', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black87, + height: 1.0, + ), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedWeightUnit.toUpperCase().toText12(fontWeight: FontWeight.w600, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _weightUnits.length, + itemBuilder: (context, index) { + final unit = _weightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedWeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedWeightUnit = value; + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedWeightUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), + SizedBox(width: 12.w), + Expanded( + child: "Calculate the BMI value and weight status to identify the healthy weight. NOt appropriate for children and women who are pregnant or breastfeeding." + .toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + ), + ); + }); + } +} diff --git a/lib/presentation/health_calculators/widgets/bmr.dart b/lib/presentation/health_calculators/widgets/bmr.dart new file mode 100644 index 0000000..771191e --- /dev/null +++ b/lib/presentation/health_calculators/widgets/bmr.dart @@ -0,0 +1,523 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; + +class BMRWidget extends StatefulWidget { + Function(dynamic result)? onChange; + + BMRWidget({super.key, required this.onChange}); + + @override + _BMRWidgetState createState() => _BMRWidgetState(); +} + +class _BMRWidgetState extends State { + final TextEditingController _heightController = TextEditingController(); + final TextEditingController _weightController = TextEditingController(); + final TextEditingController _ageController = TextEditingController(); + final List _heightUnits = ['cm', 'm', 'ft', 'in']; + final List _weightUnits = ['kg', 'lb']; + String selectedHeightUnit = 'cm'; + String selectedWeightUnit = 'kg'; + String selectedActivityLevel = 'Lightly active'; + String selectedGender = "Male"; + + @override + void initState() { + super.initState(); + _heightController.addListener(_onInputChanged); + _weightController.addListener(_onInputChanged); + _ageController.addListener(_onInputChanged); + } + + @override + void dispose() { + _heightController.removeListener(_onInputChanged); + _weightController.removeListener(_onInputChanged); + _ageController.removeListener(_onInputChanged); + _heightController.dispose(); + _weightController.dispose(); + _ageController.dispose(); + super.dispose(); + } + + void _onInputChanged() { + final provider = Provider.of(context, listen: false); + provider.calculateBMRAndCalories( + heightText: _heightController.text, + weightText: _weightController.text, + ageText: _ageController.text, + heightUnit: selectedHeightUnit, + weightUnit: selectedWeightUnit, + gender: selectedGender, + activityLevel: selectedActivityLevel, + ); + if (widget.onChange != null) widget.onChange!(provider.caloriesResultMap); + } + + @override + Widget build(BuildContext context) { + DialogService dialogService = getIt(); + AppState appState = getIt(); + + return Consumer(builder: (context, provider, _) { + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column(children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.gender, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Select Gender".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedGender.toCamelCase.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + ], + ), + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down), + SizedBox(width: 4.w), + ], + ).paddingSymmetrical(0.w, 16.w).onPress(() { + List _genders = ["Male", "Female"]; + + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Gender".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _genders.length, + itemBuilder: (context, index) { + final unit = _genders[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedGender, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + print(value); + setState(() { + selectedGender = value; + }); + _onInputChanged(); + Navigator.of(context).pop(); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toCamelCase.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedGender = unit; + }); + _onInputChanged(); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Age (11-120) yrs".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _ageController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '20', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Height".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _heightController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '175', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedHeightUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _heightUnits.length, + itemBuilder: (context, index) { + final unit = _heightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedHeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedHeightUnit = value; + }); + _onInputChanged(); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedHeightUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Weight".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _weightController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '75', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black87, + height: 1.0, + ), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedWeightUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _weightUnits.length, + itemBuilder: (context, index) { + final unit = _weightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedWeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedWeightUnit = value; + }); + _onInputChanged(); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedWeightUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Activity Level".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedActivityLevel.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + ], + ), + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down), + SizedBox(width: 4.w), + ], + ).paddingSymmetrical(0.w, 16.w).onPress(() { + List _activity = ["Almost Inactive (no exercise)", "Lightly active", "Lightly active (1-3) days per week", "Super active (very hard exercise)"]; + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Activity Level".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _activity.length, + itemBuilder: (context, index) { + final unit = _activity[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedActivityLevel, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedActivityLevel = value; + }); + _onInputChanged(); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toCamelCase.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedActivityLevel = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), + SizedBox(width: 12.w), + Expanded( + child: "Calculates daily calorie intake based on server factors, like height, weight, age, gender and daily physical activity." + .toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ])); + }); + } +} diff --git a/lib/presentation/health_calculators/widgets/calories.dart b/lib/presentation/health_calculators/widgets/calories.dart new file mode 100644 index 0000000..0d7aab7 --- /dev/null +++ b/lib/presentation/health_calculators/widgets/calories.dart @@ -0,0 +1,524 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; + +class CaloriesWidget extends StatefulWidget { + Function(dynamic result)? onChange; + + CaloriesWidget({super.key, required this.onChange}); + + @override + _CaloriesWidgetState createState() => _CaloriesWidgetState(); +} + +class _CaloriesWidgetState extends State { + final TextEditingController _heightController = TextEditingController(); + final TextEditingController _weightController = TextEditingController(); + final TextEditingController _ageController = TextEditingController(); + final List _heightUnits = ['cm', 'm', 'ft', 'in']; + final List _weightUnits = ['kg', 'lb']; + String selectedHeightUnit = 'cm'; + String selectedWeightUnit = 'kg'; + String selectedActivityLevel = 'Lightly active'; + String selectedGender = "Male"; + + @override + void initState() { + super.initState(); + _heightController.addListener(_onInputChanged); + _weightController.addListener(_onInputChanged); + _ageController.addListener(_onInputChanged); + } + + @override + void dispose() { + _heightController.removeListener(_onInputChanged); + _weightController.removeListener(_onInputChanged); + _ageController.removeListener(_onInputChanged); + _heightController.dispose(); + _weightController.dispose(); + _ageController.dispose(); + super.dispose(); + } + + void _onInputChanged() { + final provider = Provider.of(context, listen: false); + provider.calculateBMRAndCalories( + heightText: _heightController.text, + weightText: _weightController.text, + ageText: _ageController.text, + heightUnit: selectedHeightUnit, + weightUnit: selectedWeightUnit, + gender: selectedGender, + activityLevel: selectedActivityLevel, + ); + if (widget.onChange != null) widget.onChange!(provider.caloriesResultMap); + } + + @override + Widget build(BuildContext context) { + DialogService dialogService = getIt(); + AppState appState = getIt(); + + return Consumer(builder: (context, provider, _) { + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.gender, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Select Gender".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedGender.toCamelCase.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + ], + ), + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down), + SizedBox(width: 4.w), + ], + ).paddingSymmetrical(0.w, 16.w).onPress(() { + List _genders = ["Male", "Female"]; + + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Gender".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _genders.length, + itemBuilder: (context, index) { + final unit = _genders[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedGender, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedGender = value; + }); + _onInputChanged(); + Navigator.of(context).pop(); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toCamelCase.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedGender = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Age (11-120) yrs".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _ageController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '20', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Height".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _heightController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '175', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedHeightUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _heightUnits.length, + itemBuilder: (context, index) { + final unit = _heightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedHeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedHeightUnit = value; + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedHeightUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Weight".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _weightController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '75', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black87, + height: 1.0, + ), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedWeightUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _weightUnits.length, + itemBuilder: (context, index) { + final unit = _weightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedWeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedWeightUnit = value; + }); + _onInputChanged(); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedWeightUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Activity Level".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedActivityLevel.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + ], + ), + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down), + SizedBox(width: 4.w), + ], + ).paddingSymmetrical(0.w, 16.w).onPress(() { + List _activity = ["Almost Inactive (no exercise)", "Lightly active", "Lightly active (1-3) days per week", "Super active (very hard exercise)"]; + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Activity Level".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _activity.length, + itemBuilder: (context, index) { + final unit = _activity[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedActivityLevel, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedActivityLevel = value; + }); + _onInputChanged(); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toCamelCase.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedActivityLevel = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), + SizedBox(width: 12.w), + Expanded( + child: "Calculates daily calorie intake based on server factors, like height, weight, age, gender and daily physical activity." + .toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + ), + ); + }); + } +} diff --git a/lib/presentation/health_calculators/widgets/crabs.dart b/lib/presentation/health_calculators/widgets/crabs.dart new file mode 100644 index 0000000..3fa1bdf --- /dev/null +++ b/lib/presentation/health_calculators/widgets/crabs.dart @@ -0,0 +1,198 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/presentation/health_calculators/health_calculator_detailed_page.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; + +class CrabsWidget extends StatefulWidget { + Function(dynamic result)? onChange; + + CrabsWidget({super.key, required this.onChange}); + + @override + _CrabsWidgetState createState() => _CrabsWidgetState(); +} + +class _CrabsWidgetState extends State { + final TextEditingController _caloriesController = TextEditingController(); + String selectedDietType = 'Very Low Crabs'; + Function(String)? onUnitSelected; + + @override + void initState() { + super.initState(); + _caloriesController.addListener(_onInputChanged); + } + + @override + void dispose() { + _caloriesController.removeListener(_onInputChanged); + _caloriesController.dispose(); + super.dispose(); + } + + void _onInputChanged() { + final provider = Provider.of(context, listen: false); + provider.calculateMacros(caloriesText: _caloriesController.text, selectedDietType: selectedDietType); + if (widget.onChange != null) widget.onChange!(provider.macrosResultMap); + } + + @override + Widget build(BuildContext context) { + DialogService dialogService = getIt(); + + return Consumer(builder: (context, provider, _) { + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Calories Per Day".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _caloriesController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '2000', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + Utils.buildSvgWithAssets(icon: AppAssets.ask_doctor_icon).onPress(() { + Navigator.pop(context); + Navigator.of(context).push(CustomPageRoute(page: HealthCalculatorDetailedPage(calculatorType: HealthCalculatorsTypeEnum.calories))); + }), + SizedBox(width: 4.w), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Diet Type".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedDietType.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + ], + ), + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down), + SizedBox(width: 4.w), + ], + ).paddingSymmetrical(0.w, 16.w).onPress(() { + List _activity = ["Very Low Crabs", "Low Crabs", "Moderate Crabs", "USDA Guidelines ", "Zone Diet"]; + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Diet Type".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _activity.length, + itemBuilder: (context, index) { + final unit = _activity[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedDietType, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedDietType = value; + _onInputChanged(); + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toCamelCase.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedDietType = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), + SizedBox(width: 12.w), + Expanded( + child: "Calculate carbohydrate based protein and fat ration in calories and grams according to a pre set ratio." + .toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + ), + ); + }); + } +} diff --git a/lib/presentation/health_calculators/widgets/dduedate.dart b/lib/presentation/health_calculators/widgets/dduedate.dart new file mode 100644 index 0000000..91057aa --- /dev/null +++ b/lib/presentation/health_calculators/widgets/dduedate.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; + +class DeliveryDueDWidget extends StatefulWidget { + final Function(dynamic result)? onChange; + + DeliveryDueDWidget({super.key, required this.onChange}); + + @override + _DeliveryDueDWidgetState createState() => _DeliveryDueDWidgetState(); +} + +class _DeliveryDueDWidgetState extends State { + final TextEditingController _date = TextEditingController(); + String selectedDate = ''; + Function(String)? onUnitSelected; + + @override + Widget build(BuildContext context) { + final provider = Provider.of(context); + + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 0.h, bottom: 0.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + TextInputWidget( + labelText: "Date", + hintText: "11 July, 1994".needTranslation, + controller: _date, + focusNode: FocusNode(), + isEnable: true, + prefix: null, + isAllowRadius: true, + isBorderAllowed: false, + isAllowLeadingIcon: true, + padding: EdgeInsets.symmetric(vertical: 8.h), + leadingIcon: AppAssets.birthday_cake, + selectionType: SelectionTypeEnum.calendar, + isHideSwitcher: true, + onCalendarTypeChanged: (val) {}, + onChange: (val) { + if (val == null) return; + + setState(() { + selectedDate = Utils.formatDateToDisplay(val); + _date.text = selectedDate; + }); + + // provider expects ISO date string to calculate due date + provider.calculateDueDate(isoDateString: val); + + if (widget.onChange != null) { + widget.onChange!(provider.deliveryResult); + } + }, + ).withVerticalPadding(4.h), + ], + ), + ); + } +} diff --git a/lib/presentation/health_calculators/widgets/health_card.dart b/lib/presentation/health_calculators/widgets/health_card.dart new file mode 100644 index 0000000..c8603e9 --- /dev/null +++ b/lib/presentation/health_calculators/widgets/health_card.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart'; + +class HealthCard extends StatelessWidget { + const HealthCard({ + super.key, + required this.icon, + required this.labelText, + this.onTap, + }); + + final String icon; + final String labelText; + final VoidCallback? onTap; + + @override + Widget build(BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets( + icon: icon, + width: 40.w, + height: 40.h, + fit: BoxFit.cover, + ).toShimmer2(isShow: false, radius: 12.r), + SizedBox(height: 14.h), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Flexible( + child: labelText.toText12( + fontWeight: FontWeight.w600, + maxLine: 2, + )), + ], + ), + ], + ).paddingAll(16.w).onPress(() { + onTap!(); + }), + ); + } +} diff --git a/lib/presentation/health_calculators/widgets/ibw.dart b/lib/presentation/health_calculators/widgets/ibw.dart new file mode 100644 index 0000000..0e3f725 --- /dev/null +++ b/lib/presentation/health_calculators/widgets/ibw.dart @@ -0,0 +1,393 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/services/dialog_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; + +class IdealBodyWeightWidget extends StatefulWidget { + Function(dynamic result)? onChange; + + IdealBodyWeightWidget({super.key, required this.onChange}); + + @override + _IdealBodyWeightWidgetState createState() => _IdealBodyWeightWidgetState(); +} + +class _IdealBodyWeightWidgetState extends State { + final TextEditingController _heightController = TextEditingController(); + final TextEditingController _weightController = TextEditingController(); + final List _heightUnits = ['cm', 'm', 'ft', 'in']; + final List _weightUnits = ['kg', 'lb']; + String selectedHeightUnit = 'cm'; + String selectedWeightUnit = 'kg'; + String selectedBodyFrameSize = 'Medium (fingers touch)'; + Function(String)? onUnitSelected; + + @override + void initState() { + super.initState(); + _heightController.addListener(_onInputChanged); + _weightController.addListener(_onInputChanged); + } + + @override + void dispose() { + _heightController.removeListener(_onInputChanged); + _weightController.removeListener(_onInputChanged); + _heightController.dispose(); + _weightController.dispose(); + super.dispose(); + } + + void _onInputChanged() { + final provider = Provider.of(context, listen: false); + provider.calculateIBW( + heightText: _heightController.text, + weightText: _weightController.text, + heightUnit: selectedHeightUnit, + weightUnit: selectedWeightUnit, + bodyFrameSize: selectedBodyFrameSize, + ); + if (widget.onChange != null) widget.onChange!(provider.ibwResultMap); + } + + @override + Widget build(BuildContext context) { + DialogService dialogService = getIt(); + + return Consumer(builder: (context, provider, _) { + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Height".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _heightController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '175', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedHeightUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _heightUnits.length, + itemBuilder: (context, index) { + final unit = _heightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedHeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedHeightUnit = value; + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedHeightUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Weight".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _weightController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '75', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black87, + height: 1.0, + ), + ), + ) + ], + ), + ), + Container( + width: 1.w, + height: 30.w, + color: Color(0xFFEAEAEB), + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedWeightUnit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Unit".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _weightUnits.length, + itemBuilder: (context, index) { + final unit = _weightUnits[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedWeightUnit, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedWeightUnit = value; + }); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toUpperCase().toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedWeightUnit = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Body Frame Size".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + selectedBodyFrameSize.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + ], + ), + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down), + SizedBox(width: 4.w), + ], + ).paddingSymmetrical(0.w, 16.w).onPress(() { + List _activity = ["Small (fingers overlaps)", "Medium (fingers touch)", "Large (fingers don't touch)"]; + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Body Frame Size".needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: _activity.length, + itemBuilder: (context, index) { + final unit = _activity[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: 70, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: unit, + groupValue: selectedBodyFrameSize, + activeColor: AppColors.errorColor, + onChanged: (String? value) { + if (value == null) return; + setState(() { + selectedBodyFrameSize = value; + }); + Navigator.pop(context); + }, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + unit.toCamelCase.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, + ], + ).onPress(() { + setState(() { + selectedBodyFrameSize = unit; + _onInputChanged(); + }); + Navigator.pop(context); + }), + ), + ], + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1, color: Color(0xFFEEEEEE)); + }, + ), + ), + onOkPressed: () {}, + ); + }), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), + SizedBox(width: 12.w), + Expanded( + child: "Calculates the ideal body weight based on height, weight and body size.".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + ), + ); + }); + } +} diff --git a/lib/presentation/health_calculators/widgets/ovulation.dart b/lib/presentation/health_calculators/widgets/ovulation.dart new file mode 100644 index 0000000..476bf72 --- /dev/null +++ b/lib/presentation/health_calculators/widgets/ovulation.dart @@ -0,0 +1,186 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; + +class OvulationWidget extends StatefulWidget { + Function(dynamic result)? onChange; + + OvulationWidget({super.key, required this.onChange}); + + @override + _OvulationWidgetState createState() => _OvulationWidgetState(); +} + +class _OvulationWidgetState extends State { + final TextEditingController _ageController = TextEditingController(); + final TextEditingController _cycleLengthController = TextEditingController(); + final TextEditingController _lutealPhaseLengthController = TextEditingController(); + Function(String)? onUnitSelected; + String selectedDate = ''; + + @override + void initState() { + super.initState(); + _ageController.addListener(_onInputChanged); + _cycleLengthController.addListener(_onInputChanged); + _lutealPhaseLengthController.addListener(_onInputChanged); + } + + @override + void dispose() { + _ageController.removeListener(_onInputChanged); + _cycleLengthController.removeListener(_onInputChanged); + _lutealPhaseLengthController.removeListener(_onInputChanged); + _ageController.dispose(); + _cycleLengthController.dispose(); + _lutealPhaseLengthController.dispose(); + super.dispose(); + } + + void _onInputChanged() { + final provider = Provider.of(context, listen: false); + final dateText = selectedDate.isEmpty ? _ageController.text.trim() : selectedDate; + provider.calculateOvulation(dateText: dateText, cycleLengthText: _cycleLengthController.text, lutealPhaseText: _lutealPhaseLengthController.text); + if (widget.onChange != null) widget.onChange!(provider.ovulationResult); + } + + @override + Widget build(BuildContext context) { + return Consumer(builder: (context, provider, _) { + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + TextInputWidget( + labelText: "Date", + hintText: "11 July, 1994".needTranslation, + controller: _ageController, + isEnable: true, + prefix: null, + isAllowRadius: true, + isBorderAllowed: false, + isAllowLeadingIcon: true, + padding: EdgeInsets.symmetric(vertical: 8.h), + leadingIcon: AppAssets.birthday_cake, + selectionType: SelectionTypeEnum.calendar, + isHideSwitcher: true, + onCalendarTypeChanged: (val) {}, + onChange: (val) { + if (val == null) return; + setState(() { + _ageController.text = selectedDate = Utils.formatDateToDisplay(val!); + }); + _onInputChanged(); + }, + ).withVerticalPadding(8), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Average Cycle Length (Usually 28 days)".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _cycleLengthController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '15', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + SizedBox(width: 12.w), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Average Luteal Phase Length(Usually 14 days)".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: TextField( + controller: _lutealPhaseLengthController, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14, + textAlignVertical: TextAlignVertical.center, + decoration: const InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: '10', + hintStyle: TextStyle(color: Colors.grey), + ), + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), + ), + ) + ], + ), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + if (provider.ovulationResult != null) ...[ + Divider(height: 1, color: Color(0xFFEEEEEE)), + // show result UI same as before; keeping unchanged design + Row( + children: [ + Expanded(child: Text('Last Period: ${provider.ovulationResult!['lastPeriodDate'] ?? ''}')), + Expanded(child: Text('Ovulation: ${provider.ovulationResult!['ovulationDate'] ?? ''}')), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), + SizedBox(width: 12.w), + Expanded( + child: "Calculate ovulation and fertile window based on last period, cycle length and luteal phase.".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + ), + ); + }); + } +} diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index fd6e976..18cf614 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -51,11 +51,21 @@ class ServicesPage extends StatelessWidget { bgColor: Colors.orange, textColor: AppColors.blackColor, route: null, - onTap:(){ + onTap: () { Utils.openWebView( url: 'https://hmgwebservices.com/vt_mobile/html/index.html', ); }, + ), + HmgServicesComponentModel( + 12, + "Health Calculators".needTranslation, + "".needTranslation, + AppAssets.calendar, + true, + bgColor: Colors.blueAccent, + textColor: AppColors.blackColor, + route: AppRoutes.healthCalculatorsPage, ) ]; @@ -65,7 +75,7 @@ class ServicesPage extends StatelessWidget { title: "Explore Services".needTranslation, isLeading: Navigator.canPop(context), child: Padding( - padding: EdgeInsets.symmetric(horizontal: 24.h), + padding: EdgeInsets.symmetric(horizontal: 24.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/presentation/hmg_services/services_view.dart b/lib/presentation/hmg_services/services_view.dart index 2cd923f..e443647 100644 --- a/lib/presentation/hmg_services/services_view.dart +++ b/lib/presentation/hmg_services/services_view.dart @@ -49,7 +49,7 @@ class ServiceGridViewItem extends StatelessWidget { hmgServiceComponentModel.title.toText12( fontWeight: FontWeight.w500, color: hmgServiceComponentModel.textColor, - maxLine: 1, + maxLine: 2, ), ], )); diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index ed5c0db..556d535 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -4,6 +4,7 @@ import 'package:hmg_patient_app_new/presentation/authentication/register.dart'; import 'package:hmg_patient_app_new/presentation/authentication/register_step2.dart'; import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/comprehensive_checkup_page.dart'; import 'package:hmg_patient_app_new/presentation/e_referral/new_e_referral.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculators_page.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; @@ -19,6 +20,7 @@ class AppRoutes { static const String medicalFilePage = '/medicalFilePage'; static const String eReferralPage = '/erReferralPage'; static const String comprehensiveCheckupPage = '/comprehensiveCheckupPage'; + static const String healthCalculatorsPage = '/healthCalculatorsPage'; static const String homeHealthCarePage = '/homeHealthCarePage'; static const String zoomCallPage = '/zoomCallPage'; @@ -32,6 +34,8 @@ class AppRoutes { eReferralPage: (context) => NewReferralPage(), comprehensiveCheckupPage: (context) => ComprehensiveCheckupPage(), homeHealthCarePage: (context) => HhcProceduresPage(), - zoomCallPage: (context) => CallScreen() + zoomCallPage: (context) => CallScreen(), + healthCalculatorsPage: (context) => HealthCalculatorsPage() + }; } diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index c1a38ab..635a0bb 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -48,6 +48,7 @@ class TextInputWidget extends StatelessWidget { final int minLines; final int maxLines; final Color? hintColor; + final bool? isHideSwitcher; // final List countryList; // final Function(Country)? onCountryChange; @@ -85,6 +86,7 @@ class TextInputWidget extends StatelessWidget { this.isMultiline = false, this.minLines = 3, this.maxLines = 6, + this.isHideSwitcher, // this.countryList = const [], // this.onCountryChange, }); @@ -214,6 +216,7 @@ class TextInputWidget extends StatelessWidget { switcherIcon: Utils.buildSvgWithAssets(icon: AppAssets.language, width: 24.h, height: 24.h), language: appState.getLanguageCode()!, initialDate: DateTime.now(), + showCalendarToggle: isHideSwitcher == true ? false : true, fontFamily: appState.getLanguageCode() == "ar" ? "GESSTwo" : "Poppins", okWidget: Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.confirm, width: 24.h, height: 24.h)), cancelWidget: Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.cancel, iconColor: Colors.white, width: 24.h, height: 24.h)), From 3060c572019843d7b444da7732a912e32ba8071e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 15 Dec 2025 10:59:54 +0300 Subject: [PATCH 22/55] updates --- android/app/build.gradle.kts | 4 ++-- android/settings.gradle.kts | 3 ++- lib/core/api_consts.dart | 2 +- lib/core/utils/size_utils.dart | 4 ++-- .../appointments/widgets/appointment_card.dart | 12 +++++++----- .../widgets/appointment_doctor_card.dart | 2 +- .../book_appointment/book_appointment_page.dart | 2 +- lib/presentation/contact_us/feedback_page.dart | 2 +- lib/presentation/hmg_services/services_page.dart | 4 ++-- lib/presentation/home/landing_page.dart | 2 +- .../widgets/medical_file_appointment_card.dart | 2 +- lib/routes/app_routes.dart | 1 - lib/splashPage.dart | 2 +- 13 files changed, 22 insertions(+), 20 deletions(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 226d4dd..0ffb97d 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -26,8 +26,8 @@ android { applicationId = "com.ejada.hmg" // minSdk = 24 minSdk = 26 - targetSdk = 35 - compileSdk = 35 + targetSdk = 36 + compileSdk = 36 // targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index ab39a10..3e6502f 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -18,7 +18,8 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.7.3" apply false +// id("com.android.application") version "8.7.3" apply false + id("com.android.application") version "8.9.3" apply false id("org.jetbrains.kotlin.android") version "2.1.0" apply false } diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index d284b5c..acfbbc0 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -703,7 +703,7 @@ var GET_PRESCRIPTION_INSTRUCTIONS_PDF = 'Services/ChatBot_Service.svc/REST/Chatb class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/core/utils/size_utils.dart b/lib/core/utils/size_utils.dart index fdd0d30..8a0703e 100644 --- a/lib/core/utils/size_utils.dart +++ b/lib/core/utils/size_utils.dart @@ -27,7 +27,7 @@ extension ResponsiveExtension on num { double clamp; if (SizeUtils.deviceType == DeviceType.tablet || _isFoldable) { // More conservative scaling for tablets and foldables - clamp = (aspectRatio > 1.5 || aspectRatio < 0.67) ? 1.4 : 1.1; + clamp = (aspectRatio > 1.5 || aspectRatio < 0.67) ? 1.6 : 1.4; } else { // Original logic for phones clamp = (aspectRatio > 1.3 || aspectRatio < 0.77) ? 1.6 : 1.2; @@ -68,7 +68,7 @@ extension ResponsiveExtension on num { double get r { double baseScale = (this * _screenWidth) / figmaDesignWidth; - if (_isFoldable) { + if (_isFoldable || isTablet) { // Use the same logic as enhanced width for foldables double scale = _screenWidth / figmaDesignWidth; scale = scale.clamp(0.8, 1.4); diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index b4d327b..9bf16f3 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -129,7 +129,7 @@ class AppointmentCard extends StatelessWidget { children: [ Image.network( isLoading ? 'https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png' : patientAppointmentHistoryResponseModel.doctorImageURL!, - width: 63.w, + width: 63.h, height: 63.h, fit: BoxFit.cover, ).circle(100.r).toShimmer2(isShow: isLoading), @@ -238,7 +238,8 @@ class AppointmentCard extends StatelessWidget { fontWeight: FontWeight.w500, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), - height: isTablet || isFoldable ? 46.h : 40.h, + // height: isTablet || isFoldable ? 46.h : 40.h, + height: 40.h, icon: AppAssets.checkmark_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, @@ -264,7 +265,7 @@ class AppointmentCard extends StatelessWidget { fontWeight: FontWeight.w500, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), - height: isTablet || isFoldable ? 46.h : 40.h, + height: 40.h, icon: AppointmentType.getNextActionIcon(patientAppointmentHistoryResponseModel.nextAction), iconColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), iconSize: 15.h, @@ -336,7 +337,8 @@ class AppointmentCard extends StatelessWidget { fontWeight: FontWeight.w500, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), - height: isTablet || isFoldable ? 46.h : 40.h, + // height: isTablet || isFoldable ? 46.h : 40.h, + height: 40.h, icon: AppAssets.ask_doctor_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, @@ -353,7 +355,7 @@ class AppointmentCard extends StatelessWidget { fontWeight: FontWeight.w500, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), - height: isTablet || isFoldable ? 46.h : 40.h, + height: 40.h, icon: AppAssets.rebook_appointment_icon, iconColor: AppColors.blackColor, iconSize: 16.h, diff --git a/lib/presentation/appointments/widgets/appointment_doctor_card.dart b/lib/presentation/appointments/widgets/appointment_doctor_card.dart index 405aa14..6b5dde7 100644 --- a/lib/presentation/appointments/widgets/appointment_doctor_card.dart +++ b/lib/presentation/appointments/widgets/appointment_doctor_card.dart @@ -47,7 +47,7 @@ class AppointmentDoctorCard extends StatelessWidget { children: [ Image.network( patientAppointmentHistoryResponseModel.doctorImageURL!, - width: 63.w, + width: 63.h, height: 63.h, fit: BoxFit.cover, ).circle(100.r), diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart index a27e76d..4d24da7 100644 --- a/lib/presentation/book_appointment/book_appointment_page.dart +++ b/lib/presentation/book_appointment/book_appointment_page.dart @@ -144,7 +144,7 @@ class _BookAppointmentPageState extends State { children: [ Image.network( myAppointmentsVM.patientMyDoctorsList[index].doctorImageURL!, - width: 64.w, + width: 64.h, height: 64.h, fit: BoxFit.cover, ).circle(100).toShimmer2(isShow: false, radius: 50.r), diff --git a/lib/presentation/contact_us/feedback_page.dart b/lib/presentation/contact_us/feedback_page.dart index db7c218..7160179 100644 --- a/lib/presentation/contact_us/feedback_page.dart +++ b/lib/presentation/contact_us/feedback_page.dart @@ -349,7 +349,7 @@ class FeedbackPage extends StatelessWidget { fontWeight: FontWeight.w500, borderRadius: 10.r, padding: EdgeInsets.symmetric(horizontal: 10.w), - height: isTablet || isFoldable ? 46.h : 40.h, + height: 40.h, icon: AppAssets.file_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 76f0269..001af4c 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -179,7 +179,7 @@ class ServicesPage extends StatelessWidget { SizedBox(height: 16.h), GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 4, // 4 icons per row + crossAxisCount: (isFoldable || isTablet) ? 6 : 4, // 4 icons per row crossAxisSpacing: 12.w, mainAxisSpacing: 18.h, childAspectRatio: 0.8, @@ -342,7 +342,7 @@ class ServicesPage extends StatelessWidget { SizedBox(height: 16.h), GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 4, // 4 icons per row + crossAxisCount:(isFoldable || isTablet) ? 6 : 4, // 4 icons per row crossAxisSpacing: 12.w, mainAxisSpacing: 18.h, childAspectRatio: 0.8, diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index f9ea1ee..ae2e4a6 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -478,7 +478,7 @@ class _LandingPageState extends State { padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0), icon: AppAssets.add_icon, iconColor: AppColors.primaryRedColor, - height: 46.h, + height: 40.h, ), ], ), diff --git a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart index 1b09dd5..fbe79bb 100644 --- a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart +++ b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart @@ -173,7 +173,7 @@ class MedicalFileAppointmentCard extends StatelessWidget { backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index f33199d..d25a9de 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -79,7 +79,6 @@ class AppRoutes { huaweiHealthExample: (context) => HuaweiHealthExample(), // - zoomCallPage: (context) => CallScreen(), healthCalculatorsPage: (context) => HealthCalculatorsPage() }; diff --git a/lib/splashPage.dart b/lib/splashPage.dart index b5b752b..9aa16ee 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -218,7 +218,7 @@ class _SplashScreenState extends State { // AppSharedPreferences().setString(APP_LANGUAGE, projectProvider.isArabic ? "ar" : "en"); // var themeNotifier = Provider.of(context, listen: false); // themeNotifier.setTheme(defaultTheme(fontName: projectProvider.isArabic ? 'Cairo' : 'Poppins')); - PushNotificationHandler().init(context); // Asyncronously + // PushNotificationHandler().init(context); // Asyncronously } @override From fe294ae8f62ed677b5486470d7a18803de78078a Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 15 Dec 2025 11:16:44 +0300 Subject: [PATCH 23/55] updates --- .../health_calculator_result.dart | 16 ++++++++++++++++ .../health_calculators_page.dart | 13 ------------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/lib/presentation/health_calculators/health_calculator_result.dart b/lib/presentation/health_calculators/health_calculator_result.dart index 5315a89..5abe410 100644 --- a/lib/presentation/health_calculators/health_calculator_result.dart +++ b/lib/presentation/health_calculators/health_calculator_result.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; @@ -5,8 +6,10 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/generated/locale_keys.g.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'; class HealthCalculatorResultPage extends StatelessWidget { HealthCalculatorsTypeEnum calculatorType; @@ -18,6 +21,19 @@ class HealthCalculatorResultPage extends StatelessWidget { Widget build(BuildContext context) { return CollapsingListView( title: "Your ${calculatorType.name.toCamelCase}", + bottomChild: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.only(topLeft: Radius.circular(24.r), topRight: Radius.circular(24.r))), + padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.h), + child: CustomButton( + text: LocaleKeys.bookAppo.tr(), + onPressed: () {}, + icon: null, + fontSize: 16.f, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + borderRadius: 12.r, + fontWeight: FontWeight.w500), + ), child: getCalculatorResultWidget(type: calculatorType, calculatedResult: calculatedResult).paddingSymmetrical(18.w, 24.h), ); } diff --git a/lib/presentation/health_calculators/health_calculators_page.dart b/lib/presentation/health_calculators/health_calculators_page.dart index ab37c2c..8ac7a22 100644 --- a/lib/presentation/health_calculators/health_calculators_page.dart +++ b/lib/presentation/health_calculators/health_calculators_page.dart @@ -10,25 +10,12 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/hmg_services/hmg_services_view_model.dart'; -import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_all_orders_resp_model.dart'; -import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_services_resp_model.dart'; -import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/cmc_order_detail_page.dart'; -import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/cmc_selection_review_page.dart'; -import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/widgets/cmc_ui_selection_helper.dart'; import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_detailed_page.dart'; import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/health_card.dart'; -import 'package:hmg_patient_app_new/presentation/hmg_services/services_view.dart'; import 'package:hmg_patient_app_new/services/dialog_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/chip/app_custom_chip_widget.dart'; -import 'package:hmg_patient_app_new/widgets/media_viewer/full_screen_image_viewer.dart'; -import 'package:hmg_patient_app_new/widgets/radio_list_tile_widget.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:provider/provider.dart'; -import 'package:shimmer/shimmer.dart'; class HealthCalculatorsPage extends StatefulWidget { const HealthCalculatorsPage({super.key}); From 68e1b116f962665eec61b79d243577235286225b Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Mon, 15 Dec 2025 11:17:30 +0300 Subject: [PATCH 24/55] last rated updated. --- assets/images/svg/E_Referral.svg | 9 +++++++++ assets/images/svg/file.svg | 1 + assets/images/svg/files.svg | 14 ++++++++++++++ assets/images/svg/gallery.svg | 11 +++++++++++ assets/images/svg/open_camera.svg | 7 +++++++ assets/images/svg/rate_1.svg | 3 +++ assets/images/svg/rate_2.svg | 3 +++ assets/images/svg/rate_3.svg | 3 +++ assets/images/svg/rate_4.svg | 3 +++ assets/images/svg/rate_5.svg | 3 +++ lib/core/app_state.dart | 6 +++++- lib/presentation/home/landing_page.dart | 14 ++++++++++---- 12 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 assets/images/svg/E_Referral.svg create mode 100644 assets/images/svg/file.svg create mode 100644 assets/images/svg/files.svg create mode 100644 assets/images/svg/gallery.svg create mode 100644 assets/images/svg/open_camera.svg create mode 100644 assets/images/svg/rate_1.svg create mode 100644 assets/images/svg/rate_2.svg create mode 100644 assets/images/svg/rate_3.svg create mode 100644 assets/images/svg/rate_4.svg create mode 100644 assets/images/svg/rate_5.svg diff --git a/assets/images/svg/E_Referral.svg b/assets/images/svg/E_Referral.svg new file mode 100644 index 0000000..fb6b859 --- /dev/null +++ b/assets/images/svg/E_Referral.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/file.svg b/assets/images/svg/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/assets/images/svg/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/svg/files.svg b/assets/images/svg/files.svg new file mode 100644 index 0000000..dfc862e --- /dev/null +++ b/assets/images/svg/files.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/images/svg/gallery.svg b/assets/images/svg/gallery.svg new file mode 100644 index 0000000..ec1c45e --- /dev/null +++ b/assets/images/svg/gallery.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/images/svg/open_camera.svg b/assets/images/svg/open_camera.svg new file mode 100644 index 0000000..171452a --- /dev/null +++ b/assets/images/svg/open_camera.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/svg/rate_1.svg b/assets/images/svg/rate_1.svg new file mode 100644 index 0000000..8e1c2f2 --- /dev/null +++ b/assets/images/svg/rate_1.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/rate_2.svg b/assets/images/svg/rate_2.svg new file mode 100644 index 0000000..9500556 --- /dev/null +++ b/assets/images/svg/rate_2.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/rate_3.svg b/assets/images/svg/rate_3.svg new file mode 100644 index 0000000..7c9d0f5 --- /dev/null +++ b/assets/images/svg/rate_3.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/rate_4.svg b/assets/images/svg/rate_4.svg new file mode 100644 index 0000000..7f82267 --- /dev/null +++ b/assets/images/svg/rate_4.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/rate_5.svg b/assets/images/svg/rate_5.svg new file mode 100644 index 0000000..a7308ba --- /dev/null +++ b/assets/images/svg/rate_5.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/core/app_state.dart b/lib/core/app_state.dart index c8659a7..1bb1c5a 100644 --- a/lib/core/app_state.dart +++ b/lib/core/app_state.dart @@ -45,7 +45,7 @@ class AppState { bool isChildLoggedIn = false; bool isGMSAvailable = true; bool isAndroid = true; - + bool isRatedVisible =false; void setAuthenticatedUser(AuthenticatedUser? authenticatedUser, {bool isFamily = false}) { if (isFamily) { _authenticatedChildUser = authenticatedUser; @@ -172,4 +172,8 @@ class AppState { userLong = 0.0; userLong = 0.0; } + + setRatedVisible(bool value) { + isRatedVisible = value; + } } diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index d49e2d0..7ed3b33 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -107,17 +107,23 @@ class _LandingPageState extends State { prescriptionsViewModel.initPrescriptionsViewModel(); insuranceViewModel.initInsuranceProvider(); emergencyServicesViewModel.checkPatientERAdvanceBalance(); + if(!appState.isRatedVisible) { appointmentRatingViewModel.getLastRatingAppointment(onSuccess: (response) { if (appointmentRatingViewModel.appointmentRatedList.isNotEmpty) { appointmentRatingViewModel.getAppointmentDetails(appointmentRatingViewModel.appointmentRatedList.last.appointmentNo!, appointmentRatingViewModel.appointmentRatedList.last.projectID!, onSuccess: ((response) { - appointmentRatingViewModel.setClinicOrDoctor(false); - appointmentRatingViewModel.setTitle("Rate Doctor".needTranslation); - appointmentRatingViewModel.setSubTitle("How was your last visit with doctor?".needTranslation); - openLastRating(); + + appointmentRatingViewModel.setClinicOrDoctor(false); + appointmentRatingViewModel.setTitle("Rate Doctor".needTranslation); + appointmentRatingViewModel.setSubTitle("How was your last visit with doctor?".needTranslation); + openLastRating(); + appState.setRatedVisible(true); + })); + } }); + } } }); super.initState(); From a80410d64b921643a70184d8153ff3db04a120dc Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 15 Dec 2025 12:53:26 +0300 Subject: [PATCH 25/55] LiveCare flow from clinic selection implemented --- lib/core/api_consts.dart | 3 -- .../widgets/appointment_card.dart | 15 +++--- .../book_appointment/select_clinic_page.dart | 4 +- .../select_livecare_clinic_page.dart | 48 ++++++++++++++++++- .../health_calculator_result.dart | 31 +++++++++++- .../hmg_services/services_page.dart | 4 +- .../insurance/insurance_home_page.dart | 2 +- .../smartwatch_instructions_page.dart | 28 ++++++----- 8 files changed, 106 insertions(+), 29 deletions(-) diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index acfbbc0..1f92ad5 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -454,8 +454,6 @@ var GET_ANCILLARY_ORDERS_DETAILS = 'Services/Doctors.svc/REST/GetOnlineAncillary //Pharmacy wishlist // var GET_WISHLIST = "http://swd-pharapp-01:7200/api/shopping_cart_items/"; -var GET_DOCTOR_LIST_BY_TIME = "Services/Doctors.svc/REST/SearchDoctorsByTime"; - // pharmacy var PHARMACY_AUTORZIE_CUSTOMER = "AutorizeCustomer"; var PHARMACY_VERIFY_CUSTOMER = "VerifyCustomer"; @@ -553,7 +551,6 @@ var GET_FINAL_PRODUCTS = 'products?fields=id,reviews,discount_ids,name,namen,localized_names,display_order,short_description,full_description,full_descriptionn,sku,order_minimum_quantity,order_maximum_quantity,price,old_price,images,is_rx,rx_message,rx_messagen,discount_name,discount_namen,approved_rating_sum,approved_total_reviews,allow_back_in_stock_subscriptions,stock_quantity,stock_availability,stock_availabilityn,discount_percentage&CategoryId='; var GET_CLINIC_CATEGORY = 'Services/Doctors.svc/REST/DP_GetClinicCategory'; var GET_DISEASE_BY_CLINIC_ID = 'Services/Doctors.svc/REST/DP_GetDiseasesByClinicID'; -var SEARCH_DOCTOR_BY_TIME = 'Services/Doctors.svc/REST/SearchDoctorsByTime'; var TIMER_MIN = 10; diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index cd1cec8..a35c1ca 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -188,13 +188,14 @@ class AppointmentCard extends StatelessWidget { ? 'Cardiology' : "${DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false)} ${DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false)}", ).toShimmer2(isShow: isLoading), - AppCustomChipWidget( - labelPadding: EdgeInsetsDirectional.only(start: -2.w, end: 6.w), - isIconPNG: true, - icon: getIt.get().getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg, - iconSize: 18.h, - labelText: isLoading ? 'Cardiology' : "Patient: ${getIt.get().getAuthenticatedUser()!.firstName!}", - ).toShimmer2(isShow: isLoading), + + // AppCustomChipWidget( + // labelPadding: EdgeInsetsDirectional.only(start: -2.w, end: 6.w), + // isIconPNG: true, + // icon: getIt.get().getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg, + // iconSize: 18.h, + // labelText: isLoading ? 'Cardiology' : "Patient: ${getIt.get().getAuthenticatedUser()!.firstName!}", + // ).toShimmer2(isShow: isLoading), // if (!isFromMedicalReport) // AppCustomChipWidget( // icon: AppAssets.appointment_time_icon, diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart index d0bd740..df2f85a 100644 --- a/lib/presentation/book_appointment/select_clinic_page.dart +++ b/lib/presentation/book_appointment/select_clinic_page.dart @@ -212,7 +212,9 @@ class _SelectClinicPageState extends State { CustomPageRoute( page: SelectLivecareClinicPage(onNegativeClicked: (){ handleDoctorScreen(clinic); - },), + }, + selectedClinic: clinic, + ), ), ); } else { diff --git a/lib/presentation/book_appointment/select_livecare_clinic_page.dart b/lib/presentation/book_appointment/select_livecare_clinic_page.dart index 719452d..2362617 100644 --- a/lib/presentation/book_appointment/select_livecare_clinic_page.dart +++ b/lib/presentation/book_appointment/select_livecare_clinic_page.dart @@ -1,22 +1,37 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/book_appointments/models/resp_models/get_clinic_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; +import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.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'; class SelectLivecareClinicPage extends StatelessWidget { final VoidCallback? onNegativeClicked; - const SelectLivecareClinicPage({super.key, this.onNegativeClicked}); + late GetClinicsListResponseModel selectedClinic; + + SelectLivecareClinicPage({super.key, this.onNegativeClicked, required this.selectedClinic}); + + late ImmediateLiveCareViewModel immediateLiveCareViewModel; @override Widget build(BuildContext context) { + immediateLiveCareViewModel = Provider.of(context, listen: false); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: Column( @@ -103,7 +118,36 @@ class SelectLivecareClinicPage extends StatelessWidget { children: [ CustomButton( text: "Yes please, I am in a hurry".needTranslation, - onPressed: () {}, + onPressed: () async { + Navigator.pop(context); + GetLiveCareClinicListResponseModel liveCareClinic = GetLiveCareClinicListResponseModel( + iD: selectedClinic.liveCareClinicID, + serviceID: selectedClinic.liveCareServiceID, + serviceName: selectedClinic.clinicDescription, + serviceNameN: selectedClinic.clinicDescriptionN, + ); + + immediateLiveCareViewModel.setLiveCareSelectedCallType(1); + immediateLiveCareViewModel.setImmediateLiveCareSelectedClinic(liveCareClinic); + LoaderBottomSheet.showLoader(loadingText: "Fetching fees, Please wait...".needTranslation); + await immediateLiveCareViewModel.getLiveCareImmediateAppointmentFees(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + Navigator.of(getIt.get().navigatorKey.currentContext!).push( + CustomPageRoute( + page: ImmediateLiveCarePaymentDetails(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, textColor: AppColors.whiteColor, diff --git a/lib/presentation/health_calculators/health_calculator_result.dart b/lib/presentation/health_calculators/health_calculator_result.dart index 5abe410..a0a46ae 100644 --- a/lib/presentation/health_calculators/health_calculator_result.dart +++ b/lib/presentation/health_calculators/health_calculator_result.dart @@ -1,15 +1,23 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_clinic_list_response_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/region_bottomsheet/region_list_widget.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:provider/provider.dart'; + +import '../../widgets/common_bottom_sheet.dart'; class HealthCalculatorResultPage extends StatelessWidget { HealthCalculatorsTypeEnum calculatorType; @@ -26,7 +34,15 @@ class HealthCalculatorResultPage extends StatelessWidget { padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.h), child: CustomButton( text: LocaleKeys.bookAppo.tr(), - onPressed: () {}, + onPressed: () { + // Navigate to booking page + var bottomSheetType = RegionBottomSheetType.FOR_CLINIIC; + openRegionListBottomSheet(context, bottomSheetType); + getIt.get().setSelectedClinic( + GetClinicsListResponseModel(clinicID: 108, clinicDescription: "Bariatics", clinicDescriptionN: "Bariatics"), + ); + getIt.get().setIsDoctorsListLoading(true); + }, icon: null, fontSize: 16.f, backgroundColor: AppColors.primaryRedColor, @@ -38,6 +54,19 @@ class HealthCalculatorResultPage extends StatelessWidget { ); } + void openRegionListBottomSheet(BuildContext context, RegionBottomSheetType type) { + getIt.get().setProjectID(null); + + getIt.get().flush(); + getIt.get().setBottomSheetType(type); + showCommonBottomSheetWithoutHeight(context, + title: "", + titleWidget: Consumer(builder: (_, data, __) => LocaleKeys.selectRegion.tr().toText20(weight: FontWeight.w600)), + isDismissible: false, child: Consumer(builder: (_, data, __) { + return RegionBottomSheetBody(); + }), callBackFunc: () {}); + } + Widget getCalculatorResultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { switch (calculatorType) { case HealthCalculatorsTypeEnum.bmi: diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 001af4c..ec993a8 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -155,8 +155,8 @@ class ServicesPage extends StatelessWidget { AppAssets.smartwatch_icon, bgColor: AppColors.whiteColor, true, - // route: AppRoutes.smartWatches, - route: AppRoutes.huaweiHealthExample, + route: AppRoutes.smartWatches, + // route: AppRoutes.huaweiHealthExample, ), ]; diff --git a/lib/presentation/insurance/insurance_home_page.dart b/lib/presentation/insurance/insurance_home_page.dart index cdd9a2e..bacf5e9 100644 --- a/lib/presentation/insurance/insurance_home_page.dart +++ b/lib/presentation/insurance/insurance_home_page.dart @@ -74,7 +74,7 @@ class _InsuranceHomePageState extends State { padding: EdgeInsets.only(top: 24.h), child: PatientInsuranceCard( insuranceCardDetailsModel: insuranceVM.patientInsuranceList.first, - isInsuranceExpired: DateTime.now().isAfter(DateUtil.convertStringToDate(insuranceVM.patientInsuranceList.first.cardValidTo))), + isInsuranceExpired: DateTime.now().isAfter(DateUtil.convertStringToDate(insuranceVM.patientInsuranceList.first.cardValidTo))).paddingSymmetrical(24.w, 0.h), ) : Padding( padding: EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.12), diff --git a/lib/presentation/smartwatches/smartwatch_instructions_page.dart b/lib/presentation/smartwatches/smartwatch_instructions_page.dart index 357f5f5..1c3644b 100644 --- a/lib/presentation/smartwatches/smartwatch_instructions_page.dart +++ b/lib/presentation/smartwatches/smartwatch_instructions_page.dart @@ -4,15 +4,18 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:health/health.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/smartwatches/health_dashboard/health_dashboard.dart'; +import 'package:hmg_patient_app_new/services/dialog_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/routes/custom_page_route.dart'; +import 'package:url_launcher/url_launcher.dart'; class SmartwatchInstructionsPage extends StatelessWidget { const SmartwatchInstructionsPage({super.key}); @@ -178,19 +181,20 @@ class SmartwatchInstructionsPage extends StatelessWidget { await Health().getHealthConnectSdkStatus().then((val) { print('Health Connect SDK Status: $val'); if (val == HealthConnectSdkStatus.sdkAvailable) { - // Navigator.of(context).push( - // FadePage( - // page: HealthDashboard(), // Replace with the actual vital signs page - // // page: HealthApp(), // Replace with the actual vital signs page - // ), - // ); + Navigator.of(context).push( + CustomPageRoute( + page: HealthDashboard(), + ), + ); } else { - // Utils.showAppDialog(context, LocaleKeys.error.tr(context: context), LocaleKeys.healthConnectNotInstalled.tr(), () { - // Navigator.pop(context); - // Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=com.google.android.apps.healthdata"); - // launchUrl(uri, mode: LaunchMode.externalApplication); - // }); - // return; + getIt.get().showErrorBottomSheet( + message: "Seems like you do not have Health Connect App installed. Please install it from the Play Store to sync your health data.".needTranslation, + onOkPressed: () { + Navigator.pop(context); + Uri uri = Uri.parse("https://play.google.com/store/apps/details?id=com.google.android.apps.healthdata"); + launchUrl(uri, mode: LaunchMode.externalApplication); + }); + return; } }); }, From d8c7503c56384cd44286fe098ab60208c211298e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 15 Dec 2025 15:44:20 +0300 Subject: [PATCH 26/55] QLine API implementation enhancements --- lib/core/api_consts.dart | 2 +- lib/core/utils/utils.dart | 7 ++ .../my_appointments_view_model.dart | 15 +++-- .../appointments/appointment_queue_page.dart | 2 +- .../appointment_checkin_bottom_sheet.dart | 2 +- lib/presentation/home/landing_page.dart | 9 +-- .../medical_file/medical_file_page.dart | 33 ++++++++- .../medical_file/widgets/lab_rad_card.dart | 67 +++++-------------- 8 files changed, 72 insertions(+), 65 deletions(-) diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 1f92ad5..9bab873 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -700,7 +700,7 @@ var GET_PRESCRIPTION_INSTRUCTIONS_PDF = 'Services/ChatBot_Service.svc/REST/Chatb class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart index 397adad..38d04b9 100644 --- a/lib/core/utils/utils.dart +++ b/lib/core/utils/utils.dart @@ -925,4 +925,11 @@ class Utils { return ""; } + static bool isDateToday(DateTime dateToCheck) { + final DateTime now = DateTime.now(); + final DateTime today = DateTime(now.year, now.month, now.day); + final DateTime checkDate = DateTime(dateToCheck.year, dateToCheck.month, dateToCheck.day); + + return checkDate == today; + } } diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart index 0653495..d077970 100644 --- a/lib/features/my_appointments/my_appointments_view_model.dart +++ b/lib/features/my_appointments/my_appointments_view_model.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/appointemnet_filters.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart'; @@ -226,7 +227,10 @@ class MyAppointmentsViewModel extends ChangeNotifier { filteredAppointmentList.addAll(patientAppointmentsHistoryList); if (patientArrivedAppointmentsHistoryList.isNotEmpty) { - getPatientAppointmentQueueDetails(appointmentNo: patientArrivedAppointmentsHistoryList.first.appointmentNo, patientID: patientArrivedAppointmentsHistoryList.first.patientID); + if (Utils.isDateToday(DateUtil.convertStringToDate(patientArrivedAppointmentsHistoryList.first.appointmentDate))) { + // getPatientAppointmentQueueDetails(appointmentNo: patientArrivedAppointmentsHistoryList.first.appointmentNo, patientID: patientArrivedAppointmentsHistoryList.first.patientID); + getPatientAppointmentQueueDetails(); + } } print('Upcoming Appointments: ${patientUpcomingAppointmentsHistoryList.length}'); @@ -670,10 +674,11 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); } - Future getPatientAppointmentQueueDetails({required int appointmentNo, required int patientID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + Future getPatientAppointmentQueueDetails({Function(dynamic)? onSuccess, Function(String)? onError}) async { isAppointmentQueueDetailsLoading = true; notifyListeners(); - final result = await myAppointmentsRepo.getPatientAppointmentQueueDetails(appointmentNo: appointmentNo, patientID: patientID); + final result = await myAppointmentsRepo.getPatientAppointmentQueueDetails( + appointmentNo: patientArrivedAppointmentsHistoryList.first.appointmentNo, patientID: patientArrivedAppointmentsHistoryList.first.patientID); isAppointmentQueueDetailsLoading = false; @@ -692,7 +697,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { isPatientHasQueueAppointment = true; patientQueueDetailsList = apiResponse.data!; for (var element in patientQueueDetailsList) { - if (element.patientID == patientID) { + if (element.patientID == patientArrivedAppointmentsHistoryList.first.patientID) { currentPatientQueueDetails = element; currentQueueStatus = element.callType!; // currentQueueStatus = 2; @@ -701,7 +706,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { } // patientQueueDetailsList.first.callType = 1; - patientQueueDetailsList.removeWhere((element) => element.patientID == patientID); + patientQueueDetailsList.removeWhere((element) => element.patientID == patientArrivedAppointmentsHistoryList.first.patientID); } else { isPatientHasQueueAppointment = false; } diff --git a/lib/presentation/appointments/appointment_queue_page.dart b/lib/presentation/appointments/appointment_queue_page.dart index d8acac6..4554873 100644 --- a/lib/presentation/appointments/appointment_queue_page.dart +++ b/lib/presentation/appointments/appointment_queue_page.dart @@ -114,7 +114,7 @@ class AppointmentQueuePage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ - "IMD W-A-2".needTranslation.toText17(isBold: true), + myAppointmentsVM.patientQueueDetailsList[index].queueNo!.toText17(isBold: true), Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ diff --git a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart index 1fbd22e..5b1d1cd 100644 --- a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart +++ b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart @@ -149,7 +149,7 @@ class AppointmentCheckinBottomSheet extends StatelessWidget { onSuccess: (apiResponse) { LoaderBottomSheet.hideLoader(); showCommonBottomSheetWithoutHeight(context, title: "Success".needTranslation, child: Utils.getSuccessWidget(loadingText: LocaleKeys.success.tr()), callBackFunc: () async { - await myAppointmentsViewModel.getPatientAppointmentQueueDetails(appointmentNo: patientAppointmentHistoryResponseModel.appointmentNo, patientID: patientAppointmentHistoryResponseModel.patientID); + await myAppointmentsViewModel.getPatientAppointmentQueueDetails(); Navigator.of(context).pop(); Navigator.pushAndRemoveUntil( context, diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index 0bb4ab2..d7e3fa1 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -107,6 +107,7 @@ class _LandingPageState extends State { prescriptionsViewModel.initPrescriptionsViewModel(); insuranceViewModel.initInsuranceProvider(); emergencyServicesViewModel.checkPatientERAdvanceBalance(); + myAppointmentsViewModel.getPatientAppointmentQueueDetails(); appointmentRatingViewModel.getLastRatingAppointment(onSuccess: (response) { if (appointmentRatingViewModel.appointmentRatedList.isNotEmpty) { appointmentRatingViewModel.getAppointmentDetails(appointmentRatingViewModel.appointmentRatedList.last.appointmentNo!, appointmentRatingViewModel.appointmentRatedList.last.projectID!, @@ -305,15 +306,15 @@ class _LandingPageState extends State { Utils.buildSvgWithAssets(icon: AppAssets.waiting_icon, width: 24.h, height: 24.h), ], ), - SizedBox(height: 10.h), - "Hala ${appState.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true), SizedBox(height: 8.h), + "Hala ${appState.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true), + SizedBox(height: 2.h), "Thank you for your patience, here is your queue number." .needTranslation .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), SizedBox(height: 8.h), myAppointmentsVM.currentPatientQueueDetails.queueNo!.toText28(isBold: true), - SizedBox(height: 12.h), + SizedBox(height: 6.h), myAppointmentsVM.patientQueueDetailsList.isNotEmpty ? Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, @@ -337,7 +338,7 @@ class _LandingPageState extends State { ), ], ) : SizedBox(height: 12.h), - SizedBox(height: 8.h), + SizedBox(height: 5.h), CustomButton( text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus, myAppointmentsVM.currentPatientQueueDetails.roomNo ?? ""), onPressed: () {}, diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index 7d149ed..33e5056 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -27,6 +27,7 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/allergies/allergies_list_page.dart'; import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; import 'package:hmg_patient_app_new/presentation/appointments/my_doctors_page.dart'; +import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile_page.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; @@ -492,8 +493,36 @@ class _MedicalFilePageState extends State { onRescheduleTap: () { openDoctorScheduleCalendar(myAppointmentsVM.patientAppointmentsHistoryList[index]); }, - onAskDoctorTap: () {}, - )), + onAskDoctorTap: () async { + LoaderBottomSheet.showLoader(loadingText: "Checking doctor availability...".needTranslation); + await myAppointmentsViewModel.isDoctorAvailable( + projectID: myAppointmentsVM.patientAppointmentsHistoryList[index].projectID, + doctorId: myAppointmentsVM.patientAppointmentsHistoryList[index].doctorID, + clinicId: myAppointmentsVM.patientAppointmentsHistoryList[index].clinicID, + onSuccess: (value) async { + if (value) { + await myAppointmentsViewModel.getAskDoctorRequestTypes(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.askDoctor.tr(context: context), + child: AskDoctorRequestTypeSelect( + askDoctorRequestTypeList: myAppointmentsViewModel.askDoctorRequestTypeList, + myAppointmentsViewModel: myAppointmentsViewModel, + patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index], + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } else { + print("Doctor is not available"); + } + }); + }, + ), + ), ), ), ); diff --git a/lib/presentation/medical_file/widgets/lab_rad_card.dart b/lib/presentation/medical_file/widgets/lab_rad_card.dart index eef73eb..f31c90b 100644 --- a/lib/presentation/medical_file/widgets/lab_rad_card.dart +++ b/lib/presentation/medical_file/widgets/lab_rad_card.dart @@ -28,59 +28,24 @@ class LabRadCard extends StatelessWidget { AppState appState = getIt.get(); return Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 18.r, hasShadow: false), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Utils.buildSvgWithAssets( - icon: icon, - width: 40.w, - height: 40.h, - fit: BoxFit.cover, - ).toShimmer2(isShow: false, radius: 12.r), - SizedBox(width: 8.w), - Flexible( - child: labelText.toText12(isBold: true, maxLine: 2), - ), - Transform.flip( - flipX: appState.isArabic(), - child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon_small, width: 10.w, height: 10.h, fit: BoxFit.contain, iconColor: AppColors.textColor), - ), - ], + Utils.buildSvgWithAssets( + icon: icon, + width: 40.w, + height: 40.h, + fit: BoxFit.cover, + ).toShimmer2(isShow: false, radius: 12.r), + SizedBox(width: 8.w), + Flexible( + child: labelText.toText12(isBold: true, maxLine: 2), + ), + SizedBox(width: 12.w), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon_small, width: 10.w, height: 10.h, fit: BoxFit.contain, iconColor: AppColors.textColor), ), - // SizedBox(height: 16.h), - // labOrderTests.isNotEmpty - // ? ListView.separated( - // scrollDirection: Axis.vertical, - // padding: EdgeInsets.zero, - // physics: NeverScrollableScrollPhysics(), - // shrinkWrap: true, - // itemBuilder: (cxt, index) { - // return labOrderTests[index] - // .toText12(isBold: true, maxLine: 1) - // .toShimmer2(isShow: false, radius: 6.r, height: 24.h, width: 120.w) - // .toShimmer2(isShow: isLoading); - // }, - // separatorBuilder: (cxt, index) => SizedBox(height: 8.h), - // itemCount: 3, - // ) - // : "You don't have any records yet".needTranslation.toText13( - // color: AppColors.greyTextColor, isCenter: true), - // SizedBox(height: 16.h), - // Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // children: [ - // SizedBox.shrink(), - // Transform.flip( - // flipX: appState.isArabic(), - // child: Utils.buildSvgWithAssets( - // icon: AppAssets.forward_arrow_icon_small, width: 15.w, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor) - // .toShimmer2(isShow: false, radius: 12.r), - // ), - // ], - // ) ], ).paddingAll(12.w), ); From 450f07d39dfa701de4af1383da6ea75c3e6b5a07 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 16 Dec 2025 15:20:06 +0300 Subject: [PATCH 27/55] updates & fixes --- assets/images/png/home_health_care.png | Bin 0 -> 361078 bytes assets/images/png/pharmacy_service.png | Bin 0 -> 279537 bytes assets/images/svg/phramacy_icon.svg | 6 + lib/core/app_assets.dart | 5 + .../book_appointment_page.dart | 17 +- .../hmg_services/services_page.dart | 653 +++++++++--------- .../home/data/landing_page_data.dart | 52 +- .../home/data/service_card_data.dart | 4 +- lib/presentation/home/landing_page.dart | 8 +- lib/presentation/home/navigation_screen.dart | 2 + .../home/widgets/large_service_card.dart | 138 +++- .../medical_file/medical_file_page.dart | 1 + lib/theme/colors.dart | 2 + lib/widgets/custom_tab_bar.dart | 4 +- 14 files changed, 516 insertions(+), 376 deletions(-) create mode 100644 assets/images/png/home_health_care.png create mode 100644 assets/images/png/pharmacy_service.png create mode 100644 assets/images/svg/phramacy_icon.svg diff --git a/assets/images/png/home_health_care.png b/assets/images/png/home_health_care.png new file mode 100644 index 0000000000000000000000000000000000000000..21378c4264486f3b40b2f2ebf2c39ba40613e15a GIT binary patch literal 361078 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 `j&{~$ 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 B=WGA~ literal 0 HcmV?d00001 diff --git a/assets/images/png/pharmacy_service.png b/assets/images/png/pharmacy_service.png new file mode 100644 index 0000000000000000000000000000000000000000..7093d41e5bebf5bdd66d4c3798365e72b5830214 GIT binary patch literal 279537 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 z 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

8=Q5f^6J1~+g#(HJ=LQronh`a#UE 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

M9a2)a;P6hBe_M<`1YZx^9X7D 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 + + + + + diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index 49d14a4..bbe7d75 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -221,6 +221,7 @@ class AppAssets { static const String trade_down_yellow = '$svgBasePath/trade_down_yellow.svg'; static const String trade_down_red = '$svgBasePath/trade_down_red.svg'; + static const String pharmacy_icon = '$svgBasePath/phramacy_icon.svg'; //bottom navigation// static const String homeBottom = '$svgBasePath/home_bottom.svg'; @@ -249,6 +250,10 @@ class AppAssets { // PNGS // static const String hmgLogo = '$pngBasePath/hmg_logo.png'; static const String liveCareService = '$pngBasePath/livecare_service.png'; + + static const String homeHealthCareService = '$pngBasePath/home_health_care.png'; + static const String pharmacyService = '$pngBasePath/pharmacy_service.png'; + static const String maleImg = '$pngBasePath/male_img.png'; static const String femaleImg = '$pngBasePath/female_img.png'; static const String babyGirlImg = '$pngBasePath/baby_girl_img.png'; diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart index 4d24da7..5aa1b7c 100644 --- a/lib/presentation/book_appointment/book_appointment_page.dart +++ b/lib/presentation/book_appointment/book_appointment_page.dart @@ -54,7 +54,7 @@ class _BookAppointmentPageState extends State { void initState() { authVM = context.read(); scheduleMicrotask(() { - bookAppointmentsViewModel.selectedTabIndex = 0; + // bookAppointmentsViewModel.selectedTabIndex = 0; bookAppointmentsViewModel.initBookAppointmentViewModel(); bookAppointmentsViewModel.getLocation(); immediateLiveCareViewModel.initImmediateLiveCare(); @@ -68,6 +68,7 @@ class _BookAppointmentPageState extends State { immediateLiveCareViewModel = Provider.of(context, listen: false); appState = getIt.get(); regionalViewModel = Provider.of(context, listen: true); + getSelectedTabData(bookAppointmentsViewModel.selectedTabIndex); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: Column( @@ -85,6 +86,7 @@ class _BookAppointmentPageState extends State { CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), + initialIndex: bookAppointmentsVM.selectedTabIndex, tabs: [ CustomTabBarModel(null, "General".needTranslation), CustomTabBarModel(null, "LiveCare".needTranslation), @@ -323,10 +325,12 @@ class _BookAppointmentPageState extends State { ).paddingSymmetrical(24.h, 0.h); case 1: //TODO: Get LiveCare type Select UI from Hussain - return appState.isAuthenticated - ? Column( - children: [ - Container( + return + // appState.isAuthenticated + // ? + Column( + children: [ + Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 24.h, @@ -445,7 +449,8 @@ class _BookAppointmentPageState extends State { ), ], ).paddingSymmetrical(24.h, 0.h) - : getLiveCareNotLoggedInUI(); + // : getLiveCareNotLoggedInUI() + ; default: SizedBox.shrink(); } diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index ec993a8..b321ff3 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -1,5 +1,6 @@ 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'; @@ -17,6 +18,8 @@ import 'package:hmg_patient_app_new/presentation/contact_us/contact_us.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'; @@ -95,15 +98,15 @@ class ServicesPage extends StatelessWidget { LoaderBottomSheet.hideLoader(); }); }), - HmgServicesComponentModel( - 3, - "Home Health Care".needTranslation, - "".needTranslation, - AppAssets.homeBottom, - bgColor: AppColors.primaryRedColor, - true, - route: AppRoutes.homeHealthCarePage, - ), + // HmgServicesComponentModel( + // 3, + // "Home Health Care".needTranslation, + // "".needTranslation, + // AppAssets.homeBottom, + // bgColor: AppColors.primaryRedColor, + // true, + // route: AppRoutes.homeHealthCarePage, + // ), // HmgServicesComponentModel( // 11, // "Virtual Tour".needTranslation, @@ -169,331 +172,359 @@ class ServicesPage extends StatelessWidget { body: CollapsingListView( title: "Explore Services".needTranslation, isLeading: false, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 24.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 16.h), - "Medical & Care Services".needTranslation.toText18(isBold: true), - 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(), + 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, - itemCount: hmgServices.length, - padding: EdgeInsets.zero, - itemBuilder: (BuildContext context, int index) { - return ServiceGridViewItem(hmgServices[index], index, false, isHealthToolIcon: false); + 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), - 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, + ), + 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.wallet, width: 30.w, height: 30.h), - "Habib Wallet".needTranslation.toText14(weight: FontWeight.w600, maxlines: 2).expanded, - Utils.buildSvgWithAssets(icon: AppAssets.arrow_forward), + 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) ], ), - 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())); + Utils.openWebView( + url: 'https://hmgwebservices.com/vt_mobile/html/index.html', + ); }), ), - ), - 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, + 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.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), + 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) ], ), - Spacer(), - Wrap( - spacing: -8.h, - // runSpacing: 0.h, + ), + ), + ), + ], + ), + 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.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, + 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) ], ), - 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(), - ), + Utils.openWebView( + url: 'https://x.com/HMG', ); }), ), - ), - ], - ), - SizedBox(height: 24.h), - "Health Tools".needTranslation.toText18(isBold: true), - 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, - ); - }, - ), - SizedBox(height: 24.h), - "Support Services".needTranslation.toText18(isBold: true), - 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(width: 16.w), + Expanded( + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.h, + hasShadow: false, ), - ), - ], - ), - 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) - ], - ), + 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, - ); - }), - ) - ], - ) - ], - ), - SizedBox(height: 24.h), - ], - ), + ), + ).onPress(() { + showCommonBottomSheetWithoutHeight( + context, + title: LocaleKeys.contactUs.tr(), + child: ContactUs(), + callBackFunc: () {}, + isFullScreen: false, + ); + }), + ) + ], + ) + ], + ).paddingSymmetrical(24.w, 0), + SizedBox(height: 24.h), + ], ), ), ); diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart index 3e34a92..8e452ff 100644 --- a/lib/presentation/home/data/landing_page_data.dart +++ b/lib/presentation/home/data/landing_page_data.dart @@ -142,44 +142,42 @@ class LandingPageData { static List getServiceCardsList = [ ServiceCardData( - icon: AppAssets.liveCareService, + serviceName: "livecare", + icon: AppAssets.small_livecare_icon, title: "LiveCare", subtitle: "Explore our app, View our services and offers", - largeCardIcon: AppAssets.livecare_icon, - backgroundColor: Colors.transparent, - iconColor: Colors.transparent, - textColor: Colors.transparent, - isBold: true, - ), - ServiceCardData( - icon: AppAssets.lab_result_icon, - title: "Dermatology", - subtitle: "Explore our app, View our services and offers", - largeCardIcon: AppAssets.livecare_icon, - backgroundColor: AppColors.whiteColor, - iconColor: AppColors.blackColor, - textColor: AppColors.blackColor, + largeCardIcon: AppAssets.liveCareService, + backgroundColor: AppColors.successColor, + iconColor: AppColors.whiteColor, isBold: false, ), - ServiceCardData( - icon: AppAssets.my_prescription_icon, + // ServiceCardData( + // icon: AppAssets.homeBottom, + // title: "Dermatology", + // subtitle: "Explore our app, View our services and offers", + // largeCardIcon: AppAssets.homeBottom, + // backgroundColor: AppColors.primaryRedColor, + // isBold: false, + // ), + ServiceCardData( + serviceName: "home_health_care", + icon: AppAssets.homeBottom, title: "Home Health Care", subtitle: "Explore our app, View our services and offers", - largeCardIcon: AppAssets.livecare_icon, - backgroundColor: AppColors.whiteColor, - iconColor: AppColors.blackColor, - textColor: AppColors.blackColor, + largeCardIcon: AppAssets.homeHealthCareService, + backgroundColor: AppColors.primaryRedColor, + iconColor: AppColors.whiteColor, isBold: false, ), ServiceCardData( - icon: AppAssets.insurance_update_icon, + serviceName: "pharmacy", + icon: AppAssets.pharmacy_icon, //359846 title: "Pharmacy", subtitle: "Explore our app, View our services and offers", - largeCardIcon: AppAssets.livecare_icon, - backgroundColor: AppColors.whiteColor, - iconColor: AppColors.blackColor, - textColor: AppColors.blackColor, - isBold: false, + largeCardIcon: AppAssets.pharmacyService, + backgroundColor: AppColors.pharmacyBGColor, + iconColor: null, + isBold: true, ), ]; } diff --git a/lib/presentation/home/data/service_card_data.dart b/lib/presentation/home/data/service_card_data.dart index 49e7e3d..3bc22d7 100644 --- a/lib/presentation/home/data/service_card_data.dart +++ b/lib/presentation/home/data/service_card_data.dart @@ -7,7 +7,7 @@ class ServiceCardData { final String icon; final String title; final String subtitle; - final Color iconColor; + final Color? iconColor; final Color textColor; final Color backgroundColor; final bool isBold; @@ -22,6 +22,6 @@ class ServiceCardData { this.backgroundColor = AppColors.whiteColor, this.iconColor = AppColors.blackColor, this.textColor = AppColors.blackColor, - this.isBold = false, + this.isBold = false }); } diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index d7e3fa1..fc50d02 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -480,6 +480,7 @@ class _LandingPageState extends State { CustomButton( text: LocaleKeys.bookAppo.tr(context: context), onPressed: () { + getIt.get().onTabChanged(0); Navigator.of(context).push(CustomPageRoute(page: BookAppointmentPage())); }, backgroundColor: Color(0xffFEE9EA), @@ -596,7 +597,7 @@ class _LandingPageState extends State { icon: LandingPageData.getLoggedInServiceCardsList[index].icon, title: LandingPageData.getLoggedInServiceCardsList[index].title, subtitle: LandingPageData.getLoggedInServiceCardsList[index].subtitle, - iconColor: LandingPageData.getLoggedInServiceCardsList[index].iconColor, + iconColor: LandingPageData.getLoggedInServiceCardsList[index].iconColor!, textColor: LandingPageData.getLoggedInServiceCardsList[index].textColor, backgroundColor: LandingPageData.getLoggedInServiceCardsList[index].backgroundColor, isBold: LandingPageData.getLoggedInServiceCardsList[index].isBold, @@ -637,7 +638,7 @@ class _LandingPageState extends State { icon: LandingPageData.getNotLoggedInServiceCardsList[index].icon, title: LandingPageData.getNotLoggedInServiceCardsList[index].title, subtitle: LandingPageData.getNotLoggedInServiceCardsList[index].subtitle, - iconColor: LandingPageData.getNotLoggedInServiceCardsList[index].iconColor, + iconColor: LandingPageData.getNotLoggedInServiceCardsList[index].iconColor!, textColor: LandingPageData.getNotLoggedInServiceCardsList[index].textColor, backgroundColor: LandingPageData.getNotLoggedInServiceCardsList[index].backgroundColor, isBold: LandingPageData.getNotLoggedInServiceCardsList[index].isBold, @@ -682,6 +683,7 @@ class _LandingPageState extends State { 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, @@ -691,7 +693,7 @@ class _LandingPageState extends State { ), ); }, - separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 8.w), + separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 16.w), ), ), appState.isAuthenticated ? HabibWalletCard() : SizedBox(), diff --git a/lib/presentation/home/navigation_screen.dart b/lib/presentation/home/navigation_screen.dart index 7fbcdb3..6ec8c3a 100644 --- a/lib/presentation/home/navigation_screen.dart +++ b/lib/presentation/home/navigation_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/extensions/route_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/presentation/contact_us/feedback_page.dart'; import 'package:hmg_patient_app_new/presentation/hmg_services/services_page.dart'; import 'package:hmg_patient_app_new/presentation/home/landing_page.dart'; @@ -41,6 +42,7 @@ class _LandingNavigationState extends State { onTap: (index) { setState(() => _currentIndex = index); if (_currentIndex == 2) { + getIt.get().onTabChanged(0); context.navigateWithName(AppRoutes.bookAppointmentPage); return; } diff --git a/lib/presentation/home/widgets/large_service_card.dart b/lib/presentation/home/widgets/large_service_card.dart index 7a155df..0e02a5e 100644 --- a/lib/presentation/home/widgets/large_service_card.dart +++ b/lib/presentation/home/widgets/large_service_card.dart @@ -1,16 +1,26 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; +import 'package:hmg_patient_app_new/presentation/home/data/service_card_data.dart'; +import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures_page.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../../core/utils/utils.dart'; import '../../../theme/colors.dart'; class LargeServiceCard extends StatelessWidget { + final ServiceCardData serviceCardData; final String image; final String icon; final String title; @@ -18,6 +28,7 @@ class LargeServiceCard extends StatelessWidget { const LargeServiceCard({ super.key, + required this.serviceCardData, this.image = "", this.icon = "", this.title = "", @@ -27,37 +38,112 @@ class LargeServiceCard extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - width: 150.w, - padding: EdgeInsets.symmetric(horizontal: 3.w), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.transparent, borderRadius: 16.r), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + height: 350.h, + width: 230.w, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.transparent, borderRadius: 24.r), + child: Stack( children: [ - Image.asset(AppAssets.liveCareService, width: 220.w, fit: BoxFit.contain), - SizedBox(height: 10.h), - Row( - children: [ - Utils.buildSvgWithAssets(icon: icon, width: 24.w, height: 24.h), - Flexible(child: title.toText14(color: AppColors.blackColor, isBold: true, textOverflow: TextOverflow.clip, maxlines: 1)), - ], + ClipRRect( + borderRadius: BorderRadius.circular(24.r), + child: Image.asset( + serviceCardData.largeCardIcon, + fit: BoxFit.cover, + ), ), - subtitle.toText11(color: AppColors.blackColor), - SizedBox(height: 10.h), - CustomButton( - text: LocaleKeys.bookNow.tr(context: context), - onPressed: () {}, - backgroundColor: AppColors.borderOnlyColor, - borderColor: AppColors.borderOnlyColor, - textColor: AppColors.whiteColor, - fontSize: 14.f, - fontWeight: FontWeight.bold, - borderRadius: 12.r, - padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), - height: 40.h, + Positioned( + bottom: 0.0, // Positions the child 0 logical pixels from the bottom + left: 0.0, + right: 0.0, + child: Container( + height: 180.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + customBorder: BorderRadius.only( + bottomLeft: Radius.circular(24.r), + bottomRight: Radius.circular(24.r), + ), + ), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 48.h, + width: 48.w, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: serviceCardData.backgroundColor, + borderRadius: 12.r, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(12.h), + child: Utils.buildSvgWithAssets( + icon: serviceCardData.icon, + iconColor: serviceCardData.iconColor, + fit: BoxFit.contain, + ), + ), + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + serviceCardData.title.toText14(isBold: true, color: AppColors.textColor), + SizedBox(width: 6.h), + serviceCardData.subtitle.toText14(weight: FontWeight.w500, color: AppColors.textColorLight), + ], + ), + ), + ], + ).paddingSymmetrical(16.w, 20.h), + CustomButton( + text: serviceCardData.isBold ? "Visit Pharmacy Online".needTranslation : LocaleKeys.bookNow.tr(context: context), + onPressed: () { + handleOnTap(); + }, + backgroundColor: serviceCardData.isBold ? AppColors.successLightColor.withValues(alpha: 0.2) : AppColors.bgRedLightColor, + borderColor: serviceCardData.isBold ? AppColors.successLightColor.withValues(alpha: 0.01) : AppColors.bgRedLightColor, + textColor: serviceCardData.isBold ? AppColors.successColor : AppColors.primaryRedColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 10.r, + height: 40.h, + ).paddingSymmetrical(16.w, 0.h), + ], + ), + ), ), ], ), ); } + + void handleOnTap() { + switch (serviceCardData.serviceName) { + case "livecare": + { + getIt.get().onTabChanged(1); + Navigator.of(getIt.get().navigatorKey.currentContext!).push( + CustomPageRoute( + page: BookAppointmentPage(), + ), + ); + } + case "home_health_care": + { + Navigator.of(getIt().navigatorKey.currentContext!).push( + CustomPageRoute( + page: HhcProceduresPage(), + ), + ); + } + case "pharmacy": + { + Uri uri = Uri.parse(PHARMACY_REDIRECT_URL); + launchUrl(uri, mode: LaunchMode.externalApplication); + } + } + } } diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index 33e5056..f55488d 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -453,6 +453,7 @@ class _MedicalFilePageState extends State { CustomButton( text: LocaleKeys.bookAppo.tr(context: context), onPressed: () { + getIt.get().onTabChanged(0); Navigator.of(context).push( CustomPageRoute( page: BookAppointmentPage(), diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 630cf02..d0db6a5 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -33,6 +33,8 @@ class AppColors { static const Color greyTextColor = Color(0xFF8F9AA3); static const Color lightGrayBGColor = Color(0x142E3039); + static const Color pharmacyBGColor = Color(0xFF359846); + static const lightGreenColor = Color(0xFF0ccedde); static const textGreenColor = Color(0xFF18C273); static const Color ratingColorYellow = Color(0xFFFFAF15); diff --git a/lib/widgets/custom_tab_bar.dart b/lib/widgets/custom_tab_bar.dart index 35aafa4..c30c070 100644 --- a/lib/widgets/custom_tab_bar.dart +++ b/lib/widgets/custom_tab_bar.dart @@ -14,7 +14,7 @@ class CustomTabBarModel { } class CustomTabBar extends StatefulWidget { - final int initialIndex = 0; + final int initialIndex; final List tabs; final Color activeTextColor; final Color activeBackgroundColor; @@ -25,6 +25,7 @@ class CustomTabBar extends StatefulWidget { const CustomTabBar({ super.key, required this.tabs, + this.initialIndex = 0, this.activeTextColor = const Color(0xff2E3039), this.inActiveTextColor = const Color(0xff898A8D), this.activeBackgroundColor = const Color(0x142E3039), @@ -41,6 +42,7 @@ class CustomTabBarState extends State { @override void initState() { + selectedIndex = widget.initialIndex; super.initState(); } From 94668997aaf88dcb03931f57c76eaf70874ca278 Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Tue, 16 Dec 2025 16:13:30 +0300 Subject: [PATCH 28/55] Updated design for HHC --- .../hmg_services/hmg_services_view_model.dart | 78 ++-- .../location/location_view_model.dart | 41 +- .../cmc_selection_review_page.dart | 2 - .../comprehensive_checkup_page.dart | 7 +- .../hhc_order_detail_page.dart | 46 +- .../home_health_care/hhc_procedures_page.dart | 395 +++++++++--------- .../hhc_selection_review_page.dart | 80 ++-- .../medical_report/medical_reports_page.dart | 29 +- lib/widgets/map/location_map_widget.dart | 58 +-- 9 files changed, 340 insertions(+), 396 deletions(-) diff --git a/lib/features/hmg_services/hmg_services_view_model.dart b/lib/features/hmg_services/hmg_services_view_model.dart index 81cd060..b1a7757 100644 --- a/lib/features/hmg_services/hmg_services_view_model.dart +++ b/lib/features/hmg_services/hmg_services_view_model.dart @@ -3,8 +3,8 @@ import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_repo.dart'; import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_repo.dart'; -import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/create_e_referral_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/cmc_create_new_order_req_model.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/create_e_referral_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/order_update_req_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/search_e_referral_req_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/send_activation_code_ereferral_req_model.dart'; @@ -24,8 +24,9 @@ class HmgServicesViewModel extends ChangeNotifier { final BookAppointmentsRepo bookAppointmentsRepo; final ErrorHandlerService errorHandlerService; final NavigationService navigationService; - HmgServicesViewModel({required this.bookAppointmentsRepo, required this.hmgServicesRepo, required this.errorHandlerService, required this.navigationService}); + HmgServicesViewModel( + {required this.bookAppointmentsRepo, required this.hmgServicesRepo, required this.errorHandlerService, required this.navigationService}); bool isCmcOrdersLoading = false; bool isCmcServicesLoading = false; @@ -53,12 +54,12 @@ class HmgServicesViewModel extends ChangeNotifier { // HHC order creation state (no hospital selection needed for home healthcare) GetCMCServicesResponseModel? selectedServiceForHhcOrder; - - List relationTypes =[]; - List getAllCitiesList =[]; - List searchReferralList =[]; + List relationTypes = []; + List getAllCitiesList = []; + List searchReferralList = []; Future getOrdersList() async {} + // HHC multiple services selection List selectedHhcServices = []; @@ -332,10 +333,7 @@ class HmgServicesViewModel extends ChangeNotifier { await getAllHhcOrders(); } - Future getAllHhcOrders({ - Function(dynamic)? onSuccess, - Function(String)? onError, - }) async { + Future getAllHhcOrders({Function(dynamic)? onSuccess, Function(String)? onError}) async { isHhcOrdersLoading = true; notifyListeners(); @@ -541,16 +539,14 @@ class HmgServicesViewModel extends ChangeNotifier { final result = await hmgServicesRepo.getRelationshipTypes(); result.fold( - (failure) async { - + (failure) async { notifyListeners(); await errorHandlerService.handleError(failure: failure); if (onError != null) { onError(failure.toString()); } }, - (apiResponse) { - + (apiResponse) { if (apiResponse.messageStatus == 1) { relationTypes = apiResponse.data ?? []; notifyListeners(); @@ -567,7 +563,6 @@ class HmgServicesViewModel extends ChangeNotifier { ); } - Future getAllCities({ Function(dynamic)? onSuccess, Function(String)? onError, @@ -576,16 +571,14 @@ class HmgServicesViewModel extends ChangeNotifier { final result = await hmgServicesRepo.getAllCities(); result.fold( - (failure) async { - + (failure) async { notifyListeners(); await errorHandlerService.handleError(failure: failure); if (onError != null) { onError(failure.toString()); } }, - (apiResponse) { - + (apiResponse) { if (apiResponse.messageStatus == 1) { getAllCitiesList = apiResponse.data ?? []; notifyListeners(); @@ -607,22 +600,20 @@ class HmgServicesViewModel extends ChangeNotifier { Function(GenericApiModel)? onSuccess, Function(String)? onError, }) async { - notifyListeners(); final result = await hmgServicesRepo.sendEReferralActivationCode(requestModel); result.fold( - (failure) async { + (failure) async { notifyListeners(); await errorHandlerService.handleError(failure: failure); if (onError != null) { onError(failure.toString()); } }, - (apiResponse) { + (apiResponse) { if (apiResponse.messageStatus == 1) { - notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); @@ -642,22 +633,20 @@ class HmgServicesViewModel extends ChangeNotifier { Function(GenericApiModel)? onSuccess, Function(String)? onError, }) async { - notifyListeners(); final result = await hmgServicesRepo.checkEReferralActivationCode(requestModel); result.fold( - (failure) async { + (failure) async { notifyListeners(); await errorHandlerService.handleError(failure: failure); if (onError != null) { onError(failure.toString()); } }, - (apiResponse) { + (apiResponse) { if (apiResponse.messageStatus == 1) { - notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); @@ -672,28 +661,25 @@ class HmgServicesViewModel extends ChangeNotifier { ); } - Future createEReferral({ required CreateEReferralRequestModel requestModel, Function(GenericApiModel)? onSuccess, Function(String)? onError, }) async { - notifyListeners(); final result = await hmgServicesRepo.createEReferral(requestModel); result.fold( - (failure) async { + (failure) async { notifyListeners(); await errorHandlerService.handleError(failure: failure); if (onError != null) { onError(failure.toString()); } }, - (apiResponse) { + (apiResponse) { if (apiResponse.messageStatus == 1) { - notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); @@ -708,29 +694,24 @@ class HmgServicesViewModel extends ChangeNotifier { ); } - - Future searchEReferral({ required SearchEReferralRequestModel requestModel, Function(dynamic)? onSuccess, Function(String)? onError, }) async { - notifyListeners(); final result = await hmgServicesRepo.searchEReferral(requestModel); result.fold( - (failure) async { - + (failure) async { notifyListeners(); await errorHandlerService.handleError(failure: failure); if (onError != null) { onError(failure.toString()); } }, - (apiResponse) { - + (apiResponse) { if (apiResponse.messageStatus == 1) { searchReferralList = apiResponse.data ?? []; notifyListeners(); @@ -747,28 +728,26 @@ class HmgServicesViewModel extends ChangeNotifier { ); } - Future navigateToOTPScreen( - {required OTPTypeEnum otpTypeEnum, - required String phoneNumber, - required String loginToken, - required Function onSuccess, - }) async { - + Future navigateToOTPScreen({ + required OTPTypeEnum otpTypeEnum, + required String phoneNumber, + required String loginToken, + required Function onSuccess, + }) async { navigationService.pushToOtpScreen( phoneNumber: phoneNumber, isFormFamilyFile: false, checkActivationCode: (int activationCode) async { - checkEReferralActivationCode( requestModel: CheckActivationCodeForEReferralRequestModel( logInTokenID: loginToken, activationCode: activationCode.toString(), ), onSuccess: (GenericApiModel response) { - onSuccess(); + onSuccess(); }, onError: (String errorMessage) { - print(errorMessage); + print(errorMessage); }, ); }, @@ -787,5 +766,4 @@ class HmgServicesViewModel extends ChangeNotifier { }, ); } - } diff --git a/lib/features/location/location_view_model.dart b/lib/features/location/location_view_model.dart index c6ea34e..76d7c2c 100644 --- a/lib/features/location/location_view_model.dart +++ b/lib/features/location/location_view_model.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart' show ChangeNotifier; import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_platform_interface/src/types/camera.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart' as GMSMapServices; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; @@ -10,9 +10,6 @@ import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart'; import 'package:hmg_patient_app_new/features/location/location_repo.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:huawei_map/huawei_map.dart' as HMSCameraServices; -import 'package:google_maps_flutter/google_maps_flutter.dart' as GMSMapServices; - - import 'PlacePrediction.dart'; @@ -20,12 +17,12 @@ class LocationViewModel extends ChangeNotifier { final LocationRepo locationRepo; final ErrorHandlerService errorHandlerService; - LocationViewModel({required this.locationRepo, required this.errorHandlerService}){ + LocationViewModel({required this.locationRepo, required this.errorHandlerService}) { placeValueInController(); } - List predictions = []; - PlacePrediction? selectedPrediction; + List predictions = []; + PlacePrediction? selectedPrediction; bool isPredictionLoading = false; GeocodeResponse? geocodeResponse; PlaceDetails? placeDetails; @@ -39,12 +36,11 @@ class LocationViewModel extends ChangeNotifier { return HMSCameraServices.CameraPosition(target: HMSCameraServices.LatLng(getIt().userLat, getIt().userLong), zoom: 18); } - GMSMapServices.CameraPosition getGMSLocation() { return GMSMapServices.CameraPosition(target: GMSMapServices.LatLng(getIt().userLat, getIt().userLong), zoom: 18); } - void placeValueInController() async{ + void placeValueInController() async { if (await getIt().isGMSAvailable) { gmsController = Completer(); } else { @@ -54,14 +50,14 @@ class LocationViewModel extends ChangeNotifier { FutureOr getPlacesPrediction(String input) async { predictions = []; - isPredictionLoading= true; + isPredictionLoading = true; final result = await locationRepo.getPlacePredictionsAsInput(input); result.fold( (failure) { errorHandlerService.handleError(failure: failure); }, (apiModel) { - predictions = apiModel.data??[]; + predictions = apiModel.data ?? []; }, ); isPredictionLoading = false; @@ -99,21 +95,20 @@ class LocationViewModel extends ChangeNotifier { handleGMSMapCameraMoved(GMSMapServices.CameraPosition value) { mapCapturedLocation = Location(lat: value.target.latitude, lng: value.target.longitude); - } handleHMSMapCameraMoved(HMSCameraServices.CameraPosition value) { mapCapturedLocation = Location(lat: value.target.lat, lng: value.target.lng); } - handleOnCameraIdle(){ - if(mapCapturedLocation != null) { + handleOnCameraIdle() { + if (mapCapturedLocation != null) { getPlaceEncodedData(mapCapturedLocation!.lat, mapCapturedLocation!.lng); } } void updateSearchQuery(String? value) { - if(value == null || value.isEmpty){ + if (value == null || value.isEmpty) { predictions = []; return; } @@ -123,16 +118,16 @@ class LocationViewModel extends ChangeNotifier { void flushSearchPredictions() { predictions = []; - mapCapturedLocation= null; - placeDetails= null; - geocodeResponse= null; - selectedPrediction= null; + mapCapturedLocation = null; + placeDetails = null; + geocodeResponse = null; + selectedPrediction = null; notifyListeners(); } - FutureOr selectPlacePrediction(PlacePrediction placePrediction) async{ - selectedPrediction= placePrediction; + FutureOr selectPlacePrediction(PlacePrediction placePrediction) async { + selectedPrediction = placePrediction; await getPlaceDetails(placePrediction.placeID); } @@ -141,8 +136,6 @@ class LocationViewModel extends ChangeNotifier { } void moveController(Location location) { - print("moving to location"); - print("gmsController is null or not $gmsController"); if (getIt().isGMSAvailable) { gmsController?.future.then((controller) { controller.animateCamera( @@ -169,4 +162,4 @@ class LocationViewModel extends ChangeNotifier { }); } } -} \ No newline at end of file +} diff --git a/lib/presentation/comprehensive_checkup/cmc_selection_review_page.dart b/lib/presentation/comprehensive_checkup/cmc_selection_review_page.dart index 3be209b..18b656c 100644 --- a/lib/presentation/comprehensive_checkup/cmc_selection_review_page.dart +++ b/lib/presentation/comprehensive_checkup/cmc_selection_review_page.dart @@ -170,8 +170,6 @@ class _CmcSelectionReviewPageState extends State { latitude: double.parse(lat), longitude: double.parse(lng), address: hospitalName, - title: "Hospital Location".needTranslation, - showTitle: false, showAddress: false, padding: EdgeInsets.zero, onDirectionsTap: () => _launchDirections(selectedHospital), diff --git a/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart b/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart index 5529b93..8b9ad89 100644 --- a/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart +++ b/lib/presentation/comprehensive_checkup/comprehensive_checkup_page.dart @@ -366,7 +366,12 @@ class _ComprehensiveCheckupPageState extends State { if (pendingOrder == null && _selectedServiceId != null) { return SafeArea( top: false, - child: Padding( + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 12.h), child: CustomButton( borderWidth: 0, diff --git a/lib/presentation/home_health_care/hhc_order_detail_page.dart b/lib/presentation/home_health_care/hhc_order_detail_page.dart index 21b0def..92c93d1 100644 --- a/lib/presentation/home_health_care/hhc_order_detail_page.dart +++ b/lib/presentation/home_health_care/hhc_order_detail_page.dart @@ -10,10 +10,8 @@ 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/hmg_services/hmg_services_view_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_all_orders_resp_model.dart'; -import 'package:hmg_patient_app_new/presentation/home_health_care/widgets/hhc_ui_selection_helper.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/chip/app_custom_chip_widget.dart'; import 'package:provider/provider.dart'; @@ -75,7 +73,6 @@ class _HhcOrderDetailPageState extends State { Widget _buildOrderCard(GetCMCAllOrdersResponseModel order, {bool isLoading = false}) { final statusColor = _getStatusColor(order.statusId); - final canCancel = order.statusId == 1 || order.statusId == 2; return AnimatedContainer( duration: Duration(milliseconds: 300), @@ -150,27 +147,27 @@ class _HhcOrderDetailPageState extends State { ], ), - // Cancel Button - if (canCancel || isLoading) ...[ - SizedBox(height: 16.h), - Row( - children: [ - Expanded( - child: CustomButton( - text: "Cancel Order".needTranslation, - onPressed: isLoading ? () {} : () => HhcUiSelectionHelper.showCancelConfirmationDialog(context: context, order: order), - backgroundColor: AppColors.primaryRedColor, - borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, - fontSize: 14.f, - fontWeight: FontWeight.w600, - borderRadius: 10.r, - height: 44.h, - ).toShimmer2(isShow: isLoading), - ), - ], - ), - ] + // // Cancel Button + // if (canCancel || isLoading) ...[ + // SizedBox(height: 16.h), + // Row( + // children: [ + // Expanded( + // child: CustomButton( + // text: "Cancel Order".needTranslation, + // onPressed: isLoading ? () {} : () => HhcUiSelectionHelper.showCancelConfirmationDialog(context: context, order: order), + // backgroundColor: AppColors.primaryRedColor, + // borderColor: AppColors.primaryRedColor, + // textColor: AppColors.whiteColor, + // fontSize: 14.f, + // fontWeight: FontWeight.w600, + // borderRadius: 10.r, + // height: 44.h, + // ).toShimmer2(isShow: isLoading), + // ), + // ], + // ), + // ] ], ), ), @@ -219,6 +216,7 @@ class _HhcOrderDetailPageState extends State { } return ListView.separated( + padding: EdgeInsets.only(top: 24.h), shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: viewModel.hhcOrdersList.length, diff --git a/lib/presentation/home_health_care/hhc_procedures_page.dart b/lib/presentation/home_health_care/hhc_procedures_page.dart index bdc2e45..41d8a2f 100644 --- a/lib/presentation/home_health_care/hhc_procedures_page.dart +++ b/lib/presentation/home_health_care/hhc_procedures_page.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/hmg_services/hmg_services_view_model.dart'; @@ -17,6 +18,7 @@ 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/map/map_utility_screen.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; @@ -61,28 +63,9 @@ class _HhcProceduresPageState extends State { } Widget _buildPendingOrderCard(GetCMCAllOrdersResponseModel order) { - int status = order.statusId ?? 0; - String statusDisp = order.statusText ?? ""; - Color statusColor; - - if (status == 1) { - // pending - statusColor = AppColors.statusPendingColor; - } else if (status == 2) { - // processing - statusColor = AppColors.statusProcessingColor; - } else if (status == 3) { - // completed - statusColor = AppColors.statusCompletedColor; - } else { - // cancel / rejected - statusColor = AppColors.statusRejectedColor; - } - final canCancel = order.statusId == 1 || order.statusId == 2; final isArabic = getIt.get().isArabic(); - // Extract services from orderselectedservice List selectedServices = []; if (order.orderselectedservice != null) { if (order.orderselectedservice is List) { @@ -108,16 +91,12 @@ class _HhcProceduresPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), - decoration: BoxDecoration( - color: statusColor.withValues(alpha: 0.1), - borderRadius: BorderRadius.circular(8.r), - ), - child: statusDisp.toText12( - color: statusColor, - fontWeight: FontWeight.w600, - ), + Row( + children: [ + "Request ID:".needTranslation.toText14(color: AppColors.textColorLight, weight: FontWeight.w500), + SizedBox(width: 4.w), + "${order.iD ?? '-'}".toText16(isBold: true), + ], ), SizedBox(width: 8.w), if (order.created != null) @@ -127,17 +106,7 @@ class _HhcProceduresPageState extends State { ), ], ), - - SizedBox(height: 16.h), - - // Request ID - Row( - children: [ - "Request ID:".needTranslation.toText14(color: AppColors.textColorLight, weight: FontWeight.w500), - SizedBox(width: 4.w), - "${order.iD ?? '-'}".toText16(isBold: true), - ], - ), + SizedBox(height: 8.h), // Services List if (selectedServices.isNotEmpty) ...[ @@ -212,13 +181,13 @@ class _HhcProceduresPageState extends State { ], ), ); - }).toList(), + }), ], ), ), ], - SizedBox(height: 12.h), + SizedBox(height: 8.h), // Info message Container( @@ -274,99 +243,148 @@ class _HhcProceduresPageState extends State { ); } - Widget _buildServiceSelectionList(List services) { - if (services.isEmpty) { - return Center( - child: Padding( - padding: EdgeInsets.all(24.h), - child: Text( - 'No services available'.needTranslation, - style: TextStyle( - fontSize: 16.h, - color: AppColors.greyTextColor, - ), - ), - ), - ); - } - - return Consumer( - builder: (context, viewModel, child) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 8.h), - SizedBox(height: 16.h), - Text( - 'Select Services'.needTranslation, - style: TextStyle( - fontSize: 20.h, - fontWeight: FontWeight.w700, - color: AppColors.blackColor, - letterSpacing: -0.8, + _buildServicesListBottomsSheet(List services) { + showCommonBottomSheetWithoutHeight( + hasBottomPadding: false, + padding: EdgeInsets.only(top: 24.h), + context, + title: 'Select Services'.needTranslation, + isCloseButtonVisible: true, + isDismissible: true, + callBackFunc: () {}, + child: services.isEmpty + ? Center( + child: Padding( + padding: EdgeInsets.all(24.h), + child: Text( + 'No services available'.needTranslation, + style: TextStyle( + fontSize: 16.h, + color: AppColors.greyTextColor, + ), + ), ), - ).paddingOnly(left: 16.w, right: 16.w), - SizedBox(height: 12.h), - ListView.builder( - padding: EdgeInsets.symmetric(horizontal: 16.w), - itemCount: services.length, - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { - final service = services[index]; - final isSelected = viewModel.isHhcServiceSelected(service); - final isArabic = getIt.get().isArabic(); - final serviceName = isArabic ? (service.textN ?? service.text ?? '') : (service.text ?? ''); + ) + : Consumer( + builder: (context, hmgServicesViewModel, child) { + final pendingOrder = _getPendingOrder(hmgServicesViewModel.hhcOrdersList); + final hasSelectedServices = pendingOrder == null && hmgServicesViewModel.selectedHhcServices.isNotEmpty; - return AnimatedContainer( - duration: Duration(milliseconds: 300), - curve: Curves.easeInOut, - margin: EdgeInsets.only(bottom: 12.h), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 16.r, - hasShadow: true, - ), - child: Material( - color: Colors.transparent, - child: InkWell( - onTap: () => viewModel.toggleHhcServiceSelection(service), - borderRadius: BorderRadius.circular(16.r), - child: Container( - padding: EdgeInsets.all(16.w), - child: Row( - children: [ - Checkbox( - value: isSelected, - onChanged: (v) => viewModel.toggleHhcServiceSelection(service), - activeColor: AppColors.primaryRedColor, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - visualDensity: VisualDensity.compact, + return Stack( + children: [ + // Services List + ConstrainedBox( + constraints: BoxConstraints(maxHeight: SizeUtils.height * 0.7), + child: ListView.separated( + separatorBuilder: (context, index) => Divider(color: AppColors.dividerColor).paddingSymmetrical(16.w, 0), + padding: EdgeInsets.only(left: 16.w, right: 16.w, bottom: hasSelectedServices ? 160.h : 8.h), + shrinkWrap: true, + itemCount: services.length, + itemBuilder: (context, index) { + final service = services[index]; + final isSelected = hmgServicesViewModel.isHhcServiceSelected(service); + final isArabic = getIt.get().isArabic(); + final serviceName = isArabic ? (service.textN ?? service.text ?? '') : (service.text ?? ''); + + return AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + child: InkWell( + onTap: () => hmgServicesViewModel.toggleHhcServiceSelection(service), + borderRadius: BorderRadius.circular(16.r), + child: Container( + padding: EdgeInsets.all(8.w), + child: Row( + children: [ + AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + width: 24.w, + height: 24.w, + decoration: BoxDecoration( + color: isSelected ? AppColors.primaryRedColor : Colors.transparent, + borderRadius: BorderRadius.circular(5.r), + border: Border.all( + color: isSelected ? AppColors.primaryRedColor : AppColors.borderGrayColor, + width: 1.w, + ), + ), + child: isSelected ? Icon(Icons.check, size: 18.f, color: AppColors.whiteColor) : null, + ), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + serviceName.toText16( + weight: FontWeight.w500, + color: AppColors.blackColor, + maxlines: 2, + ), + ], + ), + ), + ], + ), + ), ), - SizedBox(width: 12.w), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + ); + }, + ), + ), + + if (hasSelectedServices) + Positioned( + left: 0, + right: 0, + bottom: 0, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 24.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - serviceName.toText16( - weight: FontWeight.w400, - color: AppColors.blackColor, - maxlines: 2, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Selected Services".needTranslation.toText12( + color: AppColors.textColorLight, + fontWeight: FontWeight.w600, + ), + "${hmgServicesViewModel.selectedHhcServices.length} service(s) selected".toText14( + isBold: true, + weight: FontWeight.bold, + ), + ], ), ], ), - ), - ], + SizedBox(height: 16.h), + CustomButton( + borderWidth: 0, + text: "Next".needTranslation, + onPressed: () { + Navigator.pop(context); + _proceedWithSelectedService(); + }, + textColor: AppColors.whiteColor, + borderRadius: 12.r, + borderColor: Colors.transparent, + ), + ], + ), ), ), - ), - ), + ], ); }, ), - ], - ); - }, ); } @@ -426,77 +444,70 @@ class _HhcProceduresPageState extends State { @override Widget build(BuildContext context) { - return CollapsingListView( - title: "Home Health Care".needTranslation, - history: () => Navigator.of(context).push(CustomPageRoute(page: HhcOrderDetailPage(), direction: AxisDirection.up)), - bottomChild: Consumer( - builder: (context, hmgServicesViewModel, child) { - if (hmgServicesViewModel.isHhcOrdersLoading || hmgServicesViewModel.isHhcServicesLoading) return SizedBox.shrink(); - final pendingOrder = _getPendingOrder(hmgServicesViewModel.hhcOrdersList); - if (pendingOrder == null && hmgServicesViewModel.selectedHhcServices.isNotEmpty) { - return SafeArea( - top: false, - child: Container( - color: AppColors.whiteColor, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // Selected Services Summary Widget - Container( - margin: EdgeInsets.symmetric(horizontal: 16.w, vertical: 4.h), - padding: EdgeInsets.all(16.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "Selected Services".needTranslation.toText12( - color: AppColors.textColorLight, - fontWeight: FontWeight.w600, - ), - "${hmgServicesViewModel.selectedHhcServices.length} service(s) selected".toText14( - isBold: true, - weight: FontWeight.bold, - ), - ], + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "Home Health Care".needTranslation, + history: () => Navigator.of(context).push(CustomPageRoute(page: HhcOrderDetailPage(), direction: AxisDirection.up)), + child: Consumer( + builder: (context, hmgServicesViewModel, child) { + if (hmgServicesViewModel.isHhcOrdersLoading || hmgServicesViewModel.isHhcServicesLoading) { + return _buildLoadingShimmer(); + } + final pendingOrder = _getPendingOrder(hmgServicesViewModel.hhcOrdersList); + if (pendingOrder != null) { + return _buildPendingOrderCard(pendingOrder); + } else { + return Column( + children: [ + Center( + child: Utils.getNoDataWidget( + context, + noDataText: "You have no pending requests.".needTranslation, ), - ], - ), - ), - // Next Button - Padding( - padding: EdgeInsets.only(left: 16.w, right: 16.w), - child: CustomButton( - borderWidth: 0, - text: "Next".needTranslation, - onPressed: _proceedWithSelectedService, - textColor: AppColors.whiteColor, - borderRadius: 12.r, - borderColor: Colors.transparent, - padding: EdgeInsets.symmetric(vertical: 14.h), - ), - ), - ], - ), + ), + ], + ); + } + }, ), - ); - } - return SizedBox.shrink(); - }, - ), - child: Consumer( - builder: (context, hmgServicesViewModel, child) { - if (hmgServicesViewModel.isHhcOrdersLoading || hmgServicesViewModel.isHhcServicesLoading) { - return _buildLoadingShimmer(); - } - final pendingOrder = _getPendingOrder(hmgServicesViewModel.hhcOrdersList); - if (pendingOrder != null) { - return _buildPendingOrderCard(pendingOrder); - } else { - return _buildServiceSelectionList(hmgServicesViewModel.hhcServicesList); - } - }, + ), + ), + Consumer( + builder: (BuildContext context, HmgServicesViewModel hmgServicesViewModel, Widget? child) { + if (hmgServicesViewModel.isHhcOrdersLoading || hmgServicesViewModel.isHhcServicesLoading) { + return SizedBox.shrink(); + } + final pendingOrder = _getPendingOrder(hmgServicesViewModel.hhcOrdersList); + if (pendingOrder == null) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.only(left: 16.w, right: 16.w, bottom: 24.h, top: 24.h), + child: CustomButton( + borderWidth: 0, + text: "Create new request".needTranslation, + onPressed: () => _buildServicesListBottomsSheet(hmgServicesViewModel.hhcServicesList), + textColor: AppColors.whiteColor, + borderRadius: 12.r, + borderColor: Colors.transparent, + padding: EdgeInsets.symmetric(vertical: 14.h), + ), + ), + ); + } + + return SizedBox.shrink(); + }, + ), + ], ), ); } diff --git a/lib/presentation/home_health_care/hhc_selection_review_page.dart b/lib/presentation/home_health_care/hhc_selection_review_page.dart index 8e9ba90..37410e2 100644 --- a/lib/presentation/home_health_care/hhc_selection_review_page.dart +++ b/lib/presentation/home_health_care/hhc_selection_review_page.dart @@ -15,6 +15,7 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.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/chip/app_custom_chip_widget.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/map/location_map_widget.dart'; @@ -68,40 +69,26 @@ class _HhcSelectionReviewPageState extends State { Widget _buildSelectedServicesCard(bool isArabic) { return Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 16.r, - ), + width: double.infinity, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), padding: EdgeInsets.all(16.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ "Selected Services".needTranslation.toText14( weight: FontWeight.w600, - color: AppColors.greyTextColor, + color: AppColors.textColor, letterSpacing: -0.4, ), SizedBox(height: 12.h), - ...widget.selectedServices.map((service) { - final serviceName = isArabic ? (service.textN ?? service.text ?? '') : (service.text ?? ''); - final price = service.priceTotal ?? 0.0; - return Padding( - padding: EdgeInsets.only(bottom: 4.h), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: serviceName.toText14( - weight: FontWeight.w600, - color: AppColors.blackColor, - letterSpacing: -0.5, - maxlines: 2, - ), - ), - ], - ), - ); - }), + Wrap( + spacing: 8.w, + runSpacing: 12.w, + children: widget.selectedServices.map((service) { + final serviceName = isArabic ? (service.textN ?? service.text ?? '') : (service.text ?? ''); + return AppCustomChipWidget(labelText: serviceName.needTranslation); + }).toList(), + ), ], ), ); @@ -117,8 +104,8 @@ class _HhcSelectionReviewPageState extends State { return SizedBox.shrink(); } - final double lat = mapCapturedLocation.lat ?? 0.0; - final double lng = mapCapturedLocation.lng ?? 0.0; + final double lat = mapCapturedLocation?.lat ?? 0.0; + final double lng = mapCapturedLocation?.lng ?? 0.0; if (lat == 0.0 || lng == 0.0) return SizedBox.shrink(); @@ -132,36 +119,25 @@ class _HhcSelectionReviewPageState extends State { latitude: lat, longitude: lng, address: address, - title: "Service Location".needTranslation, onDirectionsTap: () => _launchDirectionsToLocation(lat, lng, address), ); } Widget _buildBottomButton() { - return SafeArea( - top: false, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), - decoration: BoxDecoration( - color: AppColors.whiteColor, - boxShadow: [ - BoxShadow( - color: Color.fromARGB(13, 0, 0, 0), - blurRadius: 8, - offset: Offset(0, -2), - ), - ], - ), - child: CustomButton( - text: "Confirm".needTranslation, - onPressed: _handleConfirm, - textColor: AppColors.whiteColor, - backgroundColor: AppColors.successColor, - borderRadius: 12.r, - borderColor: Colors.transparent, - borderWidth: 0, - padding: EdgeInsets.symmetric(vertical: 14.h), - ), + return Container( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 24.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: CustomButton( + borderWidth: 0, + text: "Confirm".needTranslation, + onPressed: () => _handleConfirm(), + textColor: AppColors.whiteColor, + borderRadius: 12.r, + borderColor: Colors.transparent, ), ); } diff --git a/lib/presentation/medical_report/medical_reports_page.dart b/lib/presentation/medical_report/medical_reports_page.dart index 71abcb7..4047a53 100644 --- a/lib/presentation/medical_report/medical_reports_page.dart +++ b/lib/presentation/medical_report/medical_reports_page.dart @@ -10,12 +10,11 @@ import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_mode import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/medical_report/medical_report_request_page.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/presentation/medical_report/widgets/patient_medical_report_card.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/custom_tab_bar.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'; @@ -53,7 +52,8 @@ class _MedicalReportsPageState extends State { medicalFileViewModel.onMedicalReportTabChange(0); }, backgroundColor: medicalFileVM.selectedMedicalReportsTabIndex == 0 ? AppColors.bgRedLightColor : AppColors.whiteColor, - borderColor: medicalFileVM.selectedMedicalReportsTabIndex == 0 ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), + borderColor: + medicalFileVM.selectedMedicalReportsTabIndex == 0 ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), textColor: medicalFileVM.selectedMedicalReportsTabIndex == 0 ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, @@ -68,7 +68,8 @@ class _MedicalReportsPageState extends State { medicalFileViewModel.onMedicalReportTabChange(1); }, backgroundColor: medicalFileVM.selectedMedicalReportsTabIndex == 1 ? AppColors.bgRedLightColor : AppColors.whiteColor, - borderColor: medicalFileVM.selectedMedicalReportsTabIndex == 1 ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), + borderColor: + medicalFileVM.selectedMedicalReportsTabIndex == 1 ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), textColor: medicalFileVM.selectedMedicalReportsTabIndex == 1 ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, @@ -83,7 +84,8 @@ class _MedicalReportsPageState extends State { medicalFileViewModel.onMedicalReportTabChange(2); }, backgroundColor: medicalFileVM.selectedMedicalReportsTabIndex == 2 ? AppColors.bgRedLightColor : AppColors.whiteColor, - borderColor: medicalFileVM.selectedMedicalReportsTabIndex == 2 ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), + borderColor: + medicalFileVM.selectedMedicalReportsTabIndex == 2 ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), textColor: medicalFileVM.selectedMedicalReportsTabIndex == 2 ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, @@ -131,7 +133,8 @@ class _MedicalReportsPageState extends State { child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + decoration: RoundedRectangleBorder() + .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), child: PatientMedicalReportCard( patientMedicalReportResponseModel: medicalFileVM.patientMedicalReportList[index], medicalFileViewModel: medicalFileVM, @@ -141,7 +144,8 @@ class _MedicalReportsPageState extends State { ), ), ) - : Utils.getNoDataWidget(context, noDataText: "You don't have any medical reports yet.".needTranslation).paddingSymmetrical(24.h, 24.h); + : Utils.getNoDataWidget(context, noDataText: "You don't have any medical reports yet.".needTranslation) + .paddingSymmetrical(24.h, 24.h); }, separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), ), @@ -188,11 +192,10 @@ class _MedicalReportsPageState extends State { backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, textColor: AppColors.whiteColor, - fontSize: 16, + fontSize: 16.f, fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 45.h, + borderRadius: 12.r, + height: 46.h, icon: AppAssets.requests, iconColor: AppColors.whiteColor, iconSize: 20.h, @@ -218,7 +221,9 @@ class _MedicalReportsPageState extends State { LoaderBottomSheet.showLoader(); await medicalFileViewModel.insertRequestForMedicalReport(onSuccess: (val) { LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight(context, child: Utils.getSuccessWidget(loadingText: "Your medical report request has been successfully submitted.".needTranslation), callBackFunc: () { + showCommonBottomSheetWithoutHeight(context, + child: Utils.getSuccessWidget(loadingText: "Your medical report request has been successfully submitted.".needTranslation), + callBackFunc: () { medicalFileViewModel.setIsPatientMedicalReportsLoading(true); medicalFileViewModel.onMedicalReportTabChange(0); medicalFileViewModel.getPatientMedicalReportList(); diff --git a/lib/widgets/map/location_map_widget.dart b/lib/widgets/map/location_map_widget.dart index 4cf5eae..c0eb431 100644 --- a/lib/widgets/map/location_map_widget.dart +++ b/lib/widgets/map/location_map_widget.dart @@ -21,7 +21,7 @@ class LocationMapWidget extends StatelessWidget { final String address; /// The title to show above the map (e.g., "Service Location", "Hospital Location") - final String title; + final String? title; /// The zoom level for the map (default: 14) final int zoomLevel; @@ -36,9 +36,6 @@ class LocationMapWidget extends StatelessWidget { /// Whether to show the address container (default: true) final bool showAddress; - /// Whether to show the title (default: true) - final bool showTitle; - /// Custom map type (default: roadmap) final String mapType; final EdgeInsets? padding; @@ -48,12 +45,11 @@ class LocationMapWidget extends StatelessWidget { required this.latitude, required this.longitude, required this.address, - required this.title, + this.title, this.zoomLevel = 14, this.mapSize = '350x165', this.onDirectionsTap, this.showAddress = true, - this.showTitle = true, this.mapType = 'roadmap', this.padding, }); @@ -70,18 +66,15 @@ class LocationMapWidget extends StatelessWidget { "https://maps.googleapis.com/maps/api/staticmap?center=$latitude,$longitude&zoom=$zoomLevel&size=$mapSize&maptype=$mapType&markers=color:red%7C$latitude,$longitude&key=${ApiKeyConstants.googleMapsApiKey}"; return Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 16.r, - ), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), padding: padding ?? EdgeInsets.all(16.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Title - if (showTitle) ...[ + if (title != null) ...[ Text( - title, + title ?? "", style: TextStyle( fontSize: 16.f, fontWeight: FontWeight.w700, @@ -94,35 +87,22 @@ class LocationMapWidget extends StatelessWidget { // Address display if (showAddress) ...[ - Container( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 14.h), - decoration: BoxDecoration( - color: AppColors.bgScaffoldColor, - borderRadius: BorderRadius.circular(12.r), - border: Border.all( - color: AppColors.greyColor.withAlpha(51), - width: 1, - ), - ), - child: Row( - children: [ - Icon(Icons.location_on, color: AppColors.primaryRedColor, size: 20.h), - SizedBox(width: 8.w), - Expanded( - child: Text( - address, - style: TextStyle( - fontSize: 14.f, - fontWeight: FontWeight.w500, - color: AppColors.blackColor, - letterSpacing: -0.4, - ), - maxLines: 2, - overflow: TextOverflow.ellipsis, + Row( + children: [ + Expanded( + child: Text( + address, + style: TextStyle( + fontSize: 14.f, + fontWeight: FontWeight.w500, + color: AppColors.blackColor, + letterSpacing: -0.4, ), + maxLines: 2, + overflow: TextOverflow.ellipsis, ), - ], - ), + ), + ], ), SizedBox(height: 16.h), ], From 87fd9a42b7c2c48f0046398dbb173a2a3b8db7bb Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 17 Dec 2025 11:09:35 +0300 Subject: [PATCH 29/55] Nearest Appointment selected --- lib/core/api_consts.dart | 2 +- .../book_appointments_view_model.dart | 15 ++++++++++ .../location/location_view_model.dart | 4 ++- .../book_appointment/select_doctor_page.dart | 28 ++++++++++++++++++- .../book_appointment/widgets/doctor_card.dart | 4 ++- 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 9bab873..1f92ad5 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -700,7 +700,7 @@ var GET_PRESCRIPTION_INSTRUCTIONS_PDF = 'Services/ChatBot_Service.svc/REST/Chatb class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index d96cb4f..fd3f8c7 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -49,6 +49,8 @@ class BookAppointmentsViewModel extends ChangeNotifier { int initialSlotDuration = 0; + bool isNearestAppointmentSelected = false; + LocationUtils locationUtils; List clinicsList = []; @@ -187,6 +189,18 @@ class BookAppointmentsViewModel extends ChangeNotifier { notifyListeners(); } + setIsNearestAppointmentSelected(bool isNearestAppointmentSelected) { + this.isNearestAppointmentSelected = isNearestAppointmentSelected; + + if (isNearestAppointmentSelected) { + doctorsList.sort((a, b) => DateUtil.convertStringToDate(a.nearestFreeSlot!).compareTo(DateUtil.convertStringToDate(b.nearestFreeSlot!))); + } else { + doctorsList.sort((a, b) => b.decimalDoctorRate!.compareTo(a.decimalDoctorRate!)); + } + + notifyListeners(); + } + setIsWaitingAppointmentSelected(bool isWaitingAppointmentSelected) { this.isWaitingAppointmentSelected = isWaitingAppointmentSelected; notifyListeners(); @@ -391,6 +405,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { doctorsList = apiResponse.data!; filteredDoctorList = doctorsList; isDoctorsListLoading = false; + doctorsList.sort((a, b) => b.decimalDoctorRate!.compareTo(a.decimalDoctorRate!)); initializeFilteredList(); clearSearchFilters(); getFiltersFromDoctorList(); diff --git a/lib/features/location/location_view_model.dart b/lib/features/location/location_view_model.dart index 76d7c2c..5b0eef6 100644 --- a/lib/features/location/location_view_model.dart +++ b/lib/features/location/location_view_model.dart @@ -37,7 +37,9 @@ class LocationViewModel extends ChangeNotifier { } GMSMapServices.CameraPosition getGMSLocation() { - return GMSMapServices.CameraPosition(target: GMSMapServices.LatLng(getIt().userLat, getIt().userLong), zoom: 18); + return GMSMapServices.CameraPosition( + target: GMSMapServices.LatLng(getIt().userLat != 0.0 ? getIt().userLat : 24.7248316, getIt().userLong != 0.0 ? getIt().userLong : 46.4928828), + zoom: 18); } void placeValueInController() async { diff --git a/lib/presentation/book_appointment/select_doctor_page.dart b/lib/presentation/book_appointment/select_doctor_page.dart index 46c3774..e450746 100644 --- a/lib/presentation/book_appointment/select_doctor_page.dart +++ b/lib/presentation/book_appointment/select_doctor_page.dart @@ -41,6 +41,7 @@ class _SelectDoctorPageState extends State { @override void initState() { scheduleMicrotask(() { + bookAppointmentsViewModel.setIsNearestAppointmentSelected(false); if (bookAppointmentsViewModel.isLiveCareSchedule) { bookAppointmentsViewModel.getLiveCareDoctorsList(); } else { @@ -105,8 +106,33 @@ class _SelectDoctorPageState extends State { ), ], ), + SizedBox(height: 16.h), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + // Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h), + // SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.nearestAppo.tr(context: context).toText13(isBold: true), + "View nearest available appointments".needTranslation.toText11(color: AppColors.textColorLight, weight: FontWeight.w500), + ], + ), + const Spacer(), + Switch( + activeThumbColor: AppColors.successColor, + activeTrackColor: AppColors.successColor.withValues(alpha: .15), + value: bookAppointmentsVM.isNearestAppointmentSelected, + onChanged: (newValue) async { + bookAppointmentsVM.setIsNearestAppointmentSelected(newValue); + + }, + ), + ], + ), ListView.separated( - padding: EdgeInsets.only(top: 24.h), + padding: EdgeInsets.only(top: 16.h), shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemCount: bookAppointmentsVM.isDoctorsListLoading diff --git a/lib/presentation/book_appointment/widgets/doctor_card.dart b/lib/presentation/book_appointment/widgets/doctor_card.dart index 7257dbf..63450b3 100644 --- a/lib/presentation/book_appointment/widgets/doctor_card.dart +++ b/lib/presentation/book_appointment/widgets/doctor_card.dart @@ -115,12 +115,14 @@ class DoctorCard extends StatelessWidget { iconColor: AppColors.ratingColorYellow, labelText: "Rating: ${isLoading ? 4.78 : doctorsListResponseModel.decimalDoctorRate}".needTranslation, ).toShimmer2(isShow: isLoading), - doctorsListResponseModel.nearestFreeSlot != null + bookAppointmentsViewModel.isNearestAppointmentSelected + ? doctorsListResponseModel.nearestFreeSlot != null ? AppCustomChipWidget( labelText: (isLoading ? "Cardiologist" : DateUtil.getDateStringForNearestSlot(doctorsListResponseModel.nearestFreeSlot)).needTranslation, backgroundColor: AppColors.successColor, textColor: AppColors.whiteColor, ).toShimmer2(isShow: isLoading) + : SizedBox.shrink() : SizedBox.shrink(), ], ), From 15f5eaf8e55de7d48572b95162ba29bb067f92e6 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 17 Dec 2025 11:13:50 +0300 Subject: [PATCH 30/55] updates --- lib/presentation/book_appointment/select_doctor_page.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/presentation/book_appointment/select_doctor_page.dart b/lib/presentation/book_appointment/select_doctor_page.dart index e450746..72786f3 100644 --- a/lib/presentation/book_appointment/select_doctor_page.dart +++ b/lib/presentation/book_appointment/select_doctor_page.dart @@ -110,12 +110,11 @@ class _SelectDoctorPageState extends State { Row( mainAxisSize: MainAxisSize.max, children: [ - // Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h), - // SizedBox(width: 8.h), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.nearestAppo.tr(context: context).toText13(isBold: true), + SizedBox(height: 4.h), "View nearest available appointments".needTranslation.toText11(color: AppColors.textColorLight, weight: FontWeight.w500), ], ), From a78769df672b776a6b4aaf2bc30eb18a6d8e19ac Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 17 Dec 2025 11:55:40 +0300 Subject: [PATCH 31/55] collapsing_list_view improvement --- lib/widgets/appbar/collapsing_list_view.dart | 258 ++++++++++++++----- 1 file changed, 188 insertions(+), 70 deletions(-) diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart index 7329de9..2f6d412 100644 --- a/lib/widgets/appbar/collapsing_list_view.dart +++ b/lib/widgets/appbar/collapsing_list_view.dart @@ -6,6 +6,7 @@ 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/app_state.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/context_extensions.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'; @@ -47,6 +48,8 @@ class CollapsingListView extends StatelessWidget { this.physics, }); + final ScrollController _controller = ScrollController(); + @override Widget build(BuildContext context) { AppState appState = getIt.get(); @@ -56,20 +59,36 @@ class CollapsingListView extends StatelessWidget { children: [ CustomScrollView( physics: physics, + controller: _controller, slivers: [ SliverAppBar( - automaticallyImplyLeading: false, + automaticallyImplyLeading: isLeading, pinned: true, - expandedHeight: MediaQuery.of(context).size.height * 0.11.h, - stretch: true, + toolbarHeight: isLeading ? 24.h : kToolbarHeight, + leadingWidth: isLeading ? null : double.infinity, systemOverlayStyle: SystemUiOverlayStyle(statusBarBrightness: Brightness.light), surfaceTintColor: Colors.transparent, backgroundColor: AppColors.bgScaffoldColor, + bottom: isLeading + ? ScrollAnimatedTitle( + title: title, + showBack: true, + controller: _controller, + search: search, + report: report, + logout: logout, + history: history, + instructions: instructions, + requests: requests, + bottomChild: bottomChild, + trailing: trailing, + ) + : null, leading: isLeading ? Transform.flip( flipX: appState.isArabic(), child: IconButton( - icon: Utils.buildSvgWithAssets(icon: isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 32.h, height: 32.h), + icon: Utils.buildSvgWithAssets(icon: isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 24.h, height: 24.h), padding: EdgeInsets.only(left: 12), onPressed: () { if (leadingCallback != null) { @@ -81,68 +100,19 @@ class CollapsingListView extends StatelessWidget { highlightColor: Colors.transparent, ), ) - : SizedBox.shrink(), - flexibleSpace: LayoutBuilder( - builder: (context, constraints) { - final double maxHeight = 100.h; - final double minHeight = kToolbarHeight; - double t = (constraints.maxHeight - minHeight) / (maxHeight - minHeight); - t = t - 1; - if (t < 0.7) t = 0.7; - t = t.clamp(0.0, 1.0); - - final double fontSize = lerpDouble(14, 18, t)!; - final double bottomPadding = lerpDouble(0, 0, t)!; - final double leftPadding = lerpDouble(150, 24, t)!; - - return Stack( - children: [ - Align( - alignment: Alignment.lerp( - Alignment.center, - Alignment.bottomLeft, - t, - )!, - child: Padding( - padding: EdgeInsets.only( - left: appState.isArabic() ? 0 : leftPadding, right: appState.isArabic() ? leftPadding : 0, bottom: bottomPadding), - child: Row( - spacing: 4.h, - children: [ - Text( - title, - maxLines: 1, - style: TextStyle( - fontSize: (27 - (5 * (2 - t))).f, - fontWeight: FontWeight.lerp( - FontWeight.w300, - FontWeight.w600, - t, - )!, - color: AppColors.blackColor, - letterSpacing: -0.5), - ).expanded, - if (logout != null) - actionButton(context, t, title: "Logout".needTranslation, icon: AppAssets.logout).onPress(logout!), - if (report != null) - actionButton(context, t, title: "Feedback".needTranslation, icon: AppAssets.report_icon).onPress(report!), - if (history != null) - actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon) - .onPress(history!), - if (instructions != null) - actionButton(context, t, title: "Instructions".needTranslation, icon: AppAssets.requests).onPress(instructions!), - if (requests != null) - actionButton(context, t, title: "Requests".needTranslation, icon: AppAssets.insurance_history_icon) - .onPress(requests!), - if (search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(search!).paddingOnly(right: 24), - if (trailing != null) trailing!, - ], - )), - ), - ], - ); - }, - ), + : ScrollAnimatedTitle( + title: title, + showBack: false, + controller: _controller, + search: search, + report: report, + logout: logout, + history: history, + instructions: instructions, + requests: requests, + bottomChild: bottomChild, + trailing: trailing, + ), ), SliverList( delegate: SliverChildBuilderDelegate( @@ -158,13 +128,161 @@ class CollapsingListView extends StatelessWidget { ); } +// Widget actionButton(BuildContext context, double t, {required String title, required String icon}) { +// return AnimatedSize( +// duration: Duration(milliseconds: 150), +// child: Container( +// height: 40.h, +// padding: EdgeInsets.all(8.w), +// margin: EdgeInsets.only(right: 24.w), +// decoration: RoundedRectangleBorder().toSmoothCornerDecoration( +// color: AppColors.secondaryLightRedColor, +// borderRadius: 10.r, +// ), +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// mainAxisAlignment: MainAxisAlignment.center, +// mainAxisSize: MainAxisSize.min, +// spacing: 8.h, +// children: [ +// Utils.buildSvgWithAssets(icon: icon, iconColor: AppColors.primaryRedColor), +// if (t == 1) +// Text( +// title, +// style: context.dynamicTextStyle( +// color: AppColors.primaryRedColor, +// letterSpacing: -0.4, +// fontSize: (12 - (2 * (1 - t))).f, +// fontWeight: FontWeight.lerp( +// FontWeight.w300, +// FontWeight.w500, +// t, +// )!, +// ), +// ), +// ], +// ), +// ), +// ); +// } +} +// +// class ActionModel { +// bool requireT; +// +// } + +class ScrollAnimatedTitle extends StatefulWidget implements PreferredSizeWidget { + final String title; + final bool showBack; + final ScrollController controller; + + VoidCallback? search; + VoidCallback? report; + VoidCallback? logout; + VoidCallback? history; + VoidCallback? instructions; + VoidCallback? requests; + Widget? bottomChild; + Widget? trailing; + + ScrollAnimatedTitle({ + super.key, + required this.title, + required this.controller, + required this.showBack, + this.search, + this.report, + this.logout, + this.history, + this.instructions, + this.requests, + this.bottomChild, + this.trailing, + }); + + @override + Size get preferredSize => const Size.fromHeight(50); + + @override + State createState() => _ScrollAnimatedTitleState(); +} + +class _ScrollAnimatedTitleState extends State { + static const double _maxFont = 24; + static const double _minFont = 14; + + static const double _maxHeight = 80; + static const double _minHeight = 56; + + double _fontSize = _maxFont; + + @override + void initState() { + super.initState(); + widget.controller.addListener(_onScroll); + } + + @override + void dispose() { + widget.controller.removeListener(_onScroll); + super.dispose(); + } + + double t = 0; + + void _onScroll() { + final double offset = widget.controller.offset; + + // control animation range + const double range = 120; + + final double t = (1 - (offset / range)).clamp(0.0, 1.0); + this.t = t; + setState(() { + _fontSize = _minFont + (_maxFont - _minFont) * t; + }); + } + + @override + Widget build(BuildContext context) { + final isRtl = Directionality.of(context) == TextDirection.rtl; + return Container( + height: (widget.preferredSize.height - _fontSize / 2).h, + alignment: isRtl ? (widget.showBack ? Alignment.topRight : Alignment.centerRight) : (widget.showBack ? Alignment.topLeft : Alignment.centerLeft), + padding: EdgeInsets.fromLTRB(24, 0, 24, 0), + child: Row( + spacing: 4.h, + children: [ + Text( + widget.title, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: _fontSize, + fontWeight: FontWeight.bold, + ), + ).expanded, + ...[ + if (widget.logout != null) actionButton(context, t, title: "Logout".needTranslation, icon: AppAssets.logout).onPress(widget.logout!), + if (widget.report != null) actionButton(context, t, title: "Feedback".needTranslation, icon: AppAssets.report_icon).onPress(widget.report!), + if (widget.history != null) actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon).onPress(widget.history!), + if (widget.instructions != null) actionButton(context, t, title: "Instructions".needTranslation, icon: AppAssets.requests).onPress(widget.instructions!), + if (widget.requests != null) actionButton(context, t, title: "Requests".needTranslation, icon: AppAssets.insurance_history_icon).onPress(widget.requests!), + if (widget.search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(widget.search!), + if (widget.trailing != null) widget.trailing!, + ] + ], + ), + ); + } + Widget actionButton(BuildContext context, double t, {required String title, required String icon}) { return AnimatedSize( duration: Duration(milliseconds: 150), child: Container( - height: 40.h, + height: 36.h + (4.h * t), padding: EdgeInsets.all(8.w), - margin: EdgeInsets.only(right: 24.w), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.secondaryLightRedColor, borderRadius: 10.r, @@ -176,7 +294,7 @@ class CollapsingListView extends StatelessWidget { spacing: 8.h, children: [ Utils.buildSvgWithAssets(icon: icon, iconColor: AppColors.primaryRedColor), - if (t == 1) + if (t >= .5) Text( title, style: context.dynamicTextStyle( @@ -184,7 +302,7 @@ class CollapsingListView extends StatelessWidget { letterSpacing: -0.4, fontSize: (12 - (2 * (1 - t))).f, fontWeight: FontWeight.lerp( - FontWeight.w300, + FontWeight.w400, FontWeight.w500, t, )!, From edcab9d26d60c433f741c84a484b047fb70b3d77 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 17 Dec 2025 15:20:01 +0300 Subject: [PATCH 32/55] collapsing_list_view improvement --- lib/widgets/appbar/collapsing_list_view.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart index 2f6d412..ca40c32 100644 --- a/lib/widgets/appbar/collapsing_list_view.dart +++ b/lib/widgets/appbar/collapsing_list_view.dart @@ -64,7 +64,7 @@ class CollapsingListView extends StatelessWidget { SliverAppBar( automaticallyImplyLeading: isLeading, pinned: true, - toolbarHeight: isLeading ? 24.h : kToolbarHeight, + // toolbarHeight: isLeading ? 24.h : kToolbarHeight, leadingWidth: isLeading ? null : double.infinity, systemOverlayStyle: SystemUiOverlayStyle(statusBarBrightness: Brightness.light), surfaceTintColor: Colors.transparent, @@ -88,7 +88,7 @@ class CollapsingListView extends StatelessWidget { ? Transform.flip( flipX: appState.isArabic(), child: IconButton( - icon: Utils.buildSvgWithAssets(icon: isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 24.h, height: 24.h), + icon: Utils.buildSvgWithAssets(icon: isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 32.h, height: 32.h), padding: EdgeInsets.only(left: 12), onPressed: () { if (leadingCallback != null) { From f509a09b3479775254bc62812a992e94fd274f29 Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Wed, 17 Dec 2025 16:05:25 +0300 Subject: [PATCH 33/55] Health calculators & converters --- .../svg/approximate_ovulation_accordion.svg | 9 + assets/images/svg/bloodcholestrol.svg | 6 + assets/images/svg/bloodsugar.svg | 4 + assets/images/svg/bulb.svg | 5 + assets/images/svg/due_date_accordion.svg | 9 + .../images/svg/fertile_window_accordion.svg | 11 + assets/images/svg/next_period_accordion.svg | 8 + .../svg/pregnancy_test_day_accordion.svg | 20 + assets/images/svg/switch.svg | 5 + assets/images/svg/triglycerides.svg | 5 + lib/core/app_assets.dart | 15 + lib/core/dependencies.dart | 9 +- lib/core/enums.dart | 10 +- lib/main.dart | 2 +- .../book_appointment/select_clinic_page.dart | 1005 ++++++++++++++--- .../health_calculator_result.dart | 444 -------- .../health_calculators_page.dart | 157 --- .../health_calculator_detailed_page.dart | 90 +- .../health_calculator_view_model.dart | 369 +++++- .../health_calculators_page.dart | 255 +++++ .../health_converter_result.dart | 0 .../widgets/bf.dart | 2 +- .../widgets/blood_cholesterol.dart | 180 +++ .../widgets/blood_sugar.dart | 190 ++++ .../widgets/bmi.dart | 2 +- .../widgets/bmr.dart | 2 +- .../widgets/calories.dart | 2 +- .../widgets/crabs.dart | 4 +- .../widgets/dduedate.dart | 6 +- .../widgets/health_card.dart | 0 .../widgets/ibw.dart | 2 +- .../widgets/ovulation.dart | 19 +- .../widgets/triglycerides.dart | 194 ++++ .../hmg_services/services_page.dart | 2 +- .../home/data/landing_page_data.dart | 2 +- lib/routes/app_routes.dart | 8 +- 36 files changed, 2244 insertions(+), 809 deletions(-) create mode 100644 assets/images/svg/approximate_ovulation_accordion.svg create mode 100644 assets/images/svg/bloodcholestrol.svg create mode 100644 assets/images/svg/bloodsugar.svg create mode 100644 assets/images/svg/bulb.svg create mode 100644 assets/images/svg/due_date_accordion.svg create mode 100644 assets/images/svg/fertile_window_accordion.svg create mode 100644 assets/images/svg/next_period_accordion.svg create mode 100644 assets/images/svg/pregnancy_test_day_accordion.svg create mode 100644 assets/images/svg/switch.svg create mode 100644 assets/images/svg/triglycerides.svg delete mode 100644 lib/presentation/health_calculators/health_calculator_result.dart delete mode 100644 lib/presentation/health_calculators/health_calculators_page.dart rename lib/presentation/{health_calculators => health_calculators_and_converts}/health_calculator_detailed_page.dart (61%) rename lib/presentation/{health_calculators => health_calculators_and_converts}/health_calculator_view_model.dart (65%) create mode 100644 lib/presentation/health_calculators_and_converts/health_calculators_page.dart create mode 100644 lib/presentation/health_calculators_and_converts/health_converter_result.dart rename lib/presentation/{health_calculators => health_calculators_and_converts}/widgets/bf.dart (99%) create mode 100644 lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart create mode 100644 lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart rename lib/presentation/{health_calculators => health_calculators_and_converts}/widgets/bmi.dart (99%) rename lib/presentation/{health_calculators => health_calculators_and_converts}/widgets/bmr.dart (99%) rename lib/presentation/{health_calculators => health_calculators_and_converts}/widgets/calories.dart (99%) rename lib/presentation/{health_calculators => health_calculators_and_converts}/widgets/crabs.dart (98%) rename lib/presentation/{health_calculators => health_calculators_and_converts}/widgets/dduedate.dart (94%) rename lib/presentation/{health_calculators => health_calculators_and_converts}/widgets/health_card.dart (100%) rename lib/presentation/{health_calculators => health_calculators_and_converts}/widgets/ibw.dart (99%) rename lib/presentation/{health_calculators => health_calculators_and_converts}/widgets/ovulation.dart (91%) create mode 100644 lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart diff --git a/assets/images/svg/approximate_ovulation_accordion.svg b/assets/images/svg/approximate_ovulation_accordion.svg new file mode 100644 index 0000000..a721d61 --- /dev/null +++ b/assets/images/svg/approximate_ovulation_accordion.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/bloodcholestrol.svg b/assets/images/svg/bloodcholestrol.svg new file mode 100644 index 0000000..8a77bb5 --- /dev/null +++ b/assets/images/svg/bloodcholestrol.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/bloodsugar.svg b/assets/images/svg/bloodsugar.svg new file mode 100644 index 0000000..a97032c --- /dev/null +++ b/assets/images/svg/bloodsugar.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/bulb.svg b/assets/images/svg/bulb.svg new file mode 100644 index 0000000..94553a5 --- /dev/null +++ b/assets/images/svg/bulb.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/due_date_accordion.svg b/assets/images/svg/due_date_accordion.svg new file mode 100644 index 0000000..828a1c9 --- /dev/null +++ b/assets/images/svg/due_date_accordion.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/fertile_window_accordion.svg b/assets/images/svg/fertile_window_accordion.svg new file mode 100644 index 0000000..63f0173 --- /dev/null +++ b/assets/images/svg/fertile_window_accordion.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/images/svg/next_period_accordion.svg b/assets/images/svg/next_period_accordion.svg new file mode 100644 index 0000000..4ff65db --- /dev/null +++ b/assets/images/svg/next_period_accordion.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/pregnancy_test_day_accordion.svg b/assets/images/svg/pregnancy_test_day_accordion.svg new file mode 100644 index 0000000..5a29588 --- /dev/null +++ b/assets/images/svg/pregnancy_test_day_accordion.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svg/switch.svg b/assets/images/svg/switch.svg new file mode 100644 index 0000000..1db8753 --- /dev/null +++ b/assets/images/svg/switch.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/triglycerides.svg b/assets/images/svg/triglycerides.svg new file mode 100644 index 0000000..0f8facd --- /dev/null +++ b/assets/images/svg/triglycerides.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index 49d14a4..6e5bc09 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -246,6 +246,21 @@ class AppAssets { static const String refreshIcon = '$svgBasePath/refresh.svg'; static const String homeBorderedIcon = '$svgBasePath/home_bordered.svg'; + + + static const String bloodSugar = '$svgBasePath/bloodsugar.svg'; + static const String bloodCholestrol = '$svgBasePath/bloodcholestrol.svg'; + static const String triglycerides = '$svgBasePath/triglycerides.svg'; + static const String bulb = '$svgBasePath/bulb.svg'; + static const String switchBtn = '$svgBasePath/switch.svg'; + + + static const String ovulationAccordion = '$svgBasePath/approximate_ovulation_accordion.svg'; + static const String nextPeriodAccordion = '$svgBasePath/next_period_accordion.svg'; + static const String fertileAccordion = '$svgBasePath/fertile_window_accordion.svg'; + static const String pregnancyDayAccordion = '$svgBasePath/pregnancy_test_day_accordion.svg'; + static const String pregnancyDueDateAccordion = '$svgBasePath/due_date_accordion.svg'; + // PNGS // static const String hmgLogo = '$pngBasePath/hmg_logo.png'; static const String liveCareService = '$pngBasePath/livecare_service.png'; diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index 054e1fa..5d98a78 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -45,7 +45,6 @@ import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_r import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; @@ -59,6 +58,8 @@ import 'package:local_auth/local_auth.dart'; import 'package:logger/web.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../presentation/health_calculators_and_converts/health_calculator_view_model.dart'; + GetIt getIt = GetIt.instance; class AppDependencies { @@ -135,15 +136,13 @@ class AppDependencies { () => RadiologyViewModel(radiologyRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()), ); - getIt.registerLazySingleton( - () => PrescriptionsViewModel(prescriptionsRepo: getIt(), errorHandlerService: getIt(), navServices: getIt())); + getIt.registerLazySingleton(() => PrescriptionsViewModel(prescriptionsRepo: getIt(), errorHandlerService: getIt(), navServices: getIt())); getIt.registerLazySingleton(() => InsuranceViewModel(insuranceRepo: getIt(), errorHandlerService: getIt())); getIt.registerLazySingleton(() => MyAppointmentsViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); - getIt.registerLazySingleton( - () => AppointmentRatingViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); + getIt.registerLazySingleton(() => AppointmentRatingViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); getIt.registerLazySingleton( () => PayfortViewModel( diff --git a/lib/core/enums.dart b/lib/core/enums.dart index 3a9effb..8fd4818 100644 --- a/lib/core/enums.dart +++ b/lib/core/enums.dart @@ -34,9 +34,11 @@ enum FamilyFileEnum { active, inactive, blocked, deleted, pending, rejected } enum BodyView { front, back } +enum HealthCalConEnum { calculator, converter } + enum HealthCalculatorEnum { general, women } -enum HealthCalculatorsTypeEnum { bmi, calories, bmr, idealBodyWeight, bodyFat, crabsProteinFat, ovulation, deliveryDueDate } +enum HealthCalculatorsTypeEnum { bmi, calories, bmr, idealBodyWeight, bodyFat, crabsProteinFat, ovulation, deliveryDueDate, bloodSugar, bloodCholesterol, triglycerides } extension HealthCalculatorExtenshion on HealthCalculatorsTypeEnum { String get displayName { @@ -59,6 +61,12 @@ extension HealthCalculatorExtenshion on HealthCalculatorsTypeEnum { return isArabic ? "فترة الإباضة" : "Ovulation Period"; case HealthCalculatorsTypeEnum.deliveryDueDate: return isArabic ? "تاريخ استحقاق التسليم" : "Delivery Due Date"; + case HealthCalculatorsTypeEnum.bloodSugar: + return isArabic ? "سكر الدم" : "Blood Sugar"; + case HealthCalculatorsTypeEnum.bloodCholesterol: + return isArabic ? "كوليسترول الدم" : "Blood Cholesterol"; + case HealthCalculatorsTypeEnum.triglycerides: + return isArabic ? "الدهون الثلاثية في الدم" : "Triglycerides Fat Blood"; } } diff --git a/lib/main.dart b/lib/main.dart index ed69150..fd7654f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -32,7 +32,7 @@ import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart import 'package:hmg_patient_app_new/features/smartwatch_health_data/health_provider.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/routes/app_routes.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart index d0bd740..6d376a8 100644 --- a/lib/presentation/book_appointment/select_clinic_page.dart +++ b/lib/presentation/book_appointment/select_clinic_page.dart @@ -6,6 +6,7 @@ import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -27,6 +28,7 @@ import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; @@ -36,8 +38,10 @@ import 'package:provider/provider.dart'; class SelectClinicPage extends StatefulWidget { bool isFromRegionFlow; + HealthCalculatorsTypeEnum? calculatorType; + dynamic calculatedResult; - SelectClinicPage({super.key, this.isFromRegionFlow = false}); + SelectClinicPage({super.key, this.isFromRegionFlow = false, this.calculatorType, this.calculatedResult}); @override State createState() => _SelectClinicPageState(); @@ -69,131 +73,872 @@ class _SelectClinicPageState extends State { bookAppointmentsViewModel = Provider.of(context, listen: false); regionalViewModel = Provider.of(context, listen: true); appState = getIt.get(); - return Scaffold( - backgroundColor: AppColors.bgScaffoldColor, - body: CollapsingListView( - title: bookAppointmentsViewModel.isLiveCareSchedule ? "Select LiveCare Clinic".needTranslation : LocaleKeys.selectClinic.tr(context: context), - child: SingleChildScrollView( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 24.h), - child: Consumer(builder: (context, bookAppointmentsVM, child) { - return Column( - children: [ - SizedBox(height: 16.h), - TextInputWidget( - labelText: LocaleKeys.search.tr(context: context), - hintText: LocaleKeys.clinicName.tr(context: context), - controller: searchEditingController, - isEnable: true, - prefix: null, - autoFocus: false, - isBorderAllowed: false, - keyboardType: TextInputType.text, - focusNode: textFocusNode, - suffix: searchEditingController.text.isNotEmpty - ? GestureDetector( - onTap: () { - searchEditingController.clear(); - bookAppointmentsViewModel.filterClinics(""); - textFocusNode.unfocus(); - }, - child: Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown), - ) - : null, - onChange: (value) { - bookAppointmentsViewModel.filterClinics(value!); - }, - padding: EdgeInsets.symmetric( - vertical: ResponsiveExtension(10).h, - horizontal: ResponsiveExtension(15).h, + if (widget.calculatorType != null) { + return CollapsingListView( + title: "Your ${widget.calculatorType!.name.toCamelCase}", + bottomChild: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.only(topLeft: Radius.circular(24.r), topRight: Radius.circular(24.r))), + padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.h), + child: CustomButton( + text: LocaleKeys.bookAppo.tr(), + onPressed: () { + onClinicSelected(GetClinicsListResponseModel(clinicID: 108, clinicDescription: "asdfds", clinicDescriptionN: "asdfds")); + }, + icon: null, + fontSize: 16.f, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + borderRadius: 12.r, + fontWeight: FontWeight.w500), + ), + child: getCalculatorResultWidget(type: widget.calculatorType!, calculatedResult: widget.calculatedResult).paddingSymmetrical(18.w, 24.h), + ); + } else { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: bookAppointmentsViewModel.isLiveCareSchedule ? "Select LiveCare Clinic".needTranslation : LocaleKeys.selectClinic.tr(context: context), + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Consumer(builder: (context, bookAppointmentsVM, child) { + return Column( + children: [ + SizedBox(height: 16.h), + TextInputWidget( + labelText: LocaleKeys.search.tr(context: context), + hintText: LocaleKeys.clinicName.tr(context: context), + controller: searchEditingController, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + focusNode: textFocusNode, + suffix: searchEditingController.text.isNotEmpty + ? GestureDetector( + onTap: () { + searchEditingController.clear(); + bookAppointmentsViewModel.filterClinics(""); + textFocusNode.unfocus(); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, width: 20.h, height: 20.h, fit: BoxFit.scaleDown), + ) + : null, + onChange: (value) { + bookAppointmentsViewModel.filterClinics(value!); + }, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), ), - ), - bookAppointmentsVM.isLiveCareSchedule - ? ListView.separated( - padding: EdgeInsets.only(top: 24.h), - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemCount: bookAppointmentsVM.isClinicsListLoading ? 5 : bookAppointmentsVM.liveCareClinicsList.length, - itemBuilder: (context, index) { - return bookAppointmentsVM.isClinicsListLoading - ? ClinicCard( - bookAppointmentsVM: bookAppointmentsVM, - liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), - clinicsListResponseModel: GetClinicsListResponseModel(), - isLoading: bookAppointmentsVM.isClinicsListLoading, - ) - : AnimationConfiguration.staggeredList( - position: index, - duration: const Duration(milliseconds: 500), - child: SlideAnimation( - verticalOffset: 100.0, - child: FadeInAnimation( - child: AnimatedContainer( - duration: Duration(milliseconds: 300), - curve: Curves.easeInOut, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), - child: ClinicCard( - bookAppointmentsVM: bookAppointmentsVM, - liveCareClinicsResponseModel: bookAppointmentsVM.liveCareClinicsList[index], - clinicsListResponseModel: GetClinicsListResponseModel(), - isLoading: bookAppointmentsVM.isClinicsListLoading, - ).onPress(() { - onLiveCareClinicSelected(bookAppointmentsVM.liveCareClinicsList[index]); - }), + bookAppointmentsVM.isLiveCareSchedule + ? ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: bookAppointmentsVM.isClinicsListLoading ? 5 : bookAppointmentsVM.liveCareClinicsList.length, + itemBuilder: (context, index) { + return bookAppointmentsVM.isClinicsListLoading + ? ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), + clinicsListResponseModel: GetClinicsListResponseModel(), + isLoading: bookAppointmentsVM.isClinicsListLoading, + ) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: bookAppointmentsVM.liveCareClinicsList[index], + clinicsListResponseModel: GetClinicsListResponseModel(), + isLoading: bookAppointmentsVM.isClinicsListLoading, + ).onPress(() { + onLiveCareClinicSelected(bookAppointmentsVM.liveCareClinicsList[index]); + }), + ), ), ), - ), - ); - }, - separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), - ) - : ListView.separated( - padding: EdgeInsets.only(top: 24.h), - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemCount: bookAppointmentsVM.isClinicsListLoading ? 5 : bookAppointmentsVM.filteredClinicsList.length, - itemBuilder: (context, index) { - return bookAppointmentsVM.isClinicsListLoading - ? ClinicCard( - bookAppointmentsVM: bookAppointmentsVM, - liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), - clinicsListResponseModel: GetClinicsListResponseModel(), - isLoading: bookAppointmentsVM.isClinicsListLoading, - ) - : AnimationConfiguration.staggeredList( - position: index, - duration: const Duration(milliseconds: 500), - child: SlideAnimation( - verticalOffset: 100.0, - child: FadeInAnimation( - child: AnimatedContainer( - duration: Duration(milliseconds: 300), - curve: Curves.easeInOut, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), - child: ClinicCard( - bookAppointmentsVM: bookAppointmentsVM, - liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), - clinicsListResponseModel: bookAppointmentsVM.filteredClinicsList[index], - isLoading: bookAppointmentsVM.isClinicsListLoading, - ).onPress(() { - onClinicSelected(bookAppointmentsVM.filteredClinicsList[index]); - }), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ) + : ListView.separated( + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: bookAppointmentsVM.isClinicsListLoading ? 5 : bookAppointmentsVM.filteredClinicsList.length, + itemBuilder: (context, index) { + return bookAppointmentsVM.isClinicsListLoading + ? ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), + clinicsListResponseModel: GetClinicsListResponseModel(), + isLoading: bookAppointmentsVM.isClinicsListLoading, + ) + : AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: GetLiveCareClinicsResponseModel(), + clinicsListResponseModel: bookAppointmentsVM.filteredClinicsList[index], + isLoading: bookAppointmentsVM.isClinicsListLoading, + ).onPress(() { + onClinicSelected(bookAppointmentsVM.filteredClinicsList[index]); + }), + ), ), ), - ), - ); - }, - separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), + ), + ], + ); + }), + ), + ), + ), + ); + } + } + + Widget getCalculatorResultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { + switch (widget.calculatorType!) { + case HealthCalculatorsTypeEnum.bmi: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.calories: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.bmr: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.idealBodyWeight: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.bodyFat: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.crabsProteinFat: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.ovulation: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.deliveryDueDate: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.bloodSugar: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.bloodCholesterol: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + case HealthCalculatorsTypeEnum.triglycerides: + return resultWidget(type: widget.calculatorType!, calculatedResult: calculatedResult); + } + } + + Widget resultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { + print(calculatedResult); + return Column( + children: [ + if (type == HealthCalculatorsTypeEnum.bmi) ...[ + if (calculatedResult["bmiCategory"] == "Normal") ...[ + calorieWidget( + title: calculatedResult["bmiCategory"], + calories: calculatedResult["bmiResult"], + description: + 'Your BMI is within the healthy range. Continue a balanced diet, regular physical activity, and routine checkups to maintain good health. Monitor any significant changes over time.', + color: Colors.green, + icon: Icons.scale, + hide: true, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["bmiCategory"] == "Underweight") ...[ + calorieWidget( + title: calculatedResult["bmiCategory"], + calories: calculatedResult["bmiResult"], + description: + 'BMI suggests you are underweight. Consider increasing calorie intake with nutrient-dense foods, include resistance training to build muscle, and consult a healthcare professional to check for underlying causes.', + color: Colors.orange, + hide: true, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["bmiCategory"] == "Overweight") ...[ + calorieWidget( + title: calculatedResult["bmiCategory"], + calories: calculatedResult["bmiResult"], + description: + 'BMI indicates overweight. Aim for gradual, sustainable weight loss through a modest calorie deficit, regular physical activity, and healthier food choices. Seek medical advice before major lifestyle changes.', + color: Colors.red, + hide: true, + icon: Icons.warning_rounded, + ), + ] + ] else if (type == HealthCalculatorsTypeEnum.calories) ...[ + if (calculatedResult["calorieRange"] == "Normal") ...[ + calorieWidget( + title: calculatedResult["calorieRange"], + calories: calculatedResult["calories"], + description: + 'Estimated daily calories to maintain your current weight given your activity level and metabolism. Use this as a baseline: increase slightly for muscle gain, or create a small deficit for gradual weight loss. Track progress and adjust every 2–4 weeks.', + color: Colors.green, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["calorieRange"] == "Low") ...[ + calorieWidget( + title: calculatedResult["calorieRange"], + calories: calculatedResult["calories"], + description: + 'A moderate calorie reduction designed for steady, sustainable weight loss (typically 0.25–0.5 kg per week). Combine with resistance training and adequate protein to preserve muscle. Avoid extreme cuts and consult a professional if you have medical conditions.', + color: Colors.orange, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["calorieRange"] == "High") ...[ + calorieWidget( + title: calculatedResult["calorieRange"], + calories: calculatedResult["calories"], + description: + 'A large calorie reduction that may produce faster weight loss but can be hard to sustain and increase risk of nutrient deficiencies, fatigue, or muscle loss. Not recommended long-term; seek guidance from a healthcare or nutrition professional before continuing.', + color: Colors.red, + icon: Icons.warning_rounded, + ), + ] + ] else if (type == HealthCalculatorsTypeEnum.bmr) ...[ + if (calculatedResult["bmrRange"] == "Normal") ...[ + calorieWidget( + title: calculatedResult["bmrRange"], + calories: calculatedResult["bmr"], + description: + 'Your Basal Metabolic Rate (BMR) is within the expected range for your profile. BMR is the energy your body needs at rest to maintain vital functions (breathing, circulation, temperature). Use this value as the baseline for estimating total daily energy needs by applying an activity multiplier. Maintain a balanced diet and regular physical activity to support metabolic health.', + color: Colors.green, + hide: true, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["bmrRange"] == "Low") ...[ + calorieWidget( + title: calculatedResult["bmrRange"], + calories: calculatedResult["bmr"], + description: + 'Your BMR is lower than typical for your profile. Possible causes include lower lean muscle mass, age-related metabolic decline, or metabolic adaptation from prolonged calorie restriction. Consider focusing on resistance training to build/maintain muscle, ensure adequate protein and micronutrient intake, and consult a healthcare professional if this is unexpected.', + color: Colors.orange, + hide: true, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["bmrRange"] == "High") ...[ + calorieWidget( + title: calculatedResult["bmrRange"], + calories: calculatedResult["bmr"], + description: + 'Your BMR is higher than average for your profile. This can reflect greater lean mass, younger age, or a naturally higher metabolic rate, meaning you burn more energy at rest. Use this information to tailor calorie targets: higher needs for maintenance or muscle gain, moderate deficit for weight loss. Seek medical advice if you notice rapid unexplained changes.', + color: Colors.red, + hide: true, + icon: Icons.warning_rounded, + ), + ] + ] else if (type == HealthCalculatorsTypeEnum.idealBodyWeight) ...[ + if (calculatedResult["status"] == "Normal") ...[ + calorieWidget( + title: calculatedResult["status"], + calories: calculatedResult["ibw"], + hide: true, + description: (() { + final diff = calculatedResult["difference"]; + if (diff is num) { + if (diff == 0) { + return 'Your weight is at the ideal target. Maintain your current habits — balanced diet and regular activity — to keep this.'; + } else if (diff > 0) { + return 'You are below the ideal weight by ${diff.toStringAsFixed(1)} kg. Aim to gradually increase weight with a modest calorie surplus, nutrient-dense foods, and resistance training.'; + } else { + return 'You are above the ideal weight by ${diff.abs().toStringAsFixed(1)} kg. Aim for a gradual, sustainable weight reduction through a moderate calorie deficit, increased activity, and balanced nutrition.'; + } + } + return 'Your weight is close to the ideal range. Maintain a balanced diet and regular activity; follow personalized advice from a healthcare professional if needed.'; + })(), + color: Colors.green, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["status"] == "Underweight") ...[ + calorieWidget( + title: calculatedResult["status"], + calories: calculatedResult["ibw"], + hide: true, + description: (() { + final diff = calculatedResult["difference"]; + if (diff is num) { + return 'You are below the ideal weight by ${diff.toStringAsFixed(1)} kg. Focus on increasing calorie intake with nutrient-dense foods, prioritize protein and resistance training to build healthy mass, and consider consulting a healthcare professional.'; + } + return 'You appear underweight compared to the ideal. Consider increasing calorie intake with nutrient-dense foods and resistance training; seek professional guidance if needed.'; + })(), + color: Colors.orange, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["status"] == "Overweight") ...[ + calorieWidget( + title: calculatedResult["status"], + calories: calculatedResult["ibw"], + hide: true, + description: (() { + final diff = calculatedResult["difference"]; + if (diff is num) { + return 'You are above the ideal weight by ${diff.abs().toStringAsFixed(1)} kg. Aim for a gradual, sustainable weight loss strategy — moderate calorie deficit, regular physical activity, and balanced nutrition. Consult a professional before major changes.'; + } + return 'You appear above the ideal weight. Consider a gradual, sustainable calorie deficit combined with activity and balanced nutrition; consult a professional if needed.'; + })(), + color: Colors.red, + icon: Icons.warning_rounded, + ), + ] + ] else if (type == HealthCalculatorsTypeEnum.crabsProteinFat) ...[ + if (calculatedResult["dietType"] == "Very Low Crabs") ...[ + calorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'Very low‑carb (ketogenic) approach: minimal carbohydrates, higher fat and moderate protein. May support rapid weight loss and improved blood sugar control for some, but can be hard to sustain and may cause nutrient gaps. Monitor hydration/electrolytes and consult a professional for long‑term use.'; + // if (total is num) { + // return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown: Carbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + // } + return base; + })(), + chipsItems: [ + ('Carbohydrates: ' + calculatedResult["carbsGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["carbsCalories"].toStringAsFixed(0) + ' kcal'), + ('Protein: ' + calculatedResult["proteinGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["proteinCalories"].toStringAsFixed(0) + ' kcal'), + ('Fat: ' + calculatedResult["fatGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["fatCalories"].toStringAsFixed(0) + ' kcal'), + ], + color: Colors.orange, + hide: true, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["dietType"] == "Low Crabs") ...[ + calorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'Low‑carb, higher‑protein plan: reduced carbohydrates with increased protein to support satiety and muscle maintenance. Helpful for weight management and glycemic control when balanced with vegetables and healthy fats. Ensure adequate fiber and micronutrients.'; + // if (total is num) { + // return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + // } + return base; + })(), + chipsItems: [ + ('Carbohydrates: ' + calculatedResult["carbsGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["carbsCalories"].toStringAsFixed(0) + ' kcal'), + ('Protein: ' + calculatedResult["proteinGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["proteinCalories"].toStringAsFixed(0) + ' kcal'), + ('Fat: ' + calculatedResult["fatGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["fatCalories"].toStringAsFixed(0) + ' kcal'), + ], + color: Colors.orange, + hide: true, + icon: Icons.trending_down, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["dietType"] == "Moderate Crabs") ...[ + calorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'Moderate carbohydrate intake with balanced protein and fats: provides steady energy for daily activity and exercise while allowing flexibility. Suitable for many people aiming for sustainable weight management and performance.'; + // if (total is num) { + // return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + // } + return base; + })(), + chipsItems: [ + ('Carbohydrates: ' + calculatedResult["carbsGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["carbsCalories"].toStringAsFixed(0) + ' kcal'), + ('Protein: ' + calculatedResult["proteinGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["proteinCalories"].toStringAsFixed(0) + ' kcal'), + ('Fat: ' + calculatedResult["fatGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["fatCalories"].toStringAsFixed(0) + ' kcal'), + ], + color: Colors.green, + hide: true, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["dietType"] == "USDA Guidelines ") ...[ + calorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'USDA‑based balanced pattern: emphasizes fruits, vegetables, whole grains, lean proteins, and limited added sugars and saturated fats. Evidence‑based framework for general health, nutrient adequacy, and chronic disease prevention.'; + // if (total is num) { + // return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + // } + + return base; + })(), + chipsItems: [ + ('Carbohydrates: ' + calculatedResult["carbsGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["carbsCalories"].toStringAsFixed(0) + ' kcal'), + ('Protein: ' + calculatedResult["proteinGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["proteinCalories"].toStringAsFixed(0) + ' kcal'), + ('Fat: ' + calculatedResult["fatGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["fatCalories"].toStringAsFixed(0) + ' kcal'), + ], + color: Colors.green, + hide: true, + icon: Icons.scale, + ), + SizedBox(height: 16.h), + ] else if (calculatedResult["dietType"] == "Zone Diet") ...[ + calorieWidget( + title: calculatedResult["dietType"].toString(), + calories: calculatedResult["totalCalories"], + description: (() { + final total = calculatedResult["totalCalories"]; + final carbsG = calculatedResult["carbsGrams"]; + final carbsC = calculatedResult["carbsCalories"]; + final protG = calculatedResult["proteinGrams"]; + final protC = calculatedResult["proteinCalories"]; + final fatG = calculatedResult["fatGrams"]; + final fatC = calculatedResult["fatCalories"]; + final base = + 'Zone Diet (~40% carbs / 30% protein / 30% fat): emphasizes hormonal balance and portion control. May improve body composition and energy for some, but requires planning; personalize with a nutrition professional.'; + // if (total is num) { + // return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; + // } + return base; + })(), + chipsItems: [ + ('Carbohydrates: ' + calculatedResult["carbsGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["carbsCalories"].toStringAsFixed(0) + ' kcal'), + ('Protein: ' + calculatedResult["proteinGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["proteinCalories"].toStringAsFixed(0) + ' kcal'), + ('Fat: ' + calculatedResult["fatGrams"].toStringAsFixed(0) + 'g = ' + calculatedResult["fatCalories"].toStringAsFixed(0) + ' kcal'), + ], + color: Colors.orange, + hide: true, + icon: Icons.warning_rounded, + ), + ] + ] else if (type == HealthCalculatorsTypeEnum.ovulation) ...[ + Column( + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + padding: EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.nextPeriodAccordion, width: 30.h, height: 30.h), + SizedBox( + width: 8.w, + ), + calculatedResult["lastPeriodDate"].toString().toText16(color: AppColors.successColor, weight: FontWeight.w600), + ], ), - ], - ); - }), + ], + ), + SizedBox(height: 8.h), + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: calculatedResult["lastPeriodDay"].toString(), + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor), + SizedBox(height: 16.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.ovulationAccordion, width: 30.h, height: 30.h), + SizedBox( + width: 8.w, + ), + calculatedResult["ovulationDate"].toString().toText16(color: AppColors.successColor, weight: FontWeight.w600), + ], + ), + SizedBox(height: 8.h), + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: calculatedResult["ovulationDay"].toString(), + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor), + SizedBox(height: 16.h), + "Fertility Window".toText16(color: AppColors.textColor, weight: FontWeight.w600), + SizedBox(height: 8.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.fertileAccordion, width: 30.h, height: 30.h), + SizedBox( + width: 8.w, + ), + calculatedResult["fertileWindowStart"].toString().toText13(color: AppColors.successColor, weight: FontWeight.w600), + SizedBox( + width: 4.w, + ), + "-".toText16(isBold: true, color: AppColors.successColor), + SizedBox( + width: 4.w, + ), + calculatedResult["fertileWindowEnd"].toString().toText13(color: AppColors.successColor, weight: FontWeight.w600), + ], + ), + SizedBox(height: 8.h), + "This is your fertile window. Maintaining a healthy calorie range supports your body during this period, considering your Basal Metabolic Rate and activity. Your Body Mass Index is within the healthy range." + .toText12(height: 1.5, color: AppColors.textColorLight, fontWeight: FontWeight.w500) + ], + ), + ), + SizedBox( + height: 16.h, + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + padding: EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.bulb), + SizedBox( + width: 8.w, + ), + Row( + children: [ + "Tips to keep in mind".toText16(color: AppColors.textColor, weight: FontWeight.w600), + ], + ), + ], + ), + SizedBox(height: 8.h), + Column( + children: [ + _buildTipRow("Drink before you feel thirsty."), + SizedBox(height: 4.h), + _buildTipRow("Keep a refillable bottle next to you."), + SizedBox(height: 4.h), + _buildTipRow("Track your daily intake to stay motivated."), + SizedBox(height: 4.h), + _buildTipRow("Choose sparkling water instead of soda."), + ], + ).paddingOnly(left: 4.w, right: 4.w) + ], + ), + ), + ], + ) + ] else if (type == HealthCalculatorsTypeEnum.deliveryDueDate) ...[ + Column( + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + padding: EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.pregnancyDueDateAccordion, width: 30.h, height: 30.h), + SizedBox(width: 8.w), + calculatedResult["dueDate"].toString().toText16(color: AppColors.successColor, weight: FontWeight.w600), + ], + ), + Expanded(child: SizedBox(width: 8.w)), + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: calculatedResult["dueDateDay"].toString(), + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor), + ], + ), + ], + ), + ), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + padding: EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + "First Trimester".toText16(color: AppColors.textColor, weight: FontWeight.w600), + Expanded(child: SizedBox(width: 8.h)), + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: "${calculatedResult["firstTrimester"]["weeks"]} Weeks", + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor), + ], + ), + SizedBox(height: 8.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.fertileAccordion, width: 30.h, height: 30.h), + SizedBox( + width: 8.w, + ), + calculatedResult["firstTrimester"]["start"].toString().toText13(color: AppColors.successColor, weight: FontWeight.w600), + SizedBox( + width: 4.w, + ), + "-".toText16(isBold: true, color: AppColors.successColor), + SizedBox( + width: 4.w, + ), + calculatedResult["firstTrimester"]["end"].toString().toText13(color: AppColors.successColor, weight: FontWeight.w600), + ], + ), + SizedBox(height: 8.h), + ], + ), + ), + + + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + padding: EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + "Second Trimester".toText16(color: AppColors.textColor, weight: FontWeight.w600), + Expanded(child: SizedBox(width: 8.h)), + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: "${calculatedResult["secondTrimester"]["weeks"]} Weeks", + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor), + ], + ), + SizedBox(height: 8.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.ovulationAccordion, width: 30.h, height: 30.h), + SizedBox( + width: 8.w, + ), + calculatedResult["secondTrimester"]["start"].toString().toText13(color: AppColors.successColor, weight: FontWeight.w600), + SizedBox( + width: 4.w, + ), + "-".toText16(isBold: true, color: AppColors.successColor), + SizedBox( + width: 4.w, + ), + calculatedResult["secondTrimester"]["end"].toString().toText13(color: AppColors.successColor, weight: FontWeight.w600), + ], + ), + SizedBox(height: 8.h), + ], + ), + ), + + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + padding: EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + "Third Trimester".toText16(color: AppColors.textColor, weight: FontWeight.w600), + Expanded(child: SizedBox(width: 8.h)), + CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: "${calculatedResult["thirdTrimester"]["weeks"]} Weeks", + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor), + ], + ), + SizedBox(height: 8.h), + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.pregnancyDayAccordion, width: 30.h, height: 30.h), + SizedBox( + width: 8.w, + ), + calculatedResult["thirdTrimester"]["start"].toString().toText13(color: AppColors.successColor, weight: FontWeight.w600), + SizedBox( + width: 4.w, + ), + "-".toText16(isBold: true, color: AppColors.successColor), + SizedBox( + width: 4.w, + ), + calculatedResult["thirdTrimester"]["end"].toString().toText13(color: AppColors.successColor, weight: FontWeight.w600), + ], + ), + SizedBox(height: 8.h), + ], + ), + ), + + + ], + ) + ], + ], + ); + } + + Widget _buildTipRow(String text) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: 6.h, right: 8.w), + child: CircleAvatar( + radius: 3.r, + backgroundColor: AppColors.textColorLight, ), ), + Expanded( + child: text.toText12(color: AppColors.textColorLight, fontWeight: FontWeight.w500, height: 1.2.h), + ), + ], + ); + } + + Widget calorieWidget({required String title, required dynamic calories, required String description, required Color color, required IconData icon, bool hide = false, List? chipsItems}) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), + padding: EdgeInsets.all(16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + ('${calories.toStringAsFixed(0)}').toText32(color: getTextColor(title), isBold: true), + SizedBox(width: 10.w), + hide ? SizedBox() : 'kcal/day'.toText12(color: AppColors.inputLabelTextColor, isBold: true, fontWeight: FontWeight.w600) + ], + ), + _buildStatusIcon(title) + ], + ), + SizedBox(height: 16.h), + if (chipsItems != null && chipsItems.isNotEmpty) ...[ + Wrap( + spacing: 8.0, // Horizontal space between chips + runSpacing: 4.0, // Vertical space between rows of chips + children: chipsItems.map((item) { + return CustomChipWidget( + height: 30.h, + chipType: ChipTypeEnum.alert, + backgroundColor: AppColors.lightGrayBGColor, + chipText: item, + iconAsset: null, + isShowBorder: false, + borderRadius: 8.h, + textColor: AppColors.textColor) + .paddingOnly(bottom: 4.h); + }).toList(), + ), + SizedBox(height: 8.h), + ], + title.toText16(color: AppColors.textColor, weight: FontWeight.w600), + SizedBox(height: 8.h), + description.toText12(height: 1.2.h, color: AppColors.textColorLight, fontWeight: FontWeight.w500) + ], ), ); } + Widget _buildStatusIcon(String title) { + final key = title.trim(); + if (key == 'Maintenance Calories' || key == 'Normal' || key == 'Ideal Weight' || key == 'Moderate Crabs' || key == 'USDA Guidelines') { + return Utils.buildSvgWithAssets(icon: AppAssets.checkmark_icon, width: 24.w, height: 24.h); + } else if (key == 'Moderate Deficit' || key == 'Low' || key == 'Underweight' || key == 'Very Low Crabs' || key == 'Low Crabs' || key == 'Zone Diet') { + return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_yellow, width: 24.w, height: 24.h); + } else if (key == 'Aggressive Deficit' || key == 'High' || key == 'Overweight' || key == "Obese") { + return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_red, width: 24.w, height: 24.h); + } else { + return SizedBox(); + } + } + + Color getTextColor(String title) { + final key = title.trim(); + if (key == 'Maintenance Calories' || key == 'Normal' || key == 'Ideal Weight' || key == 'Moderate Crabs' || key == 'USDA Guidelines') { + return AppColors.successColor; + } else if (key == 'Moderate Deficit' || key == 'Low' || key == 'Underweight' || key == 'Very Low Crabs' || key == 'Low Crabs' || key == 'Zone Diet') { + return AppColors.warningColor; + } else if (key == 'Aggressive Deficit' || key == 'High' || key == 'Overweight' || key == "Obese") { + return AppColors.errorColor; + } else { + return Colors.black; + } + } + void onLiveCareClinicSelected(GetLiveCareClinicsResponseModel clinic) { bookAppointmentsViewModel.setLiveCareSelectedClinic(clinic); bookAppointmentsViewModel.setIsDoctorsListLoading(true); @@ -210,9 +955,11 @@ class _SelectClinicPageState extends State { if (clinic.isLiveCareClinicAndOnline ?? false) { Navigator.of(context).push( CustomPageRoute( - page: SelectLivecareClinicPage(onNegativeClicked: (){ + page: SelectLivecareClinicPage( + onNegativeClicked: () { handleDoctorScreen(clinic); - },), + }, + ), ), ); } else { @@ -226,9 +973,7 @@ class _SelectClinicPageState extends State { //Dental Clinic Flow if (clinic.clinicID == 17) { if (appState.isAuthenticated) { - initDentalAppointmentBookingFlow(int.parse(bookAppointmentsViewModel - .currentlySelectedHospitalFromRegionFlow ?? - "0")); + initDentalAppointmentBookingFlow(int.parse(bookAppointmentsViewModel.currentlySelectedHospitalFromRegionFlow ?? "0")); return; } else { bookAppointmentsViewModel.setIsChiefComplaintsListLoading(true); @@ -239,8 +984,7 @@ class _SelectClinicPageState extends State { ); return; } - } - else if (clinic.clinicID == 253) { + } else if (clinic.clinicID == 253) { bookAppointmentsViewModel.resetLaserData(); bookAppointmentsViewModel.getLaserClinic(); Navigator.push( @@ -267,8 +1011,7 @@ class _SelectClinicPageState extends State { } } - void openRegionListBottomSheet( - BuildContext context, RegionBottomSheetType type) { + void openRegionListBottomSheet(BuildContext context, RegionBottomSheetType type) { bookAppointmentsViewModel.setProjectID(null); regionalViewModel.flush(); @@ -276,12 +1019,11 @@ class _SelectClinicPageState extends State { // AppointmentViaRegionViewmodel? viewmodel = null; showCommonBottomSheetWithoutHeight(context, title: "", titleWidget: Consumer(builder: (_, data, __) => getTitle(data)), isDismissible: false, child: Consumer(builder: (_, data, __) { - return getRegionalSelectionWidget(data); - }), callBackFunc: () { - }); + return getRegionalSelectionWidget(data); + }), callBackFunc: () {}); } - Widget getRegionalSelectionWidget(AppointmentViaRegionViewmodel data) { + Widget getRegionalSelectionWidget(AppointmentViaRegionViewmodel data) { if (data.bottomSheetState == AppointmentViaRegionState.REGION_SELECTION) { return RegionBottomSheetBody(); } @@ -306,7 +1048,7 @@ class _SelectClinicPageState extends State { if (appState.isAuthenticated) { initDentalAppointment(); return SizedBox.shrink(); - }else { + } else { bookAppointmentsViewModel.setIsChiefComplaintsListLoading(true); } } @@ -319,8 +1061,7 @@ class _SelectClinicPageState extends State { } bookAppointmentsViewModel.setProjectID(id); return SizedBox.shrink(); - } - else { + } else { return SizedBox.shrink(); } return SizedBox.shrink(); @@ -474,9 +1215,7 @@ class _SelectClinicPageState extends State { void initDentalAppointment() async { await Future.delayed(Duration(milliseconds: 300)); - initDentalAppointmentBookingFlow(int.parse(bookAppointmentsViewModel - .currentlySelectedHospitalFromRegionFlow ?? - "0")); + initDentalAppointmentBookingFlow(int.parse(bookAppointmentsViewModel.currentlySelectedHospitalFromRegionFlow ?? "0")); return; } } diff --git a/lib/presentation/health_calculators/health_calculator_result.dart b/lib/presentation/health_calculators/health_calculator_result.dart deleted file mode 100644 index 5abe410..0000000 --- a/lib/presentation/health_calculators/health_calculator_result.dart +++ /dev/null @@ -1,444 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; -import 'package:hmg_patient_app_new/core/enums.dart'; -import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.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/generated/locale_keys.g.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'; - -class HealthCalculatorResultPage extends StatelessWidget { - HealthCalculatorsTypeEnum calculatorType; - dynamic calculatedResult; - - HealthCalculatorResultPage({super.key, required this.calculatorType, this.calculatedResult}); - - @override - Widget build(BuildContext context) { - return CollapsingListView( - title: "Your ${calculatorType.name.toCamelCase}", - bottomChild: Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.only(topLeft: Radius.circular(24.r), topRight: Radius.circular(24.r))), - padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.h), - child: CustomButton( - text: LocaleKeys.bookAppo.tr(), - onPressed: () {}, - icon: null, - fontSize: 16.f, - backgroundColor: AppColors.primaryRedColor, - borderColor: AppColors.primaryRedColor, - borderRadius: 12.r, - fontWeight: FontWeight.w500), - ), - child: getCalculatorResultWidget(type: calculatorType, calculatedResult: calculatedResult).paddingSymmetrical(18.w, 24.h), - ); - } - - Widget getCalculatorResultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { - switch (calculatorType) { - case HealthCalculatorsTypeEnum.bmi: - return resultWidget(type: calculatorType, calculatedResult: calculatedResult); - case HealthCalculatorsTypeEnum.calories: - return resultWidget(type: calculatorType, calculatedResult: calculatedResult); - case HealthCalculatorsTypeEnum.bmr: - return resultWidget(type: calculatorType, calculatedResult: calculatedResult); - case HealthCalculatorsTypeEnum.idealBodyWeight: - return resultWidget(type: calculatorType, calculatedResult: calculatedResult); - case HealthCalculatorsTypeEnum.bodyFat: - return resultWidget(type: calculatorType, calculatedResult: calculatedResult); - case HealthCalculatorsTypeEnum.crabsProteinFat: - return resultWidget(type: calculatorType, calculatedResult: calculatedResult); - case HealthCalculatorsTypeEnum.ovulation: - return resultWidget(type: calculatorType, calculatedResult: calculatedResult); - case HealthCalculatorsTypeEnum.deliveryDueDate: - return resultWidget(type: calculatorType, calculatedResult: calculatedResult); - } - } - - Widget resultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { - print(calculatedResult); - return Column( - children: [ - if (type == HealthCalculatorsTypeEnum.bmi) ...[ - if (calculatedResult["bmiCategory"] == "Normal") ...[ - CalorieWidget( - title: calculatedResult["bmiCategory"], - calories: calculatedResult["bmiResult"], - description: - 'Your BMI is within the healthy range. Continue a balanced diet, regular physical activity, and routine checkups to maintain good health. Monitor any significant changes over time.', - color: Colors.green, - icon: Icons.scale, - hide: true, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["bmiCategory"] == "Underweight") ...[ - CalorieWidget( - title: calculatedResult["bmiCategory"], - calories: calculatedResult["bmiResult"], - description: - 'BMI suggests you are underweight. Consider increasing calorie intake with nutrient-dense foods, include resistance training to build muscle, and consult a healthcare professional to check for underlying causes.', - color: Colors.orange, - hide: true, - icon: Icons.trending_down, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["bmiCategory"] == "Overweight") ...[ - CalorieWidget( - title: calculatedResult["bmiCategory"], - calories: calculatedResult["bmiResult"], - description: - 'BMI indicates overweight. Aim for gradual, sustainable weight loss through a modest calorie deficit, regular physical activity, and healthier food choices. Seek medical advice before major lifestyle changes.', - color: Colors.red, - hide: true, - icon: Icons.warning_rounded, - ), - ] - ] else if (type == HealthCalculatorsTypeEnum.calories) ...[ - if (calculatedResult["calorieRange"] == "Normal") ...[ - CalorieWidget( - title: calculatedResult["calorieRange"], - calories: calculatedResult["calories"], - description: - 'Estimated daily calories to maintain your current weight given your activity level and metabolism. Use this as a baseline: increase slightly for muscle gain, or create a small deficit for gradual weight loss. Track progress and adjust every 2–4 weeks.', - color: Colors.green, - icon: Icons.scale, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["calorieRange"] == "Low") ...[ - CalorieWidget( - title: calculatedResult["calorieRange"], - calories: calculatedResult["calories"], - description: - 'A moderate calorie reduction designed for steady, sustainable weight loss (typically 0.25–0.5 kg per week). Combine with resistance training and adequate protein to preserve muscle. Avoid extreme cuts and consult a professional if you have medical conditions.', - color: Colors.orange, - icon: Icons.trending_down, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["calorieRange"] == "High") ...[ - CalorieWidget( - title: calculatedResult["calorieRange"], - calories: calculatedResult["calories"], - description: - 'A large calorie reduction that may produce faster weight loss but can be hard to sustain and increase risk of nutrient deficiencies, fatigue, or muscle loss. Not recommended long-term; seek guidance from a healthcare or nutrition professional before continuing.', - color: Colors.red, - icon: Icons.warning_rounded, - ), - ] - ] else if (type == HealthCalculatorsTypeEnum.bmr) ...[ - if (calculatedResult["bmrRange"] == "Normal") ...[ - CalorieWidget( - title: calculatedResult["bmrRange"], - calories: calculatedResult["bmr"], - description: - 'Your Basal Metabolic Rate (BMR) is within the expected range for your profile. BMR is the energy your body needs at rest to maintain vital functions (breathing, circulation, temperature). Use this value as the baseline for estimating total daily energy needs by applying an activity multiplier. Maintain a balanced diet and regular physical activity to support metabolic health.', - color: Colors.green, - hide: true, - icon: Icons.scale, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["bmrRange"] == "Low") ...[ - CalorieWidget( - title: calculatedResult["bmrRange"], - calories: calculatedResult["bmr"], - description: - 'Your BMR is lower than typical for your profile. Possible causes include lower lean muscle mass, age-related metabolic decline, or metabolic adaptation from prolonged calorie restriction. Consider focusing on resistance training to build/maintain muscle, ensure adequate protein and micronutrient intake, and consult a healthcare professional if this is unexpected.', - color: Colors.orange, - hide: true, - icon: Icons.trending_down, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["bmrRange"] == "High") ...[ - CalorieWidget( - title: calculatedResult["bmrRange"], - calories: calculatedResult["bmr"], - description: - 'Your BMR is higher than average for your profile. This can reflect greater lean mass, younger age, or a naturally higher metabolic rate, meaning you burn more energy at rest. Use this information to tailor calorie targets: higher needs for maintenance or muscle gain, moderate deficit for weight loss. Seek medical advice if you notice rapid unexplained changes.', - color: Colors.red, - hide: true, - icon: Icons.warning_rounded, - ), - ] - ] else if (type == HealthCalculatorsTypeEnum.idealBodyWeight) ...[ - if (calculatedResult["status"] == "Normal") ...[ - CalorieWidget( - title: calculatedResult["status"], - calories: calculatedResult["ibw"], - hide: true, - description: (() { - final diff = calculatedResult["difference"]; - if (diff is num) { - if (diff == 0) { - return 'Your weight is at the ideal target. Maintain your current habits — balanced diet and regular activity — to keep this.'; - } else if (diff > 0) { - return 'You are below the ideal weight by ${diff.toStringAsFixed(1)} kg. Aim to gradually increase weight with a modest calorie surplus, nutrient-dense foods, and resistance training.'; - } else { - return 'You are above the ideal weight by ${diff.abs().toStringAsFixed(1)} kg. Aim for a gradual, sustainable weight reduction through a moderate calorie deficit, increased activity, and balanced nutrition.'; - } - } - return 'Your weight is close to the ideal range. Maintain a balanced diet and regular activity; follow personalized advice from a healthcare professional if needed.'; - })(), - color: Colors.green, - icon: Icons.scale, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["status"] == "Underweight") ...[ - CalorieWidget( - title: calculatedResult["status"], - calories: calculatedResult["ibw"], - hide: true, - description: (() { - final diff = calculatedResult["difference"]; - if (diff is num) { - return 'You are below the ideal weight by ${diff.toStringAsFixed(1)} kg. Focus on increasing calorie intake with nutrient-dense foods, prioritize protein and resistance training to build healthy mass, and consider consulting a healthcare professional.'; - } - return 'You appear underweight compared to the ideal. Consider increasing calorie intake with nutrient-dense foods and resistance training; seek professional guidance if needed.'; - })(), - color: Colors.orange, - icon: Icons.trending_down, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["status"] == "Overweight") ...[ - CalorieWidget( - title: calculatedResult["status"], - calories: calculatedResult["ibw"], - hide: true, - description: (() { - final diff = calculatedResult["difference"]; - if (diff is num) { - return 'You are above the ideal weight by ${diff.abs().toStringAsFixed(1)} kg. Aim for a gradual, sustainable weight loss strategy — moderate calorie deficit, regular physical activity, and balanced nutrition. Consult a professional before major changes.'; - } - return 'You appear above the ideal weight. Consider a gradual, sustainable calorie deficit combined with activity and balanced nutrition; consult a professional if needed.'; - })(), - color: Colors.red, - icon: Icons.warning_rounded, - ), - ] - ] else if (type == HealthCalculatorsTypeEnum.crabsProteinFat) ...[ - if (calculatedResult["dietType"] == "Very Low Crabs") ...[ - CalorieWidget( - title: calculatedResult["dietType"].toString(), - calories: calculatedResult["totalCalories"], - description: (() { - final total = calculatedResult["totalCalories"]; - final carbsG = calculatedResult["carbsGrams"]; - final carbsC = calculatedResult["carbsCalories"]; - final protG = calculatedResult["proteinGrams"]; - final protC = calculatedResult["proteinCalories"]; - final fatG = calculatedResult["fatGrams"]; - final fatC = calculatedResult["fatCalories"]; - final base = - 'Very low‑carb (ketogenic) approach: minimal carbohydrates, higher fat and moderate protein. May support rapid weight loss and improved blood sugar control for some, but can be hard to sustain and may cause nutrient gaps. Monitor hydration/electrolytes and consult a professional for long‑term use.'; - if (total is num) { - return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown: Carbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; - } - return base; - })(), - color: Colors.orange, - hide: true, - icon: Icons.trending_down, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["dietType"] == "Low Crabs") ...[ - CalorieWidget( - title: calculatedResult["dietType"].toString(), - calories: calculatedResult["totalCalories"], - description: (() { - final total = calculatedResult["totalCalories"]; - final carbsG = calculatedResult["carbsGrams"]; - final carbsC = calculatedResult["carbsCalories"]; - final protG = calculatedResult["proteinGrams"]; - final protC = calculatedResult["proteinCalories"]; - final fatG = calculatedResult["fatGrams"]; - final fatC = calculatedResult["fatCalories"]; - final base = - 'Low‑carb, higher‑protein plan: reduced carbohydrates with increased protein to support satiety and muscle maintenance. Helpful for weight management and glycemic control when balanced with vegetables and healthy fats. Ensure adequate fiber and micronutrients.'; - if (total is num) { - return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; - } - return base; - })(), - color: Colors.orange, - hide: true, - icon: Icons.trending_down, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["dietType"] == "Moderate Crabs") ...[ - CalorieWidget( - title: calculatedResult["dietType"].toString(), - calories: calculatedResult["totalCalories"], - description: (() { - final total = calculatedResult["totalCalories"]; - final carbsG = calculatedResult["carbsGrams"]; - final carbsC = calculatedResult["carbsCalories"]; - final protG = calculatedResult["proteinGrams"]; - final protC = calculatedResult["proteinCalories"]; - final fatG = calculatedResult["fatGrams"]; - final fatC = calculatedResult["fatCalories"]; - final base = - 'Moderate carbohydrate intake with balanced protein and fats: provides steady energy for daily activity and exercise while allowing flexibility. Suitable for many people aiming for sustainable weight management and performance.'; - if (total is num) { - return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; - } - return base; - })(), - color: Colors.green, - hide: true, - icon: Icons.scale, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["dietType"] == "USDA Guidelines ") ...[ - CalorieWidget( - title: calculatedResult["dietType"].toString(), - calories: calculatedResult["totalCalories"], - description: (() { - final total = calculatedResult["totalCalories"]; - final carbsG = calculatedResult["carbsGrams"]; - final carbsC = calculatedResult["carbsCalories"]; - final protG = calculatedResult["proteinGrams"]; - final protC = calculatedResult["proteinCalories"]; - final fatG = calculatedResult["fatGrams"]; - final fatC = calculatedResult["fatCalories"]; - final base = - 'USDA‑based balanced pattern: emphasizes fruits, vegetables, whole grains, lean proteins, and limited added sugars and saturated fats. Evidence‑based framework for general health, nutrient adequacy, and chronic disease prevention.'; - if (total is num) { - return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; - } - return base; - })(), - color: Colors.green, - hide: true, - icon: Icons.scale, - ), - SizedBox(height: 16.h), - ] else if (calculatedResult["dietType"] == "Zone Diet") ...[ - CalorieWidget( - title: calculatedResult["dietType"].toString(), - calories: calculatedResult["totalCalories"], - description: (() { - final total = calculatedResult["totalCalories"]; - final carbsG = calculatedResult["carbsGrams"]; - final carbsC = calculatedResult["carbsCalories"]; - final protG = calculatedResult["proteinGrams"]; - final protC = calculatedResult["proteinCalories"]; - final fatG = calculatedResult["fatGrams"]; - final fatC = calculatedResult["fatCalories"]; - final base = - 'Zone Diet (~40% carbs / 30% protein / 30% fat): emphasizes hormonal balance and portion control. May improve body composition and energy for some, but requires planning; personalize with a nutrition professional.'; - if (total is num) { - return '$base\n\nTotal: ${total.toStringAsFixed(0)} kcal.\n\nBreakdown:\nCarbs ${carbsG is num ? carbsG.toStringAsFixed(0) + " g" : "N/A"} (${carbsC is num ? carbsC.toStringAsFixed(0) + " kcal" : "N/A"}),\nProtein ${protG is num ? protG.toStringAsFixed(0) + " g" : "N/A"} (${protC is num ? protC.toStringAsFixed(0) + " kcal" : "N/A"}),\nFat ${fatG is num ? fatG.toStringAsFixed(1) + " g" : "N/A"} (${fatC is num ? fatC.toStringAsFixed(0) + " kcal" : "N/A"}).'; - } - return base; - })(), - color: Colors.orange, - hide: true, - icon: Icons.warning_rounded, - ), - ] - ] - ], - ); - } -} - -class CalorieWidget extends StatelessWidget { - final String title; - final dynamic calories; - final String description; - final Color color; - final IconData icon; - final bool hide; - - const CalorieWidget({super.key, required this.title, required this.calories, required this.description, required this.color, required this.icon, this.hide = false}); - - @override - Widget build(BuildContext context) { - return Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), - padding: EdgeInsets.all(16.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - ('${calories.toStringAsFixed(0)}').toText32(color: getTextColor(), isBold: true), - SizedBox(width: 10.w), - hide ? SizedBox() : 'kcal/day'.toText12(color: AppColors.inputLabelTextColor, isBold: true, fontWeight: FontWeight.w600) - ], - ), - _buildStatusIcon() - ], - ), - SizedBox(height: 16.h), - title.toText16(color: AppColors.textColor, weight: FontWeight.w600), - SizedBox(height: 8.h), - Text( - description, - style: TextStyle( - fontSize: 14, - color: Colors.grey[700], - height: 1.5, - ), - textAlign: TextAlign.start, - ), - ], - ), - ); - } - // - // Widget _buildStatusIcon() { - // if (title == 'Maintenance Calories' || title == 'Normal' || title == 'Ideal Weight') { - // return Utils.buildSvgWithAssets(icon: AppAssets.checkmark_icon, width: 24.w, height: 24.h); - // } else if (title == 'Moderate Deficit' || title == 'Low' || title == 'Underweight') { - // return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_yellow, width: 24.w, height: 24.h); - // } else if (title == 'Aggressive Deficit' || title == 'High' || title == 'Overweight' || title == "Obese") { - // return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_red, width: 24.w, height: 24.h); - // } else { - // return SizedBox(); - // } - // } - // - // Color getTextColor() { - // if (title == 'Maintenance Calories' || title == 'Normal' || title == 'Ideal Weight') { - // return AppColors.successColor; - // } else if (title == 'Moderate Deficit' || title == 'Low' || title == 'Underweight') { - // return AppColors.warningColor; - // } else if (title == 'Aggressive Deficit' || title == 'High' || title == 'Overweight' || title == "Obese") { - // return AppColors.errorColor; - // } else { - // return Colors.black; - // } - // } - - Widget _buildStatusIcon() { - final key = title.trim(); - if (key == 'Maintenance Calories' || key == 'Normal' || key == 'Ideal Weight' || key == 'Moderate Crabs' || key == 'USDA Guidelines') { - return Utils.buildSvgWithAssets(icon: AppAssets.checkmark_icon, width: 24.w, height: 24.h); - } else if (key == 'Moderate Deficit' || key == 'Low' || key == 'Underweight' || key == 'Very Low Crabs' || key == 'Low Crabs' || key == 'Zone Diet') { - return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_yellow, width: 24.w, height: 24.h); - } else if (key == 'Aggressive Deficit' || key == 'High' || key == 'Overweight' || key == "Obese") { - return Utils.buildSvgWithAssets(icon: AppAssets.trade_down_red, width: 24.w, height: 24.h); - } else { - return SizedBox(); - } - } - - Color getTextColor() { - final key = title.trim(); - if (key == 'Maintenance Calories' || key == 'Normal' || key == 'Ideal Weight' || key == 'Moderate Crabs' || key == 'USDA Guidelines') { - return AppColors.successColor; - } else if (key == 'Moderate Deficit' || key == 'Low' || key == 'Underweight' || key == 'Very Low Crabs' || key == 'Low Crabs' || key == 'Zone Diet') { - return AppColors.warningColor; - } else if (key == 'Aggressive Deficit' || key == 'High' || key == 'Overweight' || key == "Obese") { - return AppColors.errorColor; - } else { - return Colors.black; - } - } -} diff --git a/lib/presentation/health_calculators/health_calculators_page.dart b/lib/presentation/health_calculators/health_calculators_page.dart deleted file mode 100644 index 8ac7a22..0000000 --- a/lib/presentation/health_calculators/health_calculators_page.dart +++ /dev/null @@ -1,157 +0,0 @@ -import 'dart:async'; - -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; -import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/core/dependencies.dart'; -import 'package:hmg_patient_app_new/core/enums.dart'; -import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.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/presentation/health_calculators/health_calculator_detailed_page.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/health_card.dart'; -import 'package:hmg_patient_app_new/services/dialog_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/routes/custom_page_route.dart'; - -class HealthCalculatorsPage extends StatefulWidget { - const HealthCalculatorsPage({super.key}); - - @override - State createState() => _HealthCalculatorsPageState(); -} - -class _HealthCalculatorsPageState extends State { - @override - void initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - DialogService dialogService = getIt.get(); - return CollapsingListView( - title: "Health Calculators".needTranslation, - child: Column( - children: [ - Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), - child: Row( - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.general_health, height: 40.h, width: 40.w, fit: BoxFit.none), - SizedBox(width: 12.w), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - "General Health".needTranslation.toText16(weight: FontWeight.w600), - "Related To BMI, calories, body fat, etc to stay updated with your health.".needTranslation.toText12(fontWeight: FontWeight.w500, color: Color(0xFF8F9AA3)) - ], - ), - ), - SizedBox( - width: 12.w, - ), - Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), - ], - ).paddingAll(16.w)) - .onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: "Select Calculator".needTranslation, - message: "", - child: showCalculatorsItems(type: HealthCalculatorEnum.general), - onOkPressed: () {}, - ); - }), - SizedBox(height: 16.h), - Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), - child: Row( - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.women_health, height: 40.h, width: 40.w, fit: BoxFit.none), - SizedBox(width: 12.w), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - "Women's Health".needTranslation.toText16(weight: FontWeight.w600), - "Related To periods, ovulation, pregnancy, and other topics.".needTranslation.toText12(fontWeight: FontWeight.w500, color: Color(0xFF8F9AA3)) - ], - ), - ), - SizedBox(width: 12.w), - Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), - ], - ).paddingAll(16.w)) - .onPress(() { - dialogService.showFamilyBottomSheetWithoutHWithChild( - label: "Select Calculator".needTranslation, - message: "", - child: showCalculatorsItems(type: HealthCalculatorEnum.women), - onOkPressed: () {}, - ); - }), - ], - ).paddingSymmetrical(20.w, 24.h)); - } - - Widget showCalculatorsItems({required HealthCalculatorEnum type}) { - return GridView.builder( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, // 4 icons per row - crossAxisSpacing: 16.w, - mainAxisSpacing: 16.w, - childAspectRatio: 0.80), - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: type == HealthCalculatorEnum.general ? generalHealthServices.length : womenHealthServices.length, - padding: EdgeInsets.zero, - itemBuilder: (BuildContext context, int index) { - return HealthCard( - icon: type == HealthCalculatorEnum.general ? generalHealthServices[index].icon : womenHealthServices[index].icon, - labelText: type == HealthCalculatorEnum.general ? generalHealthServices[index].title : womenHealthServices[index].title, - onTap: () { - Navigator.of(context).push( - CustomPageRoute( - page: HealthCalculatorDetailedPage( - calculatorType: type == HealthCalculatorEnum.general ? generalHealthServices[index].type : womenHealthServices[index].type, - ), - ), - ); - }, - ); - }, - ); - } - - final List generalHealthServices = [ - HealthComponentModel(title: "BMI\nCalculator".needTranslation, icon: AppAssets.bmi, type: HealthCalculatorsTypeEnum.bmi), - HealthComponentModel(title: "Calories\nCalculator".needTranslation, icon: AppAssets.calories, type: HealthCalculatorsTypeEnum.calories), - HealthComponentModel(title: "BMR\nCalculator".needTranslation, icon: AppAssets.bmr, type: HealthCalculatorsTypeEnum.bmr), - HealthComponentModel(title: "Ideal Body\nWeight".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.idealBodyWeight), - HealthComponentModel(title: "Body Fat\nCalculator".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.bodyFat), - HealthComponentModel(title: "Carbs\nProtein & Fat".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.crabsProteinFat), - ]; - - final List womenHealthServices = [ - HealthComponentModel(title: "Ovulation\nPeriod".needTranslation, icon: AppAssets.locate_me, type: HealthCalculatorsTypeEnum.ovulation), - HealthComponentModel(title: "Delivery\nDue Date".needTranslation, icon: AppAssets.activeCheck, type: HealthCalculatorsTypeEnum.deliveryDueDate), - ]; -} - -class HealthComponentModel { - String title; - String? subTitle; - String icon; - Color? iconColor; - Color? bgColor; - Color? textColor; - HealthCalculatorsTypeEnum type; - - HealthComponentModel({required this.title, this.subTitle, required this.icon, this.iconColor, this.bgColor, this.textColor, required this.type}); -} diff --git a/lib/presentation/health_calculators/health_calculator_detailed_page.dart b/lib/presentation/health_calculators_and_converts/health_calculator_detailed_page.dart similarity index 61% rename from lib/presentation/health_calculators/health_calculator_detailed_page.dart rename to lib/presentation/health_calculators_and_converts/health_calculator_detailed_page.dart index ae7d46b..e0f3a7a 100644 --- a/lib/presentation/health_calculators/health_calculator_detailed_page.dart +++ b/lib/presentation/health_calculators_and_converts/health_calculator_detailed_page.dart @@ -1,25 +1,28 @@ import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/select_clinic_page.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/bf.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/blood_sugar.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/bmi.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/bmr.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/calories.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/crabs.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/dduedate.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/ibw.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/ovulation.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/triglycerides.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/presentation/health_calculators/health_calculator_result.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/bf.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/bmi.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/bmr.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/calories.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/crabs.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/dduedate.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/ibw.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/widgets/ovulation.dart'; import 'package:hmg_patient_app_new/services/dialog_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/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; class HealthCalculatorDetailedPage extends StatefulWidget { HealthCalculatorsTypeEnum calculatorType; @@ -40,24 +43,34 @@ class _HealthCalculatorDetailedPageState extends State(builder: (context, provider, _) { return CollapsingListView( title: widget.calculatorType.displayName, - bottomChild: Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.only(topLeft: Radius.circular(24.r), topRight: Radius.circular(24.r))), - padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.h), - child: CustomButton( - text: "Calculate".needTranslation, - onPressed: () { - if (calculatedResult == null) return; - DialogService dialogService = getIt.get(); - Navigator.of(context).push(CustomPageRoute( - page: HealthCalculatorResultPage(calculatorType: widget.calculatorType, calculatedResult: calculatedResult), - )); - }, - icon: null, - fontSize: 16.f, - backgroundColor: calculatedResult == null ? AppColors.bgRedLightColor : AppColors.primaryRedColor, - borderColor: calculatedResult == null ? AppColors.bgRedLightColor : AppColors.primaryRedColor, - borderRadius: 12.r, - fontWeight: FontWeight.w500)), + bottomChild: widget.calculatorType == HealthCalculatorsTypeEnum.bloodSugar || + widget.calculatorType == HealthCalculatorsTypeEnum.bloodCholesterol || + widget.calculatorType == HealthCalculatorsTypeEnum.triglycerides + ? SizedBox() + : Container( + decoration: + RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.only(topLeft: Radius.circular(24.r), topRight: Radius.circular(24.r))), + padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.h), + child: CustomButton( + text: widget.calculatorType == HealthCalculatorsTypeEnum.bloodSugar || + widget.calculatorType == HealthCalculatorsTypeEnum.bloodCholesterol || + widget.calculatorType == HealthCalculatorsTypeEnum.triglycerides + ? "Convert".needTranslation + : "Calculate".needTranslation, + onPressed: () { + if (calculatedResult == null) return; + + DialogService dialogService = getIt.get(); + Navigator.of(context).push(CustomPageRoute( + page: SelectClinicPage(calculatorType: widget.calculatorType, calculatedResult: calculatedResult), + )); + }, + icon: null, + fontSize: 16.f, + backgroundColor: calculatedResult == null ? AppColors.bgRedLightColor : AppColors.primaryRedColor, + borderColor: calculatedResult == null ? AppColors.bgRedLightColor : AppColors.primaryRedColor, + borderRadius: 12.r, + fontWeight: FontWeight.w500)), child: getCalculatorWidget( type: widget.calculatorType, onCalculate: (result) { @@ -85,6 +98,12 @@ class _HealthCalculatorDetailedPageState extends State? deliveryResult; + Map? bloodSugarResult; + Map? bloodCholesterolResult; + Map? triglyceridesResult; + + String? _mgdlValue; + + String? get mgdlValue => _mgdlValue; + + String? _mmolValue; + + String? get mmolValue => _mmolValue; + + String _activeUnit = 'mg/dL'; // current source unit + String get activeUnit => _activeUnit; + + + // ================== BLOOD CHOLESTEROL ================== + String? _cholMgdlValue; + String? _cholMmolValue; + String _cholActiveUnit = 'mg/dL'; + + String? get cholMgdlValue => _cholMgdlValue; + String? get cholMmolValue => _cholMmolValue; + String get cholActiveUnit => _cholActiveUnit; + + // ================== TRIGLYCERIDES ================== + String? _triMgdlValue; + String? _triMmolValue; + String _triActiveUnit = 'mg/dL'; + + String? get triMgdlValue => _triMgdlValue; + String? get triMmolValue => _triMmolValue; + String get triActiveUnit => _triActiveUnit; + + // Generic helpers void calculateBMI({required String heightText, required String weightText, required String heightUnit, required String weightUnit}) { @@ -113,7 +148,15 @@ class HealthCalcualtorViewModel extends ChangeNotifier { } // BMR / Calories (shared logic) - void calculateBMRAndCalories({required String heightText, required String weightText, required String ageText, required String heightUnit, required String weightUnit, required String gender, required String activityLevel, bool forCaloriesOnly = false}) { + void calculateBMRAndCalories( + {required String heightText, + required String weightText, + required String ageText, + required String heightUnit, + required String weightUnit, + required String gender, + required String activityLevel, + bool forCaloriesOnly = false}) { if (heightText.trim().isEmpty || weightText.trim().isEmpty || ageText.trim().isEmpty) { bmrResult = null; caloriesResult = null; @@ -303,7 +346,16 @@ class HealthCalcualtorViewModel extends ChangeNotifier { } // Body Fat - void calculateBodyFat({required String heightText, required String neckText, required String waistText, required String hipText, required String heightUnit, required String neckUnit, required String waistUnit, required String hipUnit, required String gender}) { + void calculateBodyFat( + {required String heightText, + required String neckText, + required String waistText, + required String hipText, + required String heightUnit, + required String neckUnit, + required String waistUnit, + required String hipUnit, + required String gender}) { if (heightText.trim().isEmpty || neckText.trim().isEmpty || waistText.trim().isEmpty) { bodyFatResult = null; bodyFatCategory = null; @@ -548,6 +600,29 @@ class HealthCalcualtorViewModel extends ChangeNotifier { return months[month - 1]; } + String _getDayName(int weekday) { + // DateTime.weekday returns 1 for Monday and 7 for Sunday. + const List days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; + return days[weekday - 1]; + } + + String _formatDateWithDayName(DateTime? date) { + if (date == null) return ''; + String dayName = _getDayName(date.weekday); // Gets 'Monday', 'Tuesday', etc. + return dayName; + } + + Map convertBloodSugar(double value, String fromUnit) { + if (fromUnit == 'mg/dL') { + final mmolL = value / 18.0182; + return {'mgdL': value, 'mmolL': mmolL}; + } else if (fromUnit == 'mmol/L') { + final mgdL = value * 18.0182; + return {'mgdL': mgdL, 'mmolL': value}; + } + return {'mgdL': 0, 'mmolL': 0}; + } + String _determineCyclePhase(int daysSincePeriod, int follicularPhase, int cycleLength) { int normalizedDay = daysSincePeriod % cycleLength; @@ -600,6 +675,8 @@ class HealthCalcualtorViewModel extends ChangeNotifier { String cyclePhase = _determineCyclePhase(daysSincePeriod, follicularPhase, cycleLength); ovulationResult = { + 'lastPeriodDay': _formatDateWithDayName(parsedDate), + 'ovulationDay': _formatDateWithDayName(ovulationDate), 'lastPeriodDate': _formatDate(parsedDate), 'ovulationDate': _formatDate(ovulationDate), 'fertileWindowStart': _formatDate(fertileStart), @@ -629,7 +706,7 @@ class HealthCalcualtorViewModel extends ChangeNotifier { DateTime? lmp; try { lmp = DateTime.tryParse(isoDateString) ?? _tryParseDate(isoDateString); - } catch (e) { + } catch (_) { lmp = null; } @@ -639,19 +716,293 @@ class HealthCalcualtorViewModel extends ChangeNotifier { return; } - DateTime dueDate = lmp.add(Duration(days: 280)); - String dueDateStr = _formatDate(dueDate); - String lmpStr = _formatDate(lmp); + // Pregnancy constants + const int totalPregnancyDays = 280; + + // Calculate main dates + final DateTime dueDate = lmp.add(const Duration(days: totalPregnancyDays)); + + // Trimester calculations + final DateTime firstTrimesterStart = lmp; + final DateTime firstTrimesterEnd = lmp.add(const Duration(days: 83)); + + final DateTime secondTrimesterStart = + firstTrimesterEnd.add(const Duration(days: 1)); + final DateTime secondTrimesterEnd = + lmp.add(const Duration(days: 195)); + + final DateTime thirdTrimesterStart = + secondTrimesterEnd.add(const Duration(days: 1)); + final DateTime thirdTrimesterEnd = dueDate; + + deliveryResult = { + 'lmpDate': _formatDate(lmp), + 'dueDate': _formatDate(dueDate), + // Raw DateTime (useful for logic/UI) + 'lmpDateTime': lmp, + 'dueDateTime': dueDate, + 'dueDateDay' : _formatDateWithDayName(dueDate), + // Trimester info + 'firstTrimester': { + 'start': _formatDate(firstTrimesterStart), + 'end': _formatDate(firstTrimesterEnd), + 'weeks': '1–12', + 'startDateTime': firstTrimesterStart, + 'endDateTime': firstTrimesterEnd, + }, + 'secondTrimester': { + 'start': _formatDate(secondTrimesterStart), + 'end': _formatDate(secondTrimesterEnd), + 'weeks': '13–27', + 'startDateTime': secondTrimesterStart, + 'endDateTime': secondTrimesterEnd, + }, + 'thirdTrimester': { + 'start': _formatDate(thirdTrimesterStart), + 'end': _formatDate(thirdTrimesterEnd), + 'weeks': '28–40', + 'startDateTime': thirdTrimesterStart, + 'endDateTime': thirdTrimesterEnd, + }, + }; - deliveryResult = {'lmpDate': lmpStr, 'dueDate': dueDateStr, 'lmpDateTime': lmp, 'dueDateTime': dueDate}; notifyListeners(); } + + // Blood sugar conversions + void calculateBloodSugar({required String valueText, required String unit}) { + if (valueText.trim().isEmpty) { + bloodSugarResult = null; + notifyListeners(); + return; + } + + try { + double value = double.parse(valueText.trim()); + + if (value <= 0) { + bloodSugarResult = null; + notifyListeners(); + return; + } + + double converted; + String convertedUnit; + + if (unit == 'mg/dL' || unit == 'MG/DL' || unit.toLowerCase().contains('mg')) { + // mg/dL -> mmol/L (glucose): divide by 18.0182 + converted = value / 18.0182; + convertedUnit = 'mmol/L'; + } else { + // mmol/L -> mg/dL + converted = value * 18.0182; + convertedUnit = 'mg/dL'; + } + + // round to sensible precision + double convertedRounded = double.parse(converted.toStringAsFixed(2)); + + bloodSugarResult = { + 'input': value, + 'inputUnit': unit, + 'converted': convertedRounded, + 'convertedUnit': convertedUnit, + }; + notifyListeners(); + } catch (e) { + bloodSugarResult = null; + notifyListeners(); + } + } + // expose map-like results for widgets to forward to parent Map? get bmiResultMap => bmiResult == null ? null : {'bmiResult': bmiResult, 'bmiCategory': bmiCategory}; + Map? get caloriesResultMap => caloriesResult == null ? null : {'calories': caloriesResult, 'bmr': bmrResult, 'calorieRange': calorieRange, 'bmrRange': bmrRange}; + Map? get ibwResultMap => ibwResult == null ? null : {'ibw': ibwResult, 'difference': weightDifference, 'status': weightStatus}; + Map? get bodyFatResultMap => bodyFatResult == null ? null : {'fatPercentage': bodyFatResult, 'fatCategory': bodyFatCategory}; - Map? get macrosResultMap => carbsCalories == null ? null : {'totalCalories': carbsCalories! + proteinCalories! + fatCalories!, 'carbsGrams': carbsGrams, 'carbsCalories': carbsCalories, 'proteinGrams': proteinGrams, 'proteinCalories': proteinCalories, 'fatGrams': fatGrams, 'fatCalories': fatCalories, 'dietType': dietType}; -} + Map? get macrosResultMap => carbsCalories == null + ? null + : { + 'totalCalories': carbsCalories! + proteinCalories! + fatCalories!, + 'carbsGrams': carbsGrams, + 'carbsCalories': carbsCalories, + 'proteinGrams': proteinGrams, + 'proteinCalories': proteinCalories, + 'fatGrams': fatGrams, + 'fatCalories': fatCalories, + 'dietType': dietType + }; + + + + void onBloodSugarChanged(String value, String fromUnit) { + _activeUnit = fromUnit; + + if (value.isEmpty) { + _mgdlValue = null; + _mmolValue = null; + notifyListeners(); + return; + } + + final parsed = double.tryParse(value); + if (parsed == null) return; + + if (fromUnit == 'mg/dL') { + _mgdlValue = value; + _mmolValue = (parsed / 18.0182).toStringAsFixed(1); + } else { + _mmolValue = value; + _mgdlValue = (parsed * 18.0182).toStringAsFixed(0); + } + + notifyListeners(); + } + + void switchBloodSugarValues() { + if (_activeUnit == 'mg/dL') { + final mmol = double.tryParse(_mmolValue ?? ''); + if (mmol == null) return; + + _activeUnit = 'mmol/L'; + + // mmol stays as source + _mmolValue = mmol.toStringAsFixed(1); + _mgdlValue = (mmol * 18.0182).toStringAsFixed(0); + } else { + final mgdl = double.tryParse(_mgdlValue ?? ''); + if (mgdl == null) return; + + _activeUnit = 'mg/dL'; + + // mg/dL stays as source + _mgdlValue = mgdl.toStringAsFixed(0); + _mmolValue = (mgdl / 18.0182).toStringAsFixed(1); + } + + notifyListeners(); + } + // --- NEW: Method to clear the values --- + void clearBloodSugar() { + _mgdlValue = null; + _mmolValue = null; + notifyListeners(); + } + + + + void onBloodCholesterolChanged(String value, String fromUnit) { + _cholActiveUnit = fromUnit; + + if (value.isEmpty) { + _cholMgdlValue = null; + _cholMmolValue = null; + notifyListeners(); + return; + } + + final parsed = double.tryParse(value); + if (parsed == null) return; + + if (fromUnit == 'mg/dL') { + _cholMgdlValue = value; + _cholMmolValue = (parsed / 38.67).toStringAsFixed(2); + } else { + _cholMmolValue = value; + _cholMgdlValue = (parsed * 38.67).toStringAsFixed(0); + } + + notifyListeners(); + } + + void switchBloodCholesterolValues() { + if (_cholActiveUnit == 'mg/dL') { + final mmol = double.tryParse(_cholMmolValue ?? ''); + if (mmol == null) return; + + _cholActiveUnit = 'mmol/L'; + + _cholMmolValue = mmol.toStringAsFixed(2); + _cholMgdlValue = (mmol * 38.67).toStringAsFixed(0); + } else { + final mgdl = double.tryParse(_cholMgdlValue ?? ''); + if (mgdl == null) return; + + _cholActiveUnit = 'mg/dL'; + + _cholMgdlValue = mgdl.toStringAsFixed(0); + _cholMmolValue = (mgdl / 38.67).toStringAsFixed(2); + } + + notifyListeners(); + } + + + void clearBloodCholesterol() { + _cholMgdlValue = null; + _cholMmolValue = null; + _cholActiveUnit = 'mg/dL'; + notifyListeners(); + } + + + + void onTriglyceridesChanged(String value, String fromUnit) { + _triActiveUnit = fromUnit; + + if (value.isEmpty) { + _triMgdlValue = null; + _triMmolValue = null; + notifyListeners(); + return; + } + + final parsed = double.tryParse(value); + if (parsed == null) return; + + if (fromUnit == 'mg/dL') { + _triMgdlValue = value; + _triMmolValue = (parsed / 88.57).toStringAsFixed(2); + } else { + _triMmolValue = value; + _triMgdlValue = (parsed * 88.57).toStringAsFixed(0); + } + + notifyListeners(); + } + + void switchTriglyceridesValues() { + if (_triActiveUnit == 'mg/dL') { + final mmol = double.tryParse(_triMmolValue ?? ''); + if (mmol == null) return; + + _triActiveUnit = 'mmol/L'; + _triMmolValue = mmol.toStringAsFixed(2); + _triMgdlValue = (mmol * 88.57).toStringAsFixed(0); + } else { + final mgdl = double.tryParse(_triMgdlValue ?? ''); + if (mgdl == null) return; + + _triActiveUnit = 'mg/dL'; + _triMgdlValue = mgdl.toStringAsFixed(0); + _triMmolValue = (mgdl / 88.57).toStringAsFixed(2); + } + + notifyListeners(); + } + + void clearTriglycerides() { + _triMgdlValue = null; + _triMmolValue = null; + _triActiveUnit = 'mg/dL'; + notifyListeners(); + } + + + +} diff --git a/lib/presentation/health_calculators_and_converts/health_calculators_page.dart b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart new file mode 100644 index 0000000..702e04c --- /dev/null +++ b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart @@ -0,0 +1,255 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/presentation/health_calculators_and_converts/health_calculator_detailed_page.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/widgets/health_card.dart'; +import 'package:hmg_patient_app_new/services/dialog_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/routes/custom_page_route.dart'; + +class HealthCalculatorsPage extends StatefulWidget { + HealthCalConEnum type; + + HealthCalculatorsPage({super.key, required this.type}); + + @override + State createState() => _HealthCalculatorsPageState(); +} + +class _HealthCalculatorsPageState extends State { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + DialogService dialogService = getIt.get(); + return CollapsingListView( + title: widget.type == HealthCalConEnum.calculator ? "Health Calculators".needTranslation : "Health Converters".needTranslation, + child: widget.type == HealthCalConEnum.calculator + ? Column( + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.general_health, height: 40.h, width: 40.w, fit: BoxFit.none), + SizedBox(width: 12.w), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "General Health".needTranslation.toText16(weight: FontWeight.w600), + "Related To BMI, calories, body fat, etc to stay updated with your health.".needTranslation.toText12(fontWeight: FontWeight.w500, color: Color(0xFF8F9AA3)) + ], + ), + ), + SizedBox( + width: 12.w, + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), + ], + ).paddingAll(16.w)) + .onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Calculator".needTranslation, + message: "", + child: showCalculatorsItems(type: HealthCalculatorEnum.general), + onOkPressed: () {}, + ); + }), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.women_health, height: 40.h, width: 40.w, fit: BoxFit.none), + SizedBox(width: 12.w), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "Women's Health".needTranslation.toText16(weight: FontWeight.w600), + "Related To periods, ovulation, pregnancy, and other topics.".needTranslation.toText12(fontWeight: FontWeight.w500, color: Color(0xFF8F9AA3)) + ], + ), + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), + ], + ).paddingAll(16.w)) + .onPress(() { + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: "Select Calculator".needTranslation, + message: "", + child: showCalculatorsItems(type: HealthCalculatorEnum.women), + onOkPressed: () {}, + ); + }), + ], + ).paddingSymmetrical(20.w, 24.h) + : Column( + children: [ + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.bloodSugar, height: 40.h, width: 40.w, fit: BoxFit.none), + SizedBox(width: 12.w), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "Blood Sugar".needTranslation.toText16(weight: FontWeight.w600), + "Track your glucose levels, understand trends, and get personalized insights for better health.".needTranslation.toText12( + fontWeight: FontWeight.w500, + color: Color(0xFF8F9AA3), + ) + ], + ), + ), + SizedBox( + width: 12.w, + ), + Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), + ], + ).paddingAll(16.w)) + .onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: HealthCalculatorDetailedPage(calculatorType: HealthCalculatorsTypeEnum.bloodSugar), + ), + ); + }), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.bloodCholestrol, height: 40.h, width: 40.w, fit: BoxFit.none), + SizedBox(width: 12.w), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "Blood Cholesterol".needTranslation.toText16(weight: FontWeight.w600), + "Monitor your cholesterol levels, track your LDL, HDL, and triglycerides. Get personalized recommendations for a healthy heart." + .needTranslation + .toText12(fontWeight: FontWeight.w500, color: Color(0xFF8F9AA3)) + ], + ), + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), + ], + ).paddingAll(16.w)) + .onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: HealthCalculatorDetailedPage(calculatorType: HealthCalculatorsTypeEnum.bloodCholesterol), + ), + ); + }), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.triglycerides, height: 40.h, width: 40.w, fit: BoxFit.none), + SizedBox(width: 12.w), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "Triglycerides Fat Blood".needTranslation.toText16(weight: FontWeight.w600), + "Manage triglycerides, a key blood fat. Understand levels, diet impacts, and heart health strategies." + .needTranslation + .toText12(fontWeight: FontWeight.w500, color: Color(0xFF8F9AA3)) + ], + ), + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrowRight, width: 24.w, height: 24.h, fit: BoxFit.contain, iconColor: AppColors.textColor), + ], + ).paddingAll(16.w)) + .onPress(() { + Navigator.of(context).push( + CustomPageRoute( + page: HealthCalculatorDetailedPage(calculatorType: HealthCalculatorsTypeEnum.triglycerides), + ), + ); + }), + ], + ).paddingSymmetrical(20.w, 24.h)); + } + + Widget showCalculatorsItems({required HealthCalculatorEnum type}) { + return GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, // 4 icons per row + crossAxisSpacing: 16.w, + mainAxisSpacing: 16.w, + childAspectRatio: 0.80), + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: type == HealthCalculatorEnum.general ? generalHealthServices.length : womenHealthServices.length, + padding: EdgeInsets.zero, + itemBuilder: (BuildContext context, int index) { + return HealthCard( + icon: type == HealthCalculatorEnum.general ? generalHealthServices[index].icon : womenHealthServices[index].icon, + labelText: type == HealthCalculatorEnum.general ? generalHealthServices[index].title : womenHealthServices[index].title, + onTap: () { + Navigator.of(context).push( + CustomPageRoute( + page: HealthCalculatorDetailedPage( + calculatorType: type == HealthCalculatorEnum.general ? generalHealthServices[index].type : womenHealthServices[index].type, + ), + ), + ); + }, + ); + }, + ); + } + + final List generalHealthServices = [ + HealthComponentModel(title: "BMI\nCalculator".needTranslation, icon: AppAssets.bmi, type: HealthCalculatorsTypeEnum.bmi), + HealthComponentModel(title: "Calories\nCalculator".needTranslation, icon: AppAssets.calories, type: HealthCalculatorsTypeEnum.calories), + HealthComponentModel(title: "BMR\nCalculator".needTranslation, icon: AppAssets.bmr, type: HealthCalculatorsTypeEnum.bmr), + HealthComponentModel(title: "Ideal Body\nWeight".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.idealBodyWeight), + HealthComponentModel(title: "Body Fat\nCalculator".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.bodyFat), + HealthComponentModel(title: "Carbs\nProtein & Fat".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.crabsProteinFat), + ]; + + final List womenHealthServices = [ + HealthComponentModel(title: "Ovulation\nPeriod".needTranslation, icon: AppAssets.locate_me, type: HealthCalculatorsTypeEnum.ovulation), + HealthComponentModel(title: "Delivery\nDue Date".needTranslation, icon: AppAssets.activeCheck, type: HealthCalculatorsTypeEnum.deliveryDueDate), + ]; +} + +class HealthComponentModel { + String title; + String? subTitle; + String icon; + Color? iconColor; + Color? bgColor; + Color? textColor; + HealthCalculatorsTypeEnum type; + + HealthComponentModel({required this.title, this.subTitle, required this.icon, this.iconColor, this.bgColor, this.textColor, required this.type}); +} diff --git a/lib/presentation/health_calculators_and_converts/health_converter_result.dart b/lib/presentation/health_calculators_and_converts/health_converter_result.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/presentation/health_calculators/widgets/bf.dart b/lib/presentation/health_calculators_and_converts/widgets/bf.dart similarity index 99% rename from lib/presentation/health_calculators/widgets/bf.dart rename to lib/presentation/health_calculators_and_converts/widgets/bf.dart index bbab9a5..3a37036 100644 --- a/lib/presentation/health_calculators/widgets/bf.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bf.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; import 'dart:math'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -9,7 +10,6 @@ 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/services/dialog_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; class BodyFatWidget extends StatefulWidget { Function(dynamic result)? onChange; diff --git a/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart b/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart new file mode 100644 index 0000000..161f318 --- /dev/null +++ b/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart @@ -0,0 +1,180 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; + +class BloodCholesterolWidget extends StatefulWidget { + final Function(dynamic result)? onChange; + + const BloodCholesterolWidget({super.key, this.onChange}); + + @override + State createState() => _BloodCholesterolWidgetState(); +} + +class _BloodCholesterolWidgetState extends State { + final TextEditingController _mgdlController = TextEditingController(); + final TextEditingController _mmolController = TextEditingController(); + final FocusNode _mgdlFocus = FocusNode(); + final FocusNode _mmolFocus = FocusNode(); + bool _isProgrammaticChange = false; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + Provider.of( + context, + listen: false, + ).clearBloodCholesterol(); + }); + } + + @override + void dispose() { + _mgdlController.dispose(); + _mmolController.dispose(); + _mgdlFocus.dispose(); + _mmolFocus.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, provider, _) { + _isProgrammaticChange = true; + final mgdlText = provider.cholMgdlValue ?? ''; + final mmolText = provider.cholMmolValue ?? ''; + + if (_mgdlController.text != mgdlText) { + _mgdlController.text = mgdlText; + _mgdlController.selection = TextSelection.fromPosition( + TextPosition(offset: _mgdlController.text.length), + ); + } + + if (_mmolController.text != mmolText) { + _mmolController.text = mmolText; + _mmolController.selection = TextSelection.fromPosition( + TextPosition(offset: _mmolController.text.length), + ); + } + + _isProgrammaticChange = false; + + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + _buildInputField( + label: "MG/DL", + hint: "120", + controller: _mgdlController, + focusNode: _mgdlFocus, + onChanged: (value) { + if (_isProgrammaticChange) return; + provider.onBloodCholesterolChanged(value, 'mg/dL'); + }, + ).paddingOnly(top: 16.h), + Row( + children: [ + const Expanded( + flex: 3, + child: Divider(height: 1, color: Color(0xFFEEEEEE)), + ), + SizedBox(width: 8.w), + Utils.buildSvgWithAssets( + icon: AppAssets.switchBtn, + width: 40.h, + height: 40.h, + ).onPress(() { + provider.switchBloodCholesterolValues(); + if (provider.cholActiveUnit == 'mg/dL') { + _mgdlFocus.requestFocus(); + } else { + _mmolFocus.requestFocus(); + } + }), + ], + ), + _buildInputField( + label: "MMOL/L", + hint: "6.7", + controller: _mmolController, + focusNode: _mmolFocus, + onChanged: (value) { + if (_isProgrammaticChange) return; + + provider.onBloodCholesterolChanged(value, 'mmol/L'); + }, + ).paddingOnly(bottom: 16.h), + const Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.globe, width: 18.w, height: 18.w), + SizedBox(width: 12.w), + Expanded( + child: "Convert blood cholesterol values between mg/dL and mmol/L. ".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + ), + ); + }, + ); + } + + /// Reusable Input Field + Widget _buildInputField({ + required String label, + required String hint, + required TextEditingController controller, + required FocusNode focusNode, + required ValueChanged onChanged, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + label.toText12( + fontWeight: FontWeight.w500, + color: AppColors.inputLabelTextColor, + ), + SizedBox( + height: 40.h, + child: TextField( + controller: controller, + focusNode: focusNode, + keyboardType: const TextInputType.numberWithOptions(decimal: true), + maxLines: 1, + onChanged: onChanged, + cursorHeight: 35.h, + textAlignVertical: TextAlignVertical.center, + decoration: InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: hint, + hintStyle: const TextStyle(color: Colors.grey), + ), + style: TextStyle( + fontSize: 32.f, + fontWeight: FontWeight.bold, + color: Colors.black87, + height: 1.h, + ), + ), + ), + ], + ); + } +} diff --git a/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart b/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart new file mode 100644 index 0000000..86b4c1e --- /dev/null +++ b/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart @@ -0,0 +1,190 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; + +class BloodSugarWidget extends StatefulWidget { + final Function(dynamic result)? onChange; + + const BloodSugarWidget({super.key, this.onChange}); + + @override + State createState() => _BloodSugarWidgetState(); +} + +class _BloodSugarWidgetState extends State { + final TextEditingController _mgdlController = TextEditingController(); + final TextEditingController _mmolController = TextEditingController(); + final FocusNode _mgdlFocus = FocusNode(); + final FocusNode _mmolFocus = FocusNode(); + bool _isProgrammaticChange = false; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + Provider.of( + context, + listen: false, + ).clearBloodSugar(); + }); + } + + @override + void dispose() { + _mgdlController.dispose(); + _mmolController.dispose(); + _mgdlFocus.dispose(); + _mmolFocus.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, provider, _) { + _isProgrammaticChange = true; + final mgdlText = provider.mgdlValue ?? ''; + final mmolText = provider.mmolValue ?? ''; + if (_mgdlController.text != mgdlText) { + _mgdlController.text = mgdlText; + _mgdlController.selection = TextSelection.fromPosition( + TextPosition(offset: _mgdlController.text.length), + ); + } + + if (_mmolController.text != mmolText) { + _mmolController.text = mmolText; + _mmolController.selection = TextSelection.fromPosition( + TextPosition(offset: _mmolController.text.length), + ); + } + + _isProgrammaticChange = false; + + return Container( + margin: EdgeInsets.zero, + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Column( + children: [ + _buildInputField( + label: "MG/DL", + hint: "120", + controller: _mgdlController, + focusNode: _mgdlFocus, + onChanged: (value) { + if (_isProgrammaticChange) return; + provider.onBloodSugarChanged(value, 'mg/dL'); + }, + ).paddingOnly(top: 16.h), + Row( + children: [ + const Expanded( + flex: 3, + child: Divider(height: 1, color: Color(0xFFEEEEEE)), + ), + SizedBox(width: 8.w), + Utils.buildSvgWithAssets( + icon: AppAssets.switchBtn, + width: 40.h, + height: 40.h, + ).onPress(() { + provider.switchBloodSugarValues(); + if (provider.activeUnit == 'mg/dL') { + _mgdlFocus.requestFocus(); + } else { + _mmolFocus.requestFocus(); + } + }), + ], + ), + _buildInputField( + label: "MMOL/L", + hint: "6.7", + controller: _mmolController, + focusNode: _mmolFocus, + onChanged: (value) { + if (_isProgrammaticChange) return; + + provider.onBloodSugarChanged(value, 'mmol/L'); + }, + ).paddingOnly(bottom: 16.h), + const Divider(height: 1, color: Color(0xFFEEEEEE)), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.globe, + width: 18.w, + height: 18.w, + ), + SizedBox(width: 12.w), + Expanded( + child: "Convert blood glucose values between mg/dL and mmol/L. (1 mmol/L ≈ 18.0182 mg/dL)".toText12( + fontWeight: FontWeight.w500, + color: AppColors.inputLabelTextColor, + ), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + ), + ); + }, + ); + } + + /// Reusable Input Field + Widget _buildInputField({ + required String label, + required String hint, + required TextEditingController controller, + required FocusNode focusNode, + required ValueChanged onChanged, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + label.toText12( + fontWeight: FontWeight.w500, + color: AppColors.inputLabelTextColor, + ), + SizedBox( + height: 40.h, + child: TextField( + controller: controller, + focusNode: focusNode, + keyboardType: const TextInputType.numberWithOptions(decimal: true), + maxLines: 1, + onChanged: onChanged, + cursorHeight: 35.h, + textAlignVertical: TextAlignVertical.center, + decoration: InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: hint, + hintStyle: const TextStyle(color: Colors.grey), + ), + style: TextStyle( + fontSize: 32.f, + fontWeight: FontWeight.bold, + color: Colors.black87, + height: 1.h, + ), + ), + ), + ], + ); + } +} diff --git a/lib/presentation/health_calculators/widgets/bmi.dart b/lib/presentation/health_calculators_and_converts/widgets/bmi.dart similarity index 99% rename from lib/presentation/health_calculators/widgets/bmi.dart rename to lib/presentation/health_calculators_and_converts/widgets/bmi.dart index be87d0d..49b77c0 100644 --- a/lib/presentation/health_calculators/widgets/bmi.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bmi.dart @@ -8,7 +8,7 @@ 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/services/dialog_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; class BMIWidget extends StatefulWidget { Function(dynamic result)? onChange; diff --git a/lib/presentation/health_calculators/widgets/bmr.dart b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart similarity index 99% rename from lib/presentation/health_calculators/widgets/bmr.dart rename to lib/presentation/health_calculators_and_converts/widgets/bmr.dart index 771191e..138fd3e 100644 --- a/lib/presentation/health_calculators/widgets/bmr.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart @@ -10,7 +10,7 @@ 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/services/dialog_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; class BMRWidget extends StatefulWidget { Function(dynamic result)? onChange; diff --git a/lib/presentation/health_calculators/widgets/calories.dart b/lib/presentation/health_calculators_and_converts/widgets/calories.dart similarity index 99% rename from lib/presentation/health_calculators/widgets/calories.dart rename to lib/presentation/health_calculators_and_converts/widgets/calories.dart index 0d7aab7..bfaad3e 100644 --- a/lib/presentation/health_calculators/widgets/calories.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/calories.dart @@ -10,7 +10,7 @@ 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/services/dialog_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; class CaloriesWidget extends StatefulWidget { Function(dynamic result)? onChange; diff --git a/lib/presentation/health_calculators/widgets/crabs.dart b/lib/presentation/health_calculators_and_converts/widgets/crabs.dart similarity index 98% rename from lib/presentation/health_calculators/widgets/crabs.dart rename to lib/presentation/health_calculators_and_converts/widgets/crabs.dart index 3fa1bdf..5fe1215 100644 --- a/lib/presentation/health_calculators/widgets/crabs.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/crabs.dart @@ -7,11 +7,11 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/presentation/health_calculators/health_calculator_detailed_page.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_detailed_page.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; class CrabsWidget extends StatefulWidget { Function(dynamic result)? onChange; diff --git a/lib/presentation/health_calculators/widgets/dduedate.dart b/lib/presentation/health_calculators_and_converts/widgets/dduedate.dart similarity index 94% rename from lib/presentation/health_calculators/widgets/dduedate.dart rename to lib/presentation/health_calculators_and_converts/widgets/dduedate.dart index 91057aa..15c0a0c 100644 --- a/lib/presentation/health_calculators/widgets/dduedate.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/dduedate.dart @@ -8,7 +8,7 @@ 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/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; class DeliveryDueDWidget extends StatefulWidget { final Function(dynamic result)? onChange; @@ -35,7 +35,7 @@ class _DeliveryDueDWidgetState extends State { child: Column( children: [ TextInputWidget( - labelText: "Date", + labelText: "Last Period Date", hintText: "11 July, 1994".needTranslation, controller: _date, focusNode: FocusNode(), @@ -56,8 +56,6 @@ class _DeliveryDueDWidgetState extends State { selectedDate = Utils.formatDateToDisplay(val); _date.text = selectedDate; }); - - // provider expects ISO date string to calculate due date provider.calculateDueDate(isoDateString: val); if (widget.onChange != null) { diff --git a/lib/presentation/health_calculators/widgets/health_card.dart b/lib/presentation/health_calculators_and_converts/widgets/health_card.dart similarity index 100% rename from lib/presentation/health_calculators/widgets/health_card.dart rename to lib/presentation/health_calculators_and_converts/widgets/health_card.dart diff --git a/lib/presentation/health_calculators/widgets/ibw.dart b/lib/presentation/health_calculators_and_converts/widgets/ibw.dart similarity index 99% rename from lib/presentation/health_calculators/widgets/ibw.dart rename to lib/presentation/health_calculators_and_converts/widgets/ibw.dart index 0e3f725..5f67511 100644 --- a/lib/presentation/health_calculators/widgets/ibw.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/ibw.dart @@ -8,7 +8,7 @@ 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/services/dialog_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; class IdealBodyWeightWidget extends StatefulWidget { Function(dynamic result)? onChange; diff --git a/lib/presentation/health_calculators/widgets/ovulation.dart b/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart similarity index 91% rename from lib/presentation/health_calculators/widgets/ovulation.dart rename to lib/presentation/health_calculators_and_converts/widgets/ovulation.dart index 476bf72..de209cb 100644 --- a/lib/presentation/health_calculators/widgets/ovulation.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart @@ -8,7 +8,7 @@ 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/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; class OvulationWidget extends StatefulWidget { Function(dynamic result)? onChange; @@ -78,7 +78,7 @@ class _OvulationWidgetState extends State { onChange: (val) { if (val == null) return; setState(() { - _ageController.text = selectedDate = Utils.formatDateToDisplay(val!); + _ageController.text = selectedDate = Utils.formatDateToDisplay(val); }); _onInputChanged(); }, @@ -109,7 +109,7 @@ class _OvulationWidgetState extends State { border: InputBorder.none, contentPadding: EdgeInsets.zero, isCollapsed: true, - hintText: '15', + hintText: '28', hintStyle: TextStyle(color: Colors.grey), ), style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), @@ -146,7 +146,7 @@ class _OvulationWidgetState extends State { border: InputBorder.none, contentPadding: EdgeInsets.zero, isCollapsed: true, - hintText: '10', + hintText: '14', hintStyle: TextStyle(color: Colors.grey), ), style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.black87, height: 1.0), @@ -157,17 +157,6 @@ class _OvulationWidgetState extends State { ), ], ).paddingSymmetrical(0.w, 16.w), - if (provider.ovulationResult != null) ...[ - Divider(height: 1, color: Color(0xFFEEEEEE)), - // show result UI same as before; keeping unchanged design - Row( - children: [ - Expanded(child: Text('Last Period: ${provider.ovulationResult!['lastPeriodDate'] ?? ''}')), - Expanded(child: Text('Ovulation: ${provider.ovulationResult!['ovulationDate'] ?? ''}')), - ], - ).paddingSymmetrical(0.w, 16.w), - ], - Divider(height: 1, color: Color(0xFFEEEEEE)), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart b/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart new file mode 100644 index 0000000..17ad1f9 --- /dev/null +++ b/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart @@ -0,0 +1,194 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; + +class TriglyceridesWidget extends StatefulWidget { + final Function(dynamic result)? onChange; + + const TriglyceridesWidget({super.key, this.onChange}); + + @override + State createState() => _TriglyceridesWidgetState(); +} + +class _TriglyceridesWidgetState extends State { + final TextEditingController _mgdlController = TextEditingController(); + final TextEditingController _mmolController = TextEditingController(); + final FocusNode _mgdlFocus = FocusNode(); + final FocusNode _mmolFocus = FocusNode(); + bool _isProgrammaticChange = false; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + Provider.of( + context, + listen: false, + ).clearTriglycerides(); + }); + } + + @override + void dispose() { + _mgdlController.dispose(); + _mmolController.dispose(); + _mgdlFocus.dispose(); + _mmolFocus.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, provider, _) { + _isProgrammaticChange = true; + + final mgdlText = provider.triMgdlValue ?? ''; + final mmolText = provider.triMmolValue ?? ''; + + if (_mgdlController.text != mgdlText) { + _mgdlController.text = mgdlText; + _mgdlController.selection = TextSelection.fromPosition( + TextPosition(offset: _mgdlController.text.length), + ); + } + + if (_mmolController.text != mmolText) { + _mmolController.text = mmolText; + _mmolController.selection = TextSelection.fromPosition( + TextPosition(offset: _mmolController.text.length), + ); + } + + _isProgrammaticChange = false; + + return Container( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Column( + children: [ + _buildInputField( + label: "MG/DL", + hint: "150", + controller: _mgdlController, + focusNode: _mgdlFocus, + onChanged: (value) { + if (_isProgrammaticChange) return; + provider.onTriglyceridesChanged(value, 'mg/dL'); + }, + ).paddingOnly(top: 16.h), + + Row( + children: [ + const Expanded( + flex: 3, + child: Divider(height: 1, color: Color(0xFFEEEEEE)), + ), + SizedBox(width: 8.w), + Utils.buildSvgWithAssets( + icon: AppAssets.switchBtn, + width: 40.h, + height: 40.h, + ).onPress(() { + provider.switchTriglyceridesValues(); + + if (provider.triActiveUnit == 'mg/dL') { + _mgdlFocus.requestFocus(); + } else { + _mmolFocus.requestFocus(); + } + }), + ], + ), + + _buildInputField( + label: "MMOL/L", + hint: "1.7", + controller: _mmolController, + focusNode: _mmolFocus, + onChanged: (value) { + if (_isProgrammaticChange) return; + provider.onTriglyceridesChanged(value, 'mmol/L'); + }, + ).paddingOnly(bottom: 16.h), + + const Divider(height: 1, color: Color(0xFFEEEEEE)), + + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.globe, + width: 18.w, + height: 18.w, + ), + SizedBox(width: 12.w), + Expanded( + child: + "Convert triglyceride values between mg/dL and mmol/L." + .toText12( + fontWeight: FontWeight.w500, + color: AppColors.inputLabelTextColor, + ), + ), + ], + ).paddingSymmetrical(0.w, 16.w), + ], + ), + ); + }, + ); + } + + Widget _buildInputField({ + required String label, + required String hint, + required TextEditingController controller, + required FocusNode focusNode, + required ValueChanged onChanged, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + label.toText12( + fontWeight: FontWeight.w500, + color: AppColors.inputLabelTextColor, + ), + SizedBox( + height: 40.h, + child: TextField( + controller: controller, + focusNode: focusNode, + + keyboardType: + const TextInputType.numberWithOptions(decimal: true), + onChanged: onChanged, + cursorHeight: 35.h, + decoration: InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: hint, + hintStyle: const TextStyle(color: Colors.grey), + ), + style: TextStyle( + fontSize: 32.f, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ); + } +} diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 001af4c..25fa7ef 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -146,7 +146,7 @@ class ServicesPage extends StatelessWidget { AppAssets.health_converters_icon, bgColor: AppColors.whiteColor, true, - route: AppRoutes.comprehensiveCheckupPage, + route: AppRoutes.healthConvertersPage, ), HmgServicesComponentModel( 11, diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart index 3e34a92..d8d5264 100644 --- a/lib/presentation/home/data/landing_page_data.dart +++ b/lib/presentation/home/data/landing_page_data.dart @@ -36,7 +36,7 @@ class LandingPageData { isBold: false, ), ServiceCardData( - serviceName: "health_calculators", + serviceName: "health_calculators_and_converts", icon: AppAssets.health_calculators_icon, title: "Health", subtitle: "Calculators", diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index d25a9de..f335f34 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; import 'package:hmg_patient_app_new/presentation/authentication/register.dart'; import 'package:hmg_patient_app_new/presentation/authentication/register_step2.dart'; @@ -6,7 +7,7 @@ import 'package:hmg_patient_app_new/presentation/blood_donation/blood_donation_p import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; import 'package:hmg_patient_app_new/presentation/comprehensive_checkup/comprehensive_checkup_page.dart'; import 'package:hmg_patient_app_new/presentation/e_referral/new_e_referral.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculators_page.dart'; +import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculators_page.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/presentation/home_health_care/hhc_procedures_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; @@ -33,6 +34,7 @@ class AppRoutes { static const String eReferralPage = '/erReferralPage'; static const String comprehensiveCheckupPage = '/comprehensiveCheckupPage'; static const String healthCalculatorsPage = '/healthCalculatorsPage'; + static const String healthConvertersPage = '/healthConvertersPage'; static const String homeHealthCarePage = '/homeHealthCarePage'; static const String zoomCallPage = '/zoomCallPage'; static const String bloodDonationPage = '/bloodDonationPage'; @@ -79,7 +81,7 @@ class AppRoutes { huaweiHealthExample: (context) => HuaweiHealthExample(), // - healthCalculatorsPage: (context) => HealthCalculatorsPage() - + healthCalculatorsPage: (context) => HealthCalculatorsPage(type: HealthCalConEnum.calculator), + healthConvertersPage: (context) => HealthCalculatorsPage(type: HealthCalConEnum.converter) }; } From ada169f83fe15509046b04b5e2207e6af614e0af Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Wed, 17 Dec 2025 16:06:30 +0300 Subject: [PATCH 34/55] Health calculators & converters --- .../health_calculators_and_converts/health_converter_result.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/presentation/health_calculators_and_converts/health_converter_result.dart diff --git a/lib/presentation/health_calculators_and_converts/health_converter_result.dart b/lib/presentation/health_calculators_and_converts/health_converter_result.dart deleted file mode 100644 index e69de29..0000000 From 5581346a2d4d7532fc46e98de190dc638a720b82 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 17 Dec 2025 16:30:06 +0300 Subject: [PATCH 35/55] updates --- lib/widgets/appbar/collapsing_list_view.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart index ca40c32..68dbb32 100644 --- a/lib/widgets/appbar/collapsing_list_view.dart +++ b/lib/widgets/appbar/collapsing_list_view.dart @@ -209,8 +209,8 @@ class ScrollAnimatedTitle extends StatefulWidget implements PreferredSizeWidget } class _ScrollAnimatedTitleState extends State { - static const double _maxFont = 24; - static const double _minFont = 14; + static const double _maxFont = 26; + static const double _minFont = 18; static const double _maxHeight = 80; static const double _minHeight = 56; From fd2abbbc7bdccc0d07f28dac4d53015cc8ef98e4 Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Wed, 24 Dec 2025 09:15:18 +0300 Subject: [PATCH 36/55] Water Intake Design completed --- assets/images/svg/add_icon_dark.svg | 3 + assets/images/svg/confirm.svg | 2 +- assets/images/svg/cup_add.svg | 5 + assets/images/svg/cup_empty.svg | 4 + assets/images/svg/cup_filled.svg | 5 + assets/images/svg/dumbell_icon.svg | 5 + assets/images/svg/glass_icon.svg | 3 + assets/images/svg/height_icon.svg | 3 + assets/images/svg/minimize_icon.svg | 3 + assets/images/svg/notification_icon_grey.svg | 4 + assets/images/svg/outer_bubbles.svg | 9 + assets/images/svg/profile_icon.svg | 3 + assets/images/svg/water_bottle.svg | 34 ++ assets/images/svg/weight_scale_icon.svg | 3 + lib/core/api/api_client.dart | 135 +++--- lib/core/api_consts.dart | 10 +- lib/core/app_assets.dart | 17 +- lib/core/dependencies.dart | 64 ++- lib/extensions/string_extensions.dart | 98 +++-- .../risk_and_suggestions_response_model.dart | 59 +++ .../symptoms_checker_repo.dart | 229 ++++++++-- .../symptoms_checker_view_model.dart | 350 ++++++++++++++- .../water_monitor/models/water_cup_model.dart | 47 ++ .../water_monitor_view_model.dart | 408 ++++++++++++++++++ lib/main.dart | 6 +- .../appointments/appointment_queue_page.dart | 116 +++-- .../e_referral/new_e_referral.dart | 22 +- .../hmg_services/services_page.dart | 4 +- .../home_health_care/hhc_procedures_page.dart | 112 +++-- .../organ_selector_screen.dart | 17 +- .../symptoms_checker/risk_factors_screen.dart | 274 ++++++------ .../symptoms_checker/suggestions_screen.dart | 237 +++++----- .../symptoms_checker/triage_screen.dart | 14 +- .../water_consumption_screen.dart | 269 ++++++++++++ .../water_monitor_settings_screen.dart | 360 ++++++++++++++++ .../widgets/bottle_shape_clipper.dart | 25 ++ .../widgets/cup_bottomsheet_widgets.dart | 324 ++++++++++++++ .../water_consumption_progress_widget.dart | 86 ++++ .../widgets/water_splash_progress_widget.dart | 351 +++++++++++++++ lib/routes/app_routes.dart | 13 +- lib/theme/colors.dart | 8 + lib/widgets/buttons/custom_button.dart | 2 +- 42 files changed, 3192 insertions(+), 551 deletions(-) create mode 100644 assets/images/svg/add_icon_dark.svg create mode 100644 assets/images/svg/cup_add.svg create mode 100644 assets/images/svg/cup_empty.svg create mode 100644 assets/images/svg/cup_filled.svg create mode 100644 assets/images/svg/dumbell_icon.svg create mode 100644 assets/images/svg/glass_icon.svg create mode 100644 assets/images/svg/height_icon.svg create mode 100644 assets/images/svg/minimize_icon.svg create mode 100644 assets/images/svg/notification_icon_grey.svg create mode 100644 assets/images/svg/outer_bubbles.svg create mode 100644 assets/images/svg/profile_icon.svg create mode 100644 assets/images/svg/water_bottle.svg create mode 100644 assets/images/svg/weight_scale_icon.svg create mode 100644 lib/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart create mode 100644 lib/features/water_monitor/models/water_cup_model.dart create mode 100644 lib/features/water_monitor/water_monitor_view_model.dart create mode 100644 lib/presentation/water_monitor/water_consumption_screen.dart create mode 100644 lib/presentation/water_monitor/water_monitor_settings_screen.dart create mode 100644 lib/presentation/water_monitor/widgets/bottle_shape_clipper.dart create mode 100644 lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart create mode 100644 lib/presentation/water_monitor/widgets/water_consumption_progress_widget.dart create mode 100644 lib/presentation/water_monitor/widgets/water_splash_progress_widget.dart diff --git a/assets/images/svg/add_icon_dark.svg b/assets/images/svg/add_icon_dark.svg new file mode 100644 index 0000000..399df3c --- /dev/null +++ b/assets/images/svg/add_icon_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/confirm.svg b/assets/images/svg/confirm.svg index 62cfa01..5ed3693 100755 --- a/assets/images/svg/confirm.svg +++ b/assets/images/svg/confirm.svg @@ -1,3 +1,3 @@ - +add_ diff --git a/assets/images/svg/cup_add.svg b/assets/images/svg/cup_add.svg new file mode 100644 index 0000000..ebe186a --- /dev/null +++ b/assets/images/svg/cup_add.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/cup_empty.svg b/assets/images/svg/cup_empty.svg new file mode 100644 index 0000000..fae08fe --- /dev/null +++ b/assets/images/svg/cup_empty.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/cup_filled.svg b/assets/images/svg/cup_filled.svg new file mode 100644 index 0000000..6a085bb --- /dev/null +++ b/assets/images/svg/cup_filled.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/dumbell_icon.svg b/assets/images/svg/dumbell_icon.svg new file mode 100644 index 0000000..1d6db5f --- /dev/null +++ b/assets/images/svg/dumbell_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/glass_icon.svg b/assets/images/svg/glass_icon.svg new file mode 100644 index 0000000..1df8eec --- /dev/null +++ b/assets/images/svg/glass_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/height_icon.svg b/assets/images/svg/height_icon.svg new file mode 100644 index 0000000..78cefdc --- /dev/null +++ b/assets/images/svg/height_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/minimize_icon.svg b/assets/images/svg/minimize_icon.svg new file mode 100644 index 0000000..b60a041 --- /dev/null +++ b/assets/images/svg/minimize_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/notification_icon_grey.svg b/assets/images/svg/notification_icon_grey.svg new file mode 100644 index 0000000..9e5e8d5 --- /dev/null +++ b/assets/images/svg/notification_icon_grey.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/outer_bubbles.svg b/assets/images/svg/outer_bubbles.svg new file mode 100644 index 0000000..cfe860d --- /dev/null +++ b/assets/images/svg/outer_bubbles.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/svg/profile_icon.svg b/assets/images/svg/profile_icon.svg new file mode 100644 index 0000000..20dfb2b --- /dev/null +++ b/assets/images/svg/profile_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/water_bottle.svg b/assets/images/svg/water_bottle.svg new file mode 100644 index 0000000..4763d7e --- /dev/null +++ b/assets/images/svg/water_bottle.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/svg/weight_scale_icon.svg b/assets/images/svg/weight_scale_icon.svg new file mode 100644 index 0000000..c3329ff --- /dev/null +++ b/assets/images/svg/weight_scale_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 888f704..f366329 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -19,7 +19,7 @@ abstract class ApiClient { Future post( String endPoint, { - required Map body, + required dynamic body, required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess, required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure, bool isAllowAny, @@ -27,6 +27,8 @@ abstract class ApiClient { bool isRCService, bool isPaymentServices, bool bypassConnectionCheck, + Map apiHeaders, + bool isBodyPlainText, }); Future get( @@ -89,7 +91,7 @@ class ApiClientImp implements ApiClient { @override post( String endPoint, { - required Map body, + required dynamic body, required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess, required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure, bool isAllowAny = false, @@ -97,6 +99,8 @@ class ApiClientImp implements ApiClient { bool isRCService = false, bool isPaymentServices = false, bool bypassConnectionCheck = true, + Map? apiHeaders, + bool isBodyPlainText = false, }) async { String url; if (isExternal) { @@ -110,80 +114,84 @@ class ApiClientImp implements ApiClient { } // try { var user = _appState.getAuthenticatedUser(); - Map headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}; - if (!isExternal) { - String? token = _appState.appAuthToken; + Map headers = apiHeaders ?? {'Content-Type': 'application/json', 'Accept': 'application/json'}; - if (body.containsKey('SetupID')) { - body['SetupID'] = body.containsKey('SetupID') ? body['SetupID'] ?? body[''] : SETUP_ID; - } else {} + // When isBodyPlainText is true, skip all body manipulation and use body as-is + if (!isBodyPlainText) { + if (!isExternal) { + String? token = _appState.appAuthToken; - if (body.containsKey('isDentalAllowedBackend')) { - body['isDentalAllowedBackend'] = - body.containsKey('isDentalAllowedBackend') ? body['isDentalAllowedBackend'] ?? IS_DENTAL_ALLOWED_BACKEND : IS_DENTAL_ALLOWED_BACKEND; - } + if (body.containsKey('SetupID')) { + body['SetupID'] = body.containsKey('SetupID') ? body['SetupID'] ?? body[''] : SETUP_ID; + } else {} - if (!body.containsKey('IsPublicRequest')) { - // if (!body.containsKey('PatientType')) { - if (user != null && user.patientType != null) { - body['PatientType'] = user.patientType; - } else { - body['PatientType'] = PATIENT_TYPE.toString(); + if (body.containsKey('isDentalAllowedBackend')) { + body['isDentalAllowedBackend'] = + body.containsKey('isDentalAllowedBackend') ? body['isDentalAllowedBackend'] ?? IS_DENTAL_ALLOWED_BACKEND : IS_DENTAL_ALLOWED_BACKEND; } - if (user != null && user.patientType != null) { - body['PatientTypeID'] = user.patientType; - } else { - body['PatientType'] = PATIENT_TYPE_ID.toString(); - } + if (!body.containsKey('IsPublicRequest')) { + // if (!body.containsKey('PatientType')) { + if (user != null && user.patientType != null) { + body['PatientType'] = user.patientType; + } else { + body['PatientType'] = PATIENT_TYPE.toString(); + } + + if (user != null && user.patientType != null) { + body['PatientTypeID'] = user.patientType; + } else { + body['PatientType'] = PATIENT_TYPE_ID.toString(); + } - if (user != null) { - body['TokenID'] = body['TokenID'] ?? token; + if (user != null) { + body['TokenID'] = body['TokenID'] ?? token; - body['PatientID'] = body['PatientID'] ?? user.patientId; + body['PatientID'] = body['PatientID'] ?? user.patientId; - body['PatientOutSA'] = body.containsKey('PatientOutSA') ? body['PatientOutSA'] ?? user.outSa : user.outSa; - body['SessionID'] = body['TokenID'] == null ? ApiConsts.sessionID : getSessionId(body['TokenID'] ?? ""); //getSe + body['PatientOutSA'] = body.containsKey('PatientOutSA') ? body['PatientOutSA'] ?? user.outSa : user.outSa; + body['SessionID'] = body['TokenID'] == null ? ApiConsts.sessionID : getSessionId(body['TokenID'] ?? ""); //getSe + } + // else { + // body['SessionID'] = body['TokenID'] == null ? ApiConsts.sessionID : getSessionId(body['TokenID'] ?? ""); //getSe + // + // } } - // else { - // body['SessionID'] = body['TokenID'] == null ? ApiConsts.sessionID : getSessionId(body['TokenID'] ?? ""); //getSe - // - // } } - } - // request.versionID = VERSION_ID; - // request.channel = CHANNEL; - // request.iPAdress = IP_ADDRESS; - // request.generalid = GENERAL_ID; - // request.languageID = (languageID == 'ar' ? 1 : 2); - // request.patientOutSA = (request.zipCode == '966' || request.zipCode == '+966') ? 0 : 1; - - // body['VersionID'] = ApiConsts.appVersionID.toString(); - if (!isExternal) { - body['VersionID'] = ApiConsts.appVersionID.toString(); - body['Channel'] = ApiConsts.appChannelId.toString(); - body['IPAdress'] = ApiConsts.appIpAddress; - body['generalid'] = ApiConsts.appGeneralId; - - body['LanguageID'] = _appState.getLanguageID().toString(); - body['Latitude'] = _appState.userLat.toString(); - body['Longitude'] = _appState.userLong.toString(); - body['DeviceTypeID'] = _appState.deviceTypeID; - if (_appState.appAuthToken.isNotEmpty) { - body[_appState.isAuthenticated ? 'TokenID' : 'LogInTokenID'] = _appState.appAuthToken; + // request.versionID = VERSION_ID; + // request.channel = CHANNEL; + // request.iPAdress = IP_ADDRESS; + // request.generalid = GENERAL_ID; + // request.languageID = (languageID == 'ar' ? 1 : 2); + // request.patientOutSA = (request.zipCode == '966' || request.zipCode == '+966') ? 0 : 1; + + // body['VersionID'] = ApiConsts.appVersionID.toString(); + if (!isExternal) { + body['VersionID'] = ApiConsts.appVersionID.toString(); + body['Channel'] = ApiConsts.appChannelId.toString(); + body['IPAdress'] = ApiConsts.appIpAddress; + body['generalid'] = ApiConsts.appGeneralId; + + body['LanguageID'] = _appState.getLanguageID().toString(); + body['Latitude'] = _appState.userLat.toString(); + body['Longitude'] = _appState.userLong.toString(); + body['DeviceTypeID'] = _appState.deviceTypeID; + if (_appState.appAuthToken.isNotEmpty) { + body[_appState.isAuthenticated ? 'TokenID' : 'LogInTokenID'] = _appState.appAuthToken; + } + + // body['TokenID'] = "@dm!n"; + // body['PatientID'] = 1018977; + // body['PatientTypeID'] = 1; + // + // body['PatientOutSA'] = 0; + // body['SessionID'] = "45786230487560q"; } - // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 1018977; - // body['PatientTypeID'] = 1; - // - // body['PatientOutSA'] = 0; - // body['SessionID'] = "45786230487560q"; + body.removeWhere((key, value) => value == null); } - body.removeWhere((key, value) => value == null); - final bool networkStatus = await Utils.checkConnection(bypassConnectionCheck: bypassConnectionCheck); if (!networkStatus) { @@ -196,12 +204,13 @@ class ApiClientImp implements ApiClient { return; } - final response = await http.post(Uri.parse(url.trim()), body: json.encode(body), headers: headers); + // Handle body encoding based on isBodyPlainText flag + final dynamic requestBody = isBodyPlainText ? body : json.encode(body); + final response = await http.post(Uri.parse(url.trim()), body: requestBody, headers: headers); final int statusCode = response.statusCode; log("uri: ${Uri.parse(url.trim())}"); log("body: ${json.encode(body)}"); // log("response.body: ${response.body}"); - // log("response.body: ${response.body}"); if (statusCode < 200 || statusCode >= 400) { onFailure('Error While Fetching data', statusCode, failureType: StatusCodeFailure("Error While Fetching data")); logApiEndpointError(endPoint, 'Error While Fetching data', statusCode); diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 9bab873..a5283c0 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -853,12 +853,11 @@ class ApiConsts { // SYMPTOMS CHECKER static final String getBodySymptomsByName = '$symptomsCheckerApi/GetBodySymptomsByName'; static final String getRiskFactors = '$symptomsCheckerApi/GetRiskFactors'; - static final String getGeneralSuggestion = '$symptomsCheckerApi/GetGeneralSggestion'; + static final String getSuggestions = '$symptomsCheckerApi/GetSuggestion'; static final String diagnosis = '$symptomsCheckerApi/diagnosis'; static final String explain = '$symptomsCheckerApi/explain'; //E-REFERRAL SERVICES - static final getAllRelationshipTypes = "Services/Patients.svc/REST/GetAllRelationshipTypes"; static final sendActivationCodeForEReferral = 'Services/Authentication.svc/REST/SendActivationCodeForEReferral'; static final checkActivationCodeForEReferral = 'Services/Authentication.svc/REST/CheckActivationCodeForEReferral'; @@ -866,6 +865,13 @@ class ApiConsts { static final createEReferral = "Services/Patients.svc/REST/CreateEReferral"; static final getEReferrals = "Services/Patients.svc/REST/GetEReferrals"; + //WATER CONSUMPTION + static String h2oGetUserProgress = "Services/H2ORemainder.svc/REST/H2O_GetUserProgress"; + static String h2oInsertUserActivity = "Services/H2ORemainder.svc/REST/H2O_InsertUserActivity"; + static String h2oGetUserDetail = "Services/H2ORemainder.svc/REST/H2O_GetUserDetails_New"; + static String h2oUpdateUserDetail = "Services/H2ORemainder.svc/REST/H2O_UpdateUserDetails_New"; + static String h2oUndoUserActivity = "Services/H2ORemainder.svc/REST/H2o_UndoUserActivity"; + // ************ static values for Api **************** static final double appVersionID = 50.3; static final int appChannelId = 3; diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index bbe7d75..34224f8 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -247,7 +247,22 @@ class AppAssets { static const String refreshIcon = '$svgBasePath/refresh.svg'; static const String homeBorderedIcon = '$svgBasePath/home_bordered.svg'; - // PNGS // + // Water Monitor + static const String waterBottle = '$svgBasePath/water_bottle.svg'; + static const String cupAdd = '$svgBasePath/cup_add.svg'; + static const String cupFilled = '$svgBasePath/cup_filled.svg'; + static const String waterBottleOuterBubbles = '$svgBasePath/outer_bubbles.svg'; + static const String cupEmpty = '$svgBasePath/cup_empty.svg'; + static const String dumbellIcon = '$svgBasePath/dumbell_icon.svg'; + static const String weightScaleIcon = '$svgBasePath/weight_scale_icon.svg'; + static const String heightIcon = '$svgBasePath/height_icon.svg'; + static const String profileIcon = '$svgBasePath/profile_icon.svg'; + static const String notificationIconGrey = '$svgBasePath/notification_icon_grey.svg'; + static const String minimizeIcon = '$svgBasePath/minimize_icon.svg'; + static const String addIconDark = '$svgBasePath/add_icon_dark.svg'; + static const String glassIcon = '$svgBasePath/glass_icon.svg'; + + // PNGS static const String hmgLogo = '$pngBasePath/hmg_logo.png'; static const String liveCareService = '$pngBasePath/livecare_service.png'; diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index 054e1fa..96cbfa9 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -45,6 +45,7 @@ import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_r import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; @@ -124,7 +125,10 @@ class AppDependencies { getIt.registerLazySingleton(() => ContactUsRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => HmgServicesRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => SymptomsCheckerRepoImp(loggerService: getIt(), apiClient: getIt())); - getIt.registerLazySingleton(() => BloodDonationRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => BloodDonationRepoImp( + loggerService: getIt(), + apiClient: getIt(), + )); // ViewModels // Global/shared VMs → LazySingleton @@ -140,10 +144,11 @@ class AppDependencies { getIt.registerLazySingleton(() => InsuranceViewModel(insuranceRepo: getIt(), errorHandlerService: getIt())); - getIt.registerLazySingleton(() => MyAppointmentsViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); + getIt.registerLazySingleton( + () => MyAppointmentsViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); getIt.registerLazySingleton( - () => AppointmentRatingViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); + () => AppointmentRatingViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); getIt.registerLazySingleton( () => PayfortViewModel( @@ -168,7 +173,12 @@ class AppDependencies { getIt.registerLazySingleton( () => BookAppointmentsViewModel( - bookAppointmentsRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt(), myAppointmentsViewModel: getIt(), locationUtils: getIt(), dialogService: getIt()), + bookAppointmentsRepo: getIt(), + errorHandlerService: getIt(), + navigationService: getIt(), + myAppointmentsViewModel: getIt(), + locationUtils: getIt(), + dialogService: getIt()), ); getIt.registerLazySingleton( @@ -182,7 +192,13 @@ class AppDependencies { getIt.registerLazySingleton( () => AuthenticationViewModel( - authenticationRepo: getIt(), cacheService: getIt(), navigationService: getIt(), dialogService: getIt(), appState: getIt(), errorHandlerService: getIt(), localAuthService: getIt()), + authenticationRepo: getIt(), + cacheService: getIt(), + navigationService: getIt(), + dialogService: getIt(), + appState: getIt(), + errorHandlerService: getIt(), + localAuthService: getIt()), ); getIt.registerLazySingleton(() => ProfileSettingsViewModel()); @@ -191,12 +207,21 @@ class AppDependencies { getIt.registerLazySingleton(() => DoctorFilterViewModel()); getIt.registerLazySingleton( - () => AppointmentViaRegionViewmodel(navigationService: getIt(), appState: getIt()), + () => AppointmentViaRegionViewmodel( + navigationService: getIt(), + appState: getIt(), + ), ); getIt.registerLazySingleton( () => EmergencyServicesViewModel( - locationUtils: getIt(), navServices: getIt(), emergencyServicesRepo: getIt(), appState: getIt(), errorHandlerService: getIt(), appointmentRepo: getIt(), dialogService: getIt()), + locationUtils: getIt(), + navServices: getIt(), + emergencyServicesRepo: getIt(), + appState: getIt(), + errorHandlerService: getIt(), + appointmentRepo: getIt(), + dialogService: getIt()), ); getIt.registerLazySingleton( @@ -213,19 +238,38 @@ class AppDependencies { () => TodoSectionViewModel(todoSectionRepo: getIt(), errorHandlerService: getIt()), ); - getIt.registerLazySingleton(() => SymptomsCheckerViewModel(errorHandlerService: getIt(), symptomsCheckerRepo: getIt())); + getIt.registerLazySingleton( + () => SymptomsCheckerViewModel( + errorHandlerService: getIt(), + symptomsCheckerRepo: getIt(), + appState: getIt(), + ), + ); getIt.registerLazySingleton( - () => HmgServicesViewModel(bookAppointmentsRepo: getIt(), hmgServicesRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()), + () => HmgServicesViewModel( + bookAppointmentsRepo: getIt(), + hmgServicesRepo: getIt(), + errorHandlerService: getIt(), + navigationService: getIt(), + ), ); getIt.registerLazySingleton( - () => BloodDonationViewModel(bloodDonationRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt(), dialogService: getIt(), appState: getIt()), + () => BloodDonationViewModel( + bloodDonationRepo: getIt(), + errorHandlerService: getIt(), + navigationService: getIt(), + dialogService: getIt(), + appState: getIt(), + ), ); getIt.registerLazySingleton( () => HealthProvider(), ); + getIt.registerLazySingleton(() => WaterMonitorViewModel()); + // Screen-specific VMs → Factory // getIt.registerFactory( // () => BookAppointmentsViewModel( diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 2039fb8..b4442cb 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -41,7 +41,7 @@ extension EmailValidator on String { FontWeight? weight, bool isBold = false, bool isUnderLine = false, - bool isCenter = false, + bool isCenter = false, int? maxlines, FontStyle? fontStyle, TextOverflow? textOverflow, @@ -214,39 +214,38 @@ extension EmailValidator on String { decoration: isUnderLine ? TextDecoration.underline : null), ); - Widget toText16({ - Color? color, - bool isUnderLine = false, - bool isBold = false, - bool isCenter = false, - int? maxlines, - double? height, - TextAlign? textAlign, - FontWeight? weight, - TextOverflow? textOverflow, - double? letterSpacing = -0.4, - Color decorationColor =AppColors.errorColor - }) => + Widget toText16( + {Color? color, + bool isUnderLine = false, + bool isBold = false, + bool isCenter = false, + int? maxlines, + double? height, + TextAlign? textAlign, + FontWeight? weight, + TextOverflow? textOverflow, + double? letterSpacing = -0.4, + Color decorationColor = AppColors.errorColor}) => Text( this, maxLines: maxlines, textAlign: isCenter ? TextAlign.center : null, style: TextStyle( - color: color ?? AppColors.blackColor, - fontSize: 16.f, - letterSpacing: letterSpacing, - height: height, - overflow: textOverflow, - fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), - decoration: isUnderLine ? TextDecoration.underline : null, - decorationColor: decorationColor - ), + color: color ?? AppColors.blackColor, + fontSize: 16.f, + letterSpacing: letterSpacing, + height: height, + overflow: textOverflow, + fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), + decoration: isUnderLine ? TextDecoration.underline : null, + decorationColor: decorationColor), ); Widget toText17({Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(color: color ?? AppColors.blackColor, fontSize: 17.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + color: color ?? AppColors.blackColor, fontSize: 17.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toText18({Color? color, FontWeight? weight, bool isBold = false, bool isCenter = false, int? maxlines, TextOverflow? textOverflow}) => Text( @@ -255,39 +254,62 @@ extension EmailValidator on String { this, overflow: textOverflow, style: TextStyle( - fontSize: 18.f, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: -0.4), + fontSize: 18.f, + fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), + color: color ?? AppColors.blackColor, + letterSpacing: -0.4), ); Widget toText19({Color? color, bool isBold = false}) => Text( this, - style: TextStyle(fontSize: 19.f, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? AppColors.blackColor, letterSpacing: -0.4), + style: TextStyle( + fontSize: 19.f, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? AppColors.blackColor, letterSpacing: -0.4), ); - Widget toText20({Color? color, FontWeight? weight, bool isBold = false, }) => Text( + Widget toText20({ + Color? color, + FontWeight? weight, + bool isBold = false, + }) => + Text( this, style: TextStyle( - fontSize: 20.f, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: -0.4), + fontSize: 20.f, + fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), + color: color ?? AppColors.blackColor, + letterSpacing: -0.4), ); Widget toText21({Color? color, bool isBold = false, FontWeight? weight, int? maxlines}) => Text( this, maxLines: maxlines, style: TextStyle( - color: color ?? AppColors.blackColor, fontSize: 21.f, letterSpacing: -1, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal)), + color: color ?? AppColors.blackColor, + fontSize: 21.f, + letterSpacing: -1, + fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal)), ); Widget toText22({Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, style: TextStyle( - height: 1, color: color ?? AppColors.blackColor, fontSize: 22.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + height: 1, + color: color ?? AppColors.blackColor, + fontSize: 22.f, + letterSpacing: -1, + fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toText24({Color? color, bool isBold = false, bool isCenter = false, FontWeight? fontWeight, double? letterSpacing}) => Text( this, textAlign: isCenter ? TextAlign.center : null, style: TextStyle( - height: 23 / 24, color: color ?? AppColors.blackColor, fontSize: 24.f, letterSpacing: letterSpacing??-1, fontWeight: isBold ? FontWeight.bold : fontWeight??FontWeight.normal), + height: 23 / 24, + color: color ?? AppColors.blackColor, + fontSize: 24.f, + letterSpacing: letterSpacing ?? -1, + fontWeight: isBold ? FontWeight.bold : fontWeight ?? FontWeight.normal), ); Widget toText26({Color? color, bool isBold = false, double? height, bool isCenter = false, FontWeight? weight, double? letterSpacing}) => Text( @@ -312,17 +334,25 @@ extension EmailValidator on String { fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); - Widget toText32({Color? color, bool isBold = false, bool isCenter = false}) => Text( + Widget toText32({FontWeight? weight, Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, style: TextStyle( - height: 32 / 32, color: color ?? AppColors.blackColor, fontSize: 32.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + height: 32 / 32, + color: color ?? AppColors.blackColor, + fontSize: 32.f, + letterSpacing: -1, + fontWeight: isBold ? FontWeight.bold : weight ?? FontWeight.normal), ); Widget toText44({Color? color, bool isBold = false}) => Text( this, style: TextStyle( - height: 32 / 32, color: color ?? AppColors.blackColor, fontSize: 44.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + height: 32 / 32, + color: color ?? AppColors.blackColor, + fontSize: 44.f, + letterSpacing: -1, + fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toSectionHeading({String upperHeading = "", String lowerHeading = ""}) { diff --git a/lib/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart b/lib/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart new file mode 100644 index 0000000..b2be4a2 --- /dev/null +++ b/lib/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart @@ -0,0 +1,59 @@ +class RiskAndSuggestionsResponseModel { + final List? dataDetails; + + RiskAndSuggestionsResponseModel({this.dataDetails}); + + factory RiskAndSuggestionsResponseModel.fromJson(Map json) { + return RiskAndSuggestionsResponseModel( + dataDetails: + json['dataDetails'] != null ? (json['dataDetails'] as List).map((item) => RiskAndSuggestionsItemModel.fromJson(item)).toList() : null, + ); + } + + Map toJson() { + return { + 'dataDetails': dataDetails?.map((item) => item.toJson()).toList(), + }; + } +} + +class RiskAndSuggestionsItemModel { + final String? id; + final String? type; + final String? name; + final String? commonName; + final String? language; + + RiskAndSuggestionsItemModel({ + this.id, + this.type, + this.name, + this.commonName, + this.language, + }); + + factory RiskAndSuggestionsItemModel.fromJson(Map json) { + return RiskAndSuggestionsItemModel( + id: json['id'], + type: json['type'], + name: json['name'], + commonName: json['common_name'], + language: json['language'], + ); + } + + Map toJson() { + return { + 'id': id, + 'type': type, + 'name': name, + 'common_name': commonName, + 'language': language, + }; + } + + // Helper method to get display name + String getDisplayName() { + return commonName ?? name ?? ''; + } +} diff --git a/lib/features/symptoms_checker/symptoms_checker_repo.dart b/lib/features/symptoms_checker/symptoms_checker_repo.dart index 5379207..954d414 100644 --- a/lib/features/symptoms_checker/symptoms_checker_repo.dart +++ b/lib/features/symptoms_checker/symptoms_checker_repo.dart @@ -7,77 +7,214 @@ import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/models/resp_models/body_symptom_response_model.dart'; +import 'package:hmg_patient_app_new/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; -import 'package:http/http.dart' as http; abstract class SymptomsCheckerRepo { Future>> getBodySymptomsByName({ required List organNames, }); + + Future>> getRiskFactors({ + required int age, + required String sex, + required List evidenceIds, + required String language, + }); + + Future>> getSuggestions({ + required int age, + required String sex, + required List evidenceIds, + required String language, + }); } class SymptomsCheckerRepoImp implements SymptomsCheckerRepo { final ApiClient apiClient; final LoggerService loggerService; - SymptomsCheckerRepoImp({ - required this.apiClient, - required this.loggerService, - }); + SymptomsCheckerRepoImp({required this.apiClient, required this.loggerService}); @override - Future>> getBodySymptomsByName({ - required List organNames, + Future>> getBodySymptomsByName({required List organNames}) async { + log("GetBodySymptomsByName Request URL: ${ApiConsts.getBodySymptomsByName}"); + log("GetBodySymptomsByName Request Body: ${jsonEncode(organNames)}"); + + Map headers = {'Content-Type': 'application/json', 'Accept': 'text/plain'}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + ApiConsts.getBodySymptomsByName, + apiHeaders: headers, + body: jsonEncode(organNames), + isExternal: true, + isAllowAny: true, + isBodyPlainText: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + loggerService.logError("GetBodySymptomsByName API Failed: $error"); + log("GetBodySymptomsByName Failed: $error, Status: $statusCode"); + failure = failureType ?? ServerFailure(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + log("GetBodySymptomsByName Response Status: $statusCode"); + loggerService.logInfo("GetBodySymptomsByName API Success: $response"); + log("GetBodySymptomsByName Response: $response"); + + BodySymptomResponseModel bodySymptomResponse = BodySymptomResponseModel.fromJson(response); + + apiResponse = GenericApiModel( + messageStatus: messageStatus ?? 1, + statusCode: statusCode, + errorMessage: errorMessage, + data: bodySymptomResponse, + ); + } catch (e, stackTrace) { + loggerService.logError("Error parsing GetBodySymptomsByName response: $e"); + loggerService.logError("StackTrace: $stackTrace"); + log("Parse Error: $e"); + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e, stackTrace) { + loggerService.logError("Exception in getBodySymptomsByName: $e"); + loggerService.logError("StackTrace: $stackTrace"); + log("Exception: $e"); + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getRiskFactors({ + required int age, + required String sex, + required List evidenceIds, + required String language, }) async { + final Map body = { + "age": { + "value": age, + }, + "sex": sex, + "evidence": evidenceIds.map((id) => {"id": id}).toList(), + "language": language, + }; + try { - // API expects a direct JSON array: ["mid_abdomen", "chest"] - // Not an object like: {"organNames": [...]} - // Since ApiClient.post expects Map and encodes it as object, - // we make direct HTTP call here to send array body - - final String requestBody = jsonEncode(organNames); - - loggerService.logInfo("GetBodySymptomsByName Request: $requestBody"); - log("GetBodySymptomsByName Request URL: ${ApiConsts.getBodySymptomsByName}"); - log("GetBodySymptomsByName Request Body: $requestBody"); - - // Make direct HTTP POST request with JSON array body - final response = await http.post( - Uri.parse(ApiConsts.getBodySymptomsByName), - headers: {'Content-Type': 'application/json', 'Accept': 'text/plain'}, - body: requestBody, + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + ApiConsts.getRiskFactors, + body: body, + isExternal: true, + isAllowAny: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + log("GetRiskFactors Failed: $error, Status: $statusCode"); + failure = failureType ?? ServerFailure(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + log("GetRiskFactors Response: $response"); + + // Parse response if it's a string + final Map responseData = response is String ? jsonDecode(response) : response; + + RiskAndSuggestionsResponseModel riskFactorsResponse = RiskAndSuggestionsResponseModel.fromJson(responseData); + + apiResponse = GenericApiModel( + messageStatus: messageStatus ?? 1, + statusCode: statusCode, + errorMessage: errorMessage, + data: riskFactorsResponse, + ); + } catch (e, stackTrace) { + loggerService.logError("Error parsing GetRiskFactors response: $e"); + loggerService.logError("StackTrace: $stackTrace"); + log("Parse Error: $e"); + failure = DataParsingFailure(e.toString()); + } + }, ); - final int statusCode = response.statusCode; + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e, stackTrace) { + loggerService.logError("Exception in getRiskFactors: $e"); + loggerService.logError("StackTrace: $stackTrace"); + log("Exception: $e"); + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getSuggestions({ + required int age, + required String sex, + required List evidenceIds, + required String language, + }) async { + final Map body = { + "age": { + "value": age, + }, + "sex": sex, + "evidence": evidenceIds.map((id) => {"id": id}).toList(), + "language": language, + }; - log("GetBodySymptomsByName Response Status: $statusCode"); - loggerService.logInfo("GetBodySymptomsByName Response Status: $statusCode"); + try { + GenericApiModel? apiResponse; + Failure? failure; - try { - // Parse the response - final responseBody = jsonDecode(response.body); + await apiClient.post( + ApiConsts.getSuggestions, + body: body, + isExternal: true, + isAllowAny: true, + onFailure: (error, statusCode, {messageStatus, failureType}) { + log("getSuggestions Failed: $error, Status: $statusCode"); + failure = failureType ?? ServerFailure(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + log("getSuggestions Response: $response"); - loggerService.logInfo("GetBodySymptomsByName API Success: $responseBody"); - log("GetBodySymptomsByName Response: $responseBody"); + // Parse response if it's a string + final Map responseData = response is String ? jsonDecode(response) : response; - BodySymptomResponseModel bodySymptomResponse = BodySymptomResponseModel.fromJson(responseBody); + RiskAndSuggestionsResponseModel riskFactorsResponse = RiskAndSuggestionsResponseModel.fromJson(responseData); - GenericApiModel apiResponse = GenericApiModel( - messageStatus: 1, - statusCode: statusCode, - errorMessage: null, - data: bodySymptomResponse, - ); + apiResponse = GenericApiModel( + messageStatus: messageStatus ?? 1, + statusCode: statusCode, + errorMessage: errorMessage, + data: riskFactorsResponse, + ); + } catch (e, stackTrace) { + loggerService.logError("Error parsing getSuggestions response: $e"); + loggerService.logError("StackTrace: $stackTrace"); + log("Parse Error: $e"); + failure = DataParsingFailure(e.toString()); + } + }, + ); - return Right(apiResponse); - } catch (e, stackTrace) { - loggerService.logError("Error parsing GetBodySymptomsByName response: $e"); - loggerService.logError("StackTrace: $stackTrace"); - log("Parse Error: $e"); - return Left(DataParsingFailure(e.toString())); - } + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); } catch (e, stackTrace) { - loggerService.logError("Exception in getBodySymptomsByName: $e"); + loggerService.logError("Exception in getSuggestions: $e"); loggerService.logError("StackTrace: $stackTrace"); log("Exception: $e"); return Left(UnknownFailure(e.toString())); diff --git a/lib/features/symptoms_checker/symptoms_checker_view_model.dart b/lib/features/symptoms_checker/symptoms_checker_view_model.dart index fe66cf7..da439c6 100644 --- a/lib/features/symptoms_checker/symptoms_checker_view_model.dart +++ b/lib/features/symptoms_checker/symptoms_checker_view_model.dart @@ -1,20 +1,24 @@ import 'dart:async'; import 'package:flutter/cupertino.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/data/organ_mapping_data.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/models/organ_model.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/models/resp_models/body_symptom_response_model.dart'; +import 'package:hmg_patient_app_new/features/symptoms_checker/models/resp_models/risk_and_suggestions_response_model.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_repo.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; class SymptomsCheckerViewModel extends ChangeNotifier { final SymptomsCheckerRepo symptomsCheckerRepo; final ErrorHandlerService errorHandlerService; + final AppState appState; SymptomsCheckerViewModel({ required this.symptomsCheckerRepo, required this.errorHandlerService, + required this.appState, }); // State variables @@ -29,9 +33,19 @@ class SymptomsCheckerViewModel extends ChangeNotifier { // API loading states bool isBodySymptomsLoading = false; + bool isRiskFactorsLoading = false; + bool isSuggestionsLoading = false; // API data storage - using API models directly BodySymptomResponseModel? bodySymptomResponse; + RiskAndSuggestionsResponseModel? riskFactorsResponse; + RiskAndSuggestionsResponseModel? suggestionsResponse; + + // Selected risk factors tracking + final Set _selectedRiskFactorIds = {}; + + // Selected Suggestions tracking + final Set _selectedSuggestionsIds = {}; // Selected symptoms tracking (organId -> Set of symptom IDs) final Map> _selectedSymptomsByOrgan = {}; @@ -111,6 +125,28 @@ class SymptomsCheckerViewModel extends ChangeNotifier { return _selectedSymptomsByOrgan.values.any((symptomIds) => symptomIds.isNotEmpty); } + /// Get risk factors list + List get riskFactorsList { + return riskFactorsResponse?.dataDetails ?? []; + } + + /// Check if any risk factors are selected + bool get hasSelectedRiskFactors => _selectedRiskFactorIds.isNotEmpty; + + /// Get selected risk factors count + int get selectedRiskFactorsCount => _selectedRiskFactorIds.length; + + /// Check if any risk factors are selected + bool get hasSelectedSuggestions => _selectedSuggestionsIds.isNotEmpty; + + /// Get selected risk factors count + int get selectedSuggestionsCount => _selectedSuggestionsIds.length; + + /// Get risk factors list + List get suggestionsList { + return suggestionsResponse?.dataDetails ?? []; + } + void toggleView() { _currentView = _currentView == BodyView.front ? BodyView.back : BodyView.front; notifyListeners(); @@ -122,6 +158,10 @@ class SymptomsCheckerViewModel extends ChangeNotifier { } void toggleOrganSelection(String organId) { + if (selectedOrganIds.isEmpty && _isBottomSheetExpanded == false) { + toggleBottomSheet(); + } + if (_selectedOrganIds.contains(organId)) { _selectedOrganIds.remove(organId); } else { @@ -131,6 +171,11 @@ class SymptomsCheckerViewModel extends ChangeNotifier { // Show tooltip _showTooltip(organId); + if (_selectedOrganIds.isEmpty) { + _isBottomSheetExpanded = false; + notifyListeners(); + } + notifyListeners(); } @@ -157,6 +202,10 @@ class SymptomsCheckerViewModel extends ChangeNotifier { void removeOrgan(String organId) { _selectedOrganIds.remove(organId); notifyListeners(); + if (_selectedOrganIds.isEmpty) { + _isBottomSheetExpanded = false; + notifyListeners(); + } } void clearAllSelections() { @@ -164,7 +213,12 @@ class SymptomsCheckerViewModel extends ChangeNotifier { notifyListeners(); } - void toggleBottomSheet() { + void toggleBottomSheet({bool? value}) { + if (value != null) { + _isBottomSheetExpanded = value; + notifyListeners(); + return; + } _isBottomSheetExpanded = !_isBottomSheetExpanded; notifyListeners(); } @@ -268,11 +322,305 @@ class SymptomsCheckerViewModel extends ChangeNotifier { notifyListeners(); } + // Risk Factors Methods + + /// Toggle risk factor selection + void toggleRiskFactorSelection(String riskFactorId) { + if (riskFactorId == "not_applicable") { + // "Not applicable" is mutually exclusive: if selected, clear all others + if (_selectedRiskFactorIds.contains(riskFactorId)) { + _selectedRiskFactorIds.remove(riskFactorId); + } else { + _selectedRiskFactorIds + ..clear() + ..add(riskFactorId); + } + } else { + _selectedRiskFactorIds.remove("not_applicable"); + if (!_selectedRiskFactorIds.add(riskFactorId)) { + _selectedRiskFactorIds.remove(riskFactorId); + } + } + + notifyListeners(); + } + + /// Check if risk factor is selected + bool isRiskFactorSelected(String riskFactorId) { + return _selectedRiskFactorIds.contains(riskFactorId); + } + + /// Get all selected risk factors + List getAllSelectedRiskFactors() { + return riskFactorsList.where((factor) => factor.id != null && _selectedRiskFactorIds.contains(factor.id)).toList(); + } + + /// Clear all risk factor selections + void clearAllRiskFactorSelections() { + _selectedRiskFactorIds.clear(); + notifyListeners(); + } + + /// Fetch risk factors based on selected symptoms + Future fetchRiskFactors({ + Function()? onSuccess, + Function(String)? onError, + }) async { + // Get all selected symptoms + final selectedSymptoms = getAllSelectedSymptoms(); + + if (selectedSymptoms.isEmpty) { + if (onError != null) { + onError('No symptoms selected'); + } + return; + } + + // Validate user info + if (_selectedAge == null || _selectedGender == null) { + if (onError != null) { + onError('User information is incomplete'); + } + return; + } + + // Extract symptom IDs + List evidenceIds = selectedSymptoms.where((s) => s.id != null).map((s) => s.id!).toList(); + + await getRiskFactors( + age: _selectedAge!, + sex: _selectedGender!.toLowerCase(), + evidenceIds: evidenceIds, + language: appState.isArabic() ? 'ar' : 'en', + onSuccess: (response) { + if (onSuccess != null) { + onSuccess(); + } + }, + onError: (error) { + if (onError != null) { + onError(error); + } + }, + ); + } + + /// Call Risk Factors API + Future getRiskFactors({ + required int age, + required String sex, + required List evidenceIds, + required String language, + Function(RiskAndSuggestionsResponseModel)? onSuccess, + Function(String)? onError, + }) async { + isRiskFactorsLoading = true; + notifyListeners(); + + final result = await symptomsCheckerRepo.getRiskFactors( + age: age, + sex: sex, + evidenceIds: evidenceIds, + language: language, + ); + + result.fold( + (failure) async { + isRiskFactorsLoading = false; + notifyListeners(); + await errorHandlerService.handleError(failure: failure); + if (onError != null) { + onError(failure.toString()); + } + }, + (apiResponse) { + isRiskFactorsLoading = false; + if (apiResponse.messageStatus == 1 && apiResponse.data != null) { + riskFactorsResponse = apiResponse.data; + + if (riskFactorsResponse != null && riskFactorsResponse!.dataDetails != null) { + RiskAndSuggestionsItemModel riskFactorItem = RiskAndSuggestionsItemModel( + id: "not_applicable", + commonName: "Not Applicable", + name: "Not Applicable", + language: appState.isArabic() ? 'ar' : 'en', + type: null, + ); + riskFactorsResponse!.dataDetails!.add(riskFactorItem); + } + + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse.data!); + } + } else { + notifyListeners(); + if (onError != null) { + onError(apiResponse.errorMessage ?? 'Failed to fetch risk factors'); + } + } + }, + ); + } + + // Suggestions Methods + + /// Toggle suggestions selection + void toggleSuggestionsSelection(String suggestionsId) { + if (suggestionsId == "not_applicable") { + // "Not applicable" is mutually exclusive: if selected, clear all others + if (_selectedSuggestionsIds.contains(suggestionsId)) { + _selectedSuggestionsIds.remove(suggestionsId); + } else { + _selectedSuggestionsIds + ..clear() + ..add(suggestionsId); + } + } else { + _selectedSuggestionsIds.remove("not_applicable"); + if (!_selectedSuggestionsIds.add(suggestionsId)) { + _selectedSuggestionsIds.remove(suggestionsId); + } + } + + notifyListeners(); + } + + /// Check if risk factor is selected + bool isSuggestionsSelected(String riskFactorId) { + return _selectedSuggestionsIds.contains(riskFactorId); + } + + /// Get all selected risk factors + List getAllSelectedSuggestions() { + return suggestionsList.where((factor) => factor.id != null && _selectedSuggestionsIds.contains(factor.id)).toList(); + } + + /// Clear all risk factor selections + void clearAllSuggestionsSelections() { + _selectedSuggestionsIds.clear(); + notifyListeners(); + } + + /// Fetch risk factors based on selected symptoms + Future fetchSuggestions({ + Function()? onSuccess, + Function(String)? onError, + }) async { + // Get all selected symptoms + final selectedSymptoms = getAllSelectedSymptoms(); + + if (selectedSymptoms.isEmpty) { + if (onError != null) { + onError('No symptoms selected'); + } + return; + } + + // Validate user info + if (_selectedAge == null || _selectedGender == null) { + if (onError != null) { + onError('User information is incomplete'); + } + return; + } + + // Extract symptom IDs + List evidenceIds = selectedSymptoms.where((s) => s.id != null).map((s) => s.id!).toList(); + + // Get all selected symptoms + final selectedRisks = getAllSelectedRiskFactors(); + + if (selectedRisks.isNotEmpty) { + List evidenceRisksIds = selectedRisks.where((s) => s.id != null && s.id != "not_applicable").map((s) => s.id!).toList(); + evidenceIds.addAll(evidenceRisksIds); + } + + await getSuggestions( + age: _selectedAge!, + sex: _selectedGender!.toLowerCase(), + evidenceIds: evidenceIds, + language: appState.isArabic() ? 'ar' : 'en', + onSuccess: (response) { + if (onSuccess != null) { + onSuccess(); + } + }, + onError: (error) { + if (onError != null) { + onError(error); + } + }, + ); + } + + /// Call Suggestions API + Future getSuggestions({ + required int age, + required String sex, + required List evidenceIds, + required String language, + Function(RiskAndSuggestionsResponseModel)? onSuccess, + Function(String)? onError, + }) async { + isSuggestionsLoading = true; + notifyListeners(); + + final result = await symptomsCheckerRepo.getSuggestions( + age: age, + sex: sex, + evidenceIds: evidenceIds, + language: language, + ); + + result.fold( + (failure) async { + isSuggestionsLoading = false; + notifyListeners(); + await errorHandlerService.handleError(failure: failure); + if (onError != null) { + onError(failure.toString()); + } + }, + (apiResponse) { + isSuggestionsLoading = false; + if (apiResponse.messageStatus == 1 && apiResponse.data != null) { + suggestionsResponse = apiResponse.data; + + if (suggestionsResponse != null && suggestionsResponse!.dataDetails != null) { + RiskAndSuggestionsItemModel riskFactorItem = RiskAndSuggestionsItemModel( + id: "not_applicable", + commonName: "Not Applicable", + name: "Not Applicable", + language: appState.isArabic() ? 'ar' : 'en', + type: null, + ); + suggestionsResponse!.dataDetails!.add(riskFactorItem); + } + + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse.data!); + } + } else { + notifyListeners(); + if (onError != null) { + onError(apiResponse.errorMessage ?? 'Failed to fetch risk factors'); + } + } + }, + ); + } + void reset() { _currentView = BodyView.front; _selectedOrganIds.clear(); _selectedSymptomsByOrgan.clear(); + _selectedRiskFactorIds.clear(); + _selectedSuggestionsIds.clear(); bodySymptomResponse = null; + riskFactorsResponse = null; + suggestionsResponse = null; _isBottomSheetExpanded = false; _tooltipTimer?.cancel(); _tooltipOrganId = null; diff --git a/lib/features/water_monitor/models/water_cup_model.dart b/lib/features/water_monitor/models/water_cup_model.dart new file mode 100644 index 0000000..b86fae4 --- /dev/null +++ b/lib/features/water_monitor/models/water_cup_model.dart @@ -0,0 +1,47 @@ +class WaterCupModel { + final String id; + final String name; + final int capacityMl; + final String iconPath; // or use IconData if you prefer + final bool isDefault; + + WaterCupModel({ + required this.id, + required this.name, + required this.capacityMl, + required this.iconPath, + this.isDefault = false, + }); + + WaterCupModel copyWith({ + String? id, + String? name, + int? capacityMl, + String? iconPath, + bool? isDefault, + }) { + return WaterCupModel( + id: id ?? this.id, + name: name ?? this.name, + capacityMl: capacityMl ?? this.capacityMl, + iconPath: iconPath ?? this.iconPath, + isDefault: isDefault ?? this.isDefault, + ); + } + + Map toJson() => { + 'id': id, + 'name': name, + 'capacityMl': capacityMl, + 'iconPath': iconPath, + 'isDefault': isDefault, + }; + + factory WaterCupModel.fromJson(Map json) => WaterCupModel( + id: json['id'], + name: json['name'], + capacityMl: json['capacityMl'], + iconPath: json['iconPath'], + isDefault: json['isDefault'] ?? false, + ); +} diff --git a/lib/features/water_monitor/water_monitor_view_model.dart b/lib/features/water_monitor/water_monitor_view_model.dart new file mode 100644 index 0000000..4e8d5f5 --- /dev/null +++ b/lib/features/water_monitor/water_monitor_view_model.dart @@ -0,0 +1,408 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/models/water_cup_model.dart'; + +class WaterMonitorViewModel extends ChangeNotifier { + // Controllers + final TextEditingController nameController = TextEditingController(); + final TextEditingController heightController = TextEditingController(); + final TextEditingController weightController = TextEditingController(); + final TextEditingController ageController = TextEditingController(); + + // Units + final List heightUnits = ['cm', 'm', 'ft', 'in']; + final List weightUnits = ['kg', 'lb']; + + // Selected values + String _selectedHeightUnit = 'cm'; + String _selectedWeightUnit = 'kg'; + String _selectedActivityLevel = 'Lightly active'; + String _selectedNumberOfReminders = '3 Time'; + String _selectedGender = "Male"; + + // Validation error message + String? _validationError; + + // Getters + String? get validationError => _validationError; + + String get selectedHeightUnit => _selectedHeightUnit; + + String get selectedWeightUnit => _selectedWeightUnit; + + String get selectedActivityLevel => _selectedActivityLevel; + + String get selectedNumberOfReminders => _selectedNumberOfReminders; + + String get selectedGender => _selectedGender; + + // Activity level options + List get activityLevels => + ["Almost Inactive (no exercise)", "Lightly active", "Lightly active (1-3) days per week", "Super active (very hard exercise)"]; + + // Reminder options + List get reminderOptions => ["1 Time", "2 Time", "3 Time", "4 Time", "5 Time", "6 Time"]; + + // Gender options + List get genderOptions => ["Male", "Female"]; + + // Initialize method to be called when needed + void initialize() { + _loadSettings(); + _initializeDefaultCups(); + } + + // Reset all fields to default + void resetFields() { + nameController.clear(); + heightController.clear(); + weightController.clear(); + ageController.clear(); + _selectedHeightUnit = 'cm'; + _selectedWeightUnit = 'kg'; + _selectedActivityLevel = 'Lightly active'; + _selectedNumberOfReminders = '3 Time'; + _selectedGender = "Male"; + notifyListeners(); + } + + // Setters with notification + void setGender(String gender) { + _selectedGender = gender; + notifyListeners(); + } + + void setHeightUnit(String unit) { + _selectedHeightUnit = unit; + notifyListeners(); + } + + void setWeightUnit(String unit) { + _selectedWeightUnit = unit; + notifyListeners(); + } + + void setActivityLevel(String level) { + _selectedActivityLevel = level; + notifyListeners(); + } + + void setNumberOfReminders(String number) { + _selectedNumberOfReminders = number; + notifyListeners(); + } + + // Validation methods + bool get isValid { + _validationError = null; // Clear previous error + + if (nameController.text.trim().isEmpty) { + _validationError = 'Name is required'; + return false; + } + + if (ageController.text.trim().isEmpty) { + _validationError = 'Age is required'; + return false; + } + + if (!_isAgeValid()) { + _validationError = validateAge(); + return false; + } + + if (heightController.text.trim().isEmpty) { + _validationError = 'Height is required'; + return false; + } + + if (!_isHeightValid()) { + _validationError = validateHeight(); + return false; + } + + if (weightController.text.trim().isEmpty) { + _validationError = 'Weight is required'; + return false; + } + + if (!_isWeightValid()) { + _validationError = validateWeight(); + return false; + } + + return true; + } + + bool _isAgeValid() { + final age = int.tryParse(ageController.text.trim()); + return age != null && age >= 11 && age <= 120; + } + + bool _isHeightValid() { + final height = double.tryParse(heightController.text.trim()); + return height != null && height > 0; + } + + bool _isWeightValid() { + final weight = double.tryParse(weightController.text.trim()); + return weight != null && weight > 0; + } + + String? validateAge() { + if (ageController.text.trim().isEmpty) { + return 'Age is required'.needTranslation; + } + final age = int.tryParse(ageController.text.trim()); + if (age == null) { + return 'Invalid age'.needTranslation; + } + if (age < 11 || age > 120) { + return 'Age must be between 11 and 120'.needTranslation; + } + return null; + } + + String? validateHeight() { + if (heightController.text.trim().isEmpty) { + return 'Height is required'.needTranslation; + } + final height = double.tryParse(heightController.text.trim()); + if (height == null || height <= 0) { + return 'Invalid height'.needTranslation; + } + return null; + } + + String? validateWeight() { + if (weightController.text.trim().isEmpty) { + return 'Weight is required'.needTranslation; + } + final weight = double.tryParse(weightController.text.trim()); + if (weight == null || weight <= 0) { + return 'Invalid weight'.needTranslation; + } + return null; + } + + // Calculate water intake based on user data + double calculateDailyWaterIntake() { + if (!isValid) return 0; + + final weight = double.parse(weightController.text.trim()); + final weightInKg = _convertWeightToKg(weight, _selectedWeightUnit); + + // Base calculation: 30-35ml per kg of body weight + double baseIntake = weightInKg * 33; + + // Adjust for activity level + double activityMultiplier = _getActivityMultiplier(); + double totalIntake = baseIntake * activityMultiplier; + + return totalIntake; // in ml + } + + double _convertWeightToKg(double weight, String unit) { + switch (unit) { + case 'kg': + return weight; + case 'lb': + return weight * 0.453592; + default: + return weight; + } + } + + double _getActivityMultiplier() { + switch (_selectedActivityLevel) { + case "Almost Inactive (no exercise)": + return 1.0; + case "Lightly active": + return 1.1; + case "Lightly active (1-3) days per week": + return 1.2; + case "Super active (very hard exercise)": + return 1.4; + default: + return 1.1; + } + } + + // Save settings + Future saveSettings() async { + if (!isValid) { + notifyListeners(); // Notify so error can be read + return false; + } + _validationError = null; // Clear error on success + notifyListeners(); + return true; + } + + // Load settings + Future _loadSettings() async { + notifyListeners(); + } + + @override + void dispose() { + nameController.dispose(); + heightController.dispose(); + weightController.dispose(); + ageController.dispose(); + super.dispose(); + } + + List _cups = []; + String? _selectedCupId; + int _totalConsumedMl = 1000; + int _dailyGoalMl = 2000; + // Calibration: portion of the bottle SVG height that is fillable (0.0 - 1.0) + double _fillableHeightPercent = 0.823; + + List get cups => _cups; + + WaterCupModel? get selectedCup { + if (_cups.isEmpty) return null; + return _cups.firstWhere((c) => c.id == _selectedCupId, orElse: () => _cups.first); + } + + int get totalConsumedMl => _totalConsumedMl; + + int get dailyGoalMl => _dailyGoalMl; + + // Portion of bottle drawable height that is fillable. + double get fillableHeightPercent => _fillableHeightPercent; + + void setFillableHeightPercent(double v) { + _fillableHeightPercent = v.clamp(0.0, 1.0); + notifyListeners(); + } + + // Normalized progress in 0.0 - 1.0 (ensure double) + double get progress { + if (_dailyGoalMl == 0) return 0.0; + final p = _totalConsumedMl / _dailyGoalMl; + return p.clamp(0.0, 1.0).toDouble(); + } + + // Convenience percent (0 - 100) + double get progressPercent => (progress * 100.0).clamp(0.0, 100.0).toDouble(); + + // Allow updating consumed and goal through the vm so UI doesn't manipulate internal fields directly + void setTotalConsumedMl(int ml) { + _totalConsumedMl = ml; + notifyListeners(); + } + + void addConsumedMl(int ml) { + _totalConsumedMl = (_totalConsumedMl + ml).clamp(0, 1000000); + notifyListeners(); + } + + void subtractConsumedMl(int ml) { + _totalConsumedMl = (_totalConsumedMl - ml).clamp(0, 1000000); + notifyListeners(); + } + + void setDailyGoal(int ml) { + _dailyGoalMl = ml; + notifyListeners(); + } + + void _initializeDefaultCups() { + _cups = [ + WaterCupModel( + id: 'default_125', + name: '125ml', + capacityMl: 125, + iconPath: AppAssets.cupEmpty, + isDefault: true, + ), + WaterCupModel( + id: 'default_150', + name: '150ml', + capacityMl: 150, + iconPath: AppAssets.cupEmpty, + isDefault: true, + ), + WaterCupModel( + id: 'default_175', + name: '175ml', + capacityMl: 175, + iconPath: AppAssets.cupEmpty, + isDefault: true, + ), + WaterCupModel( + id: 'default_200', + name: '200ml', + capacityMl: 200, + iconPath: AppAssets.cupEmpty, + isDefault: true, + ), + WaterCupModel( + id: 'default_250', + name: '250ml', + capacityMl: 250, + iconPath: AppAssets.cupEmpty, + isDefault: true, + ), + WaterCupModel( + id: 'default_300', + name: '300ml', + capacityMl: 300, + iconPath: AppAssets.cupEmpty, + isDefault: true, + ), + ]; + _selectedCupId = _cups.first.id; + notifyListeners(); + } + + void selectCup(String cupId) { + _selectedCupId = cupId; + notifyListeners(); + } + + void addCup(WaterCupModel cup) { + _cups.add(cup); + notifyListeners(); + } + + void updateCup(WaterCupModel updatedCup) { + final index = _cups.indexWhere((c) => c.id == updatedCup.id); + if (index != -1) { + _cups[index] = updatedCup; + notifyListeners(); + } + } + + // Public alias for deleting/removing a cup. Keeps API intention clear in UI code. + void removeCup(String cupId) { + deleteCup(cupId); + } + + void deleteCup(String cupId) { + final cup = _cups.firstWhere((c) => c.id == cupId); + if (cup.isDefault) return; // can't delete default cups + + _cups.removeWhere((c) => c.id == cupId); + if (_selectedCupId == cupId) { + _selectedCupId = _cups.first.id; + } + notifyListeners(); + } + + void addWaterIntake() { + if (selectedCup != null) { + _totalConsumedMl += selectedCup!.capacityMl; + notifyListeners(); + } + } + + void resetDaily() { + _totalConsumedMl = 0; + notifyListeners(); + } +} diff --git a/lib/main.dart b/lib/main.dart index ed69150..e974d6c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -30,8 +30,9 @@ import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_mo import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart'; import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; import 'package:hmg_patient_app_new/features/smartwatch_health_data/health_provider.dart'; -import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart'; +import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/routes/app_routes.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; @@ -165,6 +166,9 @@ void main() async { ), ChangeNotifierProvider( create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), ) ], child: MyApp()), ), diff --git a/lib/presentation/appointments/appointment_queue_page.dart b/lib/presentation/appointments/appointment_queue_page.dart index 4554873..124bf25 100644 --- a/lib/presentation/appointments/appointment_queue_page.dart +++ b/lib/presentation/appointments/appointment_queue_page.dart @@ -42,8 +42,11 @@ class AppointmentQueuePage extends StatelessWidget { color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: false, - side: - BorderSide(color: myAppointmentsVM.isAppointmentQueueDetailsLoading ? AppColors.whiteColor : Utils.getCardBorderColor(myAppointmentsVM.currentQueueStatus), width: 2.w), + side: BorderSide( + color: myAppointmentsVM.isAppointmentQueueDetailsLoading + ? AppColors.whiteColor + : Utils.getCardBorderColor(myAppointmentsVM.currentQueueStatus), + width: 2.w), ), child: Padding( padding: EdgeInsets.all(16.h), @@ -62,17 +65,23 @@ class AppointmentQueuePage extends StatelessWidget { ], ).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), SizedBox(height: 10.h), - "Hala ${appState!.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), + "Hala ${appState!.getAuthenticatedUser()!.firstName}!!!" + .needTranslation + .toText16(isBold: true) + .toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), SizedBox(height: 8.h), "Thank you for your patience, here is your queue number." .needTranslation .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight) .toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), SizedBox(height: 8.h), - myAppointmentsVM.currentPatientQueueDetails.queueNo!.toText32(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), + myAppointmentsVM.currentPatientQueueDetails.queueNo! + .toText32(isBold: true) + .toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), SizedBox(height: 8.h), CustomButton( - text: Utils.getCardButtonText(myAppointmentsVM.currentQueueStatus, myAppointmentsVM.currentPatientQueueDetails.roomNo ?? ""), + text: Utils.getCardButtonText( + myAppointmentsVM.currentQueueStatus, myAppointmentsVM.currentPatientQueueDetails.roomNo ?? ""), onPressed: () {}, backgroundColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus), borderColor: Utils.getCardButtonColor(myAppointmentsVM.currentQueueStatus).withValues(alpha: 0.01), @@ -94,61 +103,72 @@ class AppointmentQueuePage extends StatelessWidget { ? Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, - borderRadius: 20.h, - hasShadow: true, - ), - child: Padding( - padding: EdgeInsets.all(16.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "Serving Now".needTranslation.toText16(isBold: true).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Serving Now" + .needTranslation + .toText16(isBold: true) + .toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), SizedBox(height: 18.h), ListView.separated( - padding: EdgeInsets.zero, - shrinkWrap: true, + padding: EdgeInsets.zero, + shrinkWrap: true, itemCount: myAppointmentsVM.patientQueueDetailsList.length, physics: NeverScrollableScrollPhysics(), itemBuilder: (BuildContext context, int index) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - myAppointmentsVM.patientQueueDetailsList[index].queueNo!.toText17(isBold: true), - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - "Room: ${myAppointmentsVM.patientQueueDetailsList[index].roomNo}".toText12(fontWeight: FontWeight.w500), + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + myAppointmentsVM.patientQueueDetailsList[index].queueNo!.toText17(isBold: true), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + "Room: ${myAppointmentsVM.patientQueueDetailsList[index].roomNo}" + .toText12(fontWeight: FontWeight.w500), SizedBox(width: 8.w), AppCustomChipWidget( - deleteIcon: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 ? AppAssets.call_for_vitals : AppAssets.call_for_doctor, - labelText: - myAppointmentsVM.patientQueueDetailsList[index].callType == 1 ? "Call for vital signs".needTranslation : "Call for Doctor".needTranslation, - iconColor: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 ? AppColors.primaryRedColor : AppColors.successColor, - textColor: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 ? AppColors.primaryRedColor : AppColors.successColor, + deleteIcon: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 + ? AppAssets.call_for_vitals + : AppAssets.call_for_doctor, + labelText: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 + ? "Call for vital signs".needTranslation + : "Call for Doctor".needTranslation, + iconColor: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 + ? AppColors.primaryRedColor + : AppColors.successColor, + textColor: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 + ? AppColors.primaryRedColor + : AppColors.successColor, iconSize: 14.w, backgroundColor: myAppointmentsVM.patientQueueDetailsList[index].callType == 1 ? AppColors.primaryRedColor.withValues(alpha: 0.1) : AppColors.successColor.withValues(alpha: 0.1), labelPadding: EdgeInsetsDirectional.only(start: 8.h, end: -2.h), ), - ], - ), - ], - ); - }, - separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 8.h), + ], + ), + ], + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 8.h), ).toShimmer2(isShow: myAppointmentsVM.isAppointmentQueueDetailsLoading), ], ), - ), + ), ) : SizedBox.shrink(), SizedBox(height: 16.h), Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, - borderRadius: 20.h, + borderRadius: 24.4, hasShadow: true, ), child: Padding( @@ -171,15 +191,25 @@ class AppointmentQueuePage extends StatelessWidget { // Are there any side effects I should know about? // When should I come back for a follow-up? - "• ${"What can I do to improve my overall health?"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + "• ${"What can I do to improve my overall health?"}" + .needTranslation + .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), SizedBox(height: 4.h), - "• ${"Are there any routine screenings I should get?"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + "• ${"Are there any routine screenings I should get?"}" + .needTranslation + .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), SizedBox(height: 4.h), - "• ${"What is this medication for?"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + "• ${"What is this medication for?"}" + .needTranslation + .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), SizedBox(height: 4.h), - "• ${"Are there any side effects I should know about?"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + "• ${"Are there any side effects I should know about?"}" + .needTranslation + .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), SizedBox(height: 4.h), - "• ${"When should I come back for a follow-up?"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + "• ${"When should I come back for a follow-up?"}" + .needTranslation + .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), SizedBox(height: 16.h), ], diff --git a/lib/presentation/e_referral/new_e_referral.dart b/lib/presentation/e_referral/new_e_referral.dart index b28b8df..3083de1 100644 --- a/lib/presentation/e_referral/new_e_referral.dart +++ b/lib/presentation/e_referral/new_e_referral.dart @@ -24,6 +24,7 @@ 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:hmg_patient_app_new/widgets/stepper/stepper_widget.dart'; import 'package:provider/provider.dart'; + import 'e-referral_validator.dart'; import 'e_referral_form_manager.dart'; @@ -43,7 +44,6 @@ class _NewReferralPageState extends State { double widthOfOneState = ((ResponsiveExtension.screenWidth) / 3) - (20.h); - @override void initState() { super.initState(); @@ -116,7 +116,7 @@ class _NewReferralPageState extends State { cityCode: _formManager.formData.patientCity!.iD!.toString(), cityName: _formManager.formData.patientCity!.description, requesterName: _formManager.formData.requesterName, - requesterContactNo: _formManager.formData.countryEnum.countryCode + _formManager.formData.requesterPhone, + requesterContactNo: _formManager.formData.countryEnum.countryCode + _formManager.formData.requesterPhone, requesterRelationship: _formManager.formData.relationship?.iD, otherRelationship: _formManager.formData.relationship!.iD.toString(), fullName: _formManager.formData.patientName, @@ -133,10 +133,8 @@ class _NewReferralPageState extends State { hmgServicesVM.createEReferral( requestModel: createReferralRequestModel, onSuccess: (GenericApiModel response) { - showSuccessBottomSheet(int.parse(response.data), hmgServicesVM); LoaderBottomSheet.hideLoader(); - }, onError: (errorMessage) { // Handle error (e.g., show error message) @@ -146,9 +144,6 @@ class _NewReferralPageState extends State { } void _loadData() { - - - final authVM = context.read(); final habibWalletVM = context.read(); final hmgServicesVM = context.read(); @@ -179,7 +174,7 @@ class _NewReferralPageState extends State { color: Colors.white, padding: EdgeInsets.all(ResponsiveExtension(20).h), child: CustomButton( - text: _currentStep <=1 ? LocaleKeys.next.tr() : LocaleKeys.submit.tr(), + text: _currentStep <= 1 ? LocaleKeys.next.tr() : LocaleKeys.submit.tr(), // icon: AppAssets.search_icon, iconColor: Colors.white, onPressed: () => {_handleNextStep()}, @@ -188,7 +183,7 @@ class _NewReferralPageState extends State { child: ChangeNotifierProvider.value( value: _formManager, child: SizedBox( - height: ResponsiveExtension.screenHeight * 0.65, + height: ResponsiveExtension.screenHeight * 0.65, child: Column( children: [ const SizedBox(height: 8), @@ -220,7 +215,6 @@ class _NewReferralPageState extends State { // ); } - showSuccessBottomSheet(int requestId, HmgServicesViewModel hmgServicesViewModel) { return showCommonBottomSheetWithoutHeight( context, @@ -232,9 +226,9 @@ class _NewReferralPageState extends State { Row( children: [ "Here is your Referral #: ".needTranslation.toText14( - color: AppColors.textColorLight, - weight: FontWeight.w500, - ), + color: AppColors.textColorLight, + weight: FontWeight.w500, + ), SizedBox(width: 4.w), ("$requestId").toText16(isBold: true), ], @@ -249,7 +243,7 @@ class _NewReferralPageState extends State { onPressed: () { context.pop(); context.pop(); - _currentStep =0; + _currentStep = 0; }, textColor: AppColors.whiteColor, ), diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index b321ff3..5b7113b 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -131,7 +131,7 @@ class ServicesPage extends StatelessWidget { AppAssets.daily_water_monitor_icon, bgColor: AppColors.whiteColor, true, - route: AppRoutes.eReferralPage, + route: AppRoutes.waterConsumptionScreen, ), HmgServicesComponentModel( 11, @@ -374,7 +374,7 @@ class ServicesPage extends StatelessWidget { SizedBox(height: 16.h), GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount:(isFoldable || isTablet) ? 6 : 4, // 4 icons per row + crossAxisCount: (isFoldable || isTablet) ? 6 : 4, // 4 icons per row crossAxisSpacing: 12.w, mainAxisSpacing: 18.h, childAspectRatio: 0.8, diff --git a/lib/presentation/home_health_care/hhc_procedures_page.dart b/lib/presentation/home_health_care/hhc_procedures_page.dart index 41d8a2f..be97a88 100644 --- a/lib/presentation/home_health_care/hhc_procedures_page.dart +++ b/lib/presentation/home_health_care/hhc_procedures_page.dart @@ -446,68 +446,62 @@ class _HhcProceduresPageState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.bgScaffoldColor, - body: Column( - children: [ - Expanded( - child: CollapsingListView( - title: "Home Health Care".needTranslation, - history: () => Navigator.of(context).push(CustomPageRoute(page: HhcOrderDetailPage(), direction: AxisDirection.up)), - child: Consumer( - builder: (context, hmgServicesViewModel, child) { - if (hmgServicesViewModel.isHhcOrdersLoading || hmgServicesViewModel.isHhcServicesLoading) { - return _buildLoadingShimmer(); - } - final pendingOrder = _getPendingOrder(hmgServicesViewModel.hhcOrdersList); - if (pendingOrder != null) { - return _buildPendingOrderCard(pendingOrder); - } else { - return Column( - children: [ - Center( - child: Utils.getNoDataWidget( - context, - noDataText: "You have no pending requests.".needTranslation, - ), - ), - ], - ); - } - }, - ), - ), - ), - Consumer( - builder: (BuildContext context, HmgServicesViewModel hmgServicesViewModel, Widget? child) { - if (hmgServicesViewModel.isHhcOrdersLoading || hmgServicesViewModel.isHhcServicesLoading) { - return SizedBox.shrink(); - } - final pendingOrder = _getPendingOrder(hmgServicesViewModel.hhcOrdersList); - if (pendingOrder == null) { - return Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 24.r, - hasShadow: true, + body: CollapsingListView( + title: "Home Health Care".needTranslation, + history: () => Navigator.of(context).push(CustomPageRoute(page: HhcOrderDetailPage(), direction: AxisDirection.up)), + bottomChild: Consumer( + builder: (BuildContext context, HmgServicesViewModel hmgServicesViewModel, Widget? child) { + if (hmgServicesViewModel.isHhcOrdersLoading || hmgServicesViewModel.isHhcServicesLoading) { + return SizedBox.shrink(); + } + final pendingOrder = _getPendingOrder(hmgServicesViewModel.hhcOrdersList); + if (pendingOrder == null) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(24.w), + child: CustomButton( + borderWidth: 0, + text: "Create new request".needTranslation, + onPressed: () => _buildServicesListBottomsSheet(hmgServicesViewModel.hhcServicesList), + textColor: AppColors.whiteColor, + borderRadius: 12.r, + borderColor: Colors.transparent, + padding: EdgeInsets.symmetric(vertical: 14.h), ), - child: Padding( - padding: EdgeInsets.only(left: 16.w, right: 16.w, bottom: 24.h, top: 24.h), - child: CustomButton( - borderWidth: 0, - text: "Create new request".needTranslation, - onPressed: () => _buildServicesListBottomsSheet(hmgServicesViewModel.hhcServicesList), - textColor: AppColors.whiteColor, - borderRadius: 12.r, - borderColor: Colors.transparent, - padding: EdgeInsets.symmetric(vertical: 14.h), + ), + ); + } + + return SizedBox.shrink(); + }, + ), + child: Consumer( + builder: (context, hmgServicesViewModel, child) { + if (hmgServicesViewModel.isHhcOrdersLoading || hmgServicesViewModel.isHhcServicesLoading) { + return _buildLoadingShimmer(); + } + final pendingOrder = _getPendingOrder(hmgServicesViewModel.hhcOrdersList); + if (pendingOrder != null) { + return _buildPendingOrderCard(pendingOrder); + } else { + return Column( + children: [ + Center( + child: Utils.getNoDataWidget( + context, + noDataText: "You have no pending requests.".needTranslation, ), ), - ); - } - - return SizedBox.shrink(); - }, - ), - ], + ], + ); + } + }, + ), ), ); } diff --git a/lib/presentation/symptoms_checker/organ_selector_screen.dart b/lib/presentation/symptoms_checker/organ_selector_screen.dart index d5dc32c..c23b956 100644 --- a/lib/presentation/symptoms_checker/organ_selector_screen.dart +++ b/lib/presentation/symptoms_checker/organ_selector_screen.dart @@ -267,14 +267,15 @@ class _OrganSelectorPageState extends State { runSpacing: 8.h, children: viewModel.selectedOrgans.map((organ) { return AppCustomChipWidget( - labelText: organ.description, - backgroundColor: AppColors.secondaryLightRedColor, - textColor: AppColors.primaryRedColor, - deleteIcon: AppAssets.cancel, - deleteIconColor: AppColors.primaryRedColor, - deleteIconHasColor: false, - onDeleteTap: () => viewModel.removeOrgan(organ.id), - ); + labelText: organ.description, + backgroundColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + deleteIcon: AppAssets.cancel, + deleteIconColor: AppColors.primaryRedColor, + deleteIconHasColor: false, + onDeleteTap: () { + viewModel.removeOrgan(organ.id); + }); }).toList(), ), ), diff --git a/lib/presentation/symptoms_checker/risk_factors_screen.dart b/lib/presentation/symptoms_checker/risk_factors_screen.dart index 2992593..d4ff2cb 100644 --- a/lib/presentation/symptoms_checker/risk_factors_screen.dart +++ b/lib/presentation/symptoms_checker/risk_factors_screen.dart @@ -1,16 +1,15 @@ -import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.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/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/symptoms_checker/symptoms_checker_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.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:provider/provider.dart'; class RiskFactorsScreen extends StatefulWidget { @@ -24,23 +23,24 @@ class _RiskFactorsScreenState extends State { @override void initState() { super.initState(); - // Initialize symptom groups based on selected organs + // Fetch risk factors based on selected symptoms WidgetsBinding.instance.addPostFrameCallback((_) { final viewModel = context.read(); - viewModel.initializeSymptomGroups(); + viewModel.fetchRiskFactors(); }); } - void _onOptionSelected(int optionIndex) {} + void _onRiskFactorSelected(SymptomsCheckerViewModel viewModel, String riskFactorId) { + viewModel.toggleRiskFactorSelection(riskFactorId); + } void _onNextPressed(SymptomsCheckerViewModel viewModel) { - if (viewModel.hasSelectedSymptoms) { - // Navigate to triage screen + if (viewModel.hasSelectedRiskFactors) { context.navigateWithName(AppRoutes.suggestionsScreen); } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text('Please select at least one option before proceeding'.needTranslation), + content: Text('Please select at least one risk before proceeding'.needTranslation), backgroundColor: AppColors.errorColor, ), ); @@ -51,27 +51,13 @@ class _RiskFactorsScreenState extends State { context.pop(); } - _buildConfirmationBottomSheet({required BuildContext context, required VoidCallback onConfirm}) { - return showCommonBottomSheetWithoutHeight( - title: LocaleKeys.notice.tr(context: context), - context, - child: Utils.getWarningWidget( - loadingText: "Are you sure you want to restart the organ selection?".needTranslation, - isShowActionButtons: true, - onCancelTap: () => Navigator.pop(context), - onConfirmTap: () => onConfirm(), - ), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - } + Widget _buildRiskFactorItem(SymptomsCheckerViewModel viewModel, String riskFactorId, String optionText) { + final bool selected = viewModel.isRiskFactorSelected(riskFactorId); - Widget _buildOptionItem(int index, bool selected, String optionText) { return GestureDetector( - onTap: () => _onOptionSelected(index), + onTap: () => _onRiskFactorSelected(viewModel, riskFactorId), child: Container( - margin: EdgeInsets.only(bottom: 12.h), + margin: EdgeInsets.only(bottom: 16.h), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -83,56 +69,137 @@ class _RiskFactorsScreenState extends State { decoration: BoxDecoration( color: selected ? AppColors.primaryRedColor : Colors.transparent, borderRadius: BorderRadius.circular(5.r), - border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.borderGrayColor, width: 1.w), + border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.checkBoxBorderColor, width: 1.w), ), child: selected ? Icon(Icons.check, size: 16.f, color: AppColors.whiteColor) : null, ), SizedBox(width: 12.w), Expanded( - child: Text( - optionText, - style: TextStyle(fontSize: 14.f, color: AppColors.textColor, fontWeight: FontWeight.w500), - ), - ), + child: optionText.toText14( + color: riskFactorId == "not_applicable" ? AppColors.errorColor : AppColors.textColor, + weight: FontWeight.w500, + )), ], ), ), ); } - Widget buildFactorsList() { - return AnimatedSwitcher( - duration: const Duration(milliseconds: 400), - transitionBuilder: (Widget child, Animation animation) { - final offsetAnimation = Tween( - begin: const Offset(1.0, 0.0), - end: Offset.zero, - ).animate(CurvedAnimation( - parent: animation, - curve: Curves.easeInOut, - )); - - return SlideTransition( - position: offsetAnimation, - child: FadeTransition( - opacity: animation, - child: child, + Widget _buildRiskFactorsList(SymptomsCheckerViewModel viewModel) { + return Container( + key: ValueKey(viewModel.riskFactorsList.length), + width: double.infinity, + margin: EdgeInsets.symmetric(horizontal: 24.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), + padding: EdgeInsets.only(top: 24.h, left: 16.w, right: 16.w, bottom: 8.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...viewModel.riskFactorsList.map((factor) { + return _buildRiskFactorItem(viewModel, factor.id ?? '', factor.getDisplayName()); + }), + SizedBox(height: 12.w), + Row( + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.alertSquare, + height: 24.h, + width: 24.h, + iconColor: AppColors.textColor, + ), + SizedBox(width: 12.w), + Expanded( + child: RichText( + text: TextSpan( + style: TextStyle( + height: 1.3, + fontSize: 13.f, + fontWeight: FontWeight.w500, + color: AppColors.greyInfoTextColor, + ), + children: [ + TextSpan( + text: "Above you see the most common risk factors. Although /diagnosis may return questions about risk factors, " + .needTranslation, + ), + TextSpan( + text: "read more".needTranslation, + style: TextStyle( + color: AppColors.primaryRedColor, + fontWeight: FontWeight.w500, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + // handle tap - navigate or show bottom sheet + debugPrint('Read more tapped'); + // Example: Navigator.push(context, MaterialPageRoute(builder: (_) => RiskFactorsDetailScreen())); + }, + ), + ], + ), + ), + ) + ], ), - ); - }, - child: Container( - width: double.infinity, - margin: EdgeInsets.symmetric(horizontal: 24.w), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), - padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 20.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ...List.generate(4, (index) { - return _buildOptionItem(index, false, "currentQuestion.options[index].text"); + ], + ), + ); + } + + Widget _buildLoadingShimmer() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + // Create 2-3 shimmer cards + ...List.generate(3, (index) { + return Padding( + padding: EdgeInsets.only(bottom: 16.h), + child: _buildShimmerCard(), + ); + }), + ], + ); + } + + Widget _buildShimmerCard() { + return Container( + width: double.infinity, + margin: EdgeInsets.symmetric(horizontal: 24.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), + padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Shimmer title + Container( + height: 40.h, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24.r), + ), + ).toShimmer2(isShow: true, radius: 24.r), + SizedBox(height: 16.h), + // Shimmer chips + Wrap( + runSpacing: 12.h, + spacing: 8.w, + children: List.generate(4, (index) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), + decoration: BoxDecoration( + color: AppColors.whiteColor, + borderRadius: BorderRadius.circular(24.r), + border: Border.all(color: AppColors.bottomNAVBorder, width: 1), + ), + child: Text( + 'Not Applicable Risk Factor', + style: TextStyle(fontSize: 14.f, color: AppColors.textColor), + ), + ).toShimmer2(isShow: true, radius: 24.r); }), - ], - ), + ), + ], ), ); } @@ -147,68 +214,19 @@ class _RiskFactorsScreenState extends State { children: [ Expanded( child: CollapsingListView( - title: "Risks".needTranslation, - leadingCallback: () => _buildConfirmationBottomSheet( - context: context, - onConfirm: () => { - context.pop(), - context.pop(), - }), - child: _buildEmptyState(), - // child: viewModel.organSymptomsGroups.isEmpty - // ? _buildEmptyState() - // : Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // SizedBox(height: 16.h), - // ...viewModel.organSymptomsGroups.map((group) { - // return Padding( - // padding: EdgeInsets.only(bottom: 16.h), - // child: Container( - // width: double.infinity, - // margin: EdgeInsets.symmetric(horizontal: 24.w), - // decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), - // padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w), - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // children: [ - // Expanded( - // child: Text( - // 'Possible symptoms related to "${group.organName}"', - // style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor), - // ), - // ), - // ], - // ), - // SizedBox(height: 24.h), - // Wrap( - // runSpacing: 12.h, - // spacing: 8.w, - // children: group.symptoms.map((symptom) { - // bool isSelected = viewModel.isSymptomSelected(group.organId, symptom.id); - // return GestureDetector( - // onTap: () => viewModel.toggleSymptomSelection(group.organId, symptom.id), - // child: CustomSelectableChip( - // label: symptom.name, - // selected: isSelected, - // activeColor: AppColors.primaryRedBorderColor, - // activeTextColor: AppColors.primaryRedBorderColor, - // inactiveBorderColor: AppColors.bottomNAVBorder, - // inactiveTextColor: AppColors.textColor, - // ), - // ); - // }).toList(), - // ), - // ], - // ), - // ), - // ); - // }), - // ], - // ), + title: "Risk Factors".needTranslation, + leadingCallback: () => context.pop(), + child: viewModel.isRiskFactorsLoading + ? _buildLoadingShimmer() + : viewModel.riskFactorsList.isEmpty + ? _buildEmptyState() + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + _buildRiskFactorsList(viewModel), + ], + ), ), ), _buildStickyBottomCard(context, viewModel), @@ -229,7 +247,7 @@ class _RiskFactorsScreenState extends State { Icon(Icons.info_outline, size: 64.h, color: AppColors.greyTextColor), SizedBox(height: 16.h), Text( - 'No organs selected'.needTranslation, + 'No risk factors found'.needTranslation, style: TextStyle( fontSize: 18.f, fontWeight: FontWeight.w600, @@ -238,7 +256,7 @@ class _RiskFactorsScreenState extends State { ), SizedBox(height: 8.h), Text( - 'Please go back and select organs first'.needTranslation, + 'Based on your selected symptoms, no additional risk factors were identified.'.needTranslation, textAlign: TextAlign.center, style: TextStyle( fontSize: 14.f, diff --git a/lib/presentation/symptoms_checker/suggestions_screen.dart b/lib/presentation/symptoms_checker/suggestions_screen.dart index 2832515..f2aa71e 100644 --- a/lib/presentation/symptoms_checker/suggestions_screen.dart +++ b/lib/presentation/symptoms_checker/suggestions_screen.dart @@ -1,16 +1,14 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.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/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/symptoms_checker/symptoms_checker_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.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:provider/provider.dart'; class SuggestionsScreen extends StatefulWidget { @@ -27,14 +25,18 @@ class _SuggestionsScreenState extends State { // Initialize symptom groups based on selected organs WidgetsBinding.instance.addPostFrameCallback((_) { final viewModel = context.read(); - viewModel.initializeSymptomGroups(); + viewModel.fetchSuggestions(); }); } void _onOptionSelected(int optionIndex) {} + void _onSuggestionSelected(SymptomsCheckerViewModel viewModel, String suggestionId) { + viewModel.toggleSuggestionsSelection(suggestionId); + } + void _onNextPressed(SymptomsCheckerViewModel viewModel) { - if (viewModel.hasSelectedSymptoms) { + if (viewModel.hasSelectedSuggestions) { // Navigate to triage screen context.navigateWithName(AppRoutes.triageScreen); } else { @@ -51,27 +53,13 @@ class _SuggestionsScreenState extends State { context.pop(); } - _buildConfirmationBottomSheet({required BuildContext context, required VoidCallback onConfirm}) { - return showCommonBottomSheetWithoutHeight( - title: LocaleKeys.notice.tr(context: context), - context, - child: Utils.getWarningWidget( - loadingText: "Are you sure you want to restart the organ selection?".needTranslation, - isShowActionButtons: true, - onCancelTap: () => Navigator.pop(context), - onConfirmTap: () => onConfirm(), - ), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - } + Widget _buildSuggestionItem(SymptomsCheckerViewModel viewModel, String suggestionId, String optionText) { + final bool selected = viewModel.isSuggestionsSelected(suggestionId); - Widget _buildOptionItem(int index, bool selected, String optionText) { return GestureDetector( - onTap: () => _onOptionSelected(index), + onTap: () => _onSuggestionSelected(viewModel, suggestionId), child: Container( - margin: EdgeInsets.only(bottom: 12.h), + margin: EdgeInsets.only(bottom: 16.h), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -83,56 +71,111 @@ class _SuggestionsScreenState extends State { decoration: BoxDecoration( color: selected ? AppColors.primaryRedColor : Colors.transparent, borderRadius: BorderRadius.circular(5.r), - border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.borderGrayColor, width: 1.w), + border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.checkBoxBorderColor, width: 1.w), ), child: selected ? Icon(Icons.check, size: 16.f, color: AppColors.whiteColor) : null, ), SizedBox(width: 12.w), Expanded( - child: Text( - optionText, - style: TextStyle(fontSize: 14.f, color: AppColors.textColor, fontWeight: FontWeight.w500), - ), - ), + child: optionText.toText14( + color: suggestionId == "not_applicable" ? AppColors.errorColor : AppColors.textColor, + weight: FontWeight.w500, + )), ], ), ), ); } - Widget buildFactorsList() { - return AnimatedSwitcher( - duration: const Duration(milliseconds: 400), - transitionBuilder: (Widget child, Animation animation) { - final offsetAnimation = Tween( - begin: const Offset(1.0, 0.0), - end: Offset.zero, - ).animate(CurvedAnimation( - parent: animation, - curve: Curves.easeInOut, - )); - - return SlideTransition( - position: offsetAnimation, - child: FadeTransition( - opacity: animation, - child: child, + Widget _buildSuggestionsList(SymptomsCheckerViewModel viewModel) { + return Container( + key: ValueKey(viewModel.suggestionsList.length), + width: double.infinity, + margin: EdgeInsets.symmetric(horizontal: 24.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), + padding: EdgeInsets.only(top: 24.h, left: 16.w, right: 16.w, bottom: 8.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...viewModel.suggestionsList.map((factor) { + return _buildSuggestionItem(viewModel, factor.id ?? '', factor.getDisplayName()); + }), + SizedBox(height: 12.w), + Row( + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.alertSquare, + height: 24.h, + width: 24.h, + iconColor: AppColors.textColor, + ), + SizedBox(width: 12.w), + Expanded( + child: "This is a list of symptoms suggested by our AI, based on the information gathered so far during the interview".toText12( + color: AppColors.greyInfoTextColor, + ), + ) + ], ), - ); - }, - child: Container( - width: double.infinity, - margin: EdgeInsets.symmetric(horizontal: 24.w), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), - padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 20.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ...List.generate(4, (index) { - return _buildOptionItem(index, false, "currentQuestion.options[index].text"); + ], + ), + ); + } + + Widget _buildLoadingShimmer() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + // Create 2-3 shimmer cards + ...List.generate(3, (index) { + return Padding( + padding: EdgeInsets.only(bottom: 16.h), + child: _buildShimmerCard(), + ); + }), + ], + ); + } + + Widget _buildShimmerCard() { + return Container( + width: double.infinity, + margin: EdgeInsets.symmetric(horizontal: 24.w), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), + padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Shimmer title + Container( + height: 40.h, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24.r), + ), + ).toShimmer2(isShow: true, radius: 24.r), + SizedBox(height: 16.h), + // Shimmer chips + Wrap( + runSpacing: 12.h, + spacing: 8.w, + children: List.generate(4, (index) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.h), + decoration: BoxDecoration( + color: AppColors.whiteColor, + borderRadius: BorderRadius.circular(24.r), + border: Border.all(color: AppColors.bottomNAVBorder, width: 1), + ), + child: Text( + 'Not Applicable Suggestion', + style: TextStyle(fontSize: 14.f, color: AppColors.textColor), + ), + ).toShimmer2(isShow: true, radius: 24.r); }), - ], - ), + ), + ], ), ); } @@ -148,68 +191,18 @@ class _SuggestionsScreenState extends State { Expanded( child: CollapsingListView( title: "Suggestions".needTranslation, - leadingCallback: () => _buildConfirmationBottomSheet( - context: context, - onConfirm: () => { - context.pop(), - context.pop(), - }), - child: _buildEmptyState(), - - // child: viewModel.organSymptomsGroups.isEmpty - // ? _buildEmptyState() - // : Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // SizedBox(height: 16.h), - // ...viewModel.organSymptomsGroups.map((group) { - // return Padding( - // padding: EdgeInsets.only(bottom: 16.h), - // child: Container( - // width: double.infinity, - // margin: EdgeInsets.symmetric(horizontal: 24.w), - // decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r), - // padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w), - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // children: [ - // Expanded( - // child: Text( - // 'Possible symptoms related to "${group.organName}"', - // style: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, color: AppColors.textColor), - // ), - // ), - // ], - // ), - // SizedBox(height: 24.h), - // Wrap( - // runSpacing: 12.h, - // spacing: 8.w, - // children: group.symptoms.map((symptom) { - // bool isSelected = viewModel.isSymptomSelected(group.organId, symptom.id); - // return GestureDetector( - // onTap: () => viewModel.toggleSymptomSelection(group.organId, symptom.id), - // child: CustomSelectableChip( - // label: symptom.name, - // selected: isSelected, - // activeColor: AppColors.primaryRedBorderColor, - // activeTextColor: AppColors.primaryRedBorderColor, - // inactiveBorderColor: AppColors.bottomNAVBorder, - // inactiveTextColor: AppColors.textColor, - // ), - // ); - // }).toList(), - // ), - // ], - // ), - // ), - // ); - // }), - // ], - // ), + leadingCallback: () => context.pop(), + child: viewModel.isSuggestionsLoading + ? _buildLoadingShimmer() + : viewModel.suggestionsList.isEmpty + ? _buildEmptyState() + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + _buildSuggestionsList(viewModel), + ], + ), ), ), _buildStickyBottomCard(context, viewModel), diff --git a/lib/presentation/symptoms_checker/triage_screen.dart b/lib/presentation/symptoms_checker/triage_screen.dart index aa0cd72..ff0482e 100644 --- a/lib/presentation/symptoms_checker/triage_screen.dart +++ b/lib/presentation/symptoms_checker/triage_screen.dart @@ -148,10 +148,7 @@ class _TriageScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - currentQuestion.question, - style: TextStyle(fontSize: 16.f, fontWeight: FontWeight.w500, color: AppColors.textColor), - ), + currentQuestion.question.toText16(weight: FontWeight.w500), SizedBox(height: 24.h), ...List.generate(currentQuestion.options.length, (index) { bool selected = currentQuestion.selectedOptionIndex == index; @@ -179,17 +176,12 @@ class _TriageScreenState extends State { decoration: BoxDecoration( color: selected ? AppColors.primaryRedColor : Colors.transparent, borderRadius: BorderRadius.circular(5.r), - border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.borderGrayColor, width: 1.w), + border: Border.all(color: selected ? AppColors.primaryRedColor : AppColors.checkBoxBorderColor, width: 1.w), ), child: selected ? Icon(Icons.check, size: 16.f, color: AppColors.whiteColor) : null, ), SizedBox(width: 12.w), - Expanded( - child: Text( - optionText, - style: TextStyle(fontSize: 14.f, color: AppColors.textColor, fontWeight: FontWeight.w500), - ), - ), + Expanded(child: optionText.toText14(weight: FontWeight.w500)), ], ), ), diff --git a/lib/presentation/water_monitor/water_consumption_screen.dart b/lib/presentation/water_monitor/water_consumption_screen.dart new file mode 100644 index 0000000..198f65b --- /dev/null +++ b/lib/presentation/water_monitor/water_consumption_screen.dart @@ -0,0 +1,269 @@ +import 'dart:developer'; +import 'dart:math' as math; + +import 'package:flutter/material.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/utils/utils.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/water_monitor/water_monitor_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/bottle_shape_clipper.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/water_consumption_progress_widget.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:provider/provider.dart'; + +class WaterConsumptionScreen extends StatefulWidget { + const WaterConsumptionScreen({super.key}); + + @override + State createState() => _WaterConsumptionScreenState(); +} + +class _WaterConsumptionScreenState extends State { + @override + void initState() { + super.initState(); + // Initialize VM once the widget is mounted + WidgetsBinding.instance.addPostFrameCallback((_) { + final vm = Provider.of(context, listen: false); + vm.initialize(); + // optional: log current progress for debugging + // ignore: avoid_print + log('WaterMonitor initialized: consumed=${vm.totalConsumedMl}, goal=${vm.dailyGoalMl}, progress=${vm.progressPercent}'); + }); + } + + _buildHydrationTipsWidget() { + return Container( + margin: EdgeInsets.symmetric(horizontal: 24.h), + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.bulb_icon, width: 24.w, height: 24.h), + SizedBox(width: 8.w), + "Tips to stay hydrated".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(height: 8.h), + " • ${"Drink before you feel thirsty"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + SizedBox(height: 4.h), + " • ${"Keep a refillable bottle next to you"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + SizedBox(height: 4.h), + " • ${"Track your daily intake to stay motivated"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + SizedBox(height: 4.h), + " • ${"Choose sparkling water instead of soda"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + SizedBox(height: 8.h), + ], + ), + ); + } + + _buildStatsColumn() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Next Drink Time".toText18(weight: FontWeight.w600, color: AppColors.textColor), + "03:00 AM".toText32(weight: FontWeight.w600, color: AppColors.blueColor), + SizedBox(height: 12.h), + _buildStatusColumn(title: "Your Goal".needTranslation, subTitle: "2000ml"), + SizedBox(height: 8.h), + _buildStatusColumn(title: "Remaining".needTranslation, subTitle: "300ml"), + SizedBox(height: 8.h), + _buildStatusColumn(title: "Completed".needTranslation, subTitle: "90%", subTitleColor: AppColors.successColor), + SizedBox(height: 8.h), + _buildStatusColumn(title: "Hydration Status".needTranslation, subTitle: "Hydrated", subTitleColor: AppColors.blueColor), + SizedBox(height: 8.h), + ], + ); + } + + _buildWaterIntakeSummaryWidget() { + return Container( + width: double.infinity, + padding: EdgeInsets.all(24.w), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + AppColors.blueGradientColorOne, + AppColors.blueGradientColorTwo, + ], + ), + ), + child: LayoutBuilder( + builder: (context, constraints) { + // Responsive: stack vertically on small screens + final isSmallScreen = constraints.maxWidth < 600; + + if (isSmallScreen) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded(flex: 3, child: _buildStatsColumn()), + SizedBox(width: 16.w), + Expanded(flex: 2, child: _buildWaterBottleWidget()), + ], + ); + } else { + // Larger screens: more space for bottle + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Flexible(flex: 2, child: _buildStatsColumn()), + SizedBox(width: 32.w), + Flexible(flex: 1, child: _buildWaterBottleWidget()), + ], + ); + } + }, + ), + ); + } + + _buildStatusColumn({required String title, required String subTitle, Color? subTitleColor}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "$title:".toText16(weight: FontWeight.w500, color: AppColors.textColor), + subTitle.toText12(fontWeight: FontWeight.w600, color: subTitleColor ?? AppColors.greyTextColor), + ], + ); + } + + Widget _buildWaterBottleWidget() { + return Consumer( + builder: (context, vm, _) { + // final progressPercent = 100.0; + final progressPercent = (vm.progress * 100).clamp(0.0, 100.0); + log("progressPercent: ${progressPercent}"); + // SVG original dimensions + final svgOriginalWidth = 143.w; + final svgOriginalHeight = 315.h; + + // Responsive sizing - scale based on screen width but maintain aspect ratio + final bottleWidth = 120.w; // Adjust this for your layout + final aspectRatio = svgOriginalHeight / svgOriginalWidth; // 2. 2027 + final bottleHeight = bottleWidth * aspectRatio; + + // Exact fillable area based on SVG paths (provided by VM calibration) + final fillableHeightPercent = vm.fillableHeightPercent; + final fillableWidthPercent = 0.8; // 80.7% is body width + final bottomPaddingPercent = 0; // 0% padding from bottom (8px of 315px) + + final fillableHeight = bottleHeight * fillableHeightPercent; + final fillableWidth = bottleWidth * fillableWidthPercent; + final bottomPadding = bottleHeight * bottomPaddingPercent; + return SizedBox( + height: bottleHeight, + width: bottleWidth, + child: Stack( + alignment: Alignment.center, + children: [ + // Bottle SVG + Center( + child: Utils.buildSvgWithAssets( + icon: AppAssets.waterBottle, + height: bottleHeight, + width: bottleWidth, + fit: BoxFit.contain, // Important for scaling + ), + ), + + // Water wave - positioned from bottom + Positioned( + bottom: bottomPadding, + right: 10.w, + child: ClipPath( + clipper: BottleShapeClipper(), // Use custom clipper for exact bottle shape + child: SizedBox( + height: fillableHeight, + width: fillableWidth, + child: Align( + alignment: Alignment.bottomCenter, + child: WaterConsumptionProgressWidget( + progress: progressPercent, + // Pass a square size so the painter's vertical range matches the clip area. + // Use the larger of width/height so the waves render correctly and won't be squashed. + size: math.max(fillableWidth, fillableHeight), + // Provide exact container dimensions so the painter draws waves using the bottle's rect + containerWidth: fillableWidth, + containerHeight: fillableHeight, + waveDuration: const Duration(milliseconds: 3000), + waveColor: AppColors.blueColor, + ), + ), + ), + ), + ), + + // Bubbles positioned dynamically based on water level + if (progressPercent > 10) + Positioned( + bottom: 40.h, + child: Utils.buildSvgWithAssets( + icon: AppAssets.waterBottleOuterBubbles, + height: 60.h, + width: fillableWidth * 0.7, + ), + ), + ], + ), + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "Water Consumption".needTranslation, + bottomChild: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(24.w), + child: CustomButton( + text: "Set Reminder".needTranslation, + textColor: AppColors.successColor, + backgroundColor: AppColors.successLightBgColor, + onPressed: () => {}, + icon: AppAssets.bell, + iconColor: AppColors.successColor, + borderRadius: 12.r, + borderColor: AppColors.transparent, + padding: EdgeInsets.symmetric(vertical: 14.h), + ), + ), + ), + child: Column( + children: [ + SizedBox(height: 16.h), + _buildWaterIntakeSummaryWidget(), + SizedBox(height: 16.h), + _buildHydrationTipsWidget(), + ], + ), + ), + ); + // ); + } +} diff --git a/lib/presentation/water_monitor/water_monitor_settings_screen.dart b/lib/presentation/water_monitor/water_monitor_settings_screen.dart new file mode 100644 index 0000000..e49c8a3 --- /dev/null +++ b/lib/presentation/water_monitor/water_monitor_settings_screen.dart @@ -0,0 +1,360 @@ +import 'package:flutter/material.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/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/water_monitor/water_monitor_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart'; +import 'package:hmg_patient_app_new/services/dialog_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:provider/provider.dart'; + +class WaterMonitorSettingsScreen extends StatefulWidget { + const WaterMonitorSettingsScreen({super.key}); + + @override + State createState() => _WaterMonitorSettingsScreenState(); +} + +class _WaterMonitorSettingsScreenState extends State { + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + context.read().initialize(); + }); + } + + void _showSnackbar(String text) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(text), + backgroundColor: AppColors.errorColor, + ), + ); + } + + // Reusable method to build selection row widget + Widget _buildSelectionRow({ + required String value, + required String groupValue, + required VoidCallback onTap, + bool useUpperCase = false, + }) { + return SizedBox( + height: 70.h, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: value, + groupValue: groupValue, + activeColor: AppColors.errorColor, + onChanged: (_) => onTap(), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + (useUpperCase ? value.toUpperCase() : value.toCamelCase) + .toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1) + .expanded, + ], + ).onPress(onTap), + ); + } + + // Reusable method to show selection bottom sheet + void _showSelectionBottomSheet({ + required BuildContext context, + required String title, + required List items, + required String selectedValue, + required Function(String) onSelected, + bool useUpperCase = false, + }) { + final dialogService = getIt.get(); + + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: title.needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: items.length, + itemBuilder: (context, index) { + final item = items[index]; + return _buildSelectionRow( + value: item, + groupValue: selectedValue, + useUpperCase: useUpperCase, + onTap: () { + onSelected(item); + Navigator.pop(context); + }, + ); + }, + separatorBuilder: (_, __) => Divider(height: 1, color: AppColors.dividerColor), + ), + ), + onOkPressed: () {}, + ); + } + + void _showGenderSelectionBottomsheet(BuildContext context, WaterMonitorViewModel viewModel) { + _showSelectionBottomSheet( + context: context, + title: "Select Gender".needTranslation, + items: viewModel.genderOptions, + selectedValue: viewModel.selectedGender, + onSelected: viewModel.setGender, + ); + } + + void _showHeightUnitSelectionBottomSheet(BuildContext context, WaterMonitorViewModel viewModel) { + _showSelectionBottomSheet( + context: context, + title: "Select Unit".needTranslation, + items: viewModel.heightUnits, + selectedValue: viewModel.selectedHeightUnit, + onSelected: viewModel.setHeightUnit, + useUpperCase: true, + ); + } + + void _showWeightUnitSelectionBottomsheet(BuildContext context, WaterMonitorViewModel viewModel) { + _showSelectionBottomSheet( + context: context, + title: "Select Unit".needTranslation, + items: viewModel.weightUnits, + selectedValue: viewModel.selectedWeightUnit, + onSelected: viewModel.setWeightUnit, + useUpperCase: true, + ); + } + + void _showActivityLevelSelectionBottomsheet(BuildContext context, WaterMonitorViewModel viewModel) { + _showSelectionBottomSheet( + context: context, + title: "Select Activity Level".needTranslation, + items: viewModel.activityLevels, + selectedValue: viewModel.selectedActivityLevel, + onSelected: viewModel.setActivityLevel, + ); + } + + void _showNumberOfRemindersSelectionBottomsheet(BuildContext context, WaterMonitorViewModel viewModel) { + _showSelectionBottomSheet( + context: context, + title: "Select Number of Reminders".needTranslation, + items: viewModel.reminderOptions, + selectedValue: viewModel.selectedNumberOfReminders, + onSelected: viewModel.setNumberOfReminders, + ); + } + + // Reusable method to build text field + Widget _buildTextField(TextEditingController controller, String hintText) { + return TextField( + controller: controller, + keyboardType: TextInputType.number, + maxLines: 1, + cursorHeight: 14.h, + textAlignVertical: TextAlignVertical.center, + decoration: InputDecoration( + border: InputBorder.none, + contentPadding: EdgeInsets.zero, + isCollapsed: true, + hintText: hintText, + hintStyle: const TextStyle(color: Colors.grey), + ), + style: TextStyle( + fontSize: 14.f, + fontWeight: FontWeight.w500, + color: AppColors.textColor, + ), + ); + } + + // Reusable method to build settings row + Widget _buildSettingsRow({ + required String icon, + required String label, + String? value, + Widget? inputField, + String? unit, + VoidCallback? onUnitTap, + VoidCallback? onRowTap, + bool showDivider = true, + }) { + return Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + height: 40.w, + width: 40.w, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.greyColor, + borderRadius: 10.r, + hasShadow: false, + ), + child: Center(child: Utils.buildSvgWithAssets(icon: icon, height: 22.w, width: 22.w)), + ), + SizedBox(width: 12.w), + Expanded( + flex: unit != null ? 3 : 1, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + label.toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + if (inputField != null) + Container( + height: 20.w, + alignment: Alignment.centerLeft, + child: inputField, + ) + else if (value != null) + value.toCamelCase.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + ), + if (unit != null) ...[ + Container( + width: 1.w, + height: 30.w, + color: AppColors.dividerColor, + ).paddingOnly(right: 10.w), + Expanded( + child: Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Unit".toText12(fontWeight: FontWeight.w500, color: AppColors.inputLabelTextColor), + unit.toText12(fontWeight: FontWeight.w500, color: AppColors.textColor), + ], + ), + SizedBox(width: 12.w), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + ], + ).onPress(onUnitTap ?? () {}), + ), + ] else if (onRowTap != null) ...[ + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down), + SizedBox(width: 4.w), + ], + ], + ).paddingSymmetrical(0.w, 16.w).onPress(onRowTap ?? () {}), + if (showDivider) Divider(height: 1, color: AppColors.dividerColor), + ], + ); + } + + @override + Widget build(BuildContext context) { + final viewModel = context.watch(); + + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: "H20 Settings".needTranslation, + bottomChild: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(24.w), + child: CustomButton( + text: "Save".needTranslation, + onPressed: () async { + showSwitchCupBottomSheet(context); + return; + final success = await viewModel.saveSettings(); + if (!success && viewModel.validationError != null) { + _showSnackBar(context, viewModel.validationError!); + } else if (success) { + _showSnackBar(context, "Saved Successfully".needTranslation); + } + }, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(vertical: 14.h), + ), + ), + ), + child: Container( + margin: EdgeInsets.symmetric(horizontal: 24.w, vertical: 24.h), + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + _buildSettingsRow( + icon: AppAssets.profileIcon, + label: "Your Name".needTranslation, + inputField: _buildTextField(viewModel.nameController, 'Guest'), + ), + _buildSettingsRow( + icon: AppAssets.genderIcon, + label: "Select Gender".needTranslation, + value: viewModel.selectedGender, + onRowTap: () => _showGenderSelectionBottomsheet(context, viewModel), + ), + _buildSettingsRow( + icon: AppAssets.calendarGrey, + label: "Age (11-120) yrs".needTranslation, + inputField: _buildTextField(viewModel.ageController, '20'), + ), + _buildSettingsRow( + icon: AppAssets.heightIcon, + label: "Height".needTranslation, + inputField: _buildTextField(viewModel.heightController, '175'), + unit: viewModel.selectedHeightUnit, + onUnitTap: () => _showHeightUnitSelectionBottomSheet(context, viewModel), + ), + _buildSettingsRow( + icon: AppAssets.weightScaleIcon, + label: "Weight".needTranslation, + inputField: _buildTextField(viewModel.weightController, '75'), + unit: viewModel.selectedWeightUnit, + onUnitTap: () => _showWeightUnitSelectionBottomsheet(context, viewModel), + ), + _buildSettingsRow( + icon: AppAssets.dumbellIcon, + label: "Activity Level".needTranslation, + value: viewModel.selectedActivityLevel, + onRowTap: () => _showActivityLevelSelectionBottomsheet(context, viewModel), + ), + _buildSettingsRow( + icon: AppAssets.notificationIconGrey, + label: "Number of reminders in a day".needTranslation, + value: viewModel.selectedNumberOfReminders, + onRowTap: () => _showNumberOfRemindersSelectionBottomsheet(context, viewModel), + showDivider: false, + ), + ], + ), + ), + ), + ); + } + + // Show snackbar for validation errors and success messages + void _showSnackBar(BuildContext context, String message) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(message), + duration: const Duration(seconds: 3), + behavior: SnackBarBehavior.floating, + backgroundColor: message.contains('successfully') ? Colors.green : AppColors.errorColor, + ), + ); + } +} diff --git a/lib/presentation/water_monitor/widgets/bottle_shape_clipper.dart b/lib/presentation/water_monitor/widgets/bottle_shape_clipper.dart new file mode 100644 index 0000000..b4b7ba0 --- /dev/null +++ b/lib/presentation/water_monitor/widgets/bottle_shape_clipper.dart @@ -0,0 +1,25 @@ +// Add this class at the bottom of your file (outside the main class) +import 'package:flutter/material.dart'; + +class BottleShapeClipper extends CustomClipper { + @override + Path getClip(Size size) { + final path = Path(); + + // Create rounded rectangle matching the bottle body shape + // The bottle has rounded corners with radius ~30-40 based on SVG + final borderRadius = size.width * 0.25; // 25% of width for rounded corners + + path.addRRect( + RRect.fromRectAndRadius( + Rect.fromLTWH(0, 0, size.width, size.height), + Radius.circular(borderRadius), + ), + ); + + return path; + } + + @override + bool shouldReclip(covariant CustomClipper oldClipper) => false; +} diff --git a/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart b/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart new file mode 100644 index 0000000..013ac7b --- /dev/null +++ b/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart @@ -0,0 +1,324 @@ +import 'package:flutter/material.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/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/water_monitor/models/water_cup_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.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:provider/provider.dart'; +import 'package:uuid/uuid.dart'; + +/// Bottom sheet to switch between existing cups or add new custom cup +void showSwitchCupBottomSheet(BuildContext context) { + return showCommonBottomSheetWithoutHeight( + context, + titleWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Switch Cups".toText20(weight: FontWeight.w600), + "Select your preferred cup size".toText16(weight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), + child: SwitchCupBottomSheet(), + callBackFunc: () {}, + ); +} + +class SwitchCupBottomSheet extends StatelessWidget { + const SwitchCupBottomSheet({super.key}); + + @override + Widget build(BuildContext context) { + final viewModel = context.watch(); + final selectedId = viewModel.selectedCup?.id; + + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + crossAxisSpacing: 16.w, + childAspectRatio: 0.85, + ), + itemCount: viewModel.cups.length + 1, + itemBuilder: (context, index) { + if (index == viewModel.cups.length) { + return _buildAddCupItem(context); + } + + final cup = viewModel.cups[index]; + final isSelected = selectedId == cup.id; + + return _buildCupItem( + cup: cup, + isSelected: isSelected, + onTap: () { + viewModel.selectCup(cup.id); + context.pop(); + }, + ); + }, + ), + ], + ); + } + + Widget _buildCupItem({required WaterCupModel cup, required bool isSelected, required VoidCallback onTap}) { + return GestureDetector( + onTap: onTap, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Stack( + clipBehavior: Clip.none, + children: [ + Container( + width: 60.w, + height: 60.w, + decoration: BoxDecoration( + color: isSelected ? AppColors.primaryRedColor.withOpacity(0.08) : Colors.transparent, + borderRadius: BorderRadius.circular(12.r), + border: Border.all( + color: isSelected ? AppColors.primaryRedColor : AppColors.bgScaffoldColor, + width: 1, + ), + ), + child: Center( + child: Utils.buildSvgWithAssets( + icon: cup.iconPath, + height: 30.h, + width: 42.w, + iconColor: isSelected ? AppColors.primaryRedColor : null, + ), + ), + ), + // Red badge for custom cups (delete) + if (!cup.isDefault) + Positioned( + top: -6.h, + right: -6.w, + child: Builder(builder: (ctx) { + return InkWell( + onTap: () { + // call viewmodel remove + final vm = ctx.read(); + vm.removeCup(cup.id); + }, + child: Container( + color: AppColors.whiteColor, + child: Utils.buildSvgWithAssets(icon: AppAssets.minimizeIcon, height: 20.w, width: 20.w), + ), + ); + }), + ), + ], + ), + SizedBox(height: 2.h), + '${cup.capacityMl}ml'.toText10(weight: FontWeight.w500), + ], + ), + ); + } + + Widget _buildAddCupItem(BuildContext context) { + return GestureDetector( + onTap: () { + showCustomizeCupBottomSheet(context); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: 60.w, + height: 60.w, + child: Center(child: Utils.buildSvgWithAssets(icon: AppAssets.cupAdd, height: 30.h, width: 42.w)), + ), + SizedBox(height: 4.h), + 'Add'.needTranslation.toText10(weight: FontWeight.w500), + ], + ), + ); + } +} + +/// Bottom sheet to customize cup capacity with slider +void showCustomizeCupBottomSheet(BuildContext context, {WaterCupModel? cupToEdit}) { + return showCommonBottomSheetWithoutHeight( + context, + titleWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Customize your drink cup".needTranslation.toText20(weight: FontWeight.w600), + ], + ), + child: CustomizeCupBottomSheet(cupToEdit: cupToEdit), + callBackFunc: () {}, + ); +} + +class CustomizeCupBottomSheet extends StatefulWidget { + final WaterCupModel? cupToEdit; + + const CustomizeCupBottomSheet({super.key, this.cupToEdit}); + + @override + State createState() => _CustomizeCupBottomSheetState(); +} + +class _CustomizeCupBottomSheetState extends State { + static const int minCapacity = 50; + static const int maxCapacity = 500; + + late double _currentCapacity; + + @override + void initState() { + super.initState(); + _currentCapacity = (widget.cupToEdit?.capacityMl ?? 150).toDouble(); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Cup icon with fill level visualization + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: 60.w, + height: 80.h, + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + // Cup image with dynamic fill + SizedBox( + width: 60.w, + height: 80.h, + child: Center( + child: Utils.buildSvgWithAssets( + icon: AppAssets.cupEmpty, + width: 60.w, + height: 80.h, + fit: BoxFit.contain, + ), + ), + ), + ClipRect( + child: Align( + alignment: Alignment.bottomCenter, + heightFactor: (_currentCapacity / maxCapacity).clamp(0.0, 1.0), + child: Utils.buildSvgWithAssets( + icon: AppAssets.cupFilled, + width: 60.w, + height: 80.h, + fit: BoxFit.contain, + )), + ), + ], + ), + ), + + SizedBox(width: 12.w), + + // Slider and labels + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Current value + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + '${_currentCapacity.round()}'.toText32(isBold: true), + SizedBox(width: 4.w), + Padding( + padding: EdgeInsets.only(bottom: 4.h), + child: Text( + 'ml', + style: TextStyle( + fontSize: 16.f, + fontWeight: FontWeight.w500, + color: AppColors.greyTextColor, + height: 1.0, + ), + ), + ), + ], + ).paddingOnly(left: 12.w), + + SizedBox(height: 16.h), + + // Slider + SliderTheme( + data: SliderTheme.of(context).copyWith( + activeTrackColor: AppColors.primaryRedColor, + inactiveTrackColor: AppColors.primaryRedColor.withOpacity(0.2), + thumbColor: AppColors.primaryRedColor, + overlayColor: AppColors.primaryRedColor.withOpacity(0.2), + trackHeight: 4.h, + thumbShape: RoundSliderThumbShape(enabledThumbRadius: 10.w), + ), + child: Slider( + value: _currentCapacity, + min: minCapacity.toDouble(), + max: maxCapacity.toDouble(), + divisions: (maxCapacity - minCapacity) ~/ 10, + onChanged: (value) => setState(() => _currentCapacity = value), + ), + ), + + Align( + alignment: Alignment.centerRight, + child: 'Max: $maxCapacity ml'.toText14( + color: AppColors.greyTextColor, + ), + ), + ], + ), + ), + ], + ), + + SizedBox(height: 24.h), + CustomButton( + text: 'Select'.needTranslation, + onPressed: () { + final newCup = WaterCupModel( + id: widget.cupToEdit?.id ?? Uuid().v4(), + name: '${_currentCapacity.round()}ml', + capacityMl: _currentCapacity.round(), + iconPath: AppAssets.cupEmpty, + isDefault: false, + ); + + final viewModel = context.read(); + if (widget.cupToEdit != null) { + viewModel.updateCup(newCup); + } else { + viewModel.addCup(newCup); + } + viewModel.selectCup(newCup.id); + + Navigator.pop(context); + }, + backgroundColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + ), + ], + ); + } +} diff --git a/lib/presentation/water_monitor/widgets/water_consumption_progress_widget.dart b/lib/presentation/water_monitor/widgets/water_consumption_progress_widget.dart new file mode 100644 index 0000000..993d7ce --- /dev/null +++ b/lib/presentation/water_monitor/widgets/water_consumption_progress_widget.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/water_splash_progress_widget.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class WaterConsumptionProgressWidget extends StatefulWidget { + /// progress: 0.0 - 100.0 + final double progress; + final double size; + final Color? waveColor; + final double? containerWidth; + final double? containerHeight; + final Duration? waveDuration; + + const WaterConsumptionProgressWidget({ + super.key, + required this.progress, + this.size = 100, + this.waveColor, + this.containerWidth, + this.containerHeight, + this.waveDuration, + }); + + @override + State createState() => _WaterConsumptionProgressWidgetState(); +} + +class _WaterConsumptionProgressWidgetState extends State with SingleTickerProviderStateMixin { + late AnimationController _progressController; + late Animation _progressAnimation; + double _lastTarget = 0.0; + + @override + void initState() { + super.initState(); + _lastTarget = widget.progress; + _progressController = AnimationController(vsync: this, duration: const Duration(milliseconds: 1200)); + _progressAnimation = Tween(begin: 0, end: widget.progress).animate(CurvedAnimation(parent: _progressController, curve: Curves.easeInOut)); + _progressController.forward(); + } + + @override + void didUpdateWidget(covariant WaterConsumptionProgressWidget oldWidget) { + super.didUpdateWidget(oldWidget); + if ((widget.progress - _lastTarget).abs() > 0.01) { + // animate from current value to new target + final begin = _progressAnimation.value; + _progressAnimation = + Tween(begin: begin, end: widget.progress).animate(CurvedAnimation(parent: _progressController, curve: Curves.easeInOut)); + _progressController + ..reset() + ..forward(); + _lastTarget = widget.progress; + } + } + + @override + void dispose() { + _progressController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // default to app blue color if none provided + final blue = widget.waveColor ?? AppColors.blueColor; + return AnimatedBuilder( + animation: _progressAnimation, + builder: (context, child) { + return WaterWaveProgress( + progress: _progressAnimation.value, + size: widget.size, + showPercentage: false, + useCircleClip: false, + waveColor: blue, + containerWidth: widget.containerWidth, + containerHeight: widget.containerHeight, + waveDuration: widget.waveDuration, + backgroundColor: Colors.transparent, + progressColor: Colors.transparent, + textColor: Colors.transparent, + ); + }, + ); + } +} diff --git a/lib/presentation/water_monitor/widgets/water_splash_progress_widget.dart b/lib/presentation/water_monitor/widgets/water_splash_progress_widget.dart new file mode 100644 index 0000000..da5eb06 --- /dev/null +++ b/lib/presentation/water_monitor/widgets/water_splash_progress_widget.dart @@ -0,0 +1,351 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +/// Spherical water wave progress bar with animated ripple effect +/// Based on https://github.com/meeziest/spherical_water_wavy_progress_bar +/// +/// Usage: +/// WaterWaveProgress( +/// progress: 75.0, +/// size: 200.w, +/// showPercentage: true, +/// ) +class WaterWaveProgress extends StatefulWidget { + final double progress; // 0.0 to 100.0 + final double size; + final bool showPercentage; + final bool useCircleClip; + final Color? waveColor; + final Color? backgroundColor; + final Color? progressColor; + final Color? textColor; + final Duration? waveDuration; + + // When drawing inside a non-square clip (like bottle area), provide the actual available + // width and height so the painter can compute vertical fill correctly. + final double? containerWidth; + final double? containerHeight; + + const WaterWaveProgress({ + super.key, + required this.progress, + this.size = 200, + this.showPercentage = true, + this.useCircleClip = true, + this.waveColor, + this.backgroundColor, + this.progressColor, + this.textColor, + this.waveDuration, + this.containerWidth, + this.containerHeight, + }); + + @override + State createState() => _WaterWaveProgressState(); +} + +class _WaterWaveProgressState extends State with SingleTickerProviderStateMixin { + late AnimationController _waveController; + + @override + void initState() { + super.initState(); + _waveController = AnimationController( + vsync: this, + duration: widget.waveDuration ?? const Duration(milliseconds: 2000), + )..repeat(); + } + + @override + void dispose() { + _waveController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final radius = widget.size / 2; + + // When container dimensions are provided (non-square bottle area), use them so + // the CustomPaint canvas matches the available clip rect. Otherwise fall back + // to the square size value. + final paintWidth = widget.containerWidth ?? widget.size; + final paintHeight = widget.containerHeight ?? widget.size; + + return SizedBox( + width: paintWidth, + height: paintHeight, + child: CustomPaint( + painter: _WavePainter( + progress: widget.progress, + waveAnimation: _waveController, + // For circle-based painters we still provide circleRadius; when using + // rectangular painting the circleRadius is unused. + circleRadius: radius, + waveColor: widget.waveColor ?? AppColors.primaryRedColor, + backgroundColor: widget.backgroundColor ?? AppColors.bgScaffoldColor, + useCircleClip: widget.useCircleClip, + containerWidth: widget.containerWidth, + containerHeight: widget.containerHeight, + ), + // Only draw the circular progress/percentage when explicitly requested. + foregroundPainter: widget.showPercentage + ? _ProgressPainter( + progress: widget.progress, + circleRadius: radius, + progressColor: widget.progressColor ?? AppColors.primaryRedColor, + textColor: widget.textColor ?? AppColors.textColor, + showPercentage: widget.showPercentage, + ) + : null, + ), + ); + } +} + +/// Paints the animated water waves inside a circular clip +class _WavePainter extends CustomPainter { + final double progress; + final Animation waveAnimation; + final double circleRadius; + final Color waveColor; + final Color backgroundColor; + final bool useCircleClip; + final double? containerWidth; + final double? containerHeight; + + _WavePainter({ + required this.progress, + required this.waveAnimation, + required this.circleRadius, + required this.waveColor, + required this.backgroundColor, + this.useCircleClip = true, + this.containerWidth, + this.containerHeight, + }) : super(repaint: waveAnimation); + + @override + void paint(Canvas canvas, Size size) { + final center = Offset(size.width / 2, size.height / 2); + canvas.translate(center.dx, center.dy); + + if (useCircleClip) { + // Clip to circle + canvas.clipPath( + Path() + ..addOval( + Rect.fromCircle( + center: Offset.zero, + radius: circleRadius, + ), + ), + ); + + // Fill background circle if specified + if (backgroundColor != Colors.transparent) { + canvas.drawCircle( + Offset.zero, + circleRadius, + Paint()..color = backgroundColor, + ); + } + + // Draw two sine waves clipped to circle for spherical style + _drawSineWave(canvas, waveColor.withAlpha((0.5 * 255).round()), shift: 0); + _drawSineWave(canvas, waveColor, shift: circleRadius / 2, mirror: true); + } else { + // No circular clipping: draw waves over the full rectangular area. Use provided container + // dimensions if available; otherwise fall back to square bounds derived from circleRadius. + final w = containerWidth ?? (circleRadius * 2); + final h = containerHeight ?? (circleRadius * 2); + + // use local transforms to center at origin and compute waves relative to the provided rect + canvas.save(); + canvas.translate(-w / 2, -h / 2); // move origin to top-left of the rect + + _drawSineWaveRect(canvas, waveColor.withAlpha((0.5 * 255).round()), width: w, height: h, shift: 0); + _drawSineWaveRect(canvas, waveColor, width: w, height: h, shift: w / 4, mirror: true); + + canvas.restore(); + } + } + + void _drawSineWaveRect(Canvas canvas, Color color, {required double width, required double height, double shift = 0.0, bool mirror = false}) { + if (mirror) { + canvas.save(); + canvas.translate(width, 0); + canvas.scale(-1, 1); + } + + final amplitude = height * 0.04; // smaller amplitude for rectangular waves + final angularVelocity = pi / (width / 2); + final delta = Curves.easeInOut.transform(progress / 100); + + final offsetX = 2 * width * waveAnimation.value + shift; + final offsetY = height * (1.0 - delta); + + final path = Path(); + for (double x = 0; x <= width; x += 1) { + final y = amplitude * sin(angularVelocity * (x + offsetX)); + if (x == 0) { + path.moveTo(x, y + offsetY); + } else { + path.lineTo(x, y + offsetY); + } + } + + path.lineTo(width, height); + path.lineTo(0, height); + path.close(); + + final wavePaint = Paint() + ..color = color + ..style = PaintingStyle.fill + ..isAntiAlias = true; + + canvas.drawPath(path, wavePaint); + + if (mirror) canvas.restore(); + } + + void _drawSineWave(Canvas canvas, Color color, {double shift = 0.0, bool mirror = false}) { + if (mirror) { + canvas.save(); + canvas.transform(Matrix4.rotationY(pi).storage); + } + + // original circular/spherical style: compute bounds based on circleRadius + final startX = -circleRadius; + final endX = circleRadius; + final startY = circleRadius; + final endY = -circleRadius; + + final amplitude = circleRadius * 0.15; + final angularVelocity = pi / circleRadius; + final delta = Curves.easeInOut.transform(progress / 100); + + final offsetX = 2 * circleRadius * waveAnimation.value + shift; + final offsetY = startY + (endY - startY - amplitude) * delta; + + final wavePaint = Paint() + ..color = color + ..style = PaintingStyle.fill + ..isAntiAlias = true; + + final path = Path(); + + for (double x = startX; x <= endX; x++) { + // Sine wave function: y = A * sin(ωx + φ) + final y = amplitude * sin(angularVelocity * (x + offsetX)); + if (x == startX) { + path.moveTo(x, y + offsetY); + } else { + path.lineTo(x, y + offsetY); + } + } + + path.lineTo(endX, startY); + path.lineTo(startX, startY); + path.close(); + + canvas.drawPath(path, wavePaint); + + if (mirror) canvas.restore(); + } + + @override + bool shouldRepaint(covariant _WavePainter oldDelegate) => oldDelegate.progress != progress; +} + +/// Paints the circular progress arc and percentage text +class _ProgressPainter extends CustomPainter { + final double progress; + final double circleRadius; + final Color progressColor; + final Color textColor; + final bool showPercentage; + + _ProgressPainter({ + required this.progress, + required this.circleRadius, + required this.progressColor, + required this.textColor, + required this.showPercentage, + }); + + @override + void paint(Canvas canvas, Size size) { + final center = Offset(size.width / 2, size.height / 2); + canvas.translate(center.dx, center.dy); + + _drawCircleProgress(canvas); + if (showPercentage) { + _drawProgressText(canvas); + } + } + + void _drawCircleProgress(Canvas canvas) { + final strokeWidth = circleRadius * 0.077; + + // Background circle with shadow + final bgPaint = Paint() + ..color = progressColor.withAlpha((0.2 * 255).round()) + ..strokeWidth = strokeWidth + ..style = PaintingStyle.stroke + ..isAntiAlias = true; + + final shadowPaint = Paint() + ..color = Colors.black.withAlpha((0.1 * 255).round()) + ..strokeWidth = strokeWidth + ..style = PaintingStyle.stroke + ..maskFilter = const MaskFilter.blur(BlurStyle.outer, 10); + + canvas.drawCircle(Offset.zero, circleRadius, bgPaint); + canvas.drawCircle(Offset.zero, circleRadius, shadowPaint); + + // Progress arc + final progressPaint = Paint() + ..color = progressColor + ..strokeWidth = strokeWidth + ..strokeCap = StrokeCap.round + ..style = PaintingStyle.stroke + ..isAntiAlias = true; + + canvas.drawArc( + Rect.fromCircle(center: Offset.zero, radius: circleRadius), + -0.5 * pi, + 2 * pi * (progress / 100), + false, + progressPaint, + ); + } + + void _drawProgressText(Canvas canvas) { + final textSpan = TextSpan( + text: "${progress.toInt()}%", + style: TextStyle( + color: textColor, + fontSize: circleRadius * 0.35, + fontWeight: FontWeight.w700, + height: 1.0, + ), + ); + + final textPainter = TextPainter( + text: textSpan, + textDirection: TextDirection.ltr, + )..layout(); + + textPainter.paint( + canvas, + Offset(-textPainter.width / 2, -textPainter.height / 2), + ); + } + + @override + bool shouldRepaint(covariant _ProgressPainter oldDelegate) => oldDelegate.progress != progress; +} diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index d25a9de..5ca17c5 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -21,6 +21,8 @@ import 'package:hmg_patient_app_new/presentation/symptoms_checker/triage_screen. import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection.dart'; import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart'; import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/call_screen.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/water_consumption_screen.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/water_monitor_settings_screen.dart'; import 'package:hmg_patient_app_new/splashPage.dart'; class AppRoutes { @@ -42,6 +44,10 @@ class AppRoutes { //appointments static const String bookAppointmentPage = '/bookAppointmentPage'; + // Water Monitor + static const String waterConsumptionScreen = '/waterConsumptionScreen'; + static const String waterMonitorSettingsScreen = '/waterMonitorSettingsScreen'; + // Symptoms Checker static const String organSelectorPage = '/organSelectorPage'; static const String symptomsSelectorScreen = '/symptomsCheckerScreen'; @@ -77,9 +83,8 @@ class AppRoutes { userInfoFlowManager: (context) => UserInfoFlowManager(), smartWatches: (context) => SmartwatchInstructionsPage(), huaweiHealthExample: (context) => HuaweiHealthExample(), - - // - healthCalculatorsPage: (context) => HealthCalculatorsPage() - + healthCalculatorsPage: (context) => HealthCalculatorsPage(), + waterConsumptionScreen: (context) => WaterConsumptionScreen(), + waterMonitorSettingsScreen: (context) => WaterMonitorSettingsScreen(), }; } diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index d0db6a5..4494ce4 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -8,6 +8,7 @@ class AppColors { static const bottomSheetBgColor = Color(0xFFF8F8FA); static const lightGreyEFColor = Color(0xffeaeaff); static const greyF7Color = Color(0xffF7F7F7); + static const greyInfoTextColor = Color(0xff777777); static const lightGrayColor = Color(0xff808080); static const greyTextColorLight = Color(0xFFA2A2A2); @@ -32,6 +33,7 @@ class AppColors { static const Color inputLabelTextColor = Color(0xff898A8D); static const Color greyTextColor = Color(0xFF8F9AA3); static const Color lightGrayBGColor = Color(0x142E3039); + static const Color checkBoxBorderColor = Color(0xffD2D2D2); static const Color pharmacyBGColor = Color(0xFF359846); @@ -42,6 +44,7 @@ class AppColors { //Chips static const Color successColor = Color(0xff18C273); + static const Color successLightBgColor = Color(0xffDDF6EA); static const Color errorColor = Color(0xFFED1C2B); static const Color alertColor = Color(0xFFD48D05); static const Color infoColor = Color(0xFF0B85F7); @@ -96,4 +99,9 @@ class AppColors { static const Color eReferralCardColor = Color(0xFFFF8012); static const Color bloodDonationCardColor = Color(0xFFFF5662); static const Color bookAppointment = Color(0xFF415364); + + // Water Monitor + static const Color blueColor = Color(0xFF4EB5FF); + static const Color blueGradientColorOne = Color(0xFFF1F7FD); + static const Color blueGradientColorTwo = Color(0xFFD9EFFF); } diff --git a/lib/widgets/buttons/custom_button.dart b/lib/widgets/buttons/custom_button.dart index 676f0bc..08d281f 100644 --- a/lib/widgets/buttons/custom_button.dart +++ b/lib/widgets/buttons/custom_button.dart @@ -75,7 +75,7 @@ class CustomButton extends StatelessWidget { children: [ if (icon != null) Padding( - padding: text.isNotEmpty ? EdgeInsets.only(right: 6.w, left: 6.w) : EdgeInsets.zero, + padding: text.isNotEmpty ? EdgeInsets.only(right: 8.w, left: 8.w) : EdgeInsets.zero, child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconS, height: iconS), ), Visibility( From f886357bcdafce17d95ea0b6aab7aa995171608d Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 24 Dec 2025 11:30:34 +0300 Subject: [PATCH 37/55] updates --- lib/core/api_consts.dart | 2 +- lib/features/payfort/payfort_view_model.dart | 4 ++-- .../appointment_checkin_bottom_sheet.dart | 10 ++++---- .../immediate_livecare_payment_details.dart | 24 +++++++++++++++---- lib/presentation/home/landing_page.dart | 19 +++++++-------- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 1f92ad5..9bab873 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -700,7 +700,7 @@ var GET_PRESCRIPTION_INSTRUCTIONS_PDF = 'Services/ChatBot_Service.svc/REST/Chatb class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/features/payfort/payfort_view_model.dart b/lib/features/payfort/payfort_view_model.dart index db8209a..dda8f51 100644 --- a/lib/features/payfort/payfort_view_model.dart +++ b/lib/features/payfort/payfort_view_model.dart @@ -110,7 +110,7 @@ class PayfortViewModel extends ChangeNotifier { onError!(failure.message); }, (apiResponse) { - log(apiResponse.data); + log(apiResponse.data.toString()); if (onSuccess != null) { onSuccess(apiResponse); } @@ -134,7 +134,7 @@ class PayfortViewModel extends ChangeNotifier { onError!(failure.message); }, (apiResponse) { - log(apiResponse.data); + log(apiResponse.data.toString()); if (onSuccess != null) { onSuccess(apiResponse); } diff --git a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart index 5b1d1cd..9113ba3 100644 --- a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart +++ b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart @@ -60,7 +60,7 @@ class AppointmentCheckinBottomSheet extends StatelessWidget { double dist = Utils.distance(value.latitude, value.longitude, double.parse(projectDetailListModel.latitude!), double.parse(projectDetailListModel.longitude!)).ceilToDouble() * 1000; print(dist); if (dist <= projectDetailListModel.geofenceRadius!) { - sendCheckInRequest(projectDetailListModel.checkInQrCode!, context); + sendCheckInRequest(projectDetailListModel.checkInQrCode!, 3, context); } else { showCommonBottomSheetWithoutHeight(context, title: "Error".needTranslation, @@ -79,7 +79,7 @@ class AppointmentCheckinBottomSheet extends StatelessWidget { Future.delayed(const Duration(milliseconds: 500), () { showNfcReader(context, onNcfScan: (String nfcId) { Future.delayed(const Duration(milliseconds: 100), () { - sendCheckInRequest(nfcId, context); + sendCheckInRequest(nfcId, 1, context); }); }, onCancel: () {}); }); @@ -92,7 +92,7 @@ class AppointmentCheckinBottomSheet extends StatelessWidget { ).onPress(() async { String onlineCheckInQRCode = (await BarcodeScanner.scan().then((value) => value.rawContent)); if (onlineCheckInQRCode != "") { - sendCheckInRequest(onlineCheckInQRCode, context); + sendCheckInRequest(onlineCheckInQRCode, 2, context); } else {} }), ], @@ -140,12 +140,12 @@ class AppointmentCheckinBottomSheet extends StatelessWidget { ); } - void sendCheckInRequest(String scannedCode, BuildContext context) async { + void sendCheckInRequest(String scannedCode, int checkInType, BuildContext context) async { LoaderBottomSheet.showLoader(loadingText: "Processing Check-In...".needTranslation); await myAppointmentsViewModel.sendCheckInNfcRequest( patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, scannedCode: scannedCode, - checkInType: 2, + checkInType: checkInType, onSuccess: (apiResponse) { LoaderBottomSheet.hideLoader(); showCommonBottomSheetWithoutHeight(context, title: "Success".needTranslation, child: Utils.getSuccessWidget(loadingText: LocaleKeys.success.tr()), callBackFunc: () async { diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart index 2877b27..d54042e 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart @@ -322,15 +322,29 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget { } Future askVideoCallPermission() async { - Map statuses = await [Permission.camera, Permission.microphone, Permission.notification].request(); + bool hasPermission = false; + if (Platform.isIOS) { + Map statuses = await [Permission.camera, Permission.microphone].request(); - if (statuses[Permission.camera] == PermissionStatus.granted && statuses[Permission.microphone] == PermissionStatus.granted && statuses[Permission.notification] == PermissionStatus.granted) { - // Camera permission granted - return true; + if (statuses[Permission.camera] == PermissionStatus.granted && statuses[Permission.microphone] == PermissionStatus.granted) { + // Camera permission granted + hasPermission = true; + } else { + hasPermission = false; + } } else { - return false; + Map statuses = await [Permission.camera, Permission.microphone, Permission.notification].request(); + + if (statuses[Permission.camera] == PermissionStatus.granted && statuses[Permission.microphone] == PermissionStatus.granted && statuses[Permission.notification] == PermissionStatus.granted) { + // Camera permission granted + hasPermission = true; + } else { + hasPermission = false; + } } + return hasPermission; + // if (!(await Permission.camera.request().isGranted) || !(await Permission.microphone.request().isGranted)) { // return false; // } diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index fc50d02..64884e5 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -405,15 +405,15 @@ class _LandingPageState extends State { SizedBox(height: 10.h), "Hala ${appState.getAuthenticatedUser()!.firstName}!!!".needTranslation.toText16(isBold: true), SizedBox(height: 8.h), - "Your turn is after ${immediateLiveCareVM.patientLiveCareHistoryList[0].patCount} patients.".toText14(isBold: true), - SizedBox(height: 8.h), - Column( + "Your turn is after ${immediateLiveCareVM.patientLiveCareHistoryList[0].patCount} patients.".needTranslation.toText14(isBold: true), + SizedBox(height: 8.h), + Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Expected waiting time: ".toText12(isBold: true), - SizedBox(height: 8.h), - ValueListenableBuilder( - valueListenable: immediateLiveCareVM.durationNotifier, + "Expected waiting time: ".needTranslation.toText12(isBold: true), + SizedBox(height: 7.h), + ValueListenableBuilder( + valueListenable: immediateLiveCareVM.durationNotifier, builder: (context, duration, child) { return Column( mainAxisAlignment: MainAxisAlignment.center, @@ -423,9 +423,8 @@ class _LandingPageState extends State { ); }, ), - SizedBox(height: 12.h), - ], - ), + ], + ), // CustomButton( // text: "View Details".needTranslation, // onPressed: () async { From 3cc2610d30fd8a031d34f298735763da94f15764 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 28 Dec 2025 10:39:53 +0300 Subject: [PATCH 38/55] updates --- lib/features/blood_donation/blood_donation_repo.dart | 1 + lib/presentation/hmg_services/services_page.dart | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/features/blood_donation/blood_donation_repo.dart b/lib/features/blood_donation/blood_donation_repo.dart index 84997b2..dce0975 100644 --- a/lib/features/blood_donation/blood_donation_repo.dart +++ b/lib/features/blood_donation/blood_donation_repo.dart @@ -66,6 +66,7 @@ class BloodDonationRepoImp implements BloodDonationRepo { await apiClient.post( GET_BLOOD_REQUEST, body: mapDevice, + isAllowAny: true, onFailure: (error, statusCode, {messageStatus, failureType}) { failure = failureType; }, diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 8b10ab0..ae78973 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -86,14 +86,16 @@ class ServicesPage extends StatelessWidget { route: null, onTap: () async { LoaderBottomSheet.showLoader(loadingText: "Fetching Data..."); await bloodDonationViewModel.getRegionSelectedClinics(onSuccess: (val) async { - await bloodDonationViewModel.getPatientBloodGroupDetails(onSuccess: (val) { + // 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(); }); From 135b05e561646c0798f8a1ed3bc8cb8ef855b2cb Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Sun, 28 Dec 2025 15:51:48 +0300 Subject: [PATCH 39/55] Health calculators & converters --- lib/core/api_consts.dart | 2 +- lib/core/app_state.dart | 2 - lib/core/exceptions/api_exception.dart | 2 - lib/core/utils/doctor_response_mapper.dart | 2 - lib/core/utils/push_notification_handler.dart | 2 - lib/core/utils/size_config.dart | 1 - lib/extensions/int_extensions.dart | 1 - .../authentication/authentication_repo.dart | 2 - .../authentication_view_model.dart | 1 - .../book_appointments_repo.dart | 51 ++- .../book_appointments_view_model.dart | 118 ++++--- .../doctors_list_response_model.dart | 147 ++++----- .../hmg_services/hmg_services_repo.dart | 1 - .../ui_models/e_referral_form_model.dart | 1 - .../insurance/insurance_view_model.dart | 1 - lib/features/lab/lab_view_model.dart | 2 - .../medical_file/medical_file_repo.dart | 1 - .../medical_file/medical_file_view_model.dart | 1 - .../appointment_rating_view_model.dart | 1 - .../appointment_via_region_viewmodel.dart | 1 - .../my_appointments/my_appointments_repo.dart | 1 - .../prescriptions_view_model.dart | 2 - .../health_service.dart | 2 - .../appointment_details_page.dart | 5 - .../widgets/AppointmentFilter.dart | 1 - .../widgets/appointment_card.dart | 1 - .../appointment_checkin_bottom_sheet.dart | 2 - .../ask_doctor_request_type_select.dart | 1 - .../facility_selection_item.dart | 2 - .../facility_type_selection_widget.dart | 2 - ...l_bottom_sheet_body_for_doctor_filter.dart | 7 - .../hospital_list_items.dart | 1 - .../type_selection_widget.dart | 1 - .../region_bottomsheet/region_list_item.dart | 1 - .../region_list_widget.dart | 1 - .../widgets/select_blood_group_widget.dart | 1 - .../widgets/select_city_widget.dart | 2 - .../widgets/select_gender_widget.dart | 1 - .../doctor_filter/RegionChips.dart | 2 - .../doctor_filter/clinic_bottomsheet.dart | 10 - .../doctor_filter/doctors_filter.dart | 1 - .../doctor_filter/facility_Chips.dart | 2 - .../book_appointment/doctor_profile_page.dart | 5 - .../laser/laser_appointment.dart | 1 - .../laser/widgets/body_type_listing.dart | 1 - .../immediate_livecare_payment_details.dart | 1 - .../immediate_livecare_payment_page.dart | 5 - ...mediate_livecare_pending_request_page.dart | 3 - .../widgets/livecare_clinic_card.dart | 1 - .../widgets/select_livecare_call_type.dart | 3 - .../review_appointment_page.dart | 1 - .../search_doctor_by_name.dart | 3 - .../book_appointment/select_clinic_page.dart | 16 +- .../book_appointment/select_doctor_page.dart | 106 +++++-- ...ting_appointment_online_checkin_sheet.dart | 1 - .../widgets/appointment_calendar.dart | 2 - .../book_appointment/widgets/doctor_card.dart | 4 +- .../contact_us/feedback_page.dart | 3 - lib/presentation/contact_us/find_us_page.dart | 3 - .../contact_us/widgets/find_us_item_card.dart | 2 - .../e_referral/e_referral_form_manager.dart | 1 - .../e_referral/e_referral_search_result.dart | 1 - .../widget/e_referral_other_details.dart | 1 - .../RRT/rrt_map_screen.dart | 3 - .../RRT/rrt_request_type_select.dart | 3 - .../RRT/terms_and_condition.dart | 4 - .../requesting_services_page.dart | 5 - .../widgets/HospitalBottomSheetBody.dart | 9 - ...mbulance_option_selection_bottomsheet.dart | 3 - .../widgets/appointment_bottom_sheet.dart | 5 - .../widgets/type_selection_widget.dart | 3 - .../er_online_checkin_home.dart | 1 - ...r_online_checkin_payment_details_page.dart | 1 - ...e_checkin_select_checkin_bottom_sheet.dart | 8 - .../history/er_history_listing.dart | 2 - .../history/widget/rrt_item.dart | 1 - .../emergency_services/nearest_er_page.dart | 1 - .../widgets/location_input_bottom_sheet.dart | 1 - .../widgets/select_hospital_bottom_sheet.dart | 11 - .../health_calculator_detailed_page.dart | 79 ++++- .../health_calculators_page.dart | 22 +- .../widgets/bf.dart | 1 - .../widgets/bmr.dart | 1 - .../widgets/calories.dart | 1 - .../widgets/health_card.dart | 3 - .../home/data/landing_page_data.dart | 1 - lib/presentation/home/landing_page.dart | 2 - .../home/widgets/habib_wallet_card.dart | 1 - .../home/widgets/large_service_card.dart | 1 - .../home/widgets/small_service_card.dart | 1 - .../home/widgets/welcome_widget.dart | 2 - .../insurance/insurance_home_page.dart | 2 - .../widgets/insurance_approval_card.dart | 3 - .../insurance/widgets/insurance_history.dart | 1 - .../insurance_update_details_card.dart | 2 - lib/presentation/lab/alphabeticScroll.dart | 1 - lib/presentation/lab/lab_order_by_test.dart | 2 - lib/presentation/lab/lab_orders_page.dart | 2 +- .../lab/lab_result_item_view.dart | 1 - .../LabResultByClinic.dart | 1 - .../lab_order_result_item.dart | 5 - .../lab/lab_results/lab_result_list_item.dart | 1 - lib/presentation/lab/search_lab_report.dart | 1 - .../eye_measurement_details_page.dart | 1 - .../medical_file/medical_file_page.dart | 1 - .../widgets/patient_sick_leave_card.dart | 1 - .../widgets/patient_medical_report_card.dart | 2 - lib/presentation/my_family/my_family.dart | 6 - .../onboarding/splash_animation_screen.dart | 2 - ...rescription_delivery_orders_list_page.dart | 1 - .../prescriptions_list_page.dart | 298 +++++++++--------- .../radiology/radiology_result_page.dart | 1 - .../radiology/search_radiology.dart | 1 - .../rate_appointment_clinic.dart | 1 - .../rate_appointment_doctor.dart | 4 - .../rate_appointment/widget/doctor_row.dart | 2 - .../health_dashboard/health_dashboard.dart | 3 - .../smartwatch_instructions_page.dart | 2 - .../smartwatches/widgets/health_metric.dart | 2 - .../tele_consultation/zoom/call_screen.dart | 2 - .../ancillary_procedures_details_page.dart | 1 - lib/services/analytics/analytics_service.dart | 4 - .../analytics/flows/advance_payments.dart | 1 - .../analytics/flows/appointments.dart | 3 - lib/services/analytics/flows/live_care.dart | 1 - .../analytics/flows/login_registration.dart | 1 - lib/splashPage.dart | 7 - lib/widgets/appbar/collapsing_list_view.dart | 2 - .../date_range_calender.dart | 1 - .../viewmodel/date_range_view_model.dart | 1 - lib/widgets/datepicker_widget.dart | 1 - .../family_files/family_file_add_widget.dart | 1 - lib/widgets/loading_dialog.dart | 3 - lib/widgets/map/HMSMap.dart | 2 - lib/widgets/map/gms_map.dart | 2 - 135 files changed, 503 insertions(+), 609 deletions(-) diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 9bab873..1f92ad5 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -700,7 +700,7 @@ var GET_PRESCRIPTION_INSTRUCTIONS_PDF = 'Services/ChatBot_Service.svc/REST/Chatb class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/core/app_state.dart b/lib/core/app_state.dart index c8659a7..171a8ba 100644 --- a/lib/core/app_state.dart +++ b/lib/core/app_state.dart @@ -4,10 +4,8 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:gms_check/gms_check.dart'; import 'package:hmg_patient_app_new/core/common_models/privilege/HMCProjectListModel.dart'; -import 'package:hmg_patient_app_new/core/common_models/privilege/PrivilegeModel.dart'; import 'package:hmg_patient_app_new/core/common_models/privilege/ProjectDetailListModel.dart'; import 'package:hmg_patient_app_new/core/common_models/privilege/VidaPlusProjectListModel.dart'; -import 'package:hmg_patient_app_new/features/authentication/models/request_models/send_activation_request_model.dart'; import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_user_staus_nhic_response_model.dart'; import 'package:hmg_patient_app_new/features/authentication/models/resp_models/select_device_by_imei.dart'; diff --git a/lib/core/exceptions/api_exception.dart b/lib/core/exceptions/api_exception.dart index eb11b71..eb0258f 100644 --- a/lib/core/exceptions/api_exception.dart +++ b/lib/core/exceptions/api_exception.dart @@ -1,7 +1,5 @@ import 'dart:convert'; -import 'package:equatable/equatable.dart'; -import 'package:hmg_patient_app_new/core/api/api_client.dart'; class APIException implements Exception { static const String BAD_REQUEST = 'api_common_bad_request'; diff --git a/lib/core/utils/doctor_response_mapper.dart b/lib/core/utils/doctor_response_mapper.dart index 994e9a1..05ed2fd 100644 --- a/lib/core/utils/doctor_response_mapper.dart +++ b/lib/core/utils/doctor_response_mapper.dart @@ -1,7 +1,5 @@ import 'dart:math'; -import 'package:hmg_patient_app_new/core/cache_consts.dart' show CacheConst; -import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart' show RegionList, PatientDoctorAppointmentList, DoctorList, PatientDoctorAppointmentListByRegion; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart' show HospitalsModel; diff --git a/lib/core/utils/push_notification_handler.dart b/lib/core/utils/push_notification_handler.dart index ee05335..a96b805 100644 --- a/lib/core/utils/push_notification_handler.dart +++ b/lib/core/utils/push_notification_handler.dart @@ -18,10 +18,8 @@ import 'package:flutter_ios_voip_kit_karmm/flutter_ios_voip_kit.dart'; // import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:get_it/get_it.dart'; import 'package:hmg_patient_app_new/core/utils/local_notifications.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; -import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:uuid/uuid.dart'; diff --git a/lib/core/utils/size_config.dart b/lib/core/utils/size_config.dart index 9f9d835..0f8766a 100644 --- a/lib/core/utils/size_config.dart +++ b/lib/core/utils/size_config.dart @@ -1,6 +1,5 @@ import 'package:flutter/cupertino.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; -import 'package:hmg_patient_app_new/core/cache_consts.dart'; class SizeConfig { static double _blockWidth = 0; diff --git a/lib/extensions/int_extensions.dart b/lib/extensions/int_extensions.dart index 80b3171..75460c5 100644 --- a/lib/extensions/int_extensions.dart +++ b/lib/extensions/int_extensions.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/theme/colors.dart'; extension IntExtensions on int { Widget get height => SizedBox(height: toDouble()); diff --git a/lib/features/authentication/authentication_repo.dart b/lib/features/authentication/authentication_repo.dart index 47af20b..4a1517c 100644 --- a/lib/features/authentication/authentication_repo.dart +++ b/lib/features/authentication/authentication_repo.dart @@ -5,10 +5,8 @@ import 'package:hmg_patient_app_new/core/api/api_client.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; -import 'package:hmg_patient_app_new/core/common_models/privilege/PrivilegeModel.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; -import 'package:hmg_patient_app_new/features/authentication/models/request_models/check_activation_code_register_request_model.dart'; import 'package:hmg_patient_app_new/features/authentication/models/resp_models/select_device_by_imei.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index faedcd8..46649fb 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -27,7 +27,6 @@ import 'package:hmg_patient_app_new/features/authentication/models/resp_models/a import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_activation_code_resp_model.dart'; import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_user_staus_nhic_response_model.dart'; import 'package:hmg_patient_app_new/features/authentication/models/resp_models/select_device_by_imei.dart'; -import 'package:hmg_patient_app_new/features/medical_file/medical_file_repo.dart'; import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; diff --git a/lib/features/book_appointments/book_appointments_repo.dart b/lib/features/book_appointments/book_appointments_repo.dart index 3683d57..f6e83ff 100644 --- a/lib/features/book_appointments/book_appointments_repo.dart +++ b/lib/features/book_appointments/book_appointments_repo.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:dartz/dartz.dart'; import 'package:hmg_patient_app_new/core/api/api_client.dart'; @@ -26,9 +25,12 @@ abstract class BookAppointmentsRepo { Future>>> getDoctorsList(int clinicID, int projectID, bool isNearest, int doctorId, String doctorName, {isContinueDentalPlan = false}); + Future>>> getDoctorsListByHealthCal(int calculationID); + Future>> getDoctorProfile(int clinicID, int projectID, int doctorId, {Function(dynamic)? onSuccess, Function(String)? onError}); - Future>> getDoctorFreeSlots(int clinicID, int projectID, int doctorId, bool isBookingForLiveCare, {bool continueDentalPlan = false, Function(dynamic)? onSuccess, Function(String)? onError}); + Future>> getDoctorFreeSlots(int clinicID, int projectID, int doctorId, bool isBookingForLiveCare, + {bool continueDentalPlan = false, Function(dynamic)? onSuccess, Function(String)? onError}); Future>> cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}); @@ -83,8 +85,7 @@ abstract class BookAppointmentsRepo { Future>>> getDentalChiefComplaintDoctorsList(int projectID, int chiefComplaintID, {Function(dynamic)? onSuccess, Function(String)? onError}); - Future>>> getLaserClinics(int laserCategoryID, int projectID, int languageID, - {Function(dynamic)? onSuccess, Function(String)? onError}); + Future>>> getLaserClinics(int laserCategoryID, int projectID, int languageID, {Function(dynamic)? onSuccess, Function(String)? onError}); Future>> checkScannedNFCAndQRCode(String nfcCode, int projectId, {Function(dynamic)? onSuccess, Function(String)? onError}); @@ -206,6 +207,45 @@ class BookAppointmentsRepoImp implements BookAppointmentsRepo { } } + @override + Future>>> getDoctorsListByHealthCal(int calculationID, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + Map mapDevice = {"CalculationID": calculationID}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_DOCTOR_LIST_CALCULATION, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + onError!(error); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_CalculationTable']; + + final doctorsList = list.map((item) => DoctorsListResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: doctorsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + @override Future>> getDoctorProfile(int clinicID, int projectID, int doctorId, {Function(dynamic)? onSuccess, Function(String)? onError}) async { Map mapDevice = { @@ -824,7 +864,8 @@ class BookAppointmentsRepoImp implements BookAppointmentsRepo { } @override - Future>>> getLaserClinics(int laserCategoryID, int projectID, int languageID, {Function(dynamic p1)? onSuccess, Function(String p1)? onError}) async { + Future>>> getLaserClinics(int laserCategoryID, int projectID, int languageID, + {Function(dynamic p1)? onSuccess, Function(String p1)? onError}) async { Map mapDevice = { "LaserCategoryID": laserCategoryID, "ProjectID": projectID, diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index d96cb4f..3a58571 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -46,6 +46,9 @@ class BookAppointmentsViewModel extends ChangeNotifier { bool isDoctorSearchByNameStarted = false; bool isLiveCareSchedule = false; + bool isGetDocForHealthCal = false; + int? calculationID = 0; + bool isSortByClinic = true; int initialSlotDuration = 0; @@ -143,6 +146,17 @@ class BookAppointmentsViewModel extends ChangeNotifier { bool isBodyPartsLoading = false; int duration = 0; + + setIsSortByClinic(bool value) { + isSortByClinic = value; + if (isSortByClinic) { + doctorsList.sort((a, b) => a.clinicName!.compareTo(b.clinicName!)); + } else { + doctorsList.sort((a, b) => a.projectName!.compareTo(b.projectName!)); + } + notifyListeners(); + } + BookAppointmentsViewModel( {required this.bookAppointmentsRepo, required this.errorHandlerService, @@ -280,6 +294,8 @@ class BookAppointmentsViewModel extends ChangeNotifier { } void onTabChanged(int index) { + calculationID = null; + isGetDocForHealthCal = false; selectedTabIndex = index; notifyListeners(); } @@ -319,8 +335,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { Future getLiveCareScheduleClinics({Function(dynamic)? onSuccess, Function(String)? onError}) async { liveCareClinicsList.clear(); - final result = - await bookAppointmentsRepo.getLiveCareScheduleClinics(_appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!); + final result = await bookAppointmentsRepo.getLiveCareScheduleClinics(_appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), @@ -342,9 +357,8 @@ class BookAppointmentsViewModel extends ChangeNotifier { Future getLiveCareDoctorsList({Function(dynamic)? onSuccess, Function(String)? onError}) async { doctorsList.clear(); - final result = await bookAppointmentsRepo.getLiveCareDoctorsList( - selectedLiveCareClinic.serviceID!, _appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!, - onError: onError); + final result = + await bookAppointmentsRepo.getLiveCareDoctorsList(selectedLiveCareClinic.serviceID!, _appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!, onError: onError); result.fold( (failure) async { @@ -367,11 +381,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { } //TODO: Make the API dynamic with parameters for ProjectID, isNearest, languageID, doctorId, doctorName - Future getDoctorsList( - {int projectID = 0, bool isNearest = true, int doctorId = 0, - String doctorName = "", - Function(dynamic)? onSuccess, - Function(String)? onError}) async { + Future getDoctorsList({int projectID = 0, bool isNearest = true, int doctorId = 0, String doctorName = "", Function(dynamic)? onSuccess, Function(String)? onError}) async { doctorsList.clear(); projectID = currentlySelectedHospitalFromRegionFlow != null ? int.parse(currentlySelectedHospitalFromRegionFlow!) : projectID; final result = @@ -403,14 +413,39 @@ class BookAppointmentsViewModel extends ChangeNotifier { ); } + //TODO: GetDockets & Calculations For Health Calculator + Future getDoctorsListByHealthCal({Function(dynamic)? onSuccess, Function(String)? onError}) async { + doctorsList.clear(); + final result = await bookAppointmentsRepo.getDoctorsListByHealthCal(calculationID!); + result.fold( + (failure) async { + isDoctorsListLoading = false; + if (onError != null) onError("No doctors found for the search criteria".needTranslation); + + notifyListeners(); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + doctorsList = apiResponse.data!; + setIsSortByClinic(true); + filteredDoctorList = doctorsList; + isDoctorsListLoading = false; + initializeFilteredList(); + clearSearchFilters(); + getFiltersFromDoctorList(); + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + Future getMappedDoctors( - {int projectID = 0, - bool isNearest = false, - int doctorId = 0, - String doctorName = "", - isContinueDentalPlan = false, - Function(dynamic)? onSuccess, - Function(String)? onError}) async { + {int projectID = 0, bool isNearest = false, int doctorId = 0, String doctorName = "", isContinueDentalPlan = false, Function(dynamic)? onSuccess, Function(String)? onError}) async { filteredHospitalList = null; hospitalList = null; isRegionListLoading = true; @@ -446,8 +481,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { } Future getDoctorProfile({Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await bookAppointmentsRepo - .getDoctorProfile(selectedDoctor.clinicID ?? 0, selectedDoctor.projectID ?? 0, selectedDoctor.doctorID ?? 0, onError: onError); + final result = await bookAppointmentsRepo.getDoctorProfile(selectedDoctor.clinicID ?? 0, selectedDoctor.projectID ?? 0, selectedDoctor.doctorID ?? 0, onError: onError); result.fold( (failure) async {}, @@ -506,8 +540,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { // : date = DateUtil.convertStringToDateSaudiTimezone(element, int.parse(selectedDoctor.projectID.toString())); slotsList.add(FreeSlot(date, ['slot'])); - docFreeSlots.add(TimeSlot( - isoTime: formatter.format(date), start: new DateTime(date.year, date.month, date.day, 0, 0, 0, 0), end: date, vidaDate: element)); + docFreeSlots.add(TimeSlot(isoTime: formatter.format(date), start: new DateTime(date.year, date.month, date.day, 0, 0, 0, 0), end: date, vidaDate: element)); }); notifyListeners(); @@ -526,8 +559,8 @@ class BookAppointmentsViewModel extends ChangeNotifier { final DateFormat dateFormatter = DateFormat('yyyy-MM-dd'); Map _eventsParsed; - final result = await bookAppointmentsRepo.getLiveCareDoctorFreeSlots(selectedDoctor.clinicID ?? 0, selectedLiveCareClinic.serviceID ?? 0, - selectedDoctor.projectID ?? 0, selectedDoctor.doctorID ?? 0, isBookingForLiveCare, + final result = await bookAppointmentsRepo.getLiveCareDoctorFreeSlots( + selectedDoctor.clinicID ?? 0, selectedLiveCareClinic.serviceID ?? 0, selectedDoctor.projectID ?? 0, selectedDoctor.doctorID ?? 0, isBookingForLiveCare, onError: onError); result.fold( @@ -551,8 +584,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { // : date = DateUtil.convertStringToDateSaudiTimezone(element, int.parse(selectedDoctor.projectID.toString())); slotsList.add(FreeSlot(date, ['slot'])); - docFreeSlots.add(TimeSlot( - isoTime: formatter.format(date), start: new DateTime(date.year, date.month, date.day, 0, 0, 0, 0), end: date, vidaDate: element)); + docFreeSlots.add(TimeSlot(isoTime: formatter.format(date), start: new DateTime(date.year, date.month, date.day, 0, 0, 0, 0), end: date, vidaDate: element)); }); notifyListeners(); @@ -564,10 +596,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { ); } - Future cancelAppointment( - {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, - Function(dynamic)? onSuccess, - Function(String)? onError}) async { + Future cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await bookAppointmentsRepo.cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); result.fold( @@ -651,15 +680,13 @@ class BookAppointmentsViewModel extends ChangeNotifier { await cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel).then((val) async { navigationService.pop(); Future.delayed(Duration(milliseconds: 50)).then((value) async {}); - LoadingUtils.showFullScreenLoader( - barrierDismissible: true, isSuccessDialog: false, loadingText: "Booking your appointment...".needTranslation); + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: false, loadingText: "Booking your appointment...".needTranslation); await insertSpecificAppointment( onError: (err) {}, onSuccess: (apiResp) async { LoadingUtils.hideFullScreenLoader(); await Future.delayed(Duration(milliseconds: 50)).then((value) async { - LoadingUtils.showFullScreenLoader( - barrierDismissible: true, isSuccessDialog: true, loadingText: LocaleKeys.appointmentSuccess.tr()); + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: true, loadingText: LocaleKeys.appointmentSuccess.tr()); await Future.delayed(Duration(milliseconds: 4000)).then((value) { LoadingUtils.hideFullScreenLoader(); Navigator.pushAndRemoveUntil( @@ -749,15 +776,13 @@ class BookAppointmentsViewModel extends ChangeNotifier { await cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel).then((val) async { navigationService.pop(); Future.delayed(Duration(milliseconds: 50)).then((value) async {}); - LoadingUtils.showFullScreenLoader( - barrierDismissible: true, isSuccessDialog: false, loadingText: "Booking your appointment...".needTranslation); + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: false, loadingText: "Booking your appointment...".needTranslation); await insertSpecificAppointment( onError: (err) {}, onSuccess: (apiResp) async { LoadingUtils.hideFullScreenLoader(); await Future.delayed(Duration(milliseconds: 50)).then((value) async { - LoadingUtils.showFullScreenLoader( - barrierDismissible: true, isSuccessDialog: true, loadingText: LocaleKeys.appointmentSuccess.tr()); + LoadingUtils.showFullScreenLoader(barrierDismissible: true, isSuccessDialog: true, loadingText: LocaleKeys.appointmentSuccess.tr()); await Future.delayed(Duration(milliseconds: 4000)).then((value) { LoadingUtils.hideFullScreenLoader(); Navigator.pushAndRemoveUntil( @@ -831,9 +856,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { } else { filteredHospitalList = RegionList(); - var list = isHMG - ? hospitalList?.registeredDoctorMap![selectedRegionId]!.hmgDoctorList - : hospitalList?.registeredDoctorMap![selectedRegionId]!.hmcDoctorList; + var list = isHMG ? hospitalList?.registeredDoctorMap![selectedRegionId]!.hmgDoctorList : hospitalList?.registeredDoctorMap![selectedRegionId]!.hmcDoctorList; if (list != null && list.isEmpty) { notifyListeners(); @@ -916,8 +939,8 @@ class BookAppointmentsViewModel extends ChangeNotifier { notifyListeners(); } - void setSelections(List? selectedFacilityForFilters, List? selectedRegionForFilters, String? selectedClinicForFilters, - PatientDoctorAppointmentList? selectedHospitalForFilters, bool applyFilters) { + void setSelections( + List? selectedFacilityForFilters, List? selectedRegionForFilters, String? selectedClinicForFilters, PatientDoctorAppointmentList? selectedHospitalForFilters, bool applyFilters) { this.selectedFacilityForFilters = selectedFacilityForFilters; this.selectedClinicForFilters = selectedClinicForFilters; this.selectedHospitalForFilters = selectedHospitalForFilters; @@ -985,15 +1008,11 @@ class BookAppointmentsViewModel extends ChangeNotifier { List getDoctorListAsPerSelection() { if (!applyFilters) return doctorsList; - if ((selectedRegionForFilters?.isEmpty == true) && - (selectedFacilityForFilters?.isEmpty == true) && - selectedClinicForFilters == null && - selectedHospitalForFilters == null) { + if ((selectedRegionForFilters?.isEmpty == true) && (selectedFacilityForFilters?.isEmpty == true) && selectedClinicForFilters == null && selectedHospitalForFilters == null) { return doctorsList; } var list = doctorsList.where((element) { - var isInSelectedRegion = - (selectedRegionForFilters?.isEmpty == true) ? true : selectedRegionForFilters?.any((region) => region == element.getRegionName(isArabic())); + var isInSelectedRegion = (selectedRegionForFilters?.isEmpty == true) ? true : selectedRegionForFilters?.any((region) => region == element.getRegionName(isArabic())); var shouldApplyFacilityFilter = (selectedFacilityForFilters?.isEmpty == true) ? false : true; var isHMC = (selectedFacilityForFilters?.isEmpty == true) ? true : selectedFacilityForFilters?.any((item) => item.contains("hmc")); var isInSelectedClinic = (selectedClinicForFilters == null) ? true : selectedClinicForFilters == element.clinicName; @@ -1044,8 +1063,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { dentalChiefComplaintsList.clear(); notifyListeners(); int patientID = _appState.isAuthenticated ? _appState.getAuthenticatedUser()!.patientId ?? -1 : -1; - final result = await bookAppointmentsRepo.getDentalChiefComplaintsList( - patientID: patientID, projectID: int.parse(currentlySelectedHospitalFromRegionFlow ?? "0"), clinicID: 17); + final result = await bookAppointmentsRepo.getDentalChiefComplaintsList(patientID: patientID, projectID: int.parse(currentlySelectedHospitalFromRegionFlow ?? "0"), clinicID: 17); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), diff --git a/lib/features/book_appointments/models/resp_models/doctors_list_response_model.dart b/lib/features/book_appointments/models/resp_models/doctors_list_response_model.dart index 5df6ed8..75ed122 100644 --- a/lib/features/book_appointments/models/resp_models/doctors_list_response_model.dart +++ b/lib/features/book_appointments/models/resp_models/doctors_list_response_model.dart @@ -65,75 +65,77 @@ class DoctorsListResponseModel { String? regionID; String? projectBottomName; String? projectTopName; + int? calcID; - - DoctorsListResponseModel( - {this.clinicID, - this.clinicName, - this.clinicNameN, - this.doctorTitle, - this.iD, - this.name, - this.projectID, - this.projectName, - this.actualDoctorRate, - this.clinicRoomNo, - this.date, - this.dayName, - this.decimalDoctorRate, - this.doctorAvailability, - this.doctorID, - this.doctorImageURL, - this.doctorMobileNumber, - this.doctorProfile, - this.doctorProfileInfo, - this.doctorRate, - this.doctorStarsRate, - this.employmentType, - this.gender, - this.genderDescription, - this.hISRegionId, - this.isActive, - this.isAllowWaitList, - this.isAppointmentAllowed, - this.isDoctorAllowVedioCall, - this.isDoctorDummy, - this.isDoctorHasPrePostImages, - this.isHMC, - this.isHmg, - this.isLiveCare, - this.latitude, - this.longitude, - this.nationalityFlagURL, - this.nationalityID, - this.nationalityName, - this.nearestFreeSlot, - this.noOfFreeSlotsAvailable, - this.noOfPatientsRate, - this.originalClinicID, - this.personRate, - this.projectDistanceInKiloMeters, - this.projectNameBottom, - this.projectNameTop, - this.qR, - this.qRString, - this.rateNumber, - this.regionName, - this.regionNameN, - this.serviceID, - this.setupID, - this.speciality, - this.specialityN, - this.transactionType, - this.virtualEmploymentType, - this.workingHours, - this.vida3Id, - this.region, - this.regionArabic, - this.regionEnglish, - this.regionID, - this.projectBottomName, - this.projectTopName,}); + DoctorsListResponseModel({ + this.clinicID, + this.clinicName, + this.clinicNameN, + this.doctorTitle, + this.iD, + this.name, + this.projectID, + this.projectName, + this.actualDoctorRate, + this.clinicRoomNo, + this.date, + this.dayName, + this.decimalDoctorRate, + this.doctorAvailability, + this.doctorID, + this.doctorImageURL, + this.doctorMobileNumber, + this.doctorProfile, + this.doctorProfileInfo, + this.doctorRate, + this.doctorStarsRate, + this.employmentType, + this.gender, + this.genderDescription, + this.hISRegionId, + this.isActive, + this.isAllowWaitList, + this.isAppointmentAllowed, + this.isDoctorAllowVedioCall, + this.isDoctorDummy, + this.isDoctorHasPrePostImages, + this.isHMC, + this.isHmg, + this.isLiveCare, + this.latitude, + this.longitude, + this.nationalityFlagURL, + this.nationalityID, + this.nationalityName, + this.nearestFreeSlot, + this.noOfFreeSlotsAvailable, + this.noOfPatientsRate, + this.originalClinicID, + this.personRate, + this.projectDistanceInKiloMeters, + this.projectNameBottom, + this.projectNameTop, + this.qR, + this.qRString, + this.rateNumber, + this.regionName, + this.regionNameN, + this.serviceID, + this.setupID, + this.speciality, + this.specialityN, + this.transactionType, + this.virtualEmploymentType, + this.workingHours, + this.vida3Id, + this.region, + this.regionArabic, + this.regionEnglish, + this.regionID, + this.projectBottomName, + this.projectTopName, + this.calcID, + }); DoctorsListResponseModel.fromJson(Map json) { clinicID = json['ClinicID']; @@ -141,7 +143,7 @@ class DoctorsListResponseModel { clinicNameN = json['ClinicNameN']; doctorTitle = json['DoctorTitle']; iD = json['ID']; - name = json['Name']; + name = json['Name'] ?? json["DoctorName"]; projectID = json['ProjectID']; projectName = json['ProjectName']; actualDoctorRate = json['ActualDoctorRate']; @@ -174,7 +176,7 @@ class DoctorsListResponseModel { longitude = json['Longitude']; nationalityFlagURL = json['NationalityFlagURL']; nationalityID = json['NationalityID']; - nationalityName = json['NationalityName']; + nationalityName = json['NationalityName'] ?? json["Nationality"]; nearestFreeSlot = json['NearestFreeSlot']; noOfFreeSlotsAvailable = json['NoOfFreeSlotsAvailable']; noOfPatientsRate = json['NoOfPatientsRate']; @@ -200,6 +202,7 @@ class DoctorsListResponseModel { regionEnglish = json['RegionName']; projectBottomName = json['ProjectNameBottom']; projectTopName = json['ProjectNameTop']; + calcID = json["CalcID"]; } Map toJson() { @@ -264,6 +267,7 @@ class DoctorsListResponseModel { data['VirtualEmploymentType'] = this.virtualEmploymentType; data['WorkingHours'] = this.workingHours; data['vida3Id'] = this.vida3Id; + data['CalcID'] = this.calcID; return data; } @@ -273,7 +277,8 @@ class DoctorsListResponseModel { } return regionEnglish; } - String getProjectCompleteName(){ + + String getProjectCompleteName() { return "${this.projectTopName} ${this.projectBottomName}"; } diff --git a/lib/features/hmg_services/hmg_services_repo.dart b/lib/features/hmg_services/hmg_services_repo.dart index 4103569..b2b3709 100644 --- a/lib/features/hmg_services/hmg_services_repo.dart +++ b/lib/features/hmg_services/hmg_services_repo.dart @@ -14,7 +14,6 @@ import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_services_resp_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; -import 'package:provider/provider.dart'; import 'models/req_models/create_e_referral_model.dart'; import 'models/req_models/send_activation_code_ereferral_req_model.dart'; diff --git a/lib/features/hmg_services/models/ui_models/e_referral_form_model.dart b/lib/features/hmg_services/models/ui_models/e_referral_form_model.dart index 32964b1..8be00d6 100644 --- a/lib/features/hmg_services/models/ui_models/e_referral_form_model.dart +++ b/lib/features/hmg_services/models/ui_models/e_referral_form_model.dart @@ -1,5 +1,4 @@ // models/referral_models.dart -import 'package:hmg_patient_app_new/core/common_models/nationality_country_model.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/create_e_referral_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_all_cities_resp_model.dart'; diff --git a/lib/features/insurance/insurance_view_model.dart b/lib/features/insurance/insurance_view_model.dart index 30f4c26..0bbdda2 100644 --- a/lib/features/insurance/insurance_view_model.dart +++ b/lib/features/insurance/insurance_view_model.dart @@ -5,7 +5,6 @@ import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patien import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_card_history.dart'; import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_details_response_model.dart'; import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_update_response_model.dart'; -import 'package:hmg_patient_app_new/features/lab/lab_repo.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; class InsuranceViewModel extends ChangeNotifier { diff --git a/lib/features/lab/lab_view_model.dart b/lib/features/lab/lab_view_model.dart index cd4065e..c29e62f 100644 --- a/lib/features/lab/lab_view_model.dart +++ b/lib/features/lab/lab_view_model.dart @@ -1,6 +1,5 @@ import 'dart:collection'; import 'dart:core'; -import 'dart:math'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -18,7 +17,6 @@ import 'package:hmg_patient_app_new/theme/colors.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:intl/intl.dart' show DateFormat; -import 'package:logger/logger.dart'; class LabViewModel extends ChangeNotifier { bool isLabOrdersLoading = false; diff --git a/lib/features/medical_file/medical_file_repo.dart b/lib/features/medical_file/medical_file_repo.dart index bf10e9e..2f5cae6 100644 --- a/lib/features/medical_file/medical_file_repo.dart +++ b/lib/features/medical_file/medical_file_repo.dart @@ -3,7 +3,6 @@ import 'package:hmg_patient_app_new/core/api/api_client.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; -import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/get_allergies_response_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart index de7f067..d56ce73 100644 --- a/lib/features/medical_file/medical_file_view_model.dart +++ b/lib/features/medical_file/medical_file_view_model.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:developer'; import 'package:flutter/material.dart'; diff --git a/lib/features/my_appointments/appointment_rating_view_model.dart b/lib/features/my_appointments/appointment_rating_view_model.dart index a192df1..6dd41ff 100644 --- a/lib/features/my_appointments/appointment_rating_view_model.dart +++ b/lib/features/my_appointments/appointment_rating_view_model.dart @@ -1,7 +1,6 @@ // dart import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/appointment_details_resp_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; diff --git a/lib/features/my_appointments/appointment_via_region_viewmodel.dart b/lib/features/my_appointments/appointment_via_region_viewmodel.dart index 4a0ffab..f51f701 100644 --- a/lib/features/my_appointments/appointment_via_region_viewmodel.dart +++ b/lib/features/my_appointments/appointment_via_region_viewmodel.dart @@ -7,7 +7,6 @@ import 'package:hmg_patient_app_new/presentation/book_appointment/select_clinic_ import 'package:hmg_patient_app_new/presentation/book_appointment/select_doctor_page.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; enum AppointmentViaRegionState { REGION_SELECTION, diff --git a/lib/features/my_appointments/my_appointments_repo.dart b/lib/features/my_appointments/my_appointments_repo.dart index af03cb8..ce9e877 100644 --- a/lib/features/my_appointments/my_appointments_repo.dart +++ b/lib/features/my_appointments/my_appointments_repo.dart @@ -11,7 +11,6 @@ import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/rate_appointment_resp_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart' show HospitalsModel; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_queue_details_response_model.dart'; diff --git a/lib/features/prescriptions/prescriptions_view_model.dart b/lib/features/prescriptions/prescriptions_view_model.dart index 7517134..ff86406 100644 --- a/lib/features/prescriptions/prescriptions_view_model.dart +++ b/lib/features/prescriptions/prescriptions_view_model.dart @@ -5,8 +5,6 @@ import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/location_util.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; -import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart'; -import 'package:hmg_patient_app_new/features/location/PlacePrediction.dart'; import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/calender_utils_new.dart'; diff --git a/lib/features/smartwatch_health_data/health_service.dart b/lib/features/smartwatch_health_data/health_service.dart index c5dca48..d3815b3 100644 --- a/lib/features/smartwatch_health_data/health_service.dart +++ b/lib/features/smartwatch_health_data/health_service.dart @@ -1,7 +1,5 @@ import 'dart:io'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/cupertino.dart'; import 'package:health/health.dart'; import 'package:permission_handler/permission_handler.dart'; diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 2086c2a..7b605b9 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -1,13 +1,9 @@ import 'dart:async'; -import 'dart:collection'; -import 'dart:io'; -import 'package:device_calendar/device_calendar.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; -import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/utils/calender_utils_new.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -41,7 +37,6 @@ import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:maps_launcher/maps_launcher.dart'; import 'package:provider/provider.dart'; -import '../../core/dependencies.dart'; import '../medical_file/widgets/medical_file_card.dart'; class AppointmentDetailsPage extends StatefulWidget { diff --git a/lib/presentation/appointments/widgets/AppointmentFilter.dart b/lib/presentation/appointments/widgets/AppointmentFilter.dart index 98da22d..6546c65 100644 --- a/lib/presentation/appointments/widgets/AppointmentFilter.dart +++ b/lib/presentation/appointments/widgets/AppointmentFilter.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/appointemnet_filters.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:smooth_corner/smooth_corner.dart'; diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index a35c1ca..adca86c 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -17,7 +17,6 @@ import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_vie import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/appointments/appointment_details_page.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/appointment_queue_page.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/ask_doctor_request_type_select.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/eye_measurement_details_page.dart'; diff --git a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart index 5b1d1cd..a3e70ec 100644 --- a/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart +++ b/lib/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart @@ -14,7 +14,6 @@ import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/appointments/appointment_queue_page.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:barcode_scan2/barcode_scan2.dart'; @@ -22,7 +21,6 @@ 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/nfc/nfc_reader_sheet.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; class AppointmentCheckinBottomSheet extends StatelessWidget { AppointmentCheckinBottomSheet({super.key, required this.patientAppointmentHistoryResponseModel, required this.myAppointmentsViewModel}); diff --git a/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart b/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart index 69cdca3..01aab4e 100644 --- a/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart +++ b/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; -import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; diff --git a/lib/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart b/lib/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart index c7ef3a9..2f5589c 100644 --- a/lib/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart +++ b/lib/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart @@ -4,10 +4,8 @@ import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart' show AppColors; -import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; class FacilitySelectionItem extends StatelessWidget { diff --git a/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart b/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart index cacc9d3..cb27f9f 100644 --- a/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart +++ b/lib/presentation/appointments/widgets/faculity_selection/facility_type_selection_widget.dart @@ -8,8 +8,6 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart' - show MyAppointmentsViewModel; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body_for_doctor_filter.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body_for_doctor_filter.dart index 58a0d00..a2d22cd 100644 --- a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body_for_doctor_filter.dart +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body_for_doctor_filter.dart @@ -1,21 +1,14 @@ import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; -import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:provider/provider.dart'; class HospitalBottomSheetBodyForDoctorFilter extends StatelessWidget { diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart index 660f95e..b01b541 100644 --- a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart @@ -7,7 +7,6 @@ import 'package:hmg_patient_app_new/core/utils/utils.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/my_appointments/models/resp_models/doctor_list_api_response.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart index b023f7a..cbf68f6 100644 --- a/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart @@ -4,7 +4,6 @@ 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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:provider/provider.dart' show Consumer; diff --git a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart index 754db53..969e23a 100644 --- a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart +++ b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart @@ -5,7 +5,6 @@ import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; diff --git a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart index 6bc8007..2def72c 100644 --- a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart +++ b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart @@ -6,7 +6,6 @@ import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart' show MyAppointmentsViewModel; import 'package:hmg_patient_app_new/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart' show RegionListItem; import 'package:provider/provider.dart'; diff --git a/lib/presentation/blood_donation/widgets/select_blood_group_widget.dart b/lib/presentation/blood_donation/widgets/select_blood_group_widget.dart index f9cadb2..a5ac071 100644 --- a/lib/presentation/blood_donation/widgets/select_blood_group_widget.dart +++ b/lib/presentation/blood_donation/widgets/select_blood_group_widget.dart @@ -5,7 +5,6 @@ import 'package:hmg_patient_app_new/core/utils/utils.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/presentation/blood_donation/widgets/city_list_item.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; class SelectBloodGroupWidget extends StatelessWidget { diff --git a/lib/presentation/blood_donation/widgets/select_city_widget.dart b/lib/presentation/blood_donation/widgets/select_city_widget.dart index a0e8477..8e2f9a0 100644 --- a/lib/presentation/blood_donation/widgets/select_city_widget.dart +++ b/lib/presentation/blood_donation/widgets/select_city_widget.dart @@ -1,10 +1,8 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/presentation/blood_donation/widgets/city_list_item.dart'; -import 'package:hmg_patient_app_new/theme/colors.dart'; class SelectCityWidget extends StatelessWidget { SelectCityWidget({super.key, required this.bloodDonationViewModel}); diff --git a/lib/presentation/blood_donation/widgets/select_gender_widget.dart b/lib/presentation/blood_donation/widgets/select_gender_widget.dart index b253331..67cd4bb 100644 --- a/lib/presentation/blood_donation/widgets/select_gender_widget.dart +++ b/lib/presentation/blood_donation/widgets/select_gender_widget.dart @@ -5,7 +5,6 @@ import 'package:hmg_patient_app_new/core/utils/utils.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/presentation/blood_donation/widgets/city_list_item.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; class SelectGenderWidget extends StatelessWidget { diff --git a/lib/presentation/book_appointment/doctor_filter/RegionChips.dart b/lib/presentation/book_appointment/doctor_filter/RegionChips.dart index c81e548..19e391e 100644 --- a/lib/presentation/book_appointment/doctor_filter/RegionChips.dart +++ b/lib/presentation/book_appointment/doctor_filter/RegionChips.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; -import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart' - show BookAppointmentsViewModel; import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; diff --git a/lib/presentation/book_appointment/doctor_filter/clinic_bottomsheet.dart b/lib/presentation/book_appointment/doctor_filter/clinic_bottomsheet.dart index 155d8e3..982fc54 100644 --- a/lib/presentation/book_appointment/doctor_filter/clinic_bottomsheet.dart +++ b/lib/presentation/book_appointment/doctor_filter/clinic_bottomsheet.dart @@ -2,26 +2,16 @@ import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; -import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_filter/clinic_item.dart'; -import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/clinic_card.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; -import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:provider/provider.dart'; -import '../../../features/book_appointments/models/resp_models/get_clinic_list_response_model.dart' show GetClinicsListResponseModel; class ClinicBottomSheet extends StatelessWidget { late BookAppointmentsViewModel appointmentsViewModel; diff --git a/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart index 6e51f8a..e4d11bd 100644 --- a/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart +++ b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart @@ -9,7 +9,6 @@ import 'package:hmg_patient_app_new/features/book_appointments/book_appointments import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body_for_doctor_filter.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_filter/RegionChips.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_filter/clinic_bottomsheet.dart'; diff --git a/lib/presentation/book_appointment/doctor_filter/facility_Chips.dart b/lib/presentation/book_appointment/doctor_filter/facility_Chips.dart index f416ed4..e64c53f 100644 --- a/lib/presentation/book_appointment/doctor_filter/facility_Chips.dart +++ b/lib/presentation/book_appointment/doctor_filter/facility_Chips.dart @@ -4,8 +4,6 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; -import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart' - show BookAppointmentsViewModel; import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; diff --git a/lib/presentation/book_appointment/doctor_profile_page.dart b/lib/presentation/book_appointment/doctor_profile_page.dart index c3f4ad9..5ce7fac 100644 --- a/lib/presentation/book_appointment/doctor_profile_page.dart +++ b/lib/presentation/book_appointment/doctor_profile_page.dart @@ -1,18 +1,13 @@ -import 'dart:math'; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:hijri_gregorian_calendar/hijri_gregorian_calendar.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; -import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/book_appointments/book_appointments_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; diff --git a/lib/presentation/book_appointment/laser/laser_appointment.dart b/lib/presentation/book_appointment/laser/laser_appointment.dart index 440ae45..cde929a 100644 --- a/lib/presentation/book_appointment/laser/laser_appointment.dart +++ b/lib/presentation/book_appointment/laser/laser_appointment.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/laser_body_parts.dart'; diff --git a/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart b/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart index 46047ff..baf72d2 100644 --- a/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart +++ b/lib/presentation/book_appointment/laser/widgets/body_type_listing.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/book_appointments/models/LaserCategoryType.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart index 2877b27..58f2995 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart index b052969..48e79b1 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart @@ -11,30 +11,25 @@ import 'package:hmg_patient_app_new/core/cache_consts.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; -import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/payfort/payfort_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; -import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/theme/colors.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/in_app_browser/InAppBrowser.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:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import 'package:smooth_corner/smooth_corner.dart'; diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart index 8c8b79c..8488a49 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; @@ -11,13 +10,11 @@ import 'package:hmg_patient_app_new/core/utils/utils.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/immediate_livecare/immediate_livecare_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.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/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/countdown_timer.dart'; -import 'package:lottie/lottie.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/presentation/book_appointment/livecare/widgets/livecare_clinic_card.dart b/lib/presentation/book_appointment/livecare/widgets/livecare_clinic_card.dart index 3913f10..cdf13c6 100644 --- a/lib/presentation/book_appointment/livecare/widgets/livecare_clinic_card.dart +++ b/lib/presentation/book_appointment/livecare/widgets/livecare_clinic_card.dart @@ -7,7 +7,6 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/models/resp_models/get_livecare_immediate_clinics_response_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; diff --git a/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart b/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart index e4d69b1..31fb71f 100644 --- a/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart +++ b/lib/presentation/book_appointment/livecare/widgets/select_livecare_call_type.dart @@ -6,10 +6,7 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/medical_file/widgets/medical_file_card.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; class SelectLiveCareCallType extends StatelessWidget { diff --git a/lib/presentation/book_appointment/review_appointment_page.dart b/lib/presentation/book_appointment/review_appointment_page.dart index f76a5b0..40abd40 100644 --- a/lib/presentation/book_appointment/review_appointment_page.dart +++ b/lib/presentation/book_appointment/review_appointment_page.dart @@ -21,7 +21,6 @@ import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.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/loading_dialog.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; diff --git a/lib/presentation/book_appointment/search_doctor_by_name.dart b/lib/presentation/book_appointment/search_doctor_by_name.dart index bdb6773..d008497 100644 --- a/lib/presentation/book_appointment/search_doctor_by_name.dart +++ b/lib/presentation/book_appointment/search_doctor_by_name.dart @@ -2,8 +2,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; -import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -21,7 +19,6 @@ import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.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:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; import '../../features/book_appointments/models/resp_models/doctors_list_response_model.dart'; diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart index d801bdb..450e86b 100644 --- a/lib/presentation/book_appointment/select_clinic_page.dart +++ b/lib/presentation/book_appointment/select_clinic_page.dart @@ -33,7 +33,6 @@ import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.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:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; class SelectClinicPage extends StatefulWidget { @@ -82,7 +81,14 @@ class _SelectClinicPageState extends State { child: CustomButton( text: LocaleKeys.bookAppo.tr(), onPressed: () { - onClinicSelected(GetClinicsListResponseModel(clinicID: 108, clinicDescription: "asdfds", clinicDescriptionN: "asdfds")); + if (widget.calculatedResult["clinicId"] == null) { + bookAppointmentsViewModel.setIsDoctorsListLoading(true); + bookAppointmentsViewModel.isGetDocForHealthCal = true; + bookAppointmentsViewModel.calculationID = widget.calculatedResult["calculationID"]; + Navigator.push(context, CustomPageRoute(page: SelectDoctorPage())); + } else { + onClinicSelected(GetClinicsListResponseModel(clinicID: widget.calculatedResult["clinicId"], clinicDescription: "asdfds", clinicDescriptionN: "asdfds")); + } }, icon: null, fontSize: 16.f, @@ -248,7 +254,6 @@ class _SelectClinicPageState extends State { } Widget resultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { - print(calculatedResult); return Column( children: [ if (type == HealthCalculatorsTypeEnum.bmi) ...[ @@ -747,8 +752,6 @@ class _SelectClinicPageState extends State { ], ), ), - - SizedBox(height: 16.h), Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), @@ -793,7 +796,6 @@ class _SelectClinicPageState extends State { ], ), ), - SizedBox(height: 16.h), Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), @@ -838,8 +840,6 @@ class _SelectClinicPageState extends State { ], ), ), - - ], ) ], diff --git a/lib/presentation/book_appointment/select_doctor_page.dart b/lib/presentation/book_appointment/select_doctor_page.dart index 46c3774..b346973 100644 --- a/lib/presentation/book_appointment/select_doctor_page.dart +++ b/lib/presentation/book_appointment/select_doctor_page.dart @@ -17,6 +17,7 @@ import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/doctor_card.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/input_widget.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; @@ -32,6 +33,7 @@ class SelectDoctorPage extends StatefulWidget { class _SelectDoctorPageState extends State { TextEditingController searchEditingController = TextEditingController(); + int? expandedIndex; FocusNode textFocusNode = FocusNode(); @@ -46,6 +48,8 @@ class _SelectDoctorPageState extends State { } else { if (bookAppointmentsViewModel.selectedClinic.clinicID == 17) { bookAppointmentsViewModel.getDentalChiefComplaintDoctorsList(); + } else if (bookAppointmentsViewModel.isGetDocForHealthCal) { + bookAppointmentsViewModel.getDoctorsListByHealthCal(); } else { bookAppointmentsViewModel.getDoctorsList(); } @@ -105,6 +109,40 @@ class _SelectDoctorPageState extends State { ), ], ), + SizedBox(height: 16.h), + Row( + children: [ + CustomButton( + text: LocaleKeys.byClinic.tr(context: context), + onPressed: () { + bookAppointmentsVM.setIsSortByClinic(true); + }, + backgroundColor: bookAppointmentsVM.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, + borderColor: bookAppointmentsVM.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withOpacity(0.2), + textColor: bookAppointmentsVM.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, + fontSize: 12, + fontWeight: FontWeight.w500, + borderRadius: 10, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + SizedBox(width: 8.h), + CustomButton( + text: LocaleKeys.byHospital.tr(context: context), + onPressed: () { + bookAppointmentsVM.setIsSortByClinic(false); + }, + backgroundColor: bookAppointmentsVM.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, + borderColor: bookAppointmentsVM.isSortByClinic ? AppColors.textColor.withOpacity(0.2) : AppColors.primaryRedColor, + textColor: bookAppointmentsVM.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, + fontSize: 12, + fontWeight: FontWeight.w500, + borderRadius: 10, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + ), + ], + ).paddingSymmetrical(0.h, 0.h), ListView.separated( padding: EdgeInsets.only(top: 24.h), shrinkWrap: true, @@ -115,6 +153,7 @@ class _SelectDoctorPageState extends State { ? (bookAppointmentsVM.liveCareDoctorsList.isNotEmpty ? bookAppointmentsVM.liveCareDoctorsList.length : 1) : (bookAppointmentsVM.doctorsList.isNotEmpty ? bookAppointmentsVM.doctorsList.length : 1)), itemBuilder: (context, index) { + final isExpanded = expandedIndex == index; return bookAppointmentsVM.isDoctorsListLoading ? DoctorCard( doctorsListResponseModel: DoctorsListResponseModel(), @@ -132,38 +171,41 @@ class _SelectDoctorPageState extends State { child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, - decoration: - RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), - child: DoctorCard( - doctorsListResponseModel: bookAppointmentsVM.isLiveCareSchedule - ? bookAppointmentsVM.liveCareDoctorsList[index] - : bookAppointmentsVM.doctorsList[index], - isLoading: false, - bookAppointmentsViewModel: bookAppointmentsViewModel, - ).onPress(() async { - bookAppointmentsVM.setSelectedDoctor(bookAppointmentsVM.isLiveCareSchedule - ? bookAppointmentsVM.liveCareDoctorsList[index] - : bookAppointmentsVM.doctorsList[index]); - // bookAppointmentsVM.setSelectedDoctor(DoctorsListResponseModel()); - LoaderBottomSheet.showLoader(); - await bookAppointmentsVM.getDoctorProfile(onSuccess: (dynamic respData) { - LoaderBottomSheet.hideLoader(); - Navigator.of(context).push( - CustomPageRoute( - page: DoctorProfilePage(), - ), - ); - }, onError: (err) { - LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: err), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - }); - }), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: InkWell( + onTap: () { + setState(() { + expandedIndex = isExpanded ? null : index; + }); + }, + child: DoctorCard( + doctorsListResponseModel: bookAppointmentsVM.isLiveCareSchedule ? bookAppointmentsVM.liveCareDoctorsList[index] : bookAppointmentsVM.doctorsList[index], + isLoading: false, + bookAppointmentsViewModel: bookAppointmentsViewModel, + ).onPress(() async { + bookAppointmentsVM + .setSelectedDoctor(bookAppointmentsVM.isLiveCareSchedule ? bookAppointmentsVM.liveCareDoctorsList[index] : bookAppointmentsVM.doctorsList[index]); + // bookAppointmentsVM.setSelectedDoctor(DoctorsListResponseModel()); + LoaderBottomSheet.showLoader(); + await bookAppointmentsVM.getDoctorProfile(onSuccess: (dynamic respData) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorProfilePage(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }), + ), ), ), ), diff --git a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_online_checkin_sheet.dart b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_online_checkin_sheet.dart index 965844a..8a04843 100644 --- a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_online_checkin_sheet.dart +++ b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_online_checkin_sheet.dart @@ -1,4 +1,3 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; diff --git a/lib/presentation/book_appointment/widgets/appointment_calendar.dart b/lib/presentation/book_appointment/widgets/appointment_calendar.dart index 7c4226c..b2666b6 100644 --- a/lib/presentation/book_appointment/widgets/appointment_calendar.dart +++ b/lib/presentation/book_appointment/widgets/appointment_calendar.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; @@ -21,7 +20,6 @@ import 'package:hmg_patient_app_new/theme/colors.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/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:lottie/lottie.dart'; import 'package:provider/provider.dart'; import 'package:smooth_corner/smooth_corner.dart'; diff --git a/lib/presentation/book_appointment/widgets/doctor_card.dart b/lib/presentation/book_appointment/widgets/doctor_card.dart index 7257dbf..9ca179a 100644 --- a/lib/presentation/book_appointment/widgets/doctor_card.dart +++ b/lib/presentation/book_appointment/widgets/doctor_card.dart @@ -110,11 +110,11 @@ class DoctorCard extends StatelessWidget { AppCustomChipWidget( labelText: "Branch: ${isLoading ? "Olaya Hospital" : doctorsListResponseModel.projectName}".needTranslation, ).toShimmer2(isShow: isLoading), - AppCustomChipWidget( + doctorsListResponseModel.decimalDoctorRate != null ? AppCustomChipWidget( icon: AppAssets.rating_icon, iconColor: AppColors.ratingColorYellow, labelText: "Rating: ${isLoading ? 4.78 : doctorsListResponseModel.decimalDoctorRate}".needTranslation, - ).toShimmer2(isShow: isLoading), + ).toShimmer2(isShow: isLoading) : SizedBox(), doctorsListResponseModel.nearestFreeSlot != null ? AppCustomChipWidget( labelText: (isLoading ? "Cardiologist" : DateUtil.getDateStringForNearestSlot(doctorsListResponseModel.nearestFreeSlot)).needTranslation, diff --git a/lib/presentation/contact_us/feedback_page.dart b/lib/presentation/contact_us/feedback_page.dart index 7160179..078b3a1 100644 --- a/lib/presentation/contact_us/feedback_page.dart +++ b/lib/presentation/contact_us/feedback_page.dart @@ -8,13 +8,10 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/contact_us/contact_us_view_model.dart'; import 'package:hmg_patient_app_new/features/contact_us/models/feedback_type.dart'; import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; import 'package:hmg_patient_app_new/presentation/contact_us/widgets/feedback_appointment_selection.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; diff --git a/lib/presentation/contact_us/find_us_page.dart b/lib/presentation/contact_us/find_us_page.dart index a4e4258..5957bb8 100644 --- a/lib/presentation/contact_us/find_us_page.dart +++ b/lib/presentation/contact_us/find_us_page.dart @@ -4,14 +4,11 @@ import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.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/contact_us/contact_us_view_model.dart'; -import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/contact_us/widgets/find_us_item_card.dart'; -import 'package:hmg_patient_app_new/presentation/medical_file/widgets/patient_sick_leave_card.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/chip/app_custom_chip_widget.dart'; diff --git a/lib/presentation/contact_us/widgets/find_us_item_card.dart b/lib/presentation/contact_us/widgets/find_us_item_card.dart index a59959f..96375c0 100644 --- a/lib/presentation/contact_us/widgets/find_us_item_card.dart +++ b/lib/presentation/contact_us/widgets/find_us_item_card.dart @@ -4,13 +4,11 @@ import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.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/contact_us/models/resp_models/get_hmg_locations.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:maps_launcher/maps_launcher.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/presentation/e_referral/e_referral_form_manager.dart b/lib/presentation/e_referral/e_referral_form_manager.dart index f7093c5..9e5cbe8 100644 --- a/lib/presentation/e_referral/e_referral_form_manager.dart +++ b/lib/presentation/e_referral/e_referral_form_manager.dart @@ -1,6 +1,5 @@ // managers/referral_form_manager.dart import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/common_models/nationality_country_model.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/create_e_referral_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_all_cities_resp_model.dart'; diff --git a/lib/presentation/e_referral/e_referral_search_result.dart b/lib/presentation/e_referral/e_referral_search_result.dart index ba31f1b..8702d5a 100644 --- a/lib/presentation/e_referral/e_referral_search_result.dart +++ b/lib/presentation/e_referral/e_referral_search_result.dart @@ -1,4 +1,3 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; diff --git a/lib/presentation/e_referral/widget/e_referral_other_details.dart b/lib/presentation/e_referral/widget/e_referral_other_details.dart index fd1649f..dfde8e7 100644 --- a/lib/presentation/e_referral/widget/e_referral_other_details.dart +++ b/lib/presentation/e_referral/widget/e_referral_other_details.dart @@ -1,5 +1,4 @@ import 'dart:io'; -import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; diff --git a/lib/presentation/emergency_services/RRT/rrt_map_screen.dart b/lib/presentation/emergency_services/RRT/rrt_map_screen.dart index 3a17e5d..afe68b6 100644 --- a/lib/presentation/emergency_services/RRT/rrt_map_screen.dart +++ b/lib/presentation/emergency_services/RRT/rrt_map_screen.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -8,13 +7,11 @@ import 'package:hmg_patient_app_new/core/utils/utils.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/emergency_services/emergency_services_view_model.dart'; -import 'package:hmg_patient_app_new/features/emergency_services/models/AmbulanceCallingPlace.dart'; import 'package:hmg_patient_app_new/features/location/GeocodeResponse.dart'; import 'package:hmg_patient_app_new/features/location/PlaceDetails.dart'; import 'package:hmg_patient_app_new/features/location/PlacePrediction.dart'; import 'package:hmg_patient_app_new/features/location/location_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_doctor_card.dart'; import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/AddressItem.dart'; import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart'; import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart' show AppointmentBottomSheet; diff --git a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart index 66894b6..13e0106 100644 --- a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart +++ b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart @@ -1,5 +1,4 @@ import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; @@ -11,8 +10,6 @@ import 'package:hmg_patient_app_new/features/emergency_services/models/resp_mode import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.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/radio/custom_radio_button.dart'; import 'package:provider/provider.dart'; class RrtRequestTypeSelect extends StatelessWidget { diff --git a/lib/presentation/emergency_services/RRT/terms_and_condition.dart b/lib/presentation/emergency_services/RRT/terms_and_condition.dart index 8a50792..1d1dac1 100644 --- a/lib/presentation/emergency_services/RRT/terms_and_condition.dart +++ b/lib/presentation/emergency_services/RRT/terms_and_condition.dart @@ -1,14 +1,10 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.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/emergency_services/emergency_services_view_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; -import 'package:provider/provider.dart'; class TermsAndCondition extends StatelessWidget { final String termsAndCondition; diff --git a/lib/presentation/emergency_services/call_ambulance/requesting_services_page.dart b/lib/presentation/emergency_services/call_ambulance/requesting_services_page.dart index 83c16b6..396e509 100644 --- a/lib/presentation/emergency_services/call_ambulance/requesting_services_page.dart +++ b/lib/presentation/emergency_services/call_ambulance/requesting_services_page.dart @@ -1,15 +1,10 @@ -import 'dart:async'; import 'package:flutter/material.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/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; -import 'package:hmg_patient_app_new/features/emergency_services/models/request_model/PatientER_RC.dart'; -import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/tracking_screen.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart' - show CustomPageRoute; import 'package:lottie/lottie.dart'; class RequestingServicesPage extends StatelessWidget { diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart b/lib/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart index 71e589e..7d24393 100644 --- a/lib/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart +++ b/lib/presentation/emergency_services/call_ambulance/widgets/HospitalBottomSheetBody.dart @@ -5,22 +5,13 @@ import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/debouncer.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/book_appointments/book_appointments_view_model.dart'; -import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart' show HospitalsModel; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart'; import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; -import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; -import 'package:provider/provider.dart'; class HospitalBottomSheetBody extends StatelessWidget { diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/ambulance_option_selection_bottomsheet.dart b/lib/presentation/emergency_services/call_ambulance/widgets/ambulance_option_selection_bottomsheet.dart index de20d1a..be1d380 100644 --- a/lib/presentation/emergency_services/call_ambulance/widgets/ambulance_option_selection_bottomsheet.dart +++ b/lib/presentation/emergency_services/call_ambulance/widgets/ambulance_option_selection_bottomsheet.dart @@ -2,12 +2,9 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart' show AppAssets; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; -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/emergency_services/emergency_services_view_model.dart'; import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/PatientERTransportationMethod.dart'; import 'package:hmg_patient_app_new/presentation/emergency_services/call_ambulance/widgets/transport_option_Item.dart' show TransportOptionItem; -import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:provider/provider.dart'; class AmbulanceOptionSelectionBottomSheet extends StatelessWidget { diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart b/lib/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart index 6f5db92..e1f7420 100644 --- a/lib/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart +++ b/lib/presentation/emergency_services/call_ambulance/widgets/appointment_bottom_sheet.dart @@ -1,13 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; -import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_doctor_card.dart'; -import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/doctor_card.dart'; -import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:provider/provider.dart'; class AppointmentBottomSheet extends StatelessWidget{ diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart b/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart index 3b8d8d7..1b85165 100644 --- a/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart +++ b/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart @@ -2,12 +2,9 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; -import 'package:provider/provider.dart' show Consumer; class TypeSelectionWidget extends StatelessWidget { final String hmcCount; diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart index 0dfd081..ee061b7 100644 --- a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart @@ -8,7 +8,6 @@ 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/emergency_services/emergency_services_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/emergency_services/er_online_checkin/er_online_checkin_select_checkin_bottom_sheet.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_details_page.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_details_page.dart index 3aa975d..f48efe7 100644 --- a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_details_page.dart +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_details_page.dart @@ -10,7 +10,6 @@ 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/emergency_services/emergency_services_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; import 'package:hmg_patient_app_new/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_select_checkin_bottom_sheet.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_select_checkin_bottom_sheet.dart index 0b22417..d44686c 100644 --- a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_select_checkin_bottom_sheet.dart +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_select_checkin_bottom_sheet.dart @@ -1,4 +1,3 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -10,17 +9,10 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; -import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:barcode_scan2/barcode_scan2.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/nfc/nfc_reader_sheet.dart'; -import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; class ErOnlineCheckinSelectCheckinBottomSheet extends StatelessWidget { ErOnlineCheckinSelectCheckinBottomSheet({super.key, required this.projectID}); diff --git a/lib/presentation/emergency_services/history/er_history_listing.dart b/lib/presentation/emergency_services/history/er_history_listing.dart index b98f2f1..fe1ed31 100644 --- a/lib/presentation/emergency_services/history/er_history_listing.dart +++ b/lib/presentation/emergency_services/history/er_history_listing.dart @@ -1,4 +1,3 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart' show AppAssets; import 'package:hmg_patient_app_new/core/app_export.dart'; @@ -9,7 +8,6 @@ import 'package:hmg_patient_app_new/features/emergency_services/emergency_servic import 'package:hmg_patient_app_new/features/emergency_services/models/OrderDisplay.dart'; import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart'; import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/RRTServiceData.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/emergency_services/history/widget/ambulance_history_item.dart' show AmbulanceHistoryItem; import 'package:hmg_patient_app_new/presentation/emergency_services/history/widget/rrt_item.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; diff --git a/lib/presentation/emergency_services/history/widget/rrt_item.dart b/lib/presentation/emergency_services/history/widget/rrt_item.dart index 61ecced..dfb6e79 100644 --- a/lib/presentation/emergency_services/history/widget/rrt_item.dart +++ b/lib/presentation/emergency_services/history/widget/rrt_item.dart @@ -5,7 +5,6 @@ import 'package:hmg_patient_app_new/core/utils/date_util.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/emergency_services/emergency_services_view_model.dart'; -import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/AmbulanceRequestOrdersModel.dart'; import 'package:hmg_patient_app_new/features/emergency_services/models/resp_model/RRTServiceData.dart'; import 'package:hmg_patient_app_new/presentation/emergency_services/history/widget/RequestStatus.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; diff --git a/lib/presentation/emergency_services/nearest_er_page.dart b/lib/presentation/emergency_services/nearest_er_page.dart index 13373f1..16863bf 100644 --- a/lib/presentation/emergency_services/nearest_er_page.dart +++ b/lib/presentation/emergency_services/nearest_er_page.dart @@ -14,7 +14,6 @@ import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:provider/provider.dart' show Selector, WatchContext, ReadContext; -import '../../core/enums.dart' show SelectionTypeEnum; import '../../core/utils/debouncer.dart' show Debouncer; class NearestErPage extends StatefulWidget { diff --git a/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart b/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart index 559a0a5..c5301ea 100644 --- a/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart +++ b/lib/presentation/emergency_services/widgets/location_input_bottom_sheet.dart @@ -18,7 +18,6 @@ import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:provider/provider.dart'; import '../../../theme/colors.dart'; -import '../../appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart'; class LocationInputBottomSheet extends StatelessWidget { final Debouncer debouncer = Debouncer(milliseconds: 500); diff --git a/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart b/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart index b7a16c5..086e0da 100644 --- a/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart +++ b/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart @@ -1,21 +1,10 @@ -import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart'; import 'package:hmg_patient_app_new/presentation/habib_wallet/widgets/hospital_list_item.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; -import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:provider/provider.dart'; class SelectHospitalBottomSheet extends StatelessWidget { diff --git a/lib/presentation/health_calculators_and_converts/health_calculator_detailed_page.dart b/lib/presentation/health_calculators_and_converts/health_calculator_detailed_page.dart index e0f3a7a..eb22ab6 100644 --- a/lib/presentation/health_calculators_and_converts/health_calculator_detailed_page.dart +++ b/lib/presentation/health_calculators_and_converts/health_calculator_detailed_page.dart @@ -26,8 +26,10 @@ import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; class HealthCalculatorDetailedPage extends StatefulWidget { HealthCalculatorsTypeEnum calculatorType; + int? clinicID; + int? calculationID; - HealthCalculatorDetailedPage({super.key, required this.calculatorType}); + HealthCalculatorDetailedPage({super.key, required this.calculatorType, this.clinicID, this.calculationID}); @override State createState() => _HealthCalculatorDetailedPageState(); @@ -75,37 +77,90 @@ class _HealthCalculatorDetailedPageState extends State { CustomPageRoute( page: HealthCalculatorDetailedPage( calculatorType: type == HealthCalculatorEnum.general ? generalHealthServices[index].type : womenHealthServices[index].type, + clinicID: type == HealthCalculatorEnum.general ? generalHealthServices[index].clinicID : womenHealthServices[index].clinicID, + calculationID: type == HealthCalculatorEnum.general ? generalHealthServices[index].calculationID : womenHealthServices[index].calculationID, ), ), ); @@ -228,17 +230,17 @@ class _HealthCalculatorsPageState extends State { } final List generalHealthServices = [ - HealthComponentModel(title: "BMI\nCalculator".needTranslation, icon: AppAssets.bmi, type: HealthCalculatorsTypeEnum.bmi), - HealthComponentModel(title: "Calories\nCalculator".needTranslation, icon: AppAssets.calories, type: HealthCalculatorsTypeEnum.calories), - HealthComponentModel(title: "BMR\nCalculator".needTranslation, icon: AppAssets.bmr, type: HealthCalculatorsTypeEnum.bmr), - HealthComponentModel(title: "Ideal Body\nWeight".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.idealBodyWeight), - HealthComponentModel(title: "Body Fat\nCalculator".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.bodyFat), - HealthComponentModel(title: "Carbs\nProtein & Fat".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.crabsProteinFat), + HealthComponentModel(title: "BMI\nCalculator".needTranslation, icon: AppAssets.bmi, type: HealthCalculatorsTypeEnum.bmi, clinicID: 108, calculationID: null), + HealthComponentModel(title: "Calories\nCalculator".needTranslation, icon: AppAssets.calories, type: HealthCalculatorsTypeEnum.calories, clinicID: null, calculationID: 2), + HealthComponentModel(title: "BMR\nCalculator".needTranslation, icon: AppAssets.bmr, type: HealthCalculatorsTypeEnum.bmr, clinicID: null, calculationID: 3), + HealthComponentModel(title: "Ideal Body\nWeight".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.idealBodyWeight, clinicID: null, calculationID: 4), + HealthComponentModel(title: "Body Fat\nCalculator".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.bodyFat, clinicID: null, calculationID: 5), + HealthComponentModel(title: "Carbs\nProtein & Fat".needTranslation, icon: AppAssets.ibw, type: HealthCalculatorsTypeEnum.crabsProteinFat, clinicID: null, calculationID: 11), ]; final List womenHealthServices = [ - HealthComponentModel(title: "Ovulation\nPeriod".needTranslation, icon: AppAssets.locate_me, type: HealthCalculatorsTypeEnum.ovulation), - HealthComponentModel(title: "Delivery\nDue Date".needTranslation, icon: AppAssets.activeCheck, type: HealthCalculatorsTypeEnum.deliveryDueDate), + HealthComponentModel(title: "Ovulation\nPeriod".needTranslation, icon: AppAssets.locate_me, type: HealthCalculatorsTypeEnum.ovulation, clinicID: null, calculationID: 6 ), + HealthComponentModel(title: "Delivery\nDue Date".needTranslation, icon: AppAssets.activeCheck, type: HealthCalculatorsTypeEnum.deliveryDueDate, clinicID: null, calculationID: 6), ]; } @@ -250,6 +252,8 @@ class HealthComponentModel { Color? bgColor; Color? textColor; HealthCalculatorsTypeEnum type; + int? clinicID; + int? calculationID; - HealthComponentModel({required this.title, this.subTitle, required this.icon, this.iconColor, this.bgColor, this.textColor, required this.type}); + HealthComponentModel({required this.title, this.subTitle, required this.icon, this.iconColor, this.bgColor, this.textColor, required this.type, this.clinicID, this.calculationID}); } diff --git a/lib/presentation/health_calculators_and_converts/widgets/bf.dart b/lib/presentation/health_calculators_and_converts/widgets/bf.dart index 3a37036..3a88eb3 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/bf.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bf.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; -import 'dart:math'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; diff --git a/lib/presentation/health_calculators_and_converts/widgets/bmr.dart b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart index 138fd3e..5f429ff 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/bmr.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart @@ -3,7 +3,6 @@ import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; -import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; diff --git a/lib/presentation/health_calculators_and_converts/widgets/calories.dart b/lib/presentation/health_calculators_and_converts/widgets/calories.dart index bfaad3e..fbe15a6 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/calories.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/calories.dart @@ -3,7 +3,6 @@ import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; -import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; diff --git a/lib/presentation/health_calculators_and_converts/widgets/health_card.dart b/lib/presentation/health_calculators_and_converts/widgets/health_card.dart index c8603e9..d54d037 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/health_card.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/health_card.dart @@ -1,7 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; -import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart index cc3c881..c693479 100644 --- a/lib/presentation/home/data/landing_page_data.dart +++ b/lib/presentation/home/data/landing_page_data.dart @@ -1,4 +1,3 @@ -import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/presentation/home/data/service_card_data.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index fc50d02..6bba1c0 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -42,8 +42,6 @@ import 'package:hmg_patient_app_new/presentation/home/widgets/small_service_card import 'package:hmg_patient_app_new/presentation/home/widgets/welcome_widget.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; import 'package:hmg_patient_app_new/presentation/profile_settings/profile_settings.dart'; -import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/call_screen.dart'; -import 'package:hmg_patient_app_new/routes/app_routes.dart'; import 'package:hmg_patient_app_new/presentation/rate_appointment/rate_appointment_doctor.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; diff --git a/lib/presentation/home/widgets/habib_wallet_card.dart b/lib/presentation/home/widgets/habib_wallet_card.dart index 6ea4507..b2649f9 100644 --- a/lib/presentation/home/widgets/habib_wallet_card.dart +++ b/lib/presentation/home/widgets/habib_wallet_card.dart @@ -9,7 +9,6 @@ import 'package:hmg_patient_app_new/presentation/habib_wallet/habib_wallet_page. import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; class HabibWalletCard extends StatelessWidget { diff --git a/lib/presentation/home/widgets/large_service_card.dart b/lib/presentation/home/widgets/large_service_card.dart index 0e02a5e..5274d5b 100644 --- a/lib/presentation/home/widgets/large_service_card.dart +++ b/lib/presentation/home/widgets/large_service_card.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; diff --git a/lib/presentation/home/widgets/small_service_card.dart b/lib/presentation/home/widgets/small_service_card.dart index f54f442..76ed3f7 100644 --- a/lib/presentation/home/widgets/small_service_card.dart +++ b/lib/presentation/home/widgets/small_service_card.dart @@ -10,7 +10,6 @@ import 'package:hmg_patient_app_new/presentation/lab/lab_orders_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/patient_sickleaves_list_page.dart'; import 'package:hmg_patient_app_new/presentation/prescriptions/prescriptions_list_page.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; import '../../../core/utils/utils.dart'; diff --git a/lib/presentation/home/widgets/welcome_widget.dart b/lib/presentation/home/widgets/welcome_widget.dart index f710ab2..8ef0697 100644 --- a/lib/presentation/home/widgets/welcome_widget.dart +++ b/lib/presentation/home/widgets/welcome_widget.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.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/theme/colors.dart'; diff --git a/lib/presentation/insurance/insurance_home_page.dart b/lib/presentation/insurance/insurance_home_page.dart index bacf5e9..b005e42 100644 --- a/lib/presentation/insurance/insurance_home_page.dart +++ b/lib/presentation/insurance/insurance_home_page.dart @@ -15,12 +15,10 @@ import 'package:hmg_patient_app_new/presentation/insurance/widgets/insurance_upd import 'package:hmg_patient_app_new/presentation/insurance/widgets/patient_insurance_card.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; -import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.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/shimmer/common_shimmer_widget.dart'; import 'package:provider/provider.dart'; import 'widgets/insurance_history.dart'; diff --git a/lib/presentation/insurance/widgets/insurance_approval_card.dart b/lib/presentation/insurance/widgets/insurance_approval_card.dart index bea2e56..ee31538 100644 --- a/lib/presentation/insurance/widgets/insurance_approval_card.dart +++ b/lib/presentation/insurance/widgets/insurance_approval_card.dart @@ -8,11 +8,8 @@ import 'package:hmg_patient_app_new/core/utils/utils.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/insurance/models/resp_models/patient_insurance_approval_response_model.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/utils/appointment_type.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; class InsuranceApprovalCard extends StatelessWidget { diff --git a/lib/presentation/insurance/widgets/insurance_history.dart b/lib/presentation/insurance/widgets/insurance_history.dart index 3e6ee86..341e234 100644 --- a/lib/presentation/insurance/widgets/insurance_history.dart +++ b/lib/presentation/insurance/widgets/insurance_history.dart @@ -12,7 +12,6 @@ import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; -import 'package:hmg_patient_app_new/widgets/shimmer/common_shimmer_widget.dart'; import 'package:provider/provider.dart'; class InsuranceHistory extends StatelessWidget { diff --git a/lib/presentation/insurance/widgets/insurance_update_details_card.dart b/lib/presentation/insurance/widgets/insurance_update_details_card.dart index 753a36c..c3bbcd7 100644 --- a/lib/presentation/insurance/widgets/insurance_update_details_card.dart +++ b/lib/presentation/insurance/widgets/insurance_update_details_card.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; -import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -12,7 +11,6 @@ import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; -import 'package:hmg_patient_app_new/widgets/shimmer/common_shimmer_widget.dart'; import 'package:provider/provider.dart'; class PatientInsuranceCardUpdateCard extends StatelessWidget { diff --git a/lib/presentation/lab/alphabeticScroll.dart b/lib/presentation/lab/alphabeticScroll.dart index e610d71..5537347 100644 --- a/lib/presentation/lab/alphabeticScroll.dart +++ b/lib/presentation/lab/alphabeticScroll.dart @@ -5,7 +5,6 @@ import 'package:flutter_staggered_animations/flutter_staggered_animations.dart' import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; -import 'package:hmg_patient_app_new/core/utils/debouncer.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; diff --git a/lib/presentation/lab/lab_order_by_test.dart b/lib/presentation/lab/lab_order_by_test.dart index bd56df6..837f482 100644 --- a/lib/presentation/lab/lab_order_by_test.dart +++ b/lib/presentation/lab/lab_order_by_test.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.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/app_state.dart'; -import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; @@ -12,7 +11,6 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; -import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; class LabOrderByTest extends StatelessWidget { final VoidCallback onTap; diff --git a/lib/presentation/lab/lab_orders_page.dart b/lib/presentation/lab/lab_orders_page.dart index ebcd2e2..211c80f 100644 --- a/lib/presentation/lab/lab_orders_page.dart +++ b/lib/presentation/lab/lab_orders_page.dart @@ -1 +1 @@ -import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_order_by_test.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import '../../widgets/appbar/collapsing_list_view.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingToolbar( title: LocaleKeys.labResults.tr(), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: SingleChildScrollView( padding: EdgeInsets.all(24.h), physics: NeverScrollableScrollPhysics(), child: Consumer( builder: (context, model, child) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, "By Visit".needTranslation), CustomTabBarModel(null, "By Test".needTranslation), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.isLabOrdersLoading ? 5 : model.patientLabOrders.isNotEmpty ? model.patientLabOrders.length : 1, itemBuilder: (context, index) { final isExpanded = expandedIndex == index; return model.isLabOrdersLoading ? LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ) : model.patientLabOrders.isNotEmpty ? AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: LabResultItemView( onTap: () { model.currentlySelectedPatientOrder = model.patientLabOrders[index]; labProvider.getPatientLabResultByHospital(model.patientLabOrders[index]); labProvider.getPatientSpecialResult(model.patientLabOrders[index]); Navigator.push( context, CustomPageRoute( page: LabResultByClinic(labOrder: model.patientLabOrders[index]), )); }, labOrder: model.patientLabOrders[index], index: index, isExpanded: isExpanded), ), ), ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); }, ) // : ListView.builder( // shrinkWrap: true, // physics: NeverScrollableScrollPhysics(), // padding: EdgeInsets.zero, // itemCount: model.isLabOrdersLoading // ? 5 // : model.uniqueTests.toList().isNotEmpty // ? model.uniqueTests.toList().length // : 1, // itemBuilder: (context, index) { // final isExpanded = expandedIndex == index; // return model.isLabOrdersLoading // ? LabResultItemView( // onTap: () {}, // labOrder: null, // index: index, // isLoading: true, // ) // : model.uniqueTests.toList().isNotEmpty // ? AnimationConfiguration.staggeredList( // position: index, // duration: const Duration(milliseconds: 500), // child: SlideAnimation( // verticalOffset: 100.0, // child: FadeInAnimation( // child: LabOrderByTest( // appState: _appState, // onTap: () { // if (model.uniqueTests.toList()[index].model != null) { // rangeViewModel.flush(); // model.getPatientLabResult(model.uniqueTests.toList()[index].model!, model.uniqueTests.toList()[index].description!, // (_appState.isArabic() ? model.uniqueTests.toList()[index].testDescriptionAr! : model.uniqueTests.toList()[index].testDescriptionEn!)); // } // }, // tests: model.uniqueTests.toList()[index], // index: index, // isExpanded: isExpanded)), // ), // ) // : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); // }, // ) : (model.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) :AlphabeticScroll( alpahbetsAvailable: model.indexedCharacterForUniqueTest, details: model.uniqueTestsList, labViewModel: model, rangeViewModel: rangeViewModel, appState: _appState, ) ], ); }, ), ), )); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file +import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingToolbar( title: LocaleKeys.labResults.tr(), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: SingleChildScrollView( padding: EdgeInsets.all(24.h), physics: NeverScrollableScrollPhysics(), child: Consumer( builder: (context, model, child) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, "By Visit".needTranslation), CustomTabBarModel(null, "By Test".needTranslation), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.isLabOrdersLoading ? 5 : model.patientLabOrders.isNotEmpty ? model.patientLabOrders.length : 1, itemBuilder: (context, index) { final isExpanded = expandedIndex == index; return model.isLabOrdersLoading ? LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ) : model.patientLabOrders.isNotEmpty ? AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: LabResultItemView( onTap: () { model.currentlySelectedPatientOrder = model.patientLabOrders[index]; labProvider.getPatientLabResultByHospital(model.patientLabOrders[index]); labProvider.getPatientSpecialResult(model.patientLabOrders[index]); Navigator.push( context, CustomPageRoute( page: LabResultByClinic(labOrder: model.patientLabOrders[index]), )); }, labOrder: model.patientLabOrders[index], index: index, isExpanded: isExpanded), ), ), ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); }, ) // : ListView.builder( // shrinkWrap: true, // physics: NeverScrollableScrollPhysics(), // padding: EdgeInsets.zero, // itemCount: model.isLabOrdersLoading // ? 5 // : model.uniqueTests.toList().isNotEmpty // ? model.uniqueTests.toList().length // : 1, // itemBuilder: (context, index) { // final isExpanded = expandedIndex == index; // return model.isLabOrdersLoading // ? LabResultItemView( // onTap: () {}, // labOrder: null, // index: index, // isLoading: true, // ) // : model.uniqueTests.toList().isNotEmpty // ? AnimationConfiguration.staggeredList( // position: index, // duration: const Duration(milliseconds: 500), // child: SlideAnimation( // verticalOffset: 100.0, // child: FadeInAnimation( // child: LabOrderByTest( // appState: _appState, // onTap: () { // if (model.uniqueTests.toList()[index].model != null) { // rangeViewModel.flush(); // model.getPatientLabResult(model.uniqueTests.toList()[index].model!, model.uniqueTests.toList()[index].description!, // (_appState.isArabic() ? model.uniqueTests.toList()[index].testDescriptionAr! : model.uniqueTests.toList()[index].testDescriptionEn!)); // } // }, // tests: model.uniqueTests.toList()[index], // index: index, // isExpanded: isExpanded)), // ), // ) // : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); // }, // ) : (model.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) :AlphabeticScroll( alpahbetsAvailable: model.indexedCharacterForUniqueTest, details: model.uniqueTestsList, labViewModel: model, rangeViewModel: rangeViewModel, appState: _appState, ) ], ); }, ), ), )); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file diff --git a/lib/presentation/lab/lab_result_item_view.dart b/lib/presentation/lab/lab_result_item_view.dart index 9269c6d..db80918 100644 --- a/lib/presentation/lab/lab_result_item_view.dart +++ b/lib/presentation/lab/lab_result_item_view.dart @@ -9,7 +9,6 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; class LabResultItemView extends StatelessWidget { diff --git a/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart index a603ecb..ad4a032 100644 --- a/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart +++ b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; import 'package:flutter/material.dart'; -import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; diff --git a/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart index bc1d6b1..c6841b3 100644 --- a/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart +++ b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart @@ -2,19 +2,14 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.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/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/lab/lab_view_model.dart' show LabViewModel; import 'package:hmg_patient_app_new/features/lab/models/resp_models/lab_result.dart'; -import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; -import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; -import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:provider/provider.dart'; class LabOrderResultItem extends StatelessWidget { diff --git a/lib/presentation/lab/lab_results/lab_result_list_item.dart b/lib/presentation/lab/lab_results/lab_result_list_item.dart index f90df7b..6ccf750 100644 --- a/lib/presentation/lab/lab_results/lab_result_list_item.dart +++ b/lib/presentation/lab/lab_results/lab_result_list_item.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart' ; -import 'package:flutter/src/widgets/framework.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; diff --git a/lib/presentation/lab/search_lab_report.dart b/lib/presentation/lab/search_lab_report.dart index f1fd389..bf27b91 100644 --- a/lib/presentation/lab/search_lab_report.dart +++ b/lib/presentation/lab/search_lab_report.dart @@ -8,7 +8,6 @@ import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; -import 'package:sizer/sizer.dart'; class SearchLabResultsContent extends StatefulWidget { final List labSuggestionsList; diff --git a/lib/presentation/medical_file/eye_measurement_details_page.dart b/lib/presentation/medical_file/eye_measurement_details_page.dart index e69766a..0662cb1 100644 --- a/lib/presentation/medical_file/eye_measurement_details_page.dart +++ b/lib/presentation/medical_file/eye_measurement_details_page.dart @@ -7,7 +7,6 @@ import 'package:hmg_patient_app_new/features/book_appointments/book_appointments import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/main.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index f55488d..27b11fa 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -55,7 +55,6 @@ 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/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; -import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/expandable_list_widget.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; diff --git a/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart b/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart index a818ae5..6f9b8b5 100644 --- a/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart +++ b/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart @@ -18,7 +18,6 @@ import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.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:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:open_filex/open_filex.dart'; import 'package:provider/provider.dart'; diff --git a/lib/presentation/medical_report/widgets/patient_medical_report_card.dart b/lib/presentation/medical_report/widgets/patient_medical_report_card.dart index 1762886..413858d 100644 --- a/lib/presentation/medical_report/widgets/patient_medical_report_card.dart +++ b/lib/presentation/medical_report/widgets/patient_medical_report_card.dart @@ -1,4 +1,3 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; @@ -10,7 +9,6 @@ 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/medical_file/medical_file_view_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; diff --git a/lib/presentation/my_family/my_family.dart b/lib/presentation/my_family/my_family.dart index 781624a..07f1a4f 100644 --- a/lib/presentation/my_family/my_family.dart +++ b/lib/presentation/my_family/my_family.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -7,10 +6,8 @@ import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; -import 'package:hmg_patient_app_new/core/utils/validation_utils.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/authentication/authentication_view_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; @@ -19,10 +16,7 @@ import 'package:hmg_patient_app_new/services/dialog_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/custom_tab_bar.dart'; -import 'package:hmg_patient_app_new/widgets/dropdown/country_dropdown_widget.dart'; -import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:provider/provider.dart'; class FamilyMedicalScreen extends StatefulWidget { diff --git a/lib/presentation/onboarding/splash_animation_screen.dart b/lib/presentation/onboarding/splash_animation_screen.dart index 7acd078..105922b 100644 --- a/lib/presentation/onboarding/splash_animation_screen.dart +++ b/lib/presentation/onboarding/splash_animation_screen.dart @@ -1,10 +1,8 @@ -import 'dart:async'; import 'package:flutter/material.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/extensions/widget_extensions.dart'; -import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; diff --git a/lib/presentation/prescriptions/prescription_delivery_orders_list_page.dart b/lib/presentation/prescriptions/prescription_delivery_orders_list_page.dart index 9f2b2a2..e2ce865 100644 --- a/lib/presentation/prescriptions/prescription_delivery_orders_list_page.dart +++ b/lib/presentation/prescriptions/prescription_delivery_orders_list_page.dart @@ -2,7 +2,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; -import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; diff --git a/lib/presentation/prescriptions/prescriptions_list_page.dart b/lib/presentation/prescriptions/prescriptions_list_page.dart index 3d631ce..2cf2fcc 100644 --- a/lib/presentation/prescriptions/prescriptions_list_page.dart +++ b/lib/presentation/prescriptions/prescriptions_list_page.dart @@ -6,7 +6,6 @@ import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; -import 'package:hmg_patient_app_new/core/location_util.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; @@ -21,10 +20,7 @@ import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_deta import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; -import 'package:hmg_patient_app_new/widgets/map/map_utility_screen.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/widgets/shimmer/common_shimmer_widget.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; class PrescriptionsListPage extends StatefulWidget { @@ -130,125 +126,125 @@ class _PrescriptionsListPageState extends State { child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( - child: AnimatedContainer( - duration: Duration(milliseconds: 300), - curve: Curves.easeInOut, - margin: EdgeInsets.symmetric(vertical: 8.h), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), - child: InkWell( - onTap: () { - setState(() { - expandedIndex = isExpanded ? null : index; - }); - }, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.all(16.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + margin: EdgeInsets.symmetric(vertical: 8.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), + child: InkWell( + onTap: () { + setState(() { + expandedIndex = isExpanded ? null : index; + }); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - CustomButton( - text: "${model.patientPrescriptionOrdersViewList[index].prescriptionsList!.length} Prescriptions Available", - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 30.h, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomButton( + text: "${model.patientPrescriptionOrdersViewList[index].prescriptionsList!.length} Prescriptions Available", + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 30.h, + ), + Icon(isExpanded ? Icons.expand_less : Icons.expand_more), + ], ), - Icon(isExpanded ? Icons.expand_less : Icons.expand_more), + SizedBox(height: 8.h), + model.patientPrescriptionOrdersViewList[index].filterName!.toText16(isBold: true) ], ), - SizedBox(height: 8.h), - model.patientPrescriptionOrdersViewList[index].filterName!.toText16(isBold: true) - ], - ), - ), - AnimatedSwitcher( - duration: Duration(milliseconds: 500), - switchInCurve: Curves.easeIn, - switchOutCurve: Curves.easeOut, - transitionBuilder: (Widget child, Animation animation) { - return FadeTransition( - opacity: animation, - child: SizeTransition( - sizeFactor: animation, - axisAlignment: 0.0, - child: child, - ), - ); - }, - child: isExpanded - ? Container( - key: ValueKey(index), - padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ...model.patientPrescriptionOrdersViewList[index].prescriptionsList!.map((prescription) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Image.network( - prescription.doctorImageURL!, - width: 24.h, - height: 24.h, - fit: BoxFit.fill, - ).circle(100), - SizedBox(width: 8.h), - Expanded(child: prescription.doctorName!.toText14(weight: FontWeight.w500)), - ], - ), - SizedBox(height: 8.h), - Row( + ), + AnimatedSwitcher( + duration: Duration(milliseconds: 500), + switchInCurve: Curves.easeIn, + switchOutCurve: Curves.easeOut, + transitionBuilder: (Widget child, Animation animation) { + return FadeTransition( + opacity: animation, + child: SizeTransition( + sizeFactor: animation, + axisAlignment: 0.0, + child: child, + ), + ); + }, + child: isExpanded + ? Container( + key: ValueKey(index), + padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...model.patientPrescriptionOrdersViewList[index].prescriptionsList!.map((prescription) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - CustomButton( - text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(prescription.appointmentDate), false), - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 24.h, + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Image.network( + prescription.doctorImageURL!, + width: 24.h, + height: 24.h, + fit: BoxFit.fill, + ).circle(100), + SizedBox(width: 8.h), + Expanded(child: prescription.doctorName!.toText14(weight: FontWeight.w500)), + ], ), - SizedBox(width: 8.h), - CustomButton( - text: model.isSortByClinic ? prescription.name! : prescription.clinicDescription!, - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 24.h, + SizedBox(height: 8.h), + Row( + children: [ + CustomButton( + text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(prescription.appointmentDate), false), + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 24.h, + ), + SizedBox(width: 8.h), + CustomButton( + text: model.isSortByClinic ? prescription.name! : prescription.clinicDescription!, + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 24.h, + ), + ], ), - ], - ), - SizedBox(height: 8.h), - Row( - children: [ - Expanded( - flex: 6, - child: CustomButton( - text: prescription.isHomeMedicineDeliverySupported! - ? LocaleKeys.resendOrder.tr(context: context) - : LocaleKeys.prescriptionDeliveryError.tr(context: context), + SizedBox(height: 8.h), + Row( + children: [ + Expanded( + flex: 6, + child: CustomButton( + text: prescription.isHomeMedicineDeliverySupported! + ? LocaleKeys.resendOrder.tr(context: context) + : LocaleKeys.prescriptionDeliveryError.tr(context: context), onPressed: () async { if (prescription.isHomeMedicineDeliverySupported!) { LoaderBottomSheet.showLoader(loadingText: "Fetching prescription details...".needTranslation); @@ -269,62 +265,62 @@ class _PrescriptionsListPageState extends State { padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, icon: AppAssets.prescription_refill_icon, - iconColor: prescription.isHomeMedicineDeliverySupported! ? AppColors.successColor : AppColors.textColor.withOpacity(0.35), - iconSize: 14.h, - ), - ), - SizedBox(width: 8.h), - Expanded( - flex: 1, - child: Container( + iconColor: prescription.isHomeMedicineDeliverySupported! ? AppColors.successColor : AppColors.textColor.withOpacity(0.35), + iconSize: 14.h, + ), + ), + SizedBox(width: 8.h), + Expanded( + flex: 1, + child: Container( height: 40.h, width: 40.w, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.textColor, + color: AppColors.textColor, borderRadius: 12, ), - child: Padding( + child: Padding( padding: EdgeInsets.all(12.h), child: Transform.flip( - flipX: appState.isArabic(), - child: Utils.buildSvgWithAssets( - icon: AppAssets.forward_arrow_icon_small, - iconColor: AppColors.whiteColor, + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.whiteColor, fit: BoxFit.contain, + ), + ), ), - ), - ), - ).onPress(() { - model.setPrescriptionsDetailsLoading(); - Navigator.of(context).push( - CustomPageRoute( + ).onPress(() { + model.setPrescriptionsDetailsLoading(); + Navigator.of(context).push( + CustomPageRoute( page: PrescriptionDetailPage( prescriptionsResponseModel: prescription, isFromAppointments: false, ), ), ); - }), + }), + ), + ], ), + SizedBox(height: 12.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), + SizedBox(height: 12.h), ], - ), - SizedBox(height: 12.h), - Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), - SizedBox(height: 12.h), - ], - ); - }).toList(), - ], - ), - ) - : SizedBox.shrink(), + ); + }).toList(), + ], + ), + ) + : SizedBox.shrink(), + ), + ], ), - ], + ), ), ), ), - ), - ), ) : Utils.getNoDataWidget(context, noDataText: "You don't have any prescriptions yet.".needTranslation); }, diff --git a/lib/presentation/radiology/radiology_result_page.dart b/lib/presentation/radiology/radiology_result_page.dart index df34164..1fc2d9f 100644 --- a/lib/presentation/radiology/radiology_result_page.dart +++ b/lib/presentation/radiology/radiology_result_page.dart @@ -10,7 +10,6 @@ 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/radiology/models/resp_models/patient_radiology_response_model.dart'; import 'package:hmg_patient_app_new/features/radiology/radiology_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; diff --git a/lib/presentation/radiology/search_radiology.dart b/lib/presentation/radiology/search_radiology.dart index 98f5c90..8d63a59 100644 --- a/lib/presentation/radiology/search_radiology.dart +++ b/lib/presentation/radiology/search_radiology.dart @@ -8,7 +8,6 @@ import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; -import 'package:sizer/sizer.dart'; class SearchRadiologyContent extends StatefulWidget { final List radiologySuggestionsList; diff --git a/lib/presentation/rate_appointment/rate_appointment_clinic.dart b/lib/presentation/rate_appointment/rate_appointment_clinic.dart index 0913297..5fb1fa3 100644 --- a/lib/presentation/rate_appointment/rate_appointment_clinic.dart +++ b/lib/presentation/rate_appointment/rate_appointment_clinic.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; diff --git a/lib/presentation/rate_appointment/rate_appointment_doctor.dart b/lib/presentation/rate_appointment/rate_appointment_doctor.dart index 782927d..ac79744 100644 --- a/lib/presentation/rate_appointment/rate_appointment_doctor.dart +++ b/lib/presentation/rate_appointment/rate_appointment_doctor.dart @@ -1,17 +1,13 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_rating_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; -import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; import 'package:hmg_patient_app_new/presentation/rate_appointment/rate_appointment_clinic.dart'; import 'package:hmg_patient_app_new/presentation/rate_appointment/widget/doctor_row.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; class RateAppointmentDoctor extends StatefulWidget { diff --git a/lib/presentation/rate_appointment/widget/doctor_row.dart b/lib/presentation/rate_appointment/widget/doctor_row.dart index f38e15d..725ac7c 100644 --- a/lib/presentation/rate_appointment/widget/doctor_row.dart +++ b/lib/presentation/rate_appointment/widget/doctor_row.dart @@ -5,9 +5,7 @@ import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/my_appointments/appointment_rating_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/appointment_details_resp_model.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/rate_appointment_resp_model.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; class BuildDoctorRow extends StatelessWidget { diff --git a/lib/presentation/smartwatches/health_dashboard/health_dashboard.dart b/lib/presentation/smartwatches/health_dashboard/health_dashboard.dart index 7ede201..7c537ba 100644 --- a/lib/presentation/smartwatches/health_dashboard/health_dashboard.dart +++ b/lib/presentation/smartwatches/health_dashboard/health_dashboard.dart @@ -11,12 +11,9 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/smartwatches/widgets/health_metric.dart'; import 'package:hmg_patient_app_new/presentation/smartwatches/widgets/health_metric_card.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/custom_tab_bar.dart'; -import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import 'package:health/health.dart'; -import 'package:intl/intl.dart'; class HealthDashboard extends StatefulWidget { const HealthDashboard({Key? key}) : super(key: key); diff --git a/lib/presentation/smartwatches/smartwatch_instructions_page.dart b/lib/presentation/smartwatches/smartwatch_instructions_page.dart index 1c3644b..7f17f5a 100644 --- a/lib/presentation/smartwatches/smartwatch_instructions_page.dart +++ b/lib/presentation/smartwatches/smartwatch_instructions_page.dart @@ -3,11 +3,9 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:health/health.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/smartwatches/health_dashboard/health_dashboard.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; diff --git a/lib/presentation/smartwatches/widgets/health_metric.dart b/lib/presentation/smartwatches/widgets/health_metric.dart index 13e65ad..5375966 100644 --- a/lib/presentation/smartwatches/widgets/health_metric.dart +++ b/lib/presentation/smartwatches/widgets/health_metric.dart @@ -1,10 +1,8 @@ import 'dart:io'; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:health/health.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; class HealthMetricInfo { diff --git a/lib/presentation/tele_consultation/zoom/call_screen.dart b/lib/presentation/tele_consultation/zoom/call_screen.dart index 21ad42f..59b5ce4 100644 --- a/lib/presentation/tele_consultation/zoom/call_screen.dart +++ b/lib/presentation/tele_consultation/zoom/call_screen.dart @@ -16,7 +16,6 @@ import 'package:flutter_zoom_videosdk/native/zoom_videosdk_event_listener.dart'; import 'package:flutter_zoom_videosdk/native/zoom_videosdk_live_transcription_message_info.dart'; import 'package:flutter_zoom_videosdk/native/zoom_videosdk_share_action.dart'; import 'package:flutter_zoom_videosdk/native/zoom_videosdk_user.dart'; -import 'package:get_it/get_it.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/cache_consts.dart'; import 'package:hmg_patient_app_new/core/utils/jwt.dart'; @@ -24,7 +23,6 @@ import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/video_view.dart'; -import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:image_picker/image_picker.dart'; diff --git a/lib/presentation/todo_section/ancillary_procedures_details_page.dart b/lib/presentation/todo_section/ancillary_procedures_details_page.dart index 2755ac0..b7515af 100644 --- a/lib/presentation/todo_section/ancillary_procedures_details_page.dart +++ b/lib/presentation/todo_section/ancillary_procedures_details_page.dart @@ -22,7 +22,6 @@ 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/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class AncillaryOrderDetailsList extends StatefulWidget { diff --git a/lib/services/analytics/analytics_service.dart b/lib/services/analytics/analytics_service.dart index 3411157..c8f2e48 100644 --- a/lib/services/analytics/analytics_service.dart +++ b/lib/services/analytics/analytics_service.dart @@ -1,8 +1,5 @@ import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:geolocator/geolocator.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart'; import 'package:hmg_patient_app_new/services/analytics/flows/advance_payments.dart'; @@ -15,7 +12,6 @@ import 'package:hmg_patient_app_new/services/analytics/flows/live_care.dart'; import 'package:hmg_patient_app_new/services/analytics/flows/login_registration.dart'; import 'package:hmg_patient_app_new/services/analytics/flows/offers_promotions.dart'; import 'package:hmg_patient_app_new/services/analytics/flows/todo_list.dart'; -import 'package:http/http.dart' as AnalyticEvents; typedef GALogger = Function(String name, {Map parameters}); diff --git a/lib/services/analytics/flows/advance_payments.dart b/lib/services/analytics/flows/advance_payments.dart index 9c8baa1..133e241 100644 --- a/lib/services/analytics/flows/advance_payments.dart +++ b/lib/services/analytics/flows/advance_payments.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; class AdvancePayments{ diff --git a/lib/services/analytics/flows/appointments.dart b/lib/services/analytics/flows/appointments.dart index 57c45e6..d9991a6 100644 --- a/lib/services/analytics/flows/appointments.dart +++ b/lib/services/analytics/flows/appointments.dart @@ -1,8 +1,5 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; -import 'package:intl/intl.dart'; class Appointment { final GALogger logger; diff --git a/lib/services/analytics/flows/live_care.dart b/lib/services/analytics/flows/live_care.dart index 5e7f330..c5fac58 100644 --- a/lib/services/analytics/flows/live_care.dart +++ b/lib/services/analytics/flows/live_care.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; class LiveCare{ diff --git a/lib/services/analytics/flows/login_registration.dart b/lib/services/analytics/flows/login_registration.dart index 9488324..611cc47 100644 --- a/lib/services/analytics/flows/login_registration.dart +++ b/lib/services/analytics/flows/login_registration.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; class LoginRegistration{ diff --git a/lib/splashPage.dart b/lib/splashPage.dart index 9aa16ee..bd7afa5 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -1,15 +1,10 @@ import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_callkit_incoming/entities/call_event.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_zoom_videosdk/native/zoom_videosdk.dart'; import 'package:get_it/get_it.dart'; -import 'package:hmg_patient_app_new/presentation/lab/lab_orders_page.dart'; import 'package:hmg_patient_app_new/presentation/onboarding/onboarding_screen.dart'; import 'package:hmg_patient_app_new/presentation/onboarding/splash_animation_screen.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; @@ -20,7 +15,6 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; // import 'package:hmg_patient_app_new/presentation/authantication/login.dart'; -import 'package:hmg_patient_app_new/presentation/home/landing_page.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/call_screen.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; @@ -33,7 +27,6 @@ import 'package:provider/provider.dart'; import 'core/cache_consts.dart'; import 'core/utils/local_notifications.dart'; import 'core/utils/push_notification_handler.dart'; -import 'widgets/routes/custom_page_route.dart'; class SplashPage extends StatefulWidget { @override diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart index ca40c32..541cb5e 100644 --- a/lib/widgets/appbar/collapsing_list_view.dart +++ b/lib/widgets/appbar/collapsing_list_view.dart @@ -1,4 +1,3 @@ -import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -6,7 +5,6 @@ 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/app_state.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; -import 'package:hmg_patient_app_new/extensions/context_extensions.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'; diff --git a/lib/widgets/date_range_selector/date_range_calender.dart b/lib/widgets/date_range_selector/date_range_calender.dart index 8620ab5..debc069 100644 --- a/lib/widgets/date_range_selector/date_range_calender.dart +++ b/lib/widgets/date_range_selector/date_range_calender.dart @@ -14,7 +14,6 @@ import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart' show DateRangeSelectorRangeViewModel; import 'package:provider/provider.dart'; -import 'package:syncfusion_flutter_calendar/calendar.dart'; import 'package:syncfusion_flutter_datepicker/datepicker.dart'; typedef OnRangeSelected = void Function(DateTime? start, DateTime? end); diff --git a/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart b/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart index d295987..3f67b6a 100644 --- a/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart +++ b/lib/widgets/date_range_selector/viewmodel/date_range_view_model.dart @@ -1,4 +1,3 @@ -import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/features/lab/models/Range.dart'; diff --git a/lib/widgets/datepicker_widget.dart b/lib/widgets/datepicker_widget.dart index 47c4de6..6ca9fe1 100644 --- a/lib/widgets/datepicker_widget.dart +++ b/lib/widgets/datepicker_widget.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; class DatePickerWidget extends StatelessWidget { diff --git a/lib/widgets/family_files/family_file_add_widget.dart b/lib/widgets/family_files/family_file_add_widget.dart index 8e57f91..4840ba7 100644 --- a/lib/widgets/family_files/family_file_add_widget.dart +++ b/lib/widgets/family_files/family_file_add_widget.dart @@ -1,5 +1,4 @@ import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; diff --git a/lib/widgets/loading_dialog.dart b/lib/widgets/loading_dialog.dart index 3c2440a..dc860b5 100644 --- a/lib/widgets/loading_dialog.dart +++ b/lib/widgets/loading_dialog.dart @@ -3,10 +3,7 @@ import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; import 'package:lottie/lottie.dart'; class LoadingDialog extends StatefulWidget { diff --git a/lib/widgets/map/HMSMap.dart b/lib/widgets/map/HMSMap.dart index 7b9c553..96b2fac 100644 --- a/lib/widgets/map/HMSMap.dart +++ b/lib/widgets/map/HMSMap.dart @@ -1,9 +1,7 @@ import 'dart:async'; import 'package:flutter/material.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/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:huawei_map/huawei_map.dart' ; diff --git a/lib/widgets/map/gms_map.dart b/lib/widgets/map/gms_map.dart index 6d04692..f4c3ad5 100644 --- a/lib/widgets/map/gms_map.dart +++ b/lib/widgets/map/gms_map.dart @@ -2,9 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; From dcdd17f0e9ae0cd244b41f73ab1060f9aa76e02f Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 28 Dec 2025 16:13:53 +0300 Subject: [PATCH 40/55] sickleave fix --- lib/presentation/medical_file/patient_sickleaves_list_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/presentation/medical_file/patient_sickleaves_list_page.dart b/lib/presentation/medical_file/patient_sickleaves_list_page.dart index cbd7b56..ef5aaeb 100644 --- a/lib/presentation/medical_file/patient_sickleaves_list_page.dart +++ b/lib/presentation/medical_file/patient_sickleaves_list_page.dart @@ -108,7 +108,7 @@ class _PatientSickleavesListPageState extends State { ? PatientSickLeaveCard( patientSickLeavesResponseModel: PatientSickLeavesResponseModel(), isLoading: true, - ).paddingSymmetrical(24.h, 0.0) + ).paddingSymmetrical(0.h, 12.h) : model.patientSickLeaveList.isNotEmpty ? AnimationConfiguration.staggeredList( position: index, From a1aaa041d14c09b72e5fa66e2c854d52d9f1e30f Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Sun, 28 Dec 2025 22:53:46 +0300 Subject: [PATCH 41/55] Water Intake Final Touches --- assets/images/svg/graph_icon.svg | 5 + assets/images/svg/green_tick_icon.svg | 3 + assets/images/svg/list_icon.svg | 8 + assets/images/svg/yellow_arrow_down_icon.svg | 3 + lib/core/api/api_client.dart | 2 +- lib/core/api_consts.dart | 59 +- lib/core/app_assets.dart | 4 + lib/core/dependencies.dart | 9 +- lib/core/utils/size_utils.dart | 11 + .../insert_user_activity_request_model.dart | 26 + .../undo_user_activity_request_model.dart | 26 + .../update_user_detail_request_model.dart | 88 +++ .../models/user_progress_models.dart | 111 +++ .../water_monitor/water_monitor_repo.dart | 320 ++++++++ .../water_monitor_view_model.dart | 714 +++++++++++++++++- .../water_consumption_screen.dart | 656 +++++++++++++--- .../water_monitor_settings_screen.dart | 24 +- .../shimmer/common_shimmer_widget.dart | 11 +- 18 files changed, 1912 insertions(+), 168 deletions(-) create mode 100644 assets/images/svg/graph_icon.svg create mode 100644 assets/images/svg/green_tick_icon.svg create mode 100644 assets/images/svg/list_icon.svg create mode 100644 assets/images/svg/yellow_arrow_down_icon.svg create mode 100644 lib/features/water_monitor/models/insert_user_activity_request_model.dart create mode 100644 lib/features/water_monitor/models/undo_user_activity_request_model.dart create mode 100644 lib/features/water_monitor/models/update_user_detail_request_model.dart create mode 100644 lib/features/water_monitor/models/user_progress_models.dart create mode 100644 lib/features/water_monitor/water_monitor_repo.dart diff --git a/assets/images/svg/graph_icon.svg b/assets/images/svg/graph_icon.svg new file mode 100644 index 0000000..7bb6fbb --- /dev/null +++ b/assets/images/svg/graph_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/svg/green_tick_icon.svg b/assets/images/svg/green_tick_icon.svg new file mode 100644 index 0000000..e041191 --- /dev/null +++ b/assets/images/svg/green_tick_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/svg/list_icon.svg b/assets/images/svg/list_icon.svg new file mode 100644 index 0000000..e68f20b --- /dev/null +++ b/assets/images/svg/list_icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/images/svg/yellow_arrow_down_icon.svg b/assets/images/svg/yellow_arrow_down_icon.svg new file mode 100644 index 0000000..f2ca09f --- /dev/null +++ b/assets/images/svg/yellow_arrow_down_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index f366329..039787b 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -210,7 +210,7 @@ class ApiClientImp implements ApiClient { final int statusCode = response.statusCode; log("uri: ${Uri.parse(url.trim())}"); log("body: ${json.encode(body)}"); - // log("response.body: ${response.body}"); + log("response.body: ${response.body}"); if (statusCode < 200 || statusCode >= 400) { onFailure('Error While Fetching data', statusCode, failureType: StatusCodeFailure("Error While Fetching data")); logApiEndpointError(endPoint, 'Error While Fetching data', statusCode); diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index a5283c0..8a91a6f 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -437,14 +437,6 @@ var RATE_DOCTOR_RESPONSE = 'Services/OUTPs.svc/REST/insertAppointmentQuestionRat var GET_PATIENT_ALLERGIES = 'Services/Patients.svc/REST/GetPatientAllergies'; -// H2O -var H2O_GET_USER_PROGRESS = "Services/H2ORemainder.svc/REST/H2O_GetUserProgress"; -var H2O_INSERT_USER_ACTIVITY = "Services/H2ORemainder.svc/REST/H2O_InsertUserActivity"; -var H2O_GET_USER_DETAIL = "Services/H2ORemainder.svc/REST/H2O_GetUserDetails_New"; -var H2O_UPDATE_USER_DETAIL = "Services/H2ORemainder.svc/REST/H2O_UpdateUserDetails_New"; -var H2O_UNDO_USER_ACTIVITY = "Services/H2ORemainder.svc/REST/H2o_UndoUserActivity"; -//E_Referral Services - // Encillary Orders var GET_ANCILLARY_ORDERS = 'Services/Doctors.svc/REST/GetOnlineAncillaryOrderList'; @@ -670,25 +662,6 @@ var addPayFortApplePayResponse = "Services/PayFort_Serv.svc/REST/AddResponse"; // Auth Provider Consts -const String INSERT_DEVICE_IMEI = 'Services/Patients.svc/REST/Patient_INSERTDeviceIMEI'; -const String SELECT_DEVICE_IMEI = 'Services/Patients.svc/REST/Patient_SELECTDeviceIMEIbyIMEI'; -const String CHECK_PATIENT_AUTH = 'Services/Authentication.svc/REST/CheckPatientAuthentication'; -const GET_MOBILE_INFO = 'Services/Authentication.svc/REST/GetMobileLoginInfo'; - -const FORGOT_PASSWORD = 'Services/Authentication.svc/REST/CheckActivationCodeForSendFileNo'; -const CHECK_PATIENT_FOR_REGISTRATION = "Services/Authentication.svc/REST/CheckPatientForRegisteration"; - -const CHECK_USER_STATUS = "Services/NHIC.svc/REST/GetPatientInfo"; -const REGISTER_USER = 'Services/Authentication.svc/REST/PatientRegistration'; -const LOGGED_IN_USER_URL = 'Services/MobileNotifications.svc/REST/Insert_PatientMobileDeviceInfo'; - -const FORGOT_PATIENT_ID = 'Services/Authentication.svc/REST/SendPatientIDSMSByMobileNumber'; -const DASHBOARD = 'Services/Patients.svc/REST/PatientDashboard'; -const PROFILE_SETTING = 'Services/Patients.svc/REST/GetPateintInfoForUpdate'; -const SAVE_SETTING = 'Services/Patients.svc/REST/UpdatePateintInfo'; - -const DEACTIVATE_ACCOUNT = 'Services/Patients.svc/REST/PatientAppleActivation_InsertUpdate'; - var ER_CREATE_ADVANCE_PAYMENT = "services/Doctors.svc/REST/ER_CreateAdvancePaymentForClinic"; //family Files @@ -868,6 +841,7 @@ class ApiConsts { //WATER CONSUMPTION static String h2oGetUserProgress = "Services/H2ORemainder.svc/REST/H2O_GetUserProgress"; static String h2oInsertUserActivity = "Services/H2ORemainder.svc/REST/H2O_InsertUserActivity"; + static String h2oInsertUserDetailsNew = "Services/H2ORemainder.svc/REST/H2O_InsertUserDetails_New"; static String h2oGetUserDetail = "Services/H2ORemainder.svc/REST/H2O_GetUserDetails_New"; static String h2oUpdateUserDetail = "Services/H2ORemainder.svc/REST/H2O_UpdateUserDetails_New"; static String h2oUndoUserActivity = "Services/H2ORemainder.svc/REST/H2o_UndoUserActivity"; @@ -883,3 +857,34 @@ class ApiConsts { class ApiKeyConstants { static final String googleMapsApiKey = 'AIzaSyB6TERnxIr0yJ3qG4ULBZbu0sAD4tGqtng'; } + +//flutter: URL : https://hmgwebservices.com/Services/H2ORemainder.svc/REST/H2O_InsertUserActivity +// flutter: {"IdentificationNo":"2530976584","MobileNumber":"504278212","QuantityIntake":200,"VersionID":20.0,"Channel":3,"LanguageID":2,"IPAdress":"10.20.10.20","generalid":"Cs2020@2016$2958","PatientOutSA":0,"SessionID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","isDentalAllowedBackend":false,"DeviceTypeID":1,"PatientID":4515697,"TokenID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","PatientTypeID":1,"PatientType":1,"Latitude":37.785834,"Longitude":-122.406417} +// flutter: response.body: +// flutter: {"Date":null,"LanguageID":0,"ServiceName":0,"Time":null,"AndroidLink":null,"AuthenticationTokenID":null,"Data":null,"Dataw":false,"DietType":0,"DietTypeID":0,"ErrorCode":null,"ErrorEndUserMessage":null,"ErrorEndUserMessageN":null,"ErrorMessage":null,"ErrorStatusCode":0,"ErrorType":0,"FoodCategory":0,"IOSLink":null,"IsAuthenticated":true,"MealOrderStatus":0,"MealType":0,"MessageStatus":1,"NumberOfResultRecords":0,"PatientBlodType":null,"SuccessMsg":null,"SuccessMsgN":null,"VidaUpdatedResponse":null,"IsHMGPatient":false,"LogInTokenID":null,"PhysicalActivityData":null,"RowExists":0,"UserDetailData":null,"UserDetailData_New":null,"UserProgressForMonthData":null,"UserProgressForTodayData":[{"QuantityConsumed":200.00,"PercentageConsumed":9.41,"PercentageLeft":90.59,"QuantityLimit":2125.00}],"UserProgressForWeekData":null,"UserProgressHistoryData":[{"Quantity":200.000,"CreatedDate":"\/Date(1766911222217+0300)\/"}],"VerificationCode":null,"isSMSSent":false} + +// URL : https://hmgwebservices.com/Services/H2ORemainder.svc/REST/H2o_UndoUserActivity +// flutter: {"Progress":1,"MobileNumber":"504278212","IdentificationNo":"2530976584","VersionID":20.0,"Channel":3,"LanguageID":2,"IPAdress":"10.20.10.20","generalid":"Cs2020@2016$2958","PatientOutSA":0,"SessionID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","isDentalAllowedBackend":false,"DeviceTypeID":1,"PatientID":4515697,"TokenID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","PatientTypeID":1,"PatientType":1,"Latitude":37.785834,"Longitude":-122.406417} +// flutter: response.body: +// flutter: {"Date":null,"LanguageID":0,"ServiceName":0,"Time":null,"AndroidLink":null,"AuthenticationTokenID":null,"Data":null,"Dataw":false,"DietType":0,"DietTypeID":0,"ErrorCode":null,"ErrorEndUserMessage":null,"ErrorEndUserMessageN":null,"ErrorMessage":null,"ErrorStatusCode":0,"ErrorType":0,"FoodCategory":0,"IOSLink":null,"IsAuthenticated":false,"MealOrderStatus":0,"MealType":0,"MessageStatus":1,"NumberOfResultRecords":0,"PatientBlodType":null,"SuccessMsg":null,"SuccessMsgN":null,"VidaUpdatedResponse":null,"IsHMGPatient":false,"LogInTokenID":null,"PhysicalActivityData":null,"RowExists":0,"UserDetailData":null,"UserDetailData_New":null,"UserProgressForMonthData":null,"UserProgressForTodayData":[{"QuantityConsumed":0.00,"PercentageConsumed":0.00,"PercentageLeft":100.00,"QuantityLimit":2125.00}],"UserProgressForWeekData":null,"UserProgressHistoryData":[],"VerificationCode":null,"isSMSSent":false} + +// Progress":2 means weekly data + +// flutter: URL : https://hmgwebservices.com/Services/H2ORemainder.svc/REST/H2O_GetUserProgress +// flutter: {"Progress":2,"MobileNumber":"504278212","IdentificationNo":"2530976584","VersionID":20.0,"Channel":3,"LanguageID":2,"IPAdress":"10.20.10.20","generalid":"Cs2020@2016$2958","PatientOutSA":0,"SessionID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","isDentalAllowedBackend":false,"DeviceTypeID":1,"PatientID":4515697,"TokenID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","PatientTypeID":1,"PatientType":1,"Latitude":37.785834,"Longitude":-122.406417} +// flutter: response.body: +// [log] {"Date":null,"LanguageID":0,"ServiceName":0,"Time":null,"AndroidLink":null,"AuthenticationTokenID":null,"Data":null,"Dataw":false,"DietType":0,"DietTypeID":0,"ErrorCode":null,"ErrorEndUserMessage":null,"ErrorEndUserMessageN":null,"ErrorMessage":null,"ErrorStatusCode":0,"ErrorType":0,"FoodCategory":0,"IOSLink":null,"IsAuthenticated":false,"MealOrderStatus":0,"MealType":0,"MessageStatus":1,"NumberOfResultRecords":0,"PatientBlodType":null,"SuccessMsg":null,"SuccessMsgN":null,"VidaUpdatedResponse":null,"IsHMGPatient":false,"LogInTokenID":null,"PhysicalActivityData":null,"RowExists":0,"UserDetailData":null,"UserDetailData_New":null,"UserProgressForMonthData":null,"UserProgressForTodayData":null,"UserProgressForWeekData":[{"DayNumber":1,"DayDate":null,"DayName":"Sunday","PercentageConsumed":0},{"DayNumber":7,"DayDate":null,"DayName":"Saturday","PercentageConsumed":0},{"DayNumber":6,"DayDate":null,"DayName":"Friday","PercentageConsumed":0},{"DayNumber":5,"DayDate":null,"DayName":"Thursday","PercentageConsumed":0},{"DayNumber":4,"DayDate":null,"DayName":"Wednesday","PercentageConsumed":0},{"DayNumber":3,"DayDate":null,"DayName":"Tuesday","PercentageConsumed":0},{"DayNumber":2,"DayDate":null,"DayName":"Monday","PercentageConsumed":0}],"UserProgressHistoryData":[],"VerificationCode":null,"isSMSSent":false} + +// Progress":1 means daily data + +//URL : https://hmgwebservices.com/Services/H2ORemainder.svc/REST/H2O_GetUserProgress +// flutter: {"Progress":1,"MobileNumber":"504278212","IdentificationNo":"2530976584","VersionID":20.0,"Channel":3,"LanguageID":2,"IPAdress":"10.20.10.20","generalid":"Cs2020@2016$2958","PatientOutSA":0,"SessionID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","isDentalAllowedBackend":false,"DeviceTypeID":1,"PatientID":4515697,"TokenID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","PatientTypeID":1,"PatientType":1,"Latitude":37.785834,"Longitude":-122.406417} +// flutter: response.body: +// flutter: {"Date":null,"LanguageID":0,"ServiceName":0,"Time":null,"AndroidLink":null,"AuthenticationTokenID":null,"Data":null,"Dataw":false,"DietType":0,"DietTypeID":0,"ErrorCode":null,"ErrorEndUserMessage":null,"ErrorEndUserMessageN":null,"ErrorMessage":null,"ErrorStatusCode":0,"ErrorType":0,"FoodCategory":0,"IOSLink":null,"IsAuthenticated":false,"MealOrderStatus":0,"MealType":0,"MessageStatus":1,"NumberOfResultRecords":0,"PatientBlodType":null,"SuccessMsg":null,"SuccessMsgN":null,"VidaUpdatedResponse":null,"IsHMGPatient":false,"LogInTokenID":null,"PhysicalActivityData":null,"RowExists":0,"UserDetailData":null,"UserDetailData_New":null,"UserProgressForMonthData":null,"UserProgressForTodayData":[{"QuantityConsumed":0.00,"PercentageConsumed":0.00,"PercentageLeft":100.00,"QuantityLimit":2125.00}],"UserProgressForWeekData":null,"UserProgressHistoryData":[],"VerificationCode":null,"isSMSSent":false} + +// Progress":1 means monthly data + +// flutter: URL : https://hmgwebservices.com/Services/H2ORemainder.svc/REST/H2O_GetUserProgress +// flutter: {"Progress":3,"MobileNumber":"504278212","IdentificationNo":"2530976584","VersionID":20.0,"Channel":3,"LanguageID":2,"IPAdress":"10.20.10.20","generalid":"Cs2020@2016$2958","PatientOutSA":0,"SessionID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","isDentalAllowedBackend":false,"DeviceTypeID":1,"PatientID":4515697,"TokenID":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlblR5cGUiOjIsIm9iaiI6eyJUaW1lIjoiMjAyNS0xMi0yOFQwODozNjo0My45MTY0MzRaIiwiUGF0aWVudElEIjoiNDUxNTY5NyIsIlBhdGllbnRNZXJnZWRJRHMiOiI0NTE1Njk3IiwiUGF0aWVudE91dFNBIjpmYWxzZX0sImV4cCI6MTc2Njk2NjQwMH0.l1rCcs2OAU5u2J-iZMiO7NX6shGzLJV0hlYtVh2JeqY","PatientTypeID":1,"PatientType":1,"Latitude":37.785834,"Longitude":-122.406417} +// flutter: response.body: +// [log] {"Date":null,"LanguageID":0,"ServiceName":0,"Time":null,"AndroidLink":null,"AuthenticationTokenID":null,"Data":null,"Dataw":false,"DietType":0,"DietTypeID":0,"ErrorCode":null,"ErrorEndUserMessage":null,"ErrorEndUserMessageN":null,"ErrorMessage":null,"ErrorStatusCode":0,"ErrorType":0,"FoodCategory":0,"IOSLink":null,"IsAuthenticated":false,"MealOrderStatus":0,"MealType":0,"MessageStatus":1,"NumberOfResultRecords":0,"PatientBlodType":null,"SuccessMsg":null,"SuccessMsgN":null,"VidaUpdatedResponse":null,"IsHMGPatient":false,"LogInTokenID":null,"PhysicalActivityData":null,"RowExists":0,"UserDetailData":null,"UserDetailData_New":null,"UserProgressForMonthData":[{"MonthNumber":1,"MonthName":"January","PercentageConsumed":0},{"MonthNumber":2,"MonthName":"February","PercentageConsumed":0},{"MonthNumber":3,"MonthName":"March","PercentageConsumed":0},{"MonthNumber":4,"MonthName":"April","PercentageConsumed":0},{"MonthNumber":5,"MonthName":"May","PercentageConsumed":0},{"MonthNumber":6,"MonthName":"June","PercentageConsumed":0},{"MonthNumber":7,"MonthName":"July","PercentageConsumed":0},{"MonthNumber":8,"MonthName":"August","PercentageConsumed":0},{"MonthNumber":9,"MonthName":"September","PercentageConsumed":0},{"MonthNumber":10,"MonthName":"October","PercentageConsumed":0},{"MonthNumber":11,"MonthName":"November","PercentageConsumed":0},{"MonthNumber":12,"MonthName":"December","PercentageConsumed":0}],"UserProgressForTodayData":null,"UserProgressForWeekData":null,"UserProgressHistoryData":[],"VerificationCode":null,"isSMSSent":false} diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index 34224f8..a4fbc62 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -261,6 +261,10 @@ class AppAssets { static const String minimizeIcon = '$svgBasePath/minimize_icon.svg'; static const String addIconDark = '$svgBasePath/add_icon_dark.svg'; static const String glassIcon = '$svgBasePath/glass_icon.svg'; + static const String graphIcon = '$svgBasePath/graph_icon.svg'; + static const String listIcon = '$svgBasePath/list_icon.svg'; + static const String yellowArrowDownIcon = '$svgBasePath/yellow_arrow_down_icon.svg'; + static const String greenTickIcon = '$svgBasePath/green_tick_icon.svg'; // PNGS static const String hmgLogo = '$pngBasePath/hmg_logo.png'; diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index 96cbfa9..ee3b7eb 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -45,6 +45,7 @@ import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_r import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_repo.dart'; import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; @@ -125,10 +126,8 @@ class AppDependencies { getIt.registerLazySingleton(() => ContactUsRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => HmgServicesRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => SymptomsCheckerRepoImp(loggerService: getIt(), apiClient: getIt())); - getIt.registerLazySingleton(() => BloodDonationRepoImp( - loggerService: getIt(), - apiClient: getIt(), - )); + getIt.registerLazySingleton(() => BloodDonationRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => WaterMonitorRepoImp(loggerService: getIt(), apiClient: getIt())); // ViewModels // Global/shared VMs → LazySingleton @@ -268,7 +267,7 @@ class AppDependencies { () => HealthProvider(), ); - getIt.registerLazySingleton(() => WaterMonitorViewModel()); + getIt.registerLazySingleton(() => WaterMonitorViewModel(waterMonitorRepo: getIt())); // Screen-specific VMs → Factory // getIt.registerFactory( diff --git a/lib/core/utils/size_utils.dart b/lib/core/utils/size_utils.dart index 8a0703e..4fdc09c 100644 --- a/lib/core/utils/size_utils.dart +++ b/lib/core/utils/size_utils.dart @@ -1,4 +1,5 @@ import 'dart:developer'; +import 'dart:math' as math; import 'package:flutter/material.dart'; // These are the Viewport values of your Figma Design. @@ -6,6 +7,16 @@ import 'package:flutter/material.dart'; // These are the Viewport values of your const num figmaDesignWidth = 375; // iPhone X / 12 base width const num figmaDesignHeight = 812; // iPhone X / 12 base height + +extension ConstrainedResponsive on num { + /// Width with max cap for tablets + double get wCapped => isTablet ? math.min( w, this * 1.3) : w; + + /// Height with max cap for tablets + double get hCapped => isTablet ? math.min(h, this * 1.3) : h; +} + + extension ResponsiveExtension on num { double get _screenWidth => SizeUtils.width; diff --git a/lib/features/water_monitor/models/insert_user_activity_request_model.dart b/lib/features/water_monitor/models/insert_user_activity_request_model.dart new file mode 100644 index 0000000..a0af649 --- /dev/null +++ b/lib/features/water_monitor/models/insert_user_activity_request_model.dart @@ -0,0 +1,26 @@ +class InsertUserActivityRequestModel { + String? identificationNo; + String? mobileNumber; + num? quantityIntake; + + InsertUserActivityRequestModel({ + this.identificationNo, + this.mobileNumber, + this.quantityIntake, + }); + + Map toJson() { + final map = {}; + if (identificationNo != null) map['IdentificationNo'] = identificationNo; + if (mobileNumber != null) map['MobileNumber'] = mobileNumber; + if (quantityIntake != null) map['QuantityIntake'] = quantityIntake; + return map; + } + + factory InsertUserActivityRequestModel.fromJson(Map json) => InsertUserActivityRequestModel( + identificationNo: json['IdentificationNo']?.toString(), + mobileNumber: json['MobileNumber']?.toString(), + quantityIntake: json['QuantityIntake'], + ); +} + diff --git a/lib/features/water_monitor/models/undo_user_activity_request_model.dart b/lib/features/water_monitor/models/undo_user_activity_request_model.dart new file mode 100644 index 0000000..01dbd92 --- /dev/null +++ b/lib/features/water_monitor/models/undo_user_activity_request_model.dart @@ -0,0 +1,26 @@ +class UndoUserActivityRequestModel { + num? progress; + String? mobileNumber; + String? identificationNo; + + UndoUserActivityRequestModel({ + this.progress, + this.mobileNumber, + this.identificationNo, + }); + + Map toJson() { + final map = {}; + if (progress != null) map['Progress'] = progress; + if (mobileNumber != null) map['MobileNumber'] = mobileNumber; + if (identificationNo != null) map['IdentificationNo'] = identificationNo; + return map; + } + + factory UndoUserActivityRequestModel.fromJson(Map json) => UndoUserActivityRequestModel( + progress: json['Progress'], + mobileNumber: json['MobileNumber']?.toString(), + identificationNo: json['IdentificationNo']?.toString(), + ); +} + diff --git a/lib/features/water_monitor/models/update_user_detail_request_model.dart b/lib/features/water_monitor/models/update_user_detail_request_model.dart new file mode 100644 index 0000000..33dbbb2 --- /dev/null +++ b/lib/features/water_monitor/models/update_user_detail_request_model.dart @@ -0,0 +1,88 @@ +class UpdateUserDetailRequestModel { + // User detail fields + String? activityID; + String? dOB; + String? email; + String? firstName; + String? lastName; + String? firstNameN; + String? middleName; + String? middleNameN; + String? lastNameN; + String? gender; + num? height; + bool? isHeightInCM; + bool? isWeightInKG; + String? zipCode; + num? weight; + bool? isNotificationOn; + String? mobileNumber; + String? identificationNo; + + UpdateUserDetailRequestModel({ + this.activityID, + this.dOB, + this.email, + this.firstName, + this.lastName, + this.firstNameN, + this.middleName, + this.middleNameN, + this.lastNameN, + this.gender, + this.height, + this.isHeightInCM, + this.isWeightInKG, + this.zipCode, + this.weight, + this.isNotificationOn, + this.mobileNumber, + this.identificationNo, + }); + + Map toJson() { + final map = {}; + + // User detail fields + if (activityID != null) map['ActivityID'] = activityID; + if (dOB != null) map['DOB'] = dOB; + if (email != null) map['Email'] = email; + if (firstName != null) map['FirstName'] = firstName; + if (lastName != null) map['LastName'] = lastName; + if (firstNameN != null) map['FirstNameN'] = firstNameN; + if (middleName != null) map['MiddleName'] = middleName; + if (middleNameN != null) map['MiddleNameN'] = middleNameN; + if (lastNameN != null) map['LastNameN'] = lastNameN; + if (gender != null) map['Gender'] = gender; + if (height != null) map['Height'] = height; + if (isHeightInCM != null) map['IsHeightInCM'] = isHeightInCM; + if (isWeightInKG != null) map['IsWeightInKG'] = isWeightInKG; + if (zipCode != null) map['ZipCode'] = zipCode; + if (weight != null) map['Weight'] = weight; + if (isNotificationOn != null) map['IsNotificationOn'] = isNotificationOn; + if (mobileNumber != null) map['MobileNumber'] = mobileNumber; + if (identificationNo != null) map['IdentificationNo'] = identificationNo; + return map; + } + + factory UpdateUserDetailRequestModel.fromJson(Map json) => UpdateUserDetailRequestModel( + activityID: json['ActivityID']?.toString(), + dOB: json['DOB']?.toString(), + email: json['Email']?.toString(), + firstName: json['FirstName']?.toString(), + lastName: json['LastName']?.toString(), + firstNameN: json['FirstNameN']?.toString(), + middleName: json['MiddleName']?.toString(), + middleNameN: json['MiddleNameN']?.toString(), + lastNameN: json['LastNameN']?.toString(), + gender: json['Gender']?.toString(), + height: json['Height'], + isHeightInCM: json['IsHeightInCM'] as bool?, + isWeightInKG: json['IsWeightInKG'] as bool?, + zipCode: json['ZipCode']?.toString(), + weight: json['Weight'], + isNotificationOn: json['IsNotificationOn'] as bool?, + mobileNumber: json['MobileNumber']?.toString(), + identificationNo: json['IdentificationNo']?.toString(), + ); +} diff --git a/lib/features/water_monitor/models/user_progress_models.dart b/lib/features/water_monitor/models/user_progress_models.dart new file mode 100644 index 0000000..667653e --- /dev/null +++ b/lib/features/water_monitor/models/user_progress_models.dart @@ -0,0 +1,111 @@ +/// Model for today's water progress data +class UserProgressForTodayModel { + num? quantityConsumed; + num? percentageConsumed; + num? percentageLeft; + num? quantityLimit; + + UserProgressForTodayModel({ + this.quantityConsumed, + this.percentageConsumed, + this.percentageLeft, + this.quantityLimit, + }); + + factory UserProgressForTodayModel.fromJson(Map json) => UserProgressForTodayModel( + quantityConsumed: json['QuantityConsumed'], + percentageConsumed: json['PercentageConsumed'], + percentageLeft: json['PercentageLeft'], + quantityLimit: json['QuantityLimit'], + ); + + Map toJson() { + return { + 'QuantityConsumed': quantityConsumed, + 'PercentageConsumed': percentageConsumed, + 'PercentageLeft': percentageLeft, + 'QuantityLimit': quantityLimit, + }; + } +} + +/// Model for weekly water progress data +class UserProgressForWeekModel { + int? dayNumber; + String? dayDate; + String? dayName; + num? percentageConsumed; + + UserProgressForWeekModel({ + this.dayNumber, + this.dayDate, + this.dayName, + this.percentageConsumed, + }); + + factory UserProgressForWeekModel.fromJson(Map json) => UserProgressForWeekModel( + dayNumber: json['DayNumber'] as int?, + dayDate: json['DayDate']?.toString(), + dayName: json['DayName']?.toString(), + percentageConsumed: json['PercentageConsumed'], + ); + + Map toJson() { + return { + 'DayNumber': dayNumber, + 'DayDate': dayDate, + 'DayName': dayName, + 'PercentageConsumed': percentageConsumed, + }; + } +} + +/// Model for monthly water progress data +class UserProgressForMonthModel { + int? monthNumber; + String? monthName; + num? percentageConsumed; + + UserProgressForMonthModel({ + this.monthNumber, + this.monthName, + this.percentageConsumed, + }); + + factory UserProgressForMonthModel.fromJson(Map json) => UserProgressForMonthModel( + monthNumber: json['MonthNumber'] as int?, + monthName: json['MonthName']?.toString(), + percentageConsumed: json['PercentageConsumed'], + ); + + Map toJson() { + return { + 'MonthNumber': monthNumber, + 'MonthName': monthName, + 'PercentageConsumed': percentageConsumed, + }; + } +} + +/// Model for user progress history data +class UserProgressHistoryModel { + num? quantity; + String? createdDate; + + UserProgressHistoryModel({ + this.quantity, + this.createdDate, + }); + + factory UserProgressHistoryModel.fromJson(Map json) => UserProgressHistoryModel( + quantity: json['Quantity'], + createdDate: json['CreatedDate']?.toString(), + ); + + Map toJson() { + return { + 'Quantity': quantity, + 'CreatedDate': createdDate, + }; + } +} diff --git a/lib/features/water_monitor/water_monitor_repo.dart b/lib/features/water_monitor/water_monitor_repo.dart new file mode 100644 index 0000000..f52c971 --- /dev/null +++ b/lib/features/water_monitor/water_monitor_repo.dart @@ -0,0 +1,320 @@ +import 'dart:developer'; + +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/models/insert_user_activity_request_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/models/undo_user_activity_request_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/models/update_user_detail_request_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +/// Progress types to request different ranges from the progress API. +enum ProgressType { today, week, month } + +abstract class WaterMonitorRepo { + /// Fetch user details for water monitoring. + /// The request will include the standard payload injected by ApiClient and + /// additionally these three parameters: Progress, MobileNumber, IdentificationNo. + Future>> getUserDetailsForWaterMonitoring({ + required num progress, + required String mobileNumber, + required String identificationNo, + }); + + /// Fetch user progress for water monitoring (H2O_GetUserProgress). + Future>> getUserProgressForWaterMonitoring({ + required ProgressType progressType, + required String mobileNumber, + required String identificationNo, + }); + + /// Update user details for water monitoring. + Future>> updateOrInsertUserDetailForWaterMonitoring( + {required UpdateUserDetailRequestModel requestModel, bool isUpdate = false}); + + /// Insert user activity (water intake). + Future>> insertUserActivity({ + required InsertUserActivityRequestModel requestModel, + }); + + /// Undo last user activity. + Future>> undoUserActivity({ + required UndoUserActivityRequestModel requestModel, + }); +} + +class WaterMonitorRepoImp implements WaterMonitorRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + WaterMonitorRepoImp({required this.loggerService, required this.apiClient}); + + @override + Future>> getUserDetailsForWaterMonitoring({ + required num progress, + required String mobileNumber, + required String identificationNo, + }) async { + Map request = { + "Progress": progress, + "MobileNumber": mobileNumber, + "IdentificationNo": identificationNo, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.h2oGetUserDetail, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + log("response h2oGetUserDetail: ${response.toString()}"); + // Extract only the specific key from the API response as requested + dynamic extracted; + if (response is Map && response.containsKey('UserDetailData_New')) { + extracted = response['UserDetailData_New']; + } else { + extracted = null; + } + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: extracted, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getUserProgressForWaterMonitoring({ + required ProgressType progressType, + required String mobileNumber, + required String identificationNo, + }) async { + final progressValue = progressType == ProgressType.today ? 1 : (progressType == ProgressType.week ? 2 : 3); + + Map request = { + "Progress": progressValue, + "MobileNumber": mobileNumber, + "IdentificationNo": identificationNo, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.h2oGetUserProgress, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + // Try a few likely nested keys and fall back to the full response + dynamic extracted; + if (response is Map) { + switch (progressType) { + case ProgressType.today: + if (response.containsKey('UserProgressForTodayData')) { + extracted = response['UserProgressForTodayData']; + } + break; + case ProgressType.week: + if (response.containsKey('UserProgressForWeekData')) { + extracted = response['UserProgressForWeekData']; + } + break; + case ProgressType.month: + if (response.containsKey('UserProgressForMonthData')) { + extracted = response['UserProgressForMonthData']; + } + break; + } + + // fallbacks + if (extracted == null) { + if (response.containsKey('UserProgress')) { + extracted = response['UserProgress']; + } else if (response.containsKey('UserProgressData_New')) { + extracted = response['UserProgressData_New']; + } else { + extracted = response; + } + } + } else { + extracted = response; + } + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: extracted, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> updateOrInsertUserDetailForWaterMonitoring({ + required UpdateUserDetailRequestModel requestModel, + bool isUpdate = false, + }) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + + // Use different endpoint based on isUpdate flag + final endpoint = isUpdate ? ApiConsts.h2oUpdateUserDetail : ApiConsts.h2oInsertUserDetailsNew; + await apiClient.post( + endpoint, + body: requestModel.toJson(), + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + dynamic extracted; + if (response is Map && response.containsKey('UserDetailData_New')) { + extracted = response['UserDetailData_New']; + } else { + extracted = null; + } + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: extracted, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> insertUserActivity({ + required InsertUserActivityRequestModel requestModel, + }) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + ApiConsts.h2oInsertUserActivity, + body: requestModel.toJson(), + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + // Extract UserProgressForTodayData from the response + dynamic extracted; + if (response is Map && response.containsKey('UserProgressForTodayData')) { + extracted = response['UserProgressForTodayData']; + } else { + extracted = response; + } + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: extracted, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> undoUserActivity({ + required UndoUserActivityRequestModel requestModel, + }) async { + try { + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + ApiConsts.h2oUndoUserActivity, + body: requestModel.toJson(), + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + log("response h2oUndoUserActivity: ${response.toString()}"); + // Extract UserProgressForTodayData from the response + dynamic extracted; + if (response is Map && response.containsKey('UserProgressForTodayData')) { + extracted = response['UserProgressForTodayData']; + } else { + extracted = response; + } + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: extracted, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/water_monitor/water_monitor_view_model.dart b/lib/features/water_monitor/water_monitor_view_model.dart index 4e8d5f5..4ad8f1e 100644 --- a/lib/features/water_monitor/water_monitor_view_model.dart +++ b/lib/features/water_monitor/water_monitor_view_model.dart @@ -1,9 +1,25 @@ +import 'dart:developer'; + import 'package:flutter/material.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_state.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/models/insert_user_activity_request_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/models/undo_user_activity_request_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/models/update_user_detail_request_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/models/user_progress_models.dart'; import 'package:hmg_patient_app_new/features/water_monitor/models/water_cup_model.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_repo.dart'; +import 'package:hmg_patient_app_new/routes/app_routes.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; class WaterMonitorViewModel extends ChangeNotifier { + WaterMonitorRepo waterMonitorRepo; + + WaterMonitorViewModel({required this.waterMonitorRepo}); + // Controllers final TextEditingController nameController = TextEditingController(); final TextEditingController heightController = TextEditingController(); @@ -21,6 +37,11 @@ class WaterMonitorViewModel extends ChangeNotifier { String _selectedNumberOfReminders = '3 Time'; String _selectedGender = "Male"; + // ConsumptionScreen + + String _selectedDuration = "Daily"; + bool _isGraphView = true; + // Validation error message String? _validationError; @@ -37,6 +58,10 @@ class WaterMonitorViewModel extends ChangeNotifier { String get selectedGender => _selectedGender; + String get selectedDurationFilter => _selectedDuration; + + bool get isGraphView => _isGraphView; + // Activity level options List get activityLevels => ["Almost Inactive (no exercise)", "Lightly active", "Lightly active (1-3) days per week", "Super active (very hard exercise)"]; @@ -47,10 +72,299 @@ class WaterMonitorViewModel extends ChangeNotifier { // Gender options List get genderOptions => ["Male", "Female"]; +//Duration Options + List get durationFilters => ["Daily", "Weekly", "Monthly"]; + + // Network/data + final AppState _appState = GetIt.instance(); + final NavigationService _navigationService = GetIt.instance(); + + bool _isLoading = false; + dynamic _userDetailData; + + // Progress data lists + List _todayProgressList = []; + List _weekProgressList = []; + List _monthProgressList = []; + List _historyList = []; + + bool get isLoading => _isLoading; + + dynamic get userDetailData => _userDetailData; + + // Getters for progress data + List get todayProgressList => _todayProgressList; + + List get weekProgressList => _weekProgressList; + + List get monthProgressList => _monthProgressList; + + List get historyList => _historyList; + + // Get current progress list based on selected duration + dynamic get currentProgressData { + switch (_selectedDuration) { + case 'Daily': + return _todayProgressList; + case 'Weekly': + return _weekProgressList; + case 'Monthly': + return _monthProgressList; + default: + return _todayProgressList; + } + } + // Initialize method to be called when needed - void initialize() { + Future initialize() async { _loadSettings(); _initializeDefaultCups(); + await fetchUserDetailsForMonitoring(); + await fetchUserProgressForMonitoring(); + } + + /// Map selected duration to ProgressType enum + ProgressType _getProgressTypeFromDuration() { + switch (_selectedDuration) { + case 'Daily': + return ProgressType.today; + case 'Weekly': + return ProgressType.week; + case 'Monthly': + return ProgressType.month; + default: + return ProgressType.today; + } + } + + /// Fetch user progress data based on selected duration + Future fetchUserProgressForMonitoring() async { + try { + _isLoading = true; + notifyListeners(); + + final authenticated = _appState.getAuthenticatedUser(); + if (authenticated == null) { + _isLoading = false; + notifyListeners(); + return; + } + + final mobile = (authenticated.mobileNumber ?? '').replaceAll('+', ''); + final identification = authenticated.patientIdentificationNo ?? ''; + final progressType = _getProgressTypeFromDuration(); + + final result = await waterMonitorRepo.getUserProgressForWaterMonitoring( + progressType: progressType, + mobileNumber: mobile, + identificationNo: identification, + ); + + result.fold((failure) { + log('Error fetching user progress: ${failure.message}'); + }, (apiModel) { + log("User Progress Data ($_selectedDuration): ${apiModel.data.toString()}"); + + // Parse the response based on progress type + try { + if (apiModel.data != null && apiModel.data is List) { + switch (progressType) { + case ProgressType.today: + _todayProgressList.clear(); + for (var item in apiModel.data) { + if (item is Map) { + _todayProgressList.add(UserProgressForTodayModel.fromJson(item as Map)); + } + } + + break; + + case ProgressType.week: + _weekProgressList.clear(); + for (var item in apiModel.data) { + if (item is Map) { + _weekProgressList.add(UserProgressForWeekModel.fromJson(item as Map)); + } + } + log('Week Progress: ${_weekProgressList.length} items'); + break; + + case ProgressType.month: + _monthProgressList.clear(); + for (var item in apiModel.data) { + if (item is Map) { + _monthProgressList.add(UserProgressForMonthModel.fromJson(item as Map)); + } + } + log('Month Progress: ${_monthProgressList.length} items'); + break; + } + } + } catch (e) { + log('Error parsing progress data: $e'); + } + }); + } catch (e) { + log('Exception in fetchUserProgressForMonitoring: $e'); + } finally { + _isLoading = false; + notifyListeners(); + } + } + + Future fetchUserDetailsForMonitoring() async { + try { + _isLoading = true; + + notifyListeners(); + + final authenticated = _appState.getAuthenticatedUser(); + if (authenticated == null) { + _isLoading = false; + notifyListeners(); + return; + } + final mobile = (authenticated.mobileNumber ?? '').replaceAll('+', ''); + final identification = authenticated.patientIdentificationNo ?? ''; + + final result = await waterMonitorRepo.getUserDetailsForWaterMonitoring(progress: 1, mobileNumber: mobile, identificationNo: identification); + result.fold((failure) { + _userDetailData = null; + }, (apiModel) { + log("_userDetailData: ${apiModel.data.toString()}"); + _userDetailData = apiModel.data; + + // Populate form fields from the fetched data + if (_userDetailData != null) { + _populateFormFields(_userDetailData); + + // Calculate and set daily water goal based on the fetched user details + final calculatedGoal = calculateDailyWaterIntake(); + log("calculatedGoal: $calculatedGoal"); + if (calculatedGoal > 0) { + setDailyGoal(calculatedGoal.toInt()); + } + } + }); + } catch (e) { + _userDetailData = null; + } finally { + _isLoading = false; + notifyListeners(); + + if (_userDetailData == null) { + try { + _navigationService.pushAndReplace(AppRoutes.waterMonitorSettingsScreen); + } catch (navErr) { + log('Navigation to water monitor settings failed: $navErr'); + } + } + } + } + + /// Populates form fields from the API response data + void _populateFormFields(dynamic data) { + if (data == null) return; + + try { + // Parse the response and populate fields + if (data is Map) { + // Name + if (data['FirstName'] != null) { + nameController.text = data['FirstName'].toString(); + } + + // Gender + if (data['Gender'] != null) { + final gender = data['Gender'].toString(); + if (gender == 'M' || gender == 'Male') { + _selectedGender = 'Male'; + } else if (gender == 'F' || gender == 'Female') { + _selectedGender = 'Female'; + } + } + + // Age - calculate from DOB if available + if (data['DOB'] != null) { + final dob = data['DOB'].toString(); + final age = _calculateAgeFromDOB(dob); + if (age > 0) { + ageController.text = age.toString(); + } + } + + // Height + if (data['Height'] != null) { + heightController.text = data['Height'].toString(); + // Set height unit + if (data['IsHeightInCM'] != null) { + _selectedHeightUnit = data['IsHeightInCM'] == true ? 'cm' : 'in'; + } + } + + // Weight + if (data['Weight'] != null) { + weightController.text = data['Weight'].toString(); + // Set weight unit + if (data['IsWeightInKG'] != null) { + _selectedWeightUnit = data['IsWeightInKG'] == true ? 'kg' : 'lb'; + } + } + + // Activity Level - map ActivityID to activity level + if (data['ActivityID'] != null) { + final activityId = data['ActivityID'].toString(); + _selectedActivityLevel = _getActivityLevelFromID(activityId); + } + + // Number of reminders (if available in response) + // Note: This may not be in the response, keeping default if not present + + notifyListeners(); + } + } catch (e) { + log('Error populating form fields: $e'); + } + } + + /// Calculate age from DOB string in format /Date(milliseconds+0300)/ + int _calculateAgeFromDOB(String dobString) { + try { + // Parse the /Date(milliseconds+0300)/ format + final regex = RegExp(r'\/Date\((\d+)'); + final match = regex.firstMatch(dobString); + if (match != null) { + final milliseconds = int.tryParse(match.group(1)!); + if (milliseconds != null) { + final dob = DateTime.fromMillisecondsSinceEpoch(milliseconds); + final now = DateTime.now(); + int age = now.year - dob.year; + if (now.month < dob.month || (now.month == dob.month && now.day < dob.day)) { + age--; + } + return age; + } + } + } catch (e) { + log('Error calculating age from DOB: $e'); + } + return 0; + } + + /// Map activity ID to activity level string + String _getActivityLevelFromID(String activityId) { + switch (activityId) { + case '1': + return "Almost Inactive (no exercise)"; + case '2': + return "Lightly active"; + case '3': + return "Lightly active (1-3) days per week"; + case '4': + return "Super active (very hard exercise)"; + default: + return "Lightly active"; + } } // Reset all fields to default @@ -67,6 +381,20 @@ class WaterMonitorViewModel extends ChangeNotifier { notifyListeners(); } + // Setters with notification + void setFilterDuration(String duration) async { + _selectedDuration = duration; + notifyListeners(); + // Fetch new progress data when duration filter changes + await fetchUserProgressForMonitoring(); + } + + // Setters with notification + void setGraphView(bool value) { + _isGraphView = value; + notifyListeners(); + } + // Setters with notification void setGender(String gender) { _selectedGender = gender; @@ -229,15 +557,125 @@ class WaterMonitorViewModel extends ChangeNotifier { } } + String _getApiCompatibleGender() { + if (_selectedGender == "Female") { + return "F"; + } + return "M"; + } + // Save settings Future saveSettings() async { if (!isValid) { notifyListeners(); // Notify so error can be read return false; } - _validationError = null; // Clear error on success - notifyListeners(); - return true; + + try { + _isLoading = true; + _validationError = null; + notifyListeners(); + + // Determine if this is an update or insert + final isUpdate = _userDetailData != null; + + // Get authenticated user for mobile number and identification number + final authenticated = _appState.getAuthenticatedUser(); + final mobile = (authenticated?.mobileNumber?.replaceAll('+', '') ?? '').replaceFirst("0", ""); + final identification = authenticated?.patientIdentificationNo ?? ''; + final zipCode = authenticated?.zipCode ?? '966'; + final email = authenticated?.emailAddress ?? ''; + + // Get activity ID based on selected activity level + String activityID = _getActivityID(); + + // Create request model with user detail fields only + final requestModel = UpdateUserDetailRequestModel( + firstName: nameController.text.trim(), + lastName: nameController.text.trim(), + firstNameN: nameController.text.trim(), + middleName: '', + middleNameN: '', + lastNameN: nameController.text.trim(), + gender: _getApiCompatibleGender(), + dOB: _calculateDOBFromAge(), + height: double.tryParse(heightController.text.trim()), + isHeightInCM: _selectedHeightUnit == 'cm', + weight: double.tryParse(weightController.text.trim()), + isWeightInKG: _selectedWeightUnit == 'kg', + activityID: activityID, + isNotificationOn: true, + mobileNumber: mobile, + identificationNo: identification, + email: email, + zipCode: zipCode, + ); + + // Call the API + final result = await waterMonitorRepo.updateOrInsertUserDetailForWaterMonitoring( + requestModel: requestModel, + isUpdate: isUpdate, + ); + + return result.fold( + (failure) { + _validationError = failure.message; + _isLoading = false; + notifyListeners(); + return false; + }, + (apiModel) { + // Update local data with response + _userDetailData = apiModel.data; + // Calculate and set daily goal based on the inputs + final calculatedGoal = calculateDailyWaterIntake(); + + log("calculatedGoal: $calculatedGoal"); + if (calculatedGoal > 0) { + setDailyGoal(calculatedGoal.toInt()); + } + + _isLoading = false; + notifyListeners(); + return true; + }, + ); + } catch (e) { + _validationError = e.toString(); + _isLoading = false; + notifyListeners(); + return false; + } + } + + // Helper method to get activity ID based on activity level + String _getActivityID() { + switch (_selectedActivityLevel) { + case "Almost Inactive (no exercise)": + return "1"; + case "Lightly active": + return "2"; + case "Lightly active (1-3) days per week": + return "3"; + case "Super active (very hard exercise)": + return "4"; + default: + return "2"; + } + } + + // Helper method to calculate DOB from age + String _calculateDOBFromAge() { + final age = int.tryParse(ageController.text.trim()) ?? 0; + if (age > 0) { + final currentYear = DateTime.now().year; + final birthYear = currentYear - age; + // Create a DateTime for January 1st of the birth year + final birthDate = DateTime(birthYear, 1, 1); + // Convert to API format: /Date(milliseconds+0300)/ using DateUtil + return DateUtil.convertDateToString(birthDate); + } + return ""; } // Load settings @@ -258,8 +696,9 @@ class WaterMonitorViewModel extends ChangeNotifier { String? _selectedCupId; int _totalConsumedMl = 1000; int _dailyGoalMl = 2000; + // Calibration: portion of the bottle SVG height that is fillable (0.0 - 1.0) - double _fillableHeightPercent = 0.823; + double _fillableHeightPercent = 0.7; List get cups => _cups; @@ -290,6 +729,129 @@ class WaterMonitorViewModel extends ChangeNotifier { // Convenience percent (0 - 100) double get progressPercent => (progress * 100.0).clamp(0.0, 100.0).toDouble(); + // Calculate hydration status based on progress + String get hydrationStatus { + final percent = progressPercent; + + if (percent >= 90) { + return "Well Hydrated"; + } else if (percent >= 70) { + return "Hydrated"; + } else if (percent >= 50) { + return "Moderately Hydrated"; + } else if (percent >= 30) { + return "Slightly Dehydrated"; + } else { + return "Dehydrated"; + } + } + + // Get hydration status color + Color get hydrationStatusColor { + final percent = progressPercent; + + if (percent >= 90) { + return const Color(0xFF00C853); // Dark Green + } else if (percent >= 70) { + return const Color(0xFF4CAF50); // Green + } else if (percent >= 50) { + return const Color(0xFFFFC107); // Amber + } else if (percent >= 30) { + return const Color(0xFFFF9800); // Orange + } else { + return const Color(0xFFF44336); // Red + } + } + + String get nextDrinkTime { + if (progressPercent >= 100) { + return "Goal Achieved!"; + } + + // Get number of reminders from selected string (e.g., "3 Time" -> 3) + final remindersPerDay = int.tryParse(_selectedNumberOfReminders.replaceAll(' Time', '').trim()) ?? 3; + + // Define waking hours (e.g., 6 AM to 10 PM = 16 hours) + const wakingHoursStart = 6; // 6 AM + const wakingHoursEnd = 22; // 10 PM + const totalWakingHours = wakingHoursEnd - wakingHoursStart; + + // Calculate interval between drinks in hours + final intervalHours = totalWakingHours / remindersPerDay; + + // Get current time + final now = DateTime.now(); + final currentHour = now.hour + (now.minute / 60.0); + + // If before waking hours, next drink is at start time + if (currentHour < wakingHoursStart) { + return "${wakingHoursStart.toString().padLeft(2, '0')}:00 AM"; + } + + // If after waking hours, next drink is tomorrow morning + if (currentHour >= wakingHoursEnd) { + return "Tomorrow ${wakingHoursStart.toString().padLeft(2, '0')}:00 AM"; + } + + // Calculate which interval we're in + final hoursSinceWakeup = currentHour - wakingHoursStart; + final currentInterval = (hoursSinceWakeup / intervalHours).floor(); + + // Calculate next drink time + final nextDrinkHour = wakingHoursStart + ((currentInterval + 1) * intervalHours); + + // If next drink time is past bedtime, show tomorrow + if (nextDrinkHour >= wakingHoursEnd) { + return "Tomorrow ${wakingHoursStart.toString().padLeft(2, '0')}:00 AM"; + } + + // Format the time + final hour = nextDrinkHour.floor(); + final minute = ((nextDrinkHour - hour) * 60).round(); + + // Convert to 12-hour format + final hour12 = hour > 12 ? hour - 12 : (hour == 0 ? 12 : hour); + final period = hour >= 12 ? 'PM' : 'AM'; + + return "${hour12.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')} $period"; + } + + /// Get time until next drink in minutes + int get minutesUntilNextDrink { + if (progressPercent >= 100) return 0; + + final remindersPerDay = int.tryParse(_selectedNumberOfReminders.replaceAll(' Time', '').trim()) ?? 3; + const wakingHoursStart = 6; + const wakingHoursEnd = 22; + const totalWakingHours = wakingHoursEnd - wakingHoursStart; + final intervalHours = totalWakingHours / remindersPerDay; + + final now = DateTime.now(); + final currentHour = now.hour + (now.minute / 60.0); + + if (currentHour < wakingHoursStart) { + final minutesUntil = ((wakingHoursStart - currentHour) * 60).round(); + return minutesUntil; + } + + if (currentHour >= wakingHoursEnd) { + final hoursUntilTomorrow = 24 - currentHour + wakingHoursStart; + return (hoursUntilTomorrow * 60).round(); + } + + final hoursSinceWakeup = currentHour - wakingHoursStart; + final currentInterval = (hoursSinceWakeup / intervalHours).floor(); + final nextDrinkHour = wakingHoursStart + ((currentInterval + 1) * intervalHours); + + if (nextDrinkHour >= wakingHoursEnd) { + final hoursUntilTomorrow = 24 - currentHour + wakingHoursStart; + return (hoursUntilTomorrow * 60).round(); + } + + final minutesUntil = ((nextDrinkHour - currentHour) * 60).round(); + return minutesUntil.clamp(0, 1440); + } + // Allow updating consumed and goal through the vm so UI doesn't manipulate internal fields directly void setTotalConsumedMl(int ml) { _totalConsumedMl = ml; @@ -401,8 +963,150 @@ class WaterMonitorViewModel extends ChangeNotifier { } } + // Returns the currently selected cup capacity in ml (0 if none) + int get selectedCupCapacityMl => selectedCup?.capacityMl ?? 0; + + /// Increment the consumed amount by the currently selected cup capacity. + /// This centralizes business logic here so UI just calls this method. + void incrementBySelectedCup() { + if (selectedCup != null) { + addConsumedMl(selectedCup!.capacityMl); + } + } + + /// Decrement the consumed amount by the currently selected cup capacity. + /// Ensures value is clamped inside the VM (subtractConsumedMl already clamps). + void decrementBySelectedCup() { + if (selectedCup != null) { + subtractConsumedMl(selectedCup!.capacityMl); + } + } + void resetDaily() { _totalConsumedMl = 0; notifyListeners(); } + + /// Insert user activity (record water intake) + Future insertUserActivity({required int quantityIntake}) async { + try { + _isLoading = true; + notifyListeners(); + + // Get authenticated user info + final authenticated = _appState.getAuthenticatedUser(); + if (authenticated == null) { + _isLoading = false; + notifyListeners(); + return false; + } + + final mobile = (authenticated.mobileNumber ?? '').replaceAll('+', '').replaceFirst("0", ""); + final identification = authenticated.patientIdentificationNo ?? ''; + + // Create request model + final requestModel = InsertUserActivityRequestModel( + identificationNo: identification, + mobileNumber: mobile, + quantityIntake: quantityIntake, + ); + + // Call the API + final result = await waterMonitorRepo.insertUserActivity(requestModel: requestModel); + + return result.fold( + (failure) { + log('Error inserting user activity: ${failure.message}'); + _isLoading = false; + notifyListeners(); + return false; + }, + (apiModel) { + log("Insert user activity success: ${apiModel.data.toString()}"); + // Update consumed amount from the response + if (apiModel.data != null && apiModel.data is List && (apiModel.data as List).isNotEmpty) { + final progressData = (apiModel.data as List).first; + if (progressData is Map && progressData.containsKey('QuantityConsumed')) { + final consumed = progressData['QuantityConsumed']; + if (consumed != null) { + _totalConsumedMl = (consumed is num) ? consumed.toInt() : int.tryParse(consumed.toString()) ?? _totalConsumedMl; + } + } + + fetchUserProgressForMonitoring(); + } + + _isLoading = false; + notifyListeners(); + return true; + }, + ); + } catch (e) { + log('Exception in insertUserActivity: $e'); + _isLoading = false; + notifyListeners(); + return false; + } + } + + /// Undo last user activity + Future undoUserActivity() async { + try { + _isLoading = true; + notifyListeners(); + + // Get authenticated user info + final authenticated = _appState.getAuthenticatedUser(); + if (authenticated == null) { + _isLoading = false; + notifyListeners(); + return false; + } + + final mobile = (authenticated.mobileNumber ?? '').replaceAll('+', '').replaceFirst("0", ""); + final identification = authenticated.patientIdentificationNo ?? ''; + + // Create request model + final requestModel = UndoUserActivityRequestModel( + progress: 1, + mobileNumber: mobile, + identificationNo: identification, + ); + + // Call the API + final result = await waterMonitorRepo.undoUserActivity(requestModel: requestModel); + + return result.fold( + (failure) { + log('Error undoing user activity: ${failure.message}'); + _isLoading = false; + notifyListeners(); + return false; + }, + (apiModel) { + log("Undo user activity success: ${apiModel.data.toString()}"); + + // Update consumed amount from the response + if (apiModel.data != null && apiModel.data is List && (apiModel.data as List).isNotEmpty) { + final progressData = (apiModel.data as List).first; + if (progressData is Map && progressData.containsKey('QuantityConsumed')) { + final consumed = progressData['QuantityConsumed']; + if (consumed != null) { + _totalConsumedMl = (consumed is num) ? consumed.toInt() : int.tryParse(consumed.toString()) ?? _totalConsumedMl; + } + } + } + + _isLoading = false; + notifyListeners(); + return true; + }, + ); + } catch (e) { + log('Exception in undoUserActivity: $e'); + _isLoading = false; + notifyListeners(); + return false; + } + } } diff --git a/lib/presentation/water_monitor/water_consumption_screen.dart b/lib/presentation/water_monitor/water_consumption_screen.dart index 198f65b..625839e 100644 --- a/lib/presentation/water_monitor/water_consumption_screen.dart +++ b/lib/presentation/water_monitor/water_consumption_screen.dart @@ -4,16 +4,21 @@ import 'dart:math' as math; import 'package:flutter/material.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/dependencies.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/water_monitor/water_monitor_view_model.dart'; import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/bottle_shape_clipper.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart'; import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/water_consumption_progress_widget.dart'; +import 'package:hmg_patient_app_new/services/dialog_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:provider/provider.dart'; +import 'package:shimmer/shimmer.dart'; class WaterConsumptionScreen extends StatefulWidget { const WaterConsumptionScreen({super.key}); @@ -26,19 +31,16 @@ class _WaterConsumptionScreenState extends State { @override void initState() { super.initState(); - // Initialize VM once the widget is mounted - WidgetsBinding.instance.addPostFrameCallback((_) { - final vm = Provider.of(context, listen: false); - vm.initialize(); - // optional: log current progress for debugging - // ignore: avoid_print - log('WaterMonitor initialized: consumed=${vm.totalConsumedMl}, goal=${vm.dailyGoalMl}, progress=${vm.progressPercent}'); + WidgetsBinding.instance.addPostFrameCallback((_) async { + final vm = context.read(); + await vm.initialize(); + log('WaterMonitor initialized: consumed=${vm.totalConsumedMl}, goal=${vm.dailyGoalMl}, progress=${vm.progressPercent}'); }); } - _buildHydrationTipsWidget() { + Widget _buildHydrationTipsWidget() { return Container( - margin: EdgeInsets.symmetric(horizontal: 24.h), + margin: EdgeInsets.symmetric(horizontal: 24.w), padding: EdgeInsets.all(16.h), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, @@ -56,39 +58,32 @@ class _WaterConsumptionScreenState extends State { ], ), SizedBox(height: 8.h), - " • ${"Drink before you feel thirsty"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + " • ${"Drink before you feel thirsty"}".needTranslation.toText12( + fontWeight: FontWeight.w500, + color: AppColors.textColorLight, + ), SizedBox(height: 4.h), - " • ${"Keep a refillable bottle next to you"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + " • ${"Keep a refillable bottle next to you"}".needTranslation.toText12( + fontWeight: FontWeight.w500, + color: AppColors.textColorLight, + ), SizedBox(height: 4.h), - " • ${"Track your daily intake to stay motivated"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + " • ${"Track your daily intake to stay motivated"}".needTranslation.toText12( + fontWeight: FontWeight.w500, + color: AppColors.textColorLight, + ), SizedBox(height: 4.h), - " • ${"Choose sparkling water instead of soda"}".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + " • ${"Choose sparkling water instead of soda"}".needTranslation.toText12( + fontWeight: FontWeight.w500, + color: AppColors.textColorLight, + ), SizedBox(height: 8.h), ], ), ); } - _buildStatsColumn() { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "Next Drink Time".toText18(weight: FontWeight.w600, color: AppColors.textColor), - "03:00 AM".toText32(weight: FontWeight.w600, color: AppColors.blueColor), - SizedBox(height: 12.h), - _buildStatusColumn(title: "Your Goal".needTranslation, subTitle: "2000ml"), - SizedBox(height: 8.h), - _buildStatusColumn(title: "Remaining".needTranslation, subTitle: "300ml"), - SizedBox(height: 8.h), - _buildStatusColumn(title: "Completed".needTranslation, subTitle: "90%", subTitleColor: AppColors.successColor), - SizedBox(height: 8.h), - _buildStatusColumn(title: "Hydration Status".needTranslation, subTitle: "Hydrated", subTitleColor: AppColors.blueColor), - SizedBox(height: 8.h), - ], - ); - } - - _buildWaterIntakeSummaryWidget() { + Widget _buildWaterIntakeSummaryWidget() { return Container( width: double.infinity, padding: EdgeInsets.all(24.w), @@ -102,44 +97,68 @@ class _WaterConsumptionScreenState extends State { ], ), ), - child: LayoutBuilder( - builder: (context, constraints) { - // Responsive: stack vertically on small screens - final isSmallScreen = constraints.maxWidth < 600; + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: isTablet ? 2 : 3, + child: Consumer(builder: (context, vm, _) { + if (vm.isLoading) { + // show shimmer placeholder while fetching server-side user details + return _buildLoadingShimmer(isForHistory: false); + } - if (isSmallScreen) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded(flex: 3, child: _buildStatsColumn()), - SizedBox(width: 16.w), - Expanded(flex: 2, child: _buildWaterBottleWidget()), - ], - ); - } else { - // Larger screens: more space for bottle - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Flexible(flex: 2, child: _buildStatsColumn()), - SizedBox(width: 32.w), - Flexible(flex: 1, child: _buildWaterBottleWidget()), - ], - ); - } - }, + final goalMl = vm.dailyGoalMl; + final consumed = vm.totalConsumedMl; + final remaining = (goalMl - consumed) > 0 ? (goalMl - consumed) : 0; + final completedPercent = "${(vm.progress * 100).clamp(0.0, 100.0).toStringAsFixed(0)}%"; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Next Drink Time".toText18(weight: FontWeight.w600, color: AppColors.textColor), + vm.nextDrinkTime.toText32(weight: FontWeight.w600, color: AppColors.blueColor), + SizedBox(height: 12.h), + _buildStatusColumn(title: "Your Goal".needTranslation, subTitle: "${goalMl}ml"), + SizedBox(height: 8.h), + _buildStatusColumn(title: "Remaining".needTranslation, subTitle: "${remaining}ml"), + SizedBox(height: 8.h), + _buildStatusColumn(title: "Completed".needTranslation, subTitle: completedPercent, subTitleColor: AppColors.successColor), + SizedBox(height: 8.h), + _buildStatusColumn( + title: "Hydration Status".needTranslation, + subTitle: vm.hydrationStatus, + subTitleColor: vm.hydrationStatusColor, + ), + ], + ); + }), + ), + SizedBox(width: isTablet ? 32 : 16.w), + Expanded( + flex: isTablet ? 1 : 2, + child: _buildWaterBottleWidget(), + ), + ], + ), + _buildBottomActionWidgets(), + ], ), ); } - _buildStatusColumn({required String title, required String subTitle, Color? subTitleColor}) { + Widget _buildStatusColumn({required String title, required String subTitle, Color? subTitleColor}) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "$title:".toText16(weight: FontWeight.w500, color: AppColors.textColor), - subTitle.toText12(fontWeight: FontWeight.w600, color: subTitleColor ?? AppColors.greyTextColor), + "$title: ".toText16(weight: FontWeight.w500, color: AppColors.textColor), + subTitle.toText12( + fontWeight: FontWeight.w600, + color: subTitleColor ?? AppColors.greyTextColor, + ), ], ); } @@ -147,86 +166,507 @@ class _WaterConsumptionScreenState extends State { Widget _buildWaterBottleWidget() { return Consumer( builder: (context, vm, _) { - // final progressPercent = 100.0; final progressPercent = (vm.progress * 100).clamp(0.0, 100.0); - log("progressPercent: ${progressPercent}"); - // SVG original dimensions - final svgOriginalWidth = 143.w; - final svgOriginalHeight = 315.h; + log("progressPercent: $progressPercent"); + + // SVG aspect ratio + const svgAspectRatio = 315.0 / 143.0; // ~2.2 - // Responsive sizing - scale based on screen width but maintain aspect ratio - final bottleWidth = 120.w; // Adjust this for your layout - final aspectRatio = svgOriginalHeight / svgOriginalWidth; // 2. 2027 - final bottleHeight = bottleWidth * aspectRatio; + // Responsive bottle sizing with device-specific constraints + double bottleWidth; + if (isTablet) { + // Tablet: use logical pixels (not scaled) with a reasonable max + bottleWidth = math.min(SizeUtils.width * 0.15, 180.0); // 15% of width, max 180 + } else if (isFoldable) { + // Foldable: moderate scaling + bottleWidth = math.min(100.w, 160.0); + } else { + // Phone: use your responsive . w with a cap + bottleWidth = math.min(120.w, 140.0); + } - // Exact fillable area based on SVG paths (provided by VM calibration) - final fillableHeightPercent = vm.fillableHeightPercent; - final fillableWidthPercent = 0.8; // 80.7% is body width - final bottomPaddingPercent = 0; // 0% padding from bottom (8px of 315px) + final bottleHeight = bottleWidth * svgAspectRatio; + + // Fillable area percentages (calibrated to your SVG) + final fillableHeightPercent = 0.7; + const fillableWidthPercent = 0.8; final fillableHeight = bottleHeight * fillableHeightPercent; final fillableWidth = bottleWidth * fillableWidthPercent; - final bottomPadding = bottleHeight * bottomPaddingPercent; + + // Device-specific positioning offsets + final double leftOffset = isTablet ? 4.w : 8.w; + final double bottomOffset = isTablet ? -65.h : -78.h; + return SizedBox( height: bottleHeight, width: bottleWidth, child: Stack( + fit: StackFit.expand, alignment: Alignment.center, children: [ - // Bottle SVG + // Bottle SVG outline Center( child: Utils.buildSvgWithAssets( icon: AppAssets.waterBottle, height: bottleHeight, width: bottleWidth, - fit: BoxFit.contain, // Important for scaling + fit: BoxFit.contain, ), ), - // Water wave - positioned from bottom - Positioned( - bottom: bottomPadding, - right: 10.w, - child: ClipPath( - clipper: BottleShapeClipper(), // Use custom clipper for exact bottle shape + // Wave and bubbles clipped to bottle shape + Positioned.fill( + left: leftOffset, + bottom: bottomOffset, + child: Center( child: SizedBox( - height: fillableHeight, width: fillableWidth, - child: Align( - alignment: Alignment.bottomCenter, - child: WaterConsumptionProgressWidget( - progress: progressPercent, - // Pass a square size so the painter's vertical range matches the clip area. - // Use the larger of width/height so the waves render correctly and won't be squashed. - size: math.max(fillableWidth, fillableHeight), - // Provide exact container dimensions so the painter draws waves using the bottle's rect - containerWidth: fillableWidth, - containerHeight: fillableHeight, - waveDuration: const Duration(milliseconds: 3000), - waveColor: AppColors.blueColor, + height: fillableHeight, + child: ClipPath( + clipper: BottleShapeClipper(), + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + // Animated wave + Positioned( + child: WaterConsumptionProgressWidget( + progress: progressPercent, + size: math.min(fillableWidth, fillableHeight), + containerWidth: fillableWidth, + containerHeight: fillableHeight, + waveDuration: const Duration(milliseconds: 3000), + waveColor: AppColors.blueColor, + ), + ), + + // Bubbles (only show if progress > 10%) + if (progressPercent > 10) + Positioned( + bottom: fillableHeight * 0.12, + child: Utils.buildSvgWithAssets( + icon: AppAssets.waterBottleOuterBubbles, + // Cap bubble size based on device type + height: isTablet ? math.min(45.0, fillableHeight * 0.2) : math.min(55.0, fillableHeight * 0.22), + width: fillableWidth * 0.65, + ), + ), + ], ), ), ), ), ), + ], + ), + ); + }, + ); + } + + _buildBottomActionWidgets() { + return Consumer(builder: (context, vm, _) { + final cupAmount = vm.selectedCupCapacityMl; + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InkWell( + onTap: () async { + // Undo last activity via API + if (cupAmount > 0) { + await vm.undoUserActivity(); + } + }, + child: Utils.buildSvgWithAssets( + icon: AppAssets.minimizeIcon, + height: 20.w, + width: 20.w, + iconColor: AppColors.textColor, + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 4.w), + padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.blueColor, + borderRadius: 99.r, + hasShadow: true, + ), + child: (cupAmount > 0 ? "+ $cupAmount ml" : "+ 0ml").toText12( + fontWeight: FontWeight.w600, + color: AppColors.whiteColor, + ), + ), + InkWell( + onTap: () async { + // Insert user activity via API + if (cupAmount > 0) { + await vm.insertUserActivity(quantityIntake: cupAmount); + } + }, + child: Utils.buildSvgWithAssets( + icon: AppAssets.addIconDark, + ), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildActionButton( + onTap: () => showSwitchCupBottomSheet(context), + overlayWidget: AppAssets.refreshIcon, + title: "Switch Cup".needTranslation, + icon: Utils.buildSvgWithAssets(icon: AppAssets.glassIcon, height: 24.w, width: 24.w), + ), + _buildActionButton( + onTap: () {}, + title: "Add Water".needTranslation, + icon: Utils.buildSvgWithAssets(icon: AppAssets.glassIcon, height: 24.w, width: 24.w), + ), + _buildActionButton( + onTap: () => context.navigateWithName(AppRoutes.waterMonitorSettingsScreen), + title: "Settings".needTranslation, + icon: Icon( + Icons.settings, + color: AppColors.blueColor, + size: 24.w, + ), + ), + ], + ), + ], + ); + }); + } - // Bubbles positioned dynamically based on water level - if (progressPercent > 10) + _buildActionButton({String? overlayWidget, required String title, required Widget icon, required VoidCallback onTap}) { + return InkWell( + onTap: onTap, + child: Column( + children: [ + Stack( + children: [ + Container( + height: 46.w, + width: 46.w, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.blueColor.withValues(alpha: 0.14), + borderRadius: 12.r, + hasShadow: true, + ), + child: Center(child: icon), + ), + if (overlayWidget != null) ...[ Positioned( - bottom: 40.h, - child: Utils.buildSvgWithAssets( - icon: AppAssets.waterBottleOuterBubbles, - height: 60.h, - width: fillableWidth * 0.7, + top: 0, + right: 0, + child: Container( + padding: EdgeInsets.all(2.w), + height: 16.w, + width: 16.w, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.blueColor, + borderRadius: 100.r, + hasShadow: true, + ), + child: Center(child: Utils.buildSvgWithAssets(icon: AppAssets.refreshIcon, iconColor: AppColors.whiteColor)), ), ), + ] ], ), + SizedBox(height: 4.h), + title.toText10(), + ], + ), + ); + } + + Widget buildHistoryListTile({required String title, required String subTitle}) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title.toText14(weight: FontWeight.w500, color: AppColors.labelTextColor), + subTitle.toText18(weight: FontWeight.w600), + ], + ), + Utils.buildSvgWithAssets(icon: AppAssets.greenTickIcon) + ], + ).paddingSymmetrical(0, 8.h); + } + + Widget _buildHistoryGraphOrList() { + return Container( + margin: EdgeInsets.symmetric(horizontal: 24.w), + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Consumer(builder: (BuildContext context, WaterMonitorViewModel viewModel, Widget? child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "History".needTranslation.toText16(isBold: true), + Row( + children: [ + InkWell( + onTap: () => viewModel.setGraphView(!viewModel.isGraphView), + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + transitionBuilder: (Widget child, Animation animation) { + return FadeTransition( + opacity: animation, + child: ScaleTransition( + scale: animation, + child: child, + ), + ); + }, + child: Container( + key: ValueKey(viewModel.isGraphView), + child: Utils.buildSvgWithAssets( + icon: viewModel.isGraphView ? AppAssets.listIcon : AppAssets.graphIcon, + height: 24.h, + width: 24.h, + ), + ), + ), + ), + SizedBox(width: 8.w), + InkWell( + onTap: () => _showHistoryDurationBottomsheet(context, viewModel), + child: Utils.buildSvgWithAssets(icon: AppAssets.doctor_calendar_icon, height: 24.h, width: 24.h)) + ], + ), + ], + ), + if (!viewModel.isGraphView) + _buildHistoryListView(viewModel) + else + Center( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 32.h), + child: "Graph view coming soon".toText14(color: AppColors.greyTextColor), + ), + ), + ], + ); + }), + ); + } + + Widget _buildLoadingShimmer({bool isForHistory = true}) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.all(0.w), + itemCount: 4, + separatorBuilder: (_, __) => SizedBox(height: 12.h), + itemBuilder: (context, index) { + return Shimmer.fromColors( + baseColor: Colors.grey[300]!, + highlightColor: Colors.grey[100]!, + child: Container( + height: isForHistory ? 60.h : 40.h, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10.r), + ), + ), ); }, ); } + Widget _buildHistoryListView(WaterMonitorViewModel viewModel) { + final selectedDuration = viewModel.selectedDurationFilter; + + // Build list items based on duration + List listItems = []; + + if (selectedDuration == 'Daily') { + if (viewModel.todayProgressList.isNotEmpty) { + final todayData = viewModel.todayProgressList.first; + listItems.add( + buildHistoryListTile( + title: "Today's Progress", + subTitle: "${todayData.quantityConsumed?.toStringAsFixed(0) ?? '0'} ml / ${todayData.quantityLimit?.toStringAsFixed(0) ?? '0'} ml", + ), + ); + listItems.add(Divider(height: 1, color: AppColors.dividerColor)); + listItems.add( + buildHistoryListTile( + title: "Percentage Completed", + subTitle: "${todayData.percentageConsumed?.toStringAsFixed(1) ?? '0'}%", + ), + ); + } else { + listItems.add( + Center( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 16.h), + child: "No data available for today".toText14(color: AppColors.greyTextColor), + ), + ), + ); + } + } else if (selectedDuration == 'Weekly') { + if (viewModel.weekProgressList.isNotEmpty) { + for (var dayData in viewModel.weekProgressList) { + listItems.add( + buildHistoryListTile( + title: dayData.dayName ?? 'Unknown', + subTitle: "${dayData.percentageConsumed?.toStringAsFixed(1) ?? '0'}%", + ), + ); + if (dayData != viewModel.weekProgressList.last) { + listItems.add(Divider(height: 1, color: AppColors.dividerColor)); + } + } + } else { + listItems.add( + Center( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 16.h), + child: "No data available for this week".toText14(color: AppColors.greyTextColor), + ), + ), + ); + } + } else if (selectedDuration == 'Monthly') { + if (viewModel.monthProgressList.isNotEmpty) { + for (var monthData in viewModel.monthProgressList) { + listItems.add( + buildHistoryListTile( + title: monthData.monthName ?? 'Unknown', + subTitle: "${monthData.percentageConsumed?.toStringAsFixed(1) ?? '0'}%", + ), + ); + if (monthData != viewModel.monthProgressList.last) { + listItems.add(Divider(height: 1, color: AppColors.dividerColor)); + } + } + } else { + listItems.add( + Center( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 16.h), + child: "No data available for this year".toText14(color: AppColors.greyTextColor), + ), + ), + ); + } + } + + // Return scrollable list with min and max height constraints + return ConstrainedBox( + constraints: BoxConstraints( + minHeight: 80.h, + maxHeight: 270.h, + ), + child: viewModel.isLoading + ? _buildLoadingShimmer().paddingOnly(top: 16.h) + : listItems.isEmpty + ? Center( + child: "No history data available".toText14(color: AppColors.greyTextColor), + ) + : ListView.separated( + padding: EdgeInsets.only(top: 16.h), + shrinkWrap: true, + itemCount: listItems.length, + separatorBuilder: (context, index) => SizedBox.shrink(), + itemBuilder: (context, index) => listItems[index], + ), + ); + } + + // Reusable method to build selection row widget + Widget _buildSelectionRow({ + required String value, + required String groupValue, + required VoidCallback onTap, + bool useUpperCase = false, + }) { + return SizedBox( + height: 70.h, + child: Row( + spacing: 8.h, + children: [ + Radio( + value: value, + groupValue: groupValue, + activeColor: AppColors.errorColor, + onChanged: (_) => onTap(), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + (useUpperCase ? value.toUpperCase() : value.toCamelCase) + .toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1) + .expanded, + ], + ).onPress(onTap), + ); + } + + void _showSelectionBottomSheet({ + required BuildContext context, + required String title, + required List items, + required String selectedValue, + required Function(String) onSelected, + bool useUpperCase = false, + }) { + final dialogService = getIt.get(); + + dialogService.showFamilyBottomSheetWithoutHWithChild( + label: title.needTranslation, + message: "", + child: Container( + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + child: ListView.separated( + shrinkWrap: true, + itemCount: items.length, + itemBuilder: (context, index) { + final item = items[index]; + return _buildSelectionRow( + value: item, + groupValue: selectedValue, + useUpperCase: useUpperCase, + onTap: () { + onSelected(item); + Navigator.pop(context); + }, + ); + }, + separatorBuilder: (_, __) => Divider(height: 1, color: AppColors.dividerColor), + ), + ), + onOkPressed: () {}, + ); + } + + void _showHistoryDurationBottomsheet(BuildContext context, WaterMonitorViewModel viewModel) { + _showSelectionBottomSheet( + context: context, + title: "Select Duration".needTranslation, + items: viewModel.durationFilters, + selectedValue: viewModel.selectedDurationFilter, + onSelected: viewModel.setFilterDuration, + ); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -245,7 +685,7 @@ class _WaterConsumptionScreenState extends State { text: "Set Reminder".needTranslation, textColor: AppColors.successColor, backgroundColor: AppColors.successLightBgColor, - onPressed: () => {}, + onPressed: () {}, icon: AppAssets.bell, iconColor: AppColors.successColor, borderRadius: 12.r, @@ -259,11 +699,13 @@ class _WaterConsumptionScreenState extends State { SizedBox(height: 16.h), _buildWaterIntakeSummaryWidget(), SizedBox(height: 16.h), + _buildHistoryGraphOrList(), + SizedBox(height: 16.h), _buildHydrationTipsWidget(), + SizedBox(height: 16.h), ], ), ), ); - // ); } } diff --git a/lib/presentation/water_monitor/water_monitor_settings_screen.dart b/lib/presentation/water_monitor/water_monitor_settings_screen.dart index e49c8a3..5f1bce5 100644 --- a/lib/presentation/water_monitor/water_monitor_settings_screen.dart +++ b/lib/presentation/water_monitor/water_monitor_settings_screen.dart @@ -6,30 +6,16 @@ import 'package:hmg_patient_app_new/core/utils/utils.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/water_monitor/water_monitor_view_model.dart'; -import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart'; import 'package:hmg_patient_app_new/services/dialog_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:provider/provider.dart'; -class WaterMonitorSettingsScreen extends StatefulWidget { +class WaterMonitorSettingsScreen extends StatelessWidget { const WaterMonitorSettingsScreen({super.key}); - @override - State createState() => _WaterMonitorSettingsScreenState(); -} - -class _WaterMonitorSettingsScreenState extends State { - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - context.read().initialize(); - }); - } - - void _showSnackbar(String text) { + void _showSnackbar(String text, BuildContext context) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(text), @@ -276,13 +262,13 @@ class _WaterMonitorSettingsScreenState extends State child: CustomButton( text: "Save".needTranslation, onPressed: () async { - showSwitchCupBottomSheet(context); - return; final success = await viewModel.saveSettings(); if (!success && viewModel.validationError != null) { _showSnackBar(context, viewModel.validationError!); } else if (success) { - _showSnackBar(context, "Saved Successfully".needTranslation); + _showSnackBar(context, "Settings saved successfully".needTranslation); + // Navigate back on success + Navigator.pop(context); } }, borderRadius: 12.r, diff --git a/lib/widgets/shimmer/common_shimmer_widget.dart b/lib/widgets/shimmer/common_shimmer_widget.dart index d6a2906..3d935cb 100644 --- a/lib/widgets/shimmer/common_shimmer_widget.dart +++ b/lib/widgets/shimmer/common_shimmer_widget.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; @@ -11,9 +12,7 @@ class CommonShimmerWidget extends StatelessWidget { return SizedBox( child: Container( decoration: BoxDecoration( - borderRadius: const BorderRadius.all( - Radius.circular(10), - ), + borderRadius: BorderRadius.all(Radius.circular(10.r)), border: Border.all(color: AppColors.lightGreyEFColor, width: 1), boxShadow: [ BoxShadow( @@ -27,7 +26,11 @@ class CommonShimmerWidget extends StatelessWidget { padding: const EdgeInsets.all(12.0), child: Column( children: [ - Container(height: 100).toShimmer(), + Container( + height: 100, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(24.r)), + )).toShimmer(), 16.height, Container(height: 24).toShimmer(), 16.height, From 873b2a159199bd46b19be2e8d30c90427de145fd Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Mon, 29 Dec 2025 14:46:05 +0300 Subject: [PATCH 42/55] sorting done, covid inprogress --- assets/langs/ar-SA.json | 3 +- assets/langs/en-US.json | 4 +- lib/core/app_assets.dart | 7 + .../blood_donation_view_model.dart | 3 +- .../hmg_services/hmg_services_view_model.dart | 17 ++ .../ui_models/covid_questionnare_model.dart | 33 ++ lib/generated/locale_keys.g.dart | 7 +- .../laser/laser_appointment.dart | 2 +- .../covid19test/covid19_landing_page.dart | 283 ++++++++++++++++++ .../covid19test/covid_19_questionnaire.dart | 132 ++++++++ .../widget/e_referral_other_details.dart | 1 - .../hmg_services/services_page.dart | 10 + lib/presentation/lab/alphabeticScroll.dart | 4 +- lib/presentation/lab/lab_orders_page.dart | 2 +- .../medical_report/medical_reports_page.dart | 66 ++-- lib/routes/app_routes.dart | 6 +- lib/theme/colors.dart | 1 + lib/widgets/common_bottom_sheet.dart | 17 +- 18 files changed, 541 insertions(+), 57 deletions(-) create mode 100644 lib/features/hmg_services/models/ui_models/covid_questionnare_model.dart create mode 100644 lib/presentation/covid19test/covid19_landing_page.dart create mode 100644 lib/presentation/covid19test/covid_19_questionnaire.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 787a718..b8fc7eb 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -876,5 +876,6 @@ "endDate": "تاريخ الانتهاء", "walkin": "زيارة بدون موعد", "laserClinic": "عيادة الليزر", - "continueString": "يكمل" + "continueString": "يكمل", + "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 7b8c4b8..7839083 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -872,6 +872,6 @@ "searchClinic": "Search Clinic", "walkin": "Walk In", "continueString": "Continue", - "laserClinic": "Laser Clinic" - + "laserClinic": "Laser Clinic", + "covid_info" :"Dr. Sulaiman Al Habib hospitals are conducting a test for the emerging corona virus and issuing travel certificates 24/7 in a short time and with high accuracy. Those wishing to benefit from this service can visit one of Dr. Sulaiman Al Habib branches to conduct a corona test within few minutes, and obtain the result within several hours. Corona Virus Covid 19 testing service with PCR technology to detect the virus according to the highest international standards and with the latest high-precision RT-PCR devices (American GeneXpert and others), That is approved by the Food and Drug Authority as well as by the Saudi Center for Infectious Diseases Prevention." } \ No newline at end of file diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index 9ea7fcc..dde6484 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -262,6 +262,8 @@ class AppAssets { static const String pregnancyDayAccordion = '$svgBasePath/pregnancy_test_day_accordion.svg'; static const String pregnancyDueDateAccordion = '$svgBasePath/due_date_accordion.svg'; + static const String covid19icon = '$svgBasePath/covid_19.svg'; + // PNGS // static const String hmgLogo = '$pngBasePath/hmg_logo.png'; static const String liveCareService = '$pngBasePath/livecare_service.png'; @@ -287,6 +289,9 @@ class AppAssets { static const String fullBodyFront = '$pngBasePath/full_body_front.png'; static const String fullBodyBack = '$pngBasePath/full_body_back.png'; + + + } class AppAnimations { @@ -307,4 +312,6 @@ class AppAnimations { static const String ambulance = '$lottieBasePath/ambulance.json'; static const String ambulanceAlert = '$lottieBasePath/ambulance_alert.json'; static const String rrtAmbulance = '$lottieBasePath/rrt_ambulance.json'; + + } diff --git a/lib/features/blood_donation/blood_donation_view_model.dart b/lib/features/blood_donation/blood_donation_view_model.dart index f345359..b8f0e9c 100644 --- a/lib/features/blood_donation/blood_donation_view_model.dart +++ b/lib/features/blood_donation/blood_donation_view_model.dart @@ -1,6 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/blood_donation/blood_donation_repo.dart'; import 'package:hmg_patient_app_new/features/blood_donation/models/blood_group_list_model.dart'; import 'package:hmg_patient_app_new/features/blood_donation/models/blood_group_response_model.dart'; @@ -31,7 +32,7 @@ class BloodDonationViewModel extends ChangeNotifier { List genderList = [ BloodGroupListModel(LocaleKeys.malE.tr(), 1), - BloodGroupListModel(LocaleKeys.female.tr(), 2), + BloodGroupListModel("Female".needTranslation.tr(), 2), ]; late CitiesModel selectedCity; diff --git a/lib/features/hmg_services/hmg_services_view_model.dart b/lib/features/hmg_services/hmg_services_view_model.dart index b1a7757..5da0860 100644 --- a/lib/features/hmg_services/hmg_services_view_model.dart +++ b/lib/features/hmg_services/hmg_services_view_model.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; @@ -18,6 +20,7 @@ import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'models/req_models/check_activation_e_referral_req_model.dart'; import 'models/resq_models/relationship_type_resp_mode.dart'; +import 'models/ui_models/covid_questionnare_model.dart'; class HmgServicesViewModel extends ChangeNotifier { final HmgServicesRepo hmgServicesRepo; @@ -60,6 +63,8 @@ class HmgServicesViewModel extends ChangeNotifier { Future getOrdersList() async {} + + // HHC multiple services selection List selectedHhcServices = []; @@ -766,4 +771,16 @@ class HmgServicesViewModel extends ChangeNotifier { }, ); } + List getQuestionsFromJson() { + final String questionsJson = '''[ { "id": 1, "questionEN": "Is the test intended for travel?", "questionAR": "هل تجري التحليل بغرض السفر؟", "ans": 2 }, { "id": 2, "questionEN": "Coming from outside KSA within last 2 weeks?", "questionAR": "هل قدمت من خارج المملكة خلال الأسبوعين الماضيين؟", "ans": 2 }, { "id": 3, "questionEN": "Do you currently have fever?", "questionAR": "هل تعاني حاليا من حرارة؟", "ans": 2 }, { "id": 4, "questionEN": "Did you have fever in last 2 weeks?", "questionAR": "هل عانيت من حرارة في الأسبوعين الماضيين؟", "ans": 2 }, { "id": 5, "questionEN": "Do you have a sore throat?", "questionAR": "هل لديك التهاب في الحلق؟", "ans": 2 }, { "id": 6, "questionEN": "Do you have a runny nose?", "questionAR": "هل لديك سيلان بالأنف؟" }, { "id": 7, "questionEN": "Do you have a cough?", "questionAR": "هل لديك سعال؟", "ans": 2 }, { "id": 8, "questionEN": "Do you have shortness of breath?", "questionAR": "هل تعاني من ضيق في التنفس؟", "ans": 2 }, { "id": 9, "questionEN": "Do you have nausea?", "questionAR": "هل تعاني من غثيان؟", "ans": 2 }, { "id": 10, "questionEN": "Do you have vomiting?", "questionAR": "هل تعاني من القيء؟", "ans": 2 }, { "id": 11, "questionEN": "Do you have a headache?", "questionAR": "هل تعاني من صداع في الرأس؟", "ans": 2 }, { "id": 12, "questionEN": "Do you have muscle pain?", "questionAR": "هل تعانين من آلام عضلية؟", "ans": 2 }, { "id": 13, "questionEN": "Do you have joint pain?", "questionAR": "هل تعاني من آلام المفاصل؟", "ans": 2 }, { "id": 14, "questionEN": "Do you have diarrhea?", "questionAR": "هل لديك اسهال؟", "ans": 2 } ]'''; + + try { + final parsed = json.decode(questionsJson) as List; + return parsed + .map((e) => CovidQuestionnaireModel.fromJson(Map.from(e))) + .toList(); + } catch (_) { + return []; + } + } } diff --git a/lib/features/hmg_services/models/ui_models/covid_questionnare_model.dart b/lib/features/hmg_services/models/ui_models/covid_questionnare_model.dart new file mode 100644 index 0000000..35b0efe --- /dev/null +++ b/lib/features/hmg_services/models/ui_models/covid_questionnare_model.dart @@ -0,0 +1,33 @@ +import 'dart:convert'; + +class CovidQuestionnaireModel { + int? id; + String? questionEn; + String? questionAr; + int? ans; + + CovidQuestionnaireModel({ + this.id, + this.questionEn, + this.questionAr, + this.ans, + }); + + factory CovidQuestionnaireModel.fromRawJson(String str) => CovidQuestionnaireModel.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory CovidQuestionnaireModel.fromJson(Map json) => CovidQuestionnaireModel( + id: json["id"], + questionEn: json["questionEN"], + questionAr: json["questionAR"], + ans: json["ans"], + ); + + Map toJson() => { + "id": id, + "questionEN": questionEn, + "questionAR": questionAr, + "ans": ans, + }; +} diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index d76422b..ea0bcb8 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -2,7 +2,7 @@ // ignore_for_file: constant_identifier_names -abstract class LocaleKeys { +abstract class LocaleKeys { static const english = 'english'; static const arabic = 'arabic'; static const login = 'login'; @@ -189,7 +189,6 @@ abstract class LocaleKeys { static const firstName = 'firstName'; static const middleName = 'middleName'; static const lastName = 'lastName'; - static const female = 'female'; static const preferredLanguage = 'preferredLanguage'; static const locationsRegister = 'locationsRegister'; static const ksa = 'ksa'; @@ -801,7 +800,7 @@ abstract class LocaleKeys { static const fullName = 'fullName'; static const married = 'married'; static const uae = 'uae'; - static const malE = 'male'; + static const malE = 'malE'; static const loginBy = 'loginBy'; static const loginByOTP = 'loginByOTP'; static const guest = 'guest'; @@ -876,4 +875,6 @@ abstract class LocaleKeys { static const walkin = 'walkin'; static const laserClinic = 'laserClinic'; static const continueString = 'continueString'; + static const covid_info = 'covid_info'; + } diff --git a/lib/presentation/book_appointment/laser/laser_appointment.dart b/lib/presentation/book_appointment/laser/laser_appointment.dart index 440ae45..ec7c023 100644 --- a/lib/presentation/book_appointment/laser/laser_appointment.dart +++ b/lib/presentation/book_appointment/laser/laser_appointment.dart @@ -82,7 +82,7 @@ class LaserAppointment extends StatelessWidget { activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null,LocaleKeys.malE.tr()), - CustomTabBarModel(null,LocaleKeys.female.tr()), + CustomTabBarModel(null,"Female".needTranslation.tr()), ], onTabChange: (index) { var viewmodel = context.read(); diff --git a/lib/presentation/covid19test/covid19_landing_page.dart b/lib/presentation/covid19test/covid19_landing_page.dart new file mode 100644 index 0000000..62bd651 --- /dev/null +++ b/lib/presentation/covid19test/covid19_landing_page.dart @@ -0,0 +1,283 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.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/habib_wallet/habib_wallet_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.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/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; + +import 'covid_19_questionnaire.dart'; + +class Covid19LandingPage extends StatefulWidget { +const Covid19LandingPage({super.key}); + +@override +State createState() => _Covid19LandingPageState(); +} + +class _Covid19LandingPageState extends State { + + late HabibWalletViewModel habibWalletVM; + int? _selectedBranchIndex; + + @override + void initState() { + habibWalletVM = Provider.of(context, listen: false); + scheduleMicrotask(() { + getProjectList(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: "COVID-19", + child: Padding( + padding: EdgeInsets.all(24.w), + child: SingleChildScrollView( + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(20.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Get the results in Few Hours" + .toText18( + color: AppColors.textColor, + weight: FontWeight.w600, + ), + SizedBox(height: 16.h), + LocaleKeys.covid_info + .tr() + .toText14( + color: AppColors.greyTextColor, + weight: FontWeight.w400, + height: 1.6, + ), + ], + ), + ), + ), + ), + ), + ), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + // borderRadius: 24.r, + hasShadow: true, + customBorder: BorderRadius.only(topLeft:Radius.circular(24.r) , topRight:Radius.circular(24.r)) + ), + child: SizedBox( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomButton( + text: "SelectLocation".needTranslation, + onPressed: () { + _showBranchBottomSheet(context); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 50.h, + iconSize: 18.h, + ).paddingSymmetrical(16.h, 24.w), + ], + ), + ), + ), + ], + )); + } + void _showBranchBottomSheet(BuildContext context, ) { + // Set first branch as selected by default + setState(() { + _selectedBranchIndex = 0; + }); + + showCommonBottomSheet( + + context, + title: "Select Branch".needTranslation, + height: ResponsiveExtension.screenHeight * 0.651, + child: StatefulBuilder( + builder: (context, setBottomSheetState) { + return Consumer( + builder: (context, habibWalletVM, child) { + + final hospitals = habibWalletVM.advancePaymentHospitals; + if (hospitals.isEmpty) { + return const Center( + child: Padding( + padding: EdgeInsets.all(16.0), + child: Text('No branches available'), + ), + ); + } + + return Column( + children: [ + Expanded( + child:Container( + margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 12.h, bottom: 24.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + hasShadow: true, + customBorder: BorderRadius.only( + topLeft: Radius.circular(24.r), + topRight: Radius.circular(24.r), + ), + ), child: ListView.separated( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h), + itemBuilder: (context, index) { + final branch = hospitals[index]; + final isSelected = _selectedBranchIndex == index; + return GestureDetector( + onTap: () { + setBottomSheetState(() { + _selectedBranchIndex = index; + }); + setState(() { + _selectedBranchIndex = index; + }); + }, + child: Container( + + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), + child: Row( + children: [ + // Radio button + Container( + width: 20.w, + height: 20.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: isSelected + ? AppColors.primaryRedColor + : AppColors.greyTextColor.withValues(alpha: 0.3), + width: 2, + ), + ), + child: isSelected + ? Center( + child: Container( + width: 10.w, + height: 10.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColors.primaryRedColor, + ), + ), + ) + : null, + ), + SizedBox(width: 12.w), + // Branch details + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + SizedBox(height: 4.h), + (branch.desciption ?? 'Unknown').toText14( + color: AppColors.textColor, + weight: FontWeight.w600, + ), + ], + ), + ), + // Location icon + + ], + ), + ), + ); + }, + separatorBuilder: (context, index) => SizedBox(height: 12.h), + itemCount: hospitals.length, + )), + ), + // Next button + Container( + padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + hasShadow: true, + customBorder: BorderRadius.only( + topLeft: Radius.circular(24.r), + topRight: Radius.circular(24.r), + ), + ), + child: SafeArea( + top: false, + child: CustomButton( + text: "Next".needTranslation, + onPressed: (){ + + Navigator.of(context) + .push( + CustomPageRoute( + page: Covid19Questionnaire(selectedHospital: hospitals[_selectedBranchIndex!],), + ), + ); + + }, + backgroundColor: _selectedBranchIndex != null + ? AppColors.primaryRedColor + : AppColors.greyTextColor.withValues(alpha: 0.3), + borderColor: _selectedBranchIndex != null + ? AppColors.primaryRedColor + : AppColors.greyTextColor.withValues(alpha: 0.3), + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + height: 56.h, + ), + ), + ), + ], + ); + }, + ); + }, + ), + + ); + } + + getProjectList() async{ + await habibWalletVM.getProjectsList(); + } +} + + diff --git a/lib/presentation/covid19test/covid_19_questionnaire.dart b/lib/presentation/covid19test/covid_19_questionnaire.dart new file mode 100644 index 0000000..8d7e8bd --- /dev/null +++ b/lib/presentation/covid19test/covid_19_questionnaire.dart @@ -0,0 +1,132 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.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/hmg_services/hmg_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/ui_models/covid_questionnare_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.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/CustomSwitch.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + +import 'package:provider/provider.dart'; + +class Covid19Questionnaire extends StatefulWidget { + final HospitalsModel selectedHospital; + const Covid19Questionnaire({super.key, required this.selectedHospital}); + + @override + State createState() => _Covid19QuestionnaireState(); +} + +class _Covid19QuestionnaireState extends State { + late HmgServicesViewModel hmgServicesViewModel; + List qaList = []; + + + @override + void initState() { + hmgServicesViewModel = Provider.of(context, listen: false); + scheduleMicrotask(() { + setState(() { + qaList = hmgServicesViewModel.getQuestionsFromJson(); + }); + }); + super.initState(); + } + + void _toggleAnswer(int index, bool value) { + setState(() { + qaList[index].ans = value ? 1 : 0; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column(children: [ + Expanded( + child: CollapsingListView( + title: "COVID-19", + child: Padding( + padding: EdgeInsets.all(24.w), + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(20.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Please answer below questionnaire:".toText14( + color: AppColors.textColor, + weight: FontWeight.w500, + ), + SizedBox(height: 20.h), + // Question list + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: qaList.length, + separatorBuilder: (context, index) => SizedBox(height: 16.h), + itemBuilder: (context, index) { + final question = qaList[index]; + final isAnswerYes = question.ans == 1; + + return Row( + children: [ + Expanded( + child: (question.questionEn ?? '').toText14( + color: AppColors.textColor, + weight: FontWeight.w400, + ), + ), + SizedBox(width: 12.w), + CustomSwitch( + value: isAnswerYes, + onChanged: (value) => _toggleAnswer(index, value), + ), + ], + ); + }, + ), + ], + ), + ), + ), + ), + ), + SizedBox(height: 16.h), + // Next button + CustomButton( + text: "Next".needTranslation, + onPressed: () { + // Handle next action + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + height: 56.h, + ), + ], + ), + ), + ), + ), + ])); + } +} diff --git a/lib/presentation/e_referral/widget/e_referral_other_details.dart b/lib/presentation/e_referral/widget/e_referral_other_details.dart index fd1649f..5373109 100644 --- a/lib/presentation/e_referral/widget/e_referral_other_details.dart +++ b/lib/presentation/e_referral/widget/e_referral_other_details.dart @@ -233,7 +233,6 @@ class _OtherDetailsStepState extends State { } void _showBranchBottomSheet(BuildContext context, ReferralFormManager formManager) { - final habibWalletVM = context.read(); showCommonBottomSheetWithoutHeight( context, diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 8b10ab0..91ac9ca 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -98,6 +98,16 @@ class ServicesPage extends StatelessWidget { LoaderBottomSheet.hideLoader(); }); }), + HmgServicesComponentModel( + 11, + "Covid 19 Test".needTranslation, + "".needTranslation, + AppAssets.covid19icon, + bgColor: AppColors.covid29Color, + true, + route: AppRoutes.covid19Test, + ) + // HmgServicesComponentModel( // 3, // "Home Health Care".needTranslation, diff --git a/lib/presentation/lab/alphabeticScroll.dart b/lib/presentation/lab/alphabeticScroll.dart index e610d71..043243e 100644 --- a/lib/presentation/lab/alphabeticScroll.dart +++ b/lib/presentation/lab/alphabeticScroll.dart @@ -121,9 +121,7 @@ class _AlphabetScrollPageState extends State { @override Widget build(BuildContext context) { - return - - SizedBox( + return SizedBox( width: MediaQuery.sizeOf(context).width, child: Row( crossAxisAlignment: CrossAxisAlignment.start, // Add this diff --git a/lib/presentation/lab/lab_orders_page.dart b/lib/presentation/lab/lab_orders_page.dart index 758914b..8a75009 100644 --- a/lib/presentation/lab/lab_orders_page.dart +++ b/lib/presentation/lab/lab_orders_page.dart @@ -1 +1 @@ -import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; // Scroll controller to control page scrolling when a group expands late ScrollController _scrollController; // Map of keys for each group to allow scrolling to them final Map _groupKeys = {}; @override void initState() { _scrollController = ScrollController(); scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override void dispose() { _scrollController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return CollapsingToolbar( title: LocaleKeys.labResults.tr(), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: SingleChildScrollView( controller: _scrollController, padding: EdgeInsets.all(24.h), physics: AlwaysScrollableScrollPhysics(), child: Consumer( builder: (context, model, child) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, "By Visit".needTranslation), CustomTabBarModel(null, "By Test".needTranslation), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), ), ], ), // Place Clinic/Hospital buttons under the tabs, styled like prescriptions if (activeIndex == 0) Padding( padding: EdgeInsets.symmetric(vertical: 10.h), child: Row( children: [ CustomButton( text: LocaleKeys.byClinic.tr(context: context), onPressed: () { model.setIsSortByClinic(true); }, backgroundColor: model.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, borderColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), textColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), SizedBox(width: 8.h), CustomButton( text: LocaleKeys.byHospital.tr(context: context), onPressed: () { model.setIsSortByClinic(false); }, backgroundColor: model.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, borderColor: model.isSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, textColor: model.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ], ), ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? // By Visit - show grouped view when available model.isLabOrdersLoading ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: 5, itemBuilder: (context, index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ), ) : (model.patientLabOrdersViewList.isNotEmpty ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.patientLabOrdersViewList.length, itemBuilder: (context, index) { final group = model.patientLabOrdersViewList[index]; return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 400), child: SlideAnimation( verticalOffset: 50.0, child: FadeInAnimation( child: AnimatedContainer( key: _groupKeys.putIfAbsent(index, () => GlobalKey()), duration: Duration(milliseconds: 300), curve: Curves.easeInOut, margin: EdgeInsets.symmetric(vertical: 8.h), decoration: RoundedRectangleBorder() .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), child: InkWell( onTap: () { setState(() { expandedIndex = expandedIndex == index ? null : index; }); // After rebuild, ensure the expanded group is visible WidgetsBinding.instance.addPostFrameCallback((_) { final key = _groupKeys[index]; if (key != null && key.currentContext != null && expandedIndex == index) { Scrollable.ensureVisible( key.currentContext!, duration: Duration(milliseconds: 350), curve: Curves.easeInOut, alignment: 0.1, ); } }); }, child: Padding( padding: EdgeInsets.all(16.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ CustomButton( text: "${group.length} ${'results'.needTranslation}", onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 30.h, ), Icon(expandedIndex == index ? Icons.expand_less : Icons.expand_more, ), ], ), SizedBox(height: 8.h), Text( model.isSortByClinic ? (group.first.clinicDescription ?? 'Unknown') : (group.first.projectName ?? 'Unknown'), style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w600), overflow: TextOverflow.ellipsis, ), // Expanded list of orders when group is expanded AnimatedSwitcher( duration: Duration(milliseconds: 400), child: expandedIndex == index ? Container( key: ValueKey(index), padding: EdgeInsets.only(top: 12.h), child: Column( children: group.map((order) { return Container( margin: EdgeInsets.only(bottom: 12.h), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 12.h, hasShadow: true, ), child: Padding( padding: EdgeInsets.all(14.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Image.network( order.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", width: 24.h, height: 24.h, fit: BoxFit.cover, ).circle(100), SizedBox(width: 8.h), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ (order.doctorName ?? order.doctorNameEnglish ?? "").toString().toText14(weight: FontWeight.w500), SizedBox(height: 6.h), ], ), ), ], ), SizedBox(height: 8.h), Row( children: [ CustomButton( text: ("Order No: ".needTranslation + order.orderNo!), onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 24.h, ), SizedBox(width: 8.h), CustomButton( text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 24.h, ), SizedBox(width: 8.h), ], ), SizedBox(height: 8.h), Row( children: [ CustomButton( text: model.isSortByClinic ? (order.clinicDescription ?? "") : (order.projectName ?? ""), onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 24.h, ), // SizedBox(height: 8.h), // Expanded( // flex: 6, // child: CustomButton( // text: LocaleKeys.view.tr(context: context), // onPressed: () async { // model.currentlySelectedPatientOrder = order; // labProvider.getPatientLabResultByHospital(order); // labProvider.getPatientSpecialResult(order); // Navigator.push( // context, // CustomPageRoute( // page: LabResultByClinic(labOrder: order), // ), // ); // }, // backgroundColor: AppColors.bgRedLightColor, // borderColor: AppColors.primaryRedColor, // textColor: AppColors.primaryRedColor, // fontSize: 14, // fontWeight: FontWeight.w500, // borderRadius: 12, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 40.h, // ), // ), ], ), Row( children: [ Expanded(flex:6, child: SizedBox()), Expanded( flex: 1, child: Container( height: 40.h, width: 40.w, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.textColor, borderRadius: 12, ), child: Padding( padding: EdgeInsets.all(12.h), child: Transform.flip( flipX: _appState.isArabic(), child: Utils.buildSvgWithAssets( icon: AppAssets.forward_arrow_icon_small, iconColor: AppColors.whiteColor, fit: BoxFit.contain, ), ), ), ).onPress(() { model.currentlySelectedPatientOrder = order; labProvider.getPatientLabResultByHospital(order); labProvider.getPatientSpecialResult(order); Navigator.of(context).push( CustomPageRoute(page: LabResultByClinic(labOrder: order)), ); }), ) ], ), ])), ); }).toList(), ), ) : SizedBox.shrink(), ), ], ), ), ), ), ), ), ); }, ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation)) : // By Test or other tabs keep existing behavior (model.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) : AlphabeticScroll( alpahbetsAvailable: model.indexedCharacterForUniqueTest, details: model.uniqueTestsList, labViewModel: model, rangeViewModel: rangeViewModel, appState: _appState, ) ], ); }, ), ), ); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file +import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return CollapsingToolbar( title: LocaleKeys.labResults.tr(), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: Consumer( builder: (context, model, child) { return SingleChildScrollView( physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.all(24.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, "By Visit".needTranslation), CustomTabBarModel(null, "By Test".needTranslation), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), ), ], ), if (activeIndex == 0) Padding( padding: EdgeInsets.symmetric(vertical: 10.h), child: Row( children: [ CustomButton( text: LocaleKeys.byClinic.tr(context: context), onPressed: () { model.setIsSortByClinic(true); }, backgroundColor: model.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, borderColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), textColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), SizedBox(width: 8.h), CustomButton( text: LocaleKeys.byHospital.tr(context: context), onPressed: () { model.setIsSortByClinic(false); }, backgroundColor: model.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, borderColor: model.isSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, textColor: model.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ], ), ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? // By Visit - show grouped view when available model.isLabOrdersLoading ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: 5, itemBuilder: (context, index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ), ) : (model.patientLabOrdersViewList.isNotEmpty ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.patientLabOrdersViewList.length, itemBuilder: (context, index) { final group = model.patientLabOrdersViewList[index]; final isExpanded = expandedIndex == index; return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, margin: EdgeInsets.symmetric(vertical: 8.h), decoration: RoundedRectangleBorder() .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), child: InkWell( onTap: () { setState(() { expandedIndex = isExpanded ? null : index; }); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.all(16.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ CustomButton( text: "${group.length} ${'results'.needTranslation}", onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 30.h, ), Icon(isExpanded ? Icons.expand_less : Icons.expand_more), ], ), SizedBox(height: 8.h), Text( model.isSortByClinic ? (group.first.clinicDescription ?? 'Unknown') : (group.first.projectName ?? 'Unknown'), style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w600), overflow: TextOverflow.ellipsis, ), ], ), ), AnimatedSwitcher( duration: Duration(milliseconds: 500), switchInCurve: Curves.easeIn, switchOutCurve: Curves.easeOut, transitionBuilder: (Widget child, Animation animation) { return FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, axisAlignment: 0.0, child: child, ), ); }, child: isExpanded ? Container( key: ValueKey(index), padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ...group.map((order) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisSize: MainAxisSize.min, children: [ Image.network( order.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", width: 24.h, height: 24.h, fit: BoxFit.cover, ).circle(100), SizedBox(width: 8.h), Expanded(child: (order.doctorName ?? order.doctorNameEnglish ?? "").toString().toText14(weight: FontWeight.w500)), ], ), SizedBox(height: 8.h), Row( children: [ CustomButton( text: ("Order No: ".needTranslation + order.orderNo!), onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 24.h, ), SizedBox(width: 8.h), CustomButton( text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 24.h, ), ], ), SizedBox(height: 8.h), Row( children: [ CustomButton( text: model.isSortByClinic ? (order.clinicDescription ?? "") : (order.projectName ?? ""), onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 24.h, ), ], ), // SizedBox(height: 8.h), Row( children: [ Expanded(flex: 2, child: SizedBox()), // Expanded( // flex: 1, // child: Container( // height: 40.h, // width: 40.w, // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( // color: AppColors.textColor, // borderRadius: 12, // ), // child: Padding( // padding: EdgeInsets.all(12.h), // child: Transform.flip( // flipX: _appState.isArabic(), // child: Utils.buildSvgWithAssets( // icon: AppAssets.forward_arrow_icon_small, // iconColor: AppColors.whiteColor, // fit: BoxFit.contain, // ), // ), // ), // ).onPress(() { // model.currentlySelectedPatientOrder = order; // labProvider.getPatientLabResultByHospital(order); // labProvider.getPatientSpecialResult(order); // Navigator.of(context).push( // CustomPageRoute(page: LabResultByClinic(labOrder: order)), // ); // }), // ) Expanded( flex:2, child: CustomButton( icon: AppAssets.view_report_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, text: "View Results".needTranslation, onPressed: () { model.currentlySelectedPatientOrder = order; labProvider.getPatientLabResultByHospital(order); labProvider.getPatientSpecialResult(order); Navigator.of(context).push( CustomPageRoute(page: LabResultByClinic(labOrder: order)), ); }, backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, fontSize: 14, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ) ], ), SizedBox(height: 12.h), Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), SizedBox(height: 12.h), ], ); }).toList(), ], ), ) : SizedBox.shrink(), ), ], ), ), ), ), )); }, ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation)) : // By Test or other tabs keep existing behavior (model.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) : AlphabeticScroll( alpahbetsAvailable: model.indexedCharacterForUniqueTest, details: model.uniqueTestsList, labViewModel: model, rangeViewModel: rangeViewModel, appState: _appState, ) ], ) ); }, ), ); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file diff --git a/lib/presentation/medical_report/medical_reports_page.dart b/lib/presentation/medical_report/medical_reports_page.dart index b15266c..cb78479 100644 --- a/lib/presentation/medical_report/medical_reports_page.dart +++ b/lib/presentation/medical_report/medical_reports_page.dart @@ -51,39 +51,39 @@ class _MedicalReportsPageState extends State { children: [ SizedBox(height: 16.h), // Status filter tabs - Row( - children: [ - CustomButton( - text: LocaleKeys.byClinic.tr(context: context), - onPressed: () { - medicalFileVM.setIsMedicalReportsSortByClinic(true); - }, - backgroundColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, - borderColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), - textColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, - fontSize: 12, - fontWeight: FontWeight.w500, - borderRadius: 10, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 40.h, - ), - SizedBox(width: 8.h), - CustomButton( - text: LocaleKeys.byHospital.tr(context: context), - onPressed: () { - medicalFileVM.setIsMedicalReportsSortByClinic(false); - }, - backgroundColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, - borderColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, - textColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, - fontSize: 12, - fontWeight: FontWeight.w500, - borderRadius: 10, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 40.h, - ), - ], - ).paddingSymmetrical(24.h, 0.h), + // Row( + // children: [ + // CustomButton( + // text: LocaleKeys.byClinic.tr(context: context), + // onPressed: () { + // medicalFileVM.setIsMedicalReportsSortByClinic(true); + // }, + // backgroundColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, + // borderColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), + // textColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, + // fontSize: 12, + // fontWeight: FontWeight.w500, + // borderRadius: 10, + // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + // height: 40.h, + // ), + // SizedBox(width: 8.h), + // CustomButton( + // text: LocaleKeys.byHospital.tr(context: context), + // onPressed: () { + // medicalFileVM.setIsMedicalReportsSortByClinic(false); + // }, + // backgroundColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, + // borderColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, + // textColor: medicalFileVM.isMedicalReportsSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, + // fontSize: 12, + // fontWeight: FontWeight.w500, + // borderRadius: 10, + // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + // height: 40.h, + // ), + // ], + // ).paddingSymmetrical(24.h, 0.h), SizedBox(height: 20.h), Row( children: [ diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index f335f34..2718741 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -24,6 +24,8 @@ import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_sele import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/call_screen.dart'; import 'package:hmg_patient_app_new/splashPage.dart'; +import '../presentation/covid19test/covid19_landing_page.dart'; + class AppRoutes { static const String initialRoute = '/initialRoute'; static const String loginScreen = '/loginScreen'; @@ -40,7 +42,7 @@ class AppRoutes { static const String bloodDonationPage = '/bloodDonationPage'; static const String smartWatches = '/smartWatches'; static const String huaweiHealthExample = '/huaweiHealthExample'; - + static const String covid19Test = '/covid19Test'; //appointments static const String bookAppointmentPage = '/bookAppointmentPage'; @@ -79,7 +81,7 @@ class AppRoutes { userInfoFlowManager: (context) => UserInfoFlowManager(), smartWatches: (context) => SmartwatchInstructionsPage(), huaweiHealthExample: (context) => HuaweiHealthExample(), - + covid19Test: (context) => Covid19LandingPage(), // healthCalculatorsPage: (context) => HealthCalculatorsPage(type: HealthCalConEnum.calculator), healthConvertersPage: (context) => HealthCalculatorsPage(type: HealthCalConEnum.converter) diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index d0db6a5..e658b29 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -96,4 +96,5 @@ class AppColors { static const Color eReferralCardColor = Color(0xFFFF8012); static const Color bloodDonationCardColor = Color(0xFFFF5662); static const Color bookAppointment = Color(0xFF415364); + static const Color covid29Color = Color(0xff2563EB); } diff --git a/lib/widgets/common_bottom_sheet.dart b/lib/widgets/common_bottom_sheet.dart index 9312519..6ff5cc5 100644 --- a/lib/widgets/common_bottom_sheet.dart +++ b/lib/widgets/common_bottom_sheet.dart @@ -108,11 +108,11 @@ class ButtonSheetContent extends StatelessWidget { @override Widget build(BuildContext context) { return Column( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - // SizedBox( - // height: 20.h, - // ), + SizedBox( + height: 20.h, + ), // Center( // child: Container( // margin: const EdgeInsets.only(top: 18, bottom: 12), @@ -127,10 +127,9 @@ class ButtonSheetContent extends StatelessWidget { // Close button isCloseButtonVisible && isFullScreen - ? Column(children: [ - SizedBox( - height: 40.h, - ), + ? Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ Padding( padding: EdgeInsets.symmetric( horizontal: 16, @@ -145,7 +144,7 @@ class ButtonSheetContent extends StatelessWidget { isFullScreen ? Column( children: [ - SizedBox(height: 20.h), + // SizedBox(height: 20.h), Padding(padding: EdgeInsets.symmetric(horizontal: 16.h), child: title.toText24(isBold: true)), SizedBox(height: 16.h), ], From 68a34369ee60d136e7da261dfb073d1b0ffe1a62 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Mon, 29 Dec 2025 14:49:00 +0300 Subject: [PATCH 43/55] no message --- assets/images/svg/covid_19.svg | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 assets/images/svg/covid_19.svg diff --git a/assets/images/svg/covid_19.svg b/assets/images/svg/covid_19.svg new file mode 100644 index 0000000..f3aa128 --- /dev/null +++ b/assets/images/svg/covid_19.svg @@ -0,0 +1,7 @@ + + + + + + + From 3601e39a2946e4d7545e8ae045f5761071b15761 Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Tue, 30 Dec 2025 14:56:55 +0300 Subject: [PATCH 44/55] Health calculators & converters --- .../book_appointments_view_model.dart | 32 +- .../book_appointment/select_doctor_page.dart | 135 ++++++-- .../health_calculator_result.dart | 0 .../health_calculator_view_model.dart | 311 ++++++++++++++---- .../widgets/blood_cholesterol.dart | 20 +- .../widgets/blood_sugar.dart | 19 +- .../widgets/triglycerides.dart | 20 +- 7 files changed, 405 insertions(+), 132 deletions(-) delete mode 100644 lib/presentation/health_calculators/health_calculator_result.dart diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index 3a58571..5c19ca9 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -64,6 +64,11 @@ class BookAppointmentsViewModel extends ChangeNotifier { List doctorsList = []; List filteredDoctorList = []; + // Grouped doctors lists + List> doctorsListByClinic = []; + List> doctorsListByHospital = []; + List> doctorsListGrouped = []; + List liveCareDoctorsList = []; List patientDentalPlanEstimationList = []; @@ -149,14 +154,28 @@ class BookAppointmentsViewModel extends ChangeNotifier { setIsSortByClinic(bool value) { isSortByClinic = value; - if (isSortByClinic) { - doctorsList.sort((a, b) => a.clinicName!.compareTo(b.clinicName!)); - } else { - doctorsList.sort((a, b) => a.projectName!.compareTo(b.projectName!)); - } + doctorsListGrouped = isSortByClinic ? doctorsListByClinic : doctorsListByHospital; notifyListeners(); } + // Group doctors by clinic and hospital + void _groupDoctorsList() { + final clinicMap = >{}; + final hospitalMap = >{}; + + for (var doctor in doctorsList) { + final clinicKey = (doctor.clinicName ?? 'Unknown').trim(); + clinicMap.putIfAbsent(clinicKey, () => []).add(doctor); + + final hospitalKey = (doctor.projectName ?? 'Unknown').trim(); + hospitalMap.putIfAbsent(hospitalKey, () => []).add(doctor); + } + + doctorsListByClinic = clinicMap.values.toList(); + doctorsListByHospital = hospitalMap.values.toList(); + doctorsListGrouped = isSortByClinic ? doctorsListByClinic : doctorsListByHospital; + } + BookAppointmentsViewModel( {required this.bookAppointmentsRepo, required this.errorHandlerService, @@ -404,6 +423,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { initializeFilteredList(); clearSearchFilters(); getFiltersFromDoctorList(); + _groupDoctorsList(); notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); @@ -435,6 +455,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { initializeFilteredList(); clearSearchFilters(); getFiltersFromDoctorList(); + _groupDoctorsList(); notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); @@ -1102,6 +1123,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { // initializeFilteredList(); // clearSearchFilters(); // getFiltersFromDoctorList(); + _groupDoctorsList(); notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); diff --git a/lib/presentation/book_appointment/select_doctor_page.dart b/lib/presentation/book_appointment/select_doctor_page.dart index b346973..f9745aa 100644 --- a/lib/presentation/book_appointment/select_doctor_page.dart +++ b/lib/presentation/book_appointment/select_doctor_page.dart @@ -40,8 +40,14 @@ class _SelectDoctorPageState extends State { late AppState appState; late BookAppointmentsViewModel bookAppointmentsViewModel; + // Scroll controller to control page scrolling when a group expands + late ScrollController _scrollController; + // Map of keys for each item to allow scrolling to them + final Map _itemKeys = {}; + @override void initState() { + _scrollController = ScrollController(); scheduleMicrotask(() { if (bookAppointmentsViewModel.isLiveCareSchedule) { bookAppointmentsViewModel.getLiveCareDoctorsList(); @@ -58,6 +64,12 @@ class _SelectDoctorPageState extends State { super.initState(); } + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { bookAppointmentsViewModel = Provider.of(context, listen: false); @@ -67,6 +79,7 @@ class _SelectDoctorPageState extends State { body: CollapsingListView( title: "Choose Doctor".needTranslation, child: SingleChildScrollView( + controller: _scrollController, child: Padding( padding: EdgeInsets.symmetric(horizontal: 24.h), child: Consumer(builder: (context, bookAppointmentsVM, child) { @@ -149,9 +162,7 @@ class _SelectDoctorPageState extends State { physics: NeverScrollableScrollPhysics(), itemCount: bookAppointmentsVM.isDoctorsListLoading ? 5 - : (bookAppointmentsVM.isLiveCareSchedule - ? (bookAppointmentsVM.liveCareDoctorsList.isNotEmpty ? bookAppointmentsVM.liveCareDoctorsList.length : 1) - : (bookAppointmentsVM.doctorsList.isNotEmpty ? bookAppointmentsVM.doctorsList.length : 1)), + : (bookAppointmentsVM.doctorsListGrouped.isNotEmpty ? bookAppointmentsVM.doctorsListGrouped.length : 1), itemBuilder: (context, index) { final isExpanded = expandedIndex == index; return bookAppointmentsVM.isDoctorsListLoading @@ -160,7 +171,7 @@ class _SelectDoctorPageState extends State { isLoading: true, bookAppointmentsViewModel: bookAppointmentsViewModel, ) - : checkIsDoctorsListEmpty() + : bookAppointmentsVM.doctorsListGrouped.isEmpty ? Utils.getNoDataWidget(context, noDataText: "No Doctor found for selected criteria...".needTranslation) : AnimationConfiguration.staggeredList( position: index, @@ -169,6 +180,7 @@ class _SelectDoctorPageState extends State { verticalOffset: 100.0, child: FadeInAnimation( child: AnimatedContainer( + key: _itemKeys.putIfAbsent(index, () => GlobalKey()), duration: Duration(milliseconds: 300), curve: Curves.easeInOut, decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), @@ -177,34 +189,97 @@ class _SelectDoctorPageState extends State { setState(() { expandedIndex = isExpanded ? null : index; }); + // After rebuild, ensure the expanded item is visible + WidgetsBinding.instance.addPostFrameCallback((_) { + final key = _itemKeys[index]; + if (key != null && key.currentContext != null && expandedIndex == index) { + Scrollable.ensureVisible( + key.currentContext!, + duration: Duration(milliseconds: 350), + curve: Curves.easeInOut, + alignment: 0.1, + ); + } + }); }, - child: DoctorCard( - doctorsListResponseModel: bookAppointmentsVM.isLiveCareSchedule ? bookAppointmentsVM.liveCareDoctorsList[index] : bookAppointmentsVM.doctorsList[index], - isLoading: false, - bookAppointmentsViewModel: bookAppointmentsViewModel, - ).onPress(() async { - bookAppointmentsVM - .setSelectedDoctor(bookAppointmentsVM.isLiveCareSchedule ? bookAppointmentsVM.liveCareDoctorsList[index] : bookAppointmentsVM.doctorsList[index]); - // bookAppointmentsVM.setSelectedDoctor(DoctorsListResponseModel()); - LoaderBottomSheet.showLoader(); - await bookAppointmentsVM.getDoctorProfile(onSuccess: (dynamic respData) { - LoaderBottomSheet.hideLoader(); - Navigator.of(context).push( - CustomPageRoute( - page: DoctorProfilePage(), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Header row with count badge and expand/collapse icon + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CustomButton( + text: "${bookAppointmentsVM.doctorsListGrouped[index].length} ${'doctors'.needTranslation}", + onPressed: () {}, + backgroundColor: AppColors.greyColor, + borderColor: AppColors.greyColor, + textColor: AppColors.blackColor, + fontSize: 10, + fontWeight: FontWeight.w500, + borderRadius: 8, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 30.h, + ), + Icon(isExpanded ? Icons.expand_less : Icons.expand_more), + ], ), - ); - }, onError: (err) { - LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: err), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - }); - }), + SizedBox(height: 8.h), + // Clinic/Hospital name as group title + Text( + bookAppointmentsVM.isSortByClinic + ? (bookAppointmentsVM.doctorsListGrouped[index].first.clinicName ?? 'Unknown') + : (bookAppointmentsVM.doctorsListGrouped[index].first.projectName ?? 'Unknown'), + style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w600), + overflow: TextOverflow.ellipsis, + ), + // Expanded content - list of doctors in this group + AnimatedSwitcher( + duration: Duration(milliseconds: 400), + child: isExpanded + ? Container( + key: ValueKey(index), + padding: EdgeInsets.only(top: 12.h), + child: Column( + children: bookAppointmentsVM.doctorsListGrouped[index].map((doctor) { + return Container( + margin: EdgeInsets.only(bottom: 12.h), + child: DoctorCard( + doctorsListResponseModel: doctor, + isLoading: false, + bookAppointmentsViewModel: bookAppointmentsViewModel, + ).onPress(() async { + bookAppointmentsVM.setSelectedDoctor(doctor); + LoaderBottomSheet.showLoader(); + await bookAppointmentsVM.getDoctorProfile(onSuccess: (dynamic respData) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorProfilePage(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }), + ); + }).toList(), + ), + ) + : SizedBox.shrink(), + ), + ], + ), + ), ), ), ), diff --git a/lib/presentation/health_calculators/health_calculator_result.dart b/lib/presentation/health_calculators/health_calculator_result.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/presentation/health_calculators_and_converts/health_calculator_view_model.dart b/lib/presentation/health_calculators_and_converts/health_calculator_view_model.dart index 4a78549..c085ac8 100644 --- a/lib/presentation/health_calculators_and_converts/health_calculator_view_model.dart +++ b/lib/presentation/health_calculators_and_converts/health_calculator_view_model.dart @@ -49,28 +49,41 @@ class HealthCalcualtorViewModel extends ChangeNotifier { String? get mmolValue => _mmolValue; + // Store the original entered value and which field it was entered in + String? _originalValue; + String _originalUnit = 'mg/dL'; // which field the original value was entered in + bool _isSwapped = false; // toggle state for switch + String _activeUnit = 'mg/dL'; // current source unit String get activeUnit => _activeUnit; - // ================== BLOOD CHOLESTEROL ================== String? _cholMgdlValue; String? _cholMmolValue; + String? _cholOriginalValue; + String _cholOriginalUnit = 'mg/dL'; + bool _cholIsSwapped = false; String _cholActiveUnit = 'mg/dL'; String? get cholMgdlValue => _cholMgdlValue; + String? get cholMmolValue => _cholMmolValue; + String get cholActiveUnit => _cholActiveUnit; // ================== TRIGLYCERIDES ================== String? _triMgdlValue; String? _triMmolValue; + String? _triOriginalValue; + String _triOriginalUnit = 'mg/dL'; + bool _triIsSwapped = false; String _triActiveUnit = 'mg/dL'; String? get triMgdlValue => _triMgdlValue; + String? get triMmolValue => _triMmolValue; - String get triActiveUnit => _triActiveUnit; + String get triActiveUnit => _triActiveUnit; // Generic helpers @@ -726,13 +739,10 @@ class HealthCalcualtorViewModel extends ChangeNotifier { final DateTime firstTrimesterStart = lmp; final DateTime firstTrimesterEnd = lmp.add(const Duration(days: 83)); - final DateTime secondTrimesterStart = - firstTrimesterEnd.add(const Duration(days: 1)); - final DateTime secondTrimesterEnd = - lmp.add(const Duration(days: 195)); + final DateTime secondTrimesterStart = firstTrimesterEnd.add(const Duration(days: 1)); + final DateTime secondTrimesterEnd = lmp.add(const Duration(days: 195)); - final DateTime thirdTrimesterStart = - secondTrimesterEnd.add(const Duration(days: 1)); + final DateTime thirdTrimesterStart = secondTrimesterEnd.add(const Duration(days: 1)); final DateTime thirdTrimesterEnd = dueDate; deliveryResult = { @@ -741,7 +751,7 @@ class HealthCalcualtorViewModel extends ChangeNotifier { // Raw DateTime (useful for logic/UI) 'lmpDateTime': lmp, 'dueDateTime': dueDate, - 'dueDateDay' : _formatDateWithDayName(dueDate), + 'dueDateDay': _formatDateWithDayName(dueDate), // Trimester info 'firstTrimester': { 'start': _formatDate(firstTrimesterStart), @@ -769,7 +779,6 @@ class HealthCalcualtorViewModel extends ChangeNotifier { notifyListeners(); } - // Blood sugar conversions void calculateBloodSugar({required String valueText, required String unit}) { if (valueText.trim().isEmpty) { @@ -838,8 +847,6 @@ class HealthCalcualtorViewModel extends ChangeNotifier { 'dietType': dietType }; - - void onBloodSugarChanged(String value, String fromUnit) { _activeUnit = fromUnit; @@ -855,47 +862,105 @@ class HealthCalcualtorViewModel extends ChangeNotifier { if (fromUnit == 'mg/dL') { _mgdlValue = value; - _mmolValue = (parsed / 18.0182).toStringAsFixed(1); + _mmolValue = (parsed / 18.0182).toStringAsFixed(3); } else { _mmolValue = value; - _mgdlValue = (parsed * 18.0182).toStringAsFixed(0); + _mgdlValue = (parsed * 18.0182).toStringAsFixed(3); } notifyListeners(); } - void switchBloodSugarValues() { - if (_activeUnit == 'mg/dL') { - final mmol = double.tryParse(_mmolValue ?? ''); - if (mmol == null) return; + void onBloodSugarMgdlChanged(String value) { + _mgdlValue = value; + _originalValue = value; + _originalUnit = 'mg/dL'; + _isSwapped = false; + _activeUnit = 'mg/dL'; + + if (value.isEmpty) { + _mmolValue = null; + _originalValue = null; + notifyListeners(); + return; + } - _activeUnit = 'mmol/L'; + final parsed = double.tryParse(value); + if (parsed == null) return; - // mmol stays as source - _mmolValue = mmol.toStringAsFixed(1); - _mgdlValue = (mmol * 18.0182).toStringAsFixed(0); - } else { - final mgdl = double.tryParse(_mgdlValue ?? ''); - if (mgdl == null) return; + // Convert mg/dL to mmol/L + _mmolValue = (parsed / 18.0182).toStringAsFixed(3); + notifyListeners(); + } - _activeUnit = 'mg/dL'; + void onBloodSugarMmolChanged(String value) { + _mmolValue = value; + _originalValue = value; + _originalUnit = 'mmol/L'; + _isSwapped = false; + _activeUnit = 'mmol/L'; - // mg/dL stays as source - _mgdlValue = mgdl.toStringAsFixed(0); - _mmolValue = (mgdl / 18.0182).toStringAsFixed(1); + if (value.isEmpty) { + _mgdlValue = null; + _originalValue = null; + notifyListeners(); + return; } + final parsed = double.tryParse(value); + if (parsed == null) return; + + // Convert mmol/L to mg/dL + _mgdlValue = (parsed * 18.0182).toStringAsFixed(3); notifyListeners(); } + + void switchBloodSugarValues() { + // Toggle between two states using the original entered value + if (_originalValue == null || _originalValue!.isEmpty) return; + + final originalParsed = double.tryParse(_originalValue!); + if (originalParsed == null) return; + + _isSwapped = !_isSwapped; + + if (_originalUnit == 'mg/dL') { + if (_isSwapped) { + // Original was in mg/dL, now treat it as mmol/L + _mmolValue = _originalValue; // Keep original format + _mgdlValue = (originalParsed * 18.0182).toStringAsFixed(3); + } else { + // Back to original: value in mg/dL + _mgdlValue = _originalValue; // Keep original format + _mmolValue = (originalParsed / 18.0182).toStringAsFixed(3); + } + } else { + // Original was in mmol/L + if (_isSwapped) { + // Now treat it as mg/dL + _mgdlValue = _originalValue; // Keep original format + _mmolValue = (originalParsed / 18.0182).toStringAsFixed(3); + } else { + // Back to original: value in mmol/L + _mmolValue = _originalValue; // Keep original format + _mgdlValue = (originalParsed * 18.0182).toStringAsFixed(3); + } + } + + notifyListeners(); + } + // --- NEW: Method to clear the values --- void clearBloodSugar() { _mgdlValue = null; _mmolValue = null; + _originalValue = null; + _originalUnit = 'mg/dL'; + _isSwapped = false; + _activeUnit = 'mg/dL'; notifyListeners(); } - - void onBloodCholesterolChanged(String value, String fromUnit) { _cholActiveUnit = fromUnit; @@ -911,47 +976,104 @@ class HealthCalcualtorViewModel extends ChangeNotifier { if (fromUnit == 'mg/dL') { _cholMgdlValue = value; - _cholMmolValue = (parsed / 38.67).toStringAsFixed(2); + _cholMmolValue = (parsed / 38.67).toStringAsFixed(3); } else { _cholMmolValue = value; - _cholMgdlValue = (parsed * 38.67).toStringAsFixed(0); + _cholMgdlValue = (parsed * 38.67).toStringAsFixed(3); } notifyListeners(); } - void switchBloodCholesterolValues() { - if (_cholActiveUnit == 'mg/dL') { - final mmol = double.tryParse(_cholMmolValue ?? ''); - if (mmol == null) return; + void onCholesterolMgdlChanged(String value) { + _cholMgdlValue = value; + _cholOriginalValue = value; + _cholOriginalUnit = 'mg/dL'; + _cholIsSwapped = false; + _cholActiveUnit = 'mg/dL'; + + if (value.isEmpty) { + _cholMmolValue = null; + _cholOriginalValue = null; + notifyListeners(); + return; + } - _cholActiveUnit = 'mmol/L'; + final parsed = double.tryParse(value); + if (parsed == null) return; - _cholMmolValue = mmol.toStringAsFixed(2); - _cholMgdlValue = (mmol * 38.67).toStringAsFixed(0); - } else { - final mgdl = double.tryParse(_cholMgdlValue ?? ''); - if (mgdl == null) return; + // Convert mg/dL to mmol/L + _cholMmolValue = (parsed / 38.67).toStringAsFixed(3); + notifyListeners(); + } - _cholActiveUnit = 'mg/dL'; + void onCholesterolMmolChanged(String value) { + _cholMmolValue = value; + _cholOriginalValue = value; + _cholOriginalUnit = 'mmol/L'; + _cholIsSwapped = false; + _cholActiveUnit = 'mmol/L'; - _cholMgdlValue = mgdl.toStringAsFixed(0); - _cholMmolValue = (mgdl / 38.67).toStringAsFixed(2); + if (value.isEmpty) { + _cholMgdlValue = null; + _cholOriginalValue = null; + notifyListeners(); + return; } + final parsed = double.tryParse(value); + if (parsed == null) return; + + // Convert mmol/L to mg/dL + _cholMgdlValue = (parsed * 38.67).toStringAsFixed(3); notifyListeners(); } + void switchBloodCholesterolValues() { + // Toggle between two states using the original entered value + if (_cholOriginalValue == null || _cholOriginalValue!.isEmpty) return; + + final originalParsed = double.tryParse(_cholOriginalValue!); + if (originalParsed == null) return; + + _cholIsSwapped = !_cholIsSwapped; + + if (_cholOriginalUnit == 'mg/dL') { + if (_cholIsSwapped) { + // Original was in mg/dL, now treat it as mmol/L + _cholMmolValue = _cholOriginalValue; // Keep original format + _cholMgdlValue = (originalParsed * 38.67).toStringAsFixed(3); + } else { + // Back to original: value in mg/dL + _cholMgdlValue = _cholOriginalValue; // Keep original format + _cholMmolValue = (originalParsed / 38.67).toStringAsFixed(3); + } + } else { + // Original was in mmol/L + if (_cholIsSwapped) { + // Now treat it as mg/dL + _cholMgdlValue = _cholOriginalValue; // Keep original format + _cholMmolValue = (originalParsed / 38.67).toStringAsFixed(3); + } else { + // Back to original: value in mmol/L + _cholMmolValue = _cholOriginalValue; // Keep original format + _cholMgdlValue = (originalParsed * 38.67).toStringAsFixed(3); + } + } + + notifyListeners(); + } void clearBloodCholesterol() { _cholMgdlValue = null; _cholMmolValue = null; + _cholOriginalValue = null; + _cholOriginalUnit = 'mg/dL'; + _cholIsSwapped = false; _cholActiveUnit = 'mg/dL'; notifyListeners(); } - - void onTriglyceridesChanged(String value, String fromUnit) { _triActiveUnit = fromUnit; @@ -967,30 +1089,89 @@ class HealthCalcualtorViewModel extends ChangeNotifier { if (fromUnit == 'mg/dL') { _triMgdlValue = value; - _triMmolValue = (parsed / 88.57).toStringAsFixed(2); + _triMmolValue = (parsed / 88.57).toStringAsFixed(3); } else { _triMmolValue = value; - _triMgdlValue = (parsed * 88.57).toStringAsFixed(0); + _triMgdlValue = (parsed * 88.57).toStringAsFixed(3); } notifyListeners(); } + void onTriglyceridesMgdlChanged(String value) { + _triMgdlValue = value; + _triOriginalValue = value; + _triOriginalUnit = 'mg/dL'; + _triIsSwapped = false; + _triActiveUnit = 'mg/dL'; + + if (value.isEmpty) { + _triMmolValue = null; + _triOriginalValue = null; + notifyListeners(); + return; + } + + final parsed = double.tryParse(value); + if (parsed == null) return; + + // Convert mg/dL to mmol/L + _triMmolValue = (parsed / 88.57).toStringAsFixed(3); + notifyListeners(); + } + + void onTriglyceridesMmolChanged(String value) { + _triMmolValue = value; + _triOriginalValue = value; + _triOriginalUnit = 'mmol/L'; + _triIsSwapped = false; + _triActiveUnit = 'mmol/L'; + + if (value.isEmpty) { + _triMgdlValue = null; + _triOriginalValue = null; + notifyListeners(); + return; + } + + final parsed = double.tryParse(value); + if (parsed == null) return; + + // Convert mmol/L to mg/dL + _triMgdlValue = (parsed * 88.57).toStringAsFixed(3); + notifyListeners(); + } + void switchTriglyceridesValues() { - if (_triActiveUnit == 'mg/dL') { - final mmol = double.tryParse(_triMmolValue ?? ''); - if (mmol == null) return; + // Toggle between two states using the original entered value + if (_triOriginalValue == null || _triOriginalValue!.isEmpty) return; - _triActiveUnit = 'mmol/L'; - _triMmolValue = mmol.toStringAsFixed(2); - _triMgdlValue = (mmol * 88.57).toStringAsFixed(0); - } else { - final mgdl = double.tryParse(_triMgdlValue ?? ''); - if (mgdl == null) return; + final originalParsed = double.tryParse(_triOriginalValue!); + if (originalParsed == null) return; + + _triIsSwapped = !_triIsSwapped; - _triActiveUnit = 'mg/dL'; - _triMgdlValue = mgdl.toStringAsFixed(0); - _triMmolValue = (mgdl / 88.57).toStringAsFixed(2); + if (_triOriginalUnit == 'mg/dL') { + if (_triIsSwapped) { + // Original was in mg/dL, now treat it as mmol/L + _triMmolValue = _triOriginalValue; // Keep original format + _triMgdlValue = (originalParsed * 88.57).toStringAsFixed(3); + } else { + // Back to original: value in mg/dL + _triMgdlValue = _triOriginalValue; // Keep original format + _triMmolValue = (originalParsed / 88.57).toStringAsFixed(3); + } + } else { + // Original was in mmol/L + if (_triIsSwapped) { + // Now treat it as mg/dL + _triMgdlValue = _triOriginalValue; // Keep original format + _triMmolValue = (originalParsed / 88.57).toStringAsFixed(3); + } else { + // Back to original: value in mmol/L + _triMmolValue = _triOriginalValue; // Keep original format + _triMgdlValue = (originalParsed * 88.57).toStringAsFixed(3); + } } notifyListeners(); @@ -999,10 +1180,10 @@ class HealthCalcualtorViewModel extends ChangeNotifier { void clearTriglycerides() { _triMgdlValue = null; _triMmolValue = null; + _triOriginalValue = null; + _triOriginalUnit = 'mg/dL'; + _triIsSwapped = false; _triActiveUnit = 'mg/dL'; notifyListeners(); } - - - } diff --git a/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart b/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart index 161f318..e3bc7ff 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/blood_cholesterol.dart @@ -52,14 +52,15 @@ class _BloodCholesterolWidgetState extends State { final mgdlText = provider.cholMgdlValue ?? ''; final mmolText = provider.cholMmolValue ?? ''; - if (_mgdlController.text != mgdlText) { + // Only update if focus is not on this field (to avoid cursor jumping) + if (!_mgdlFocus.hasFocus && _mgdlController.text != mgdlText) { _mgdlController.text = mgdlText; _mgdlController.selection = TextSelection.fromPosition( TextPosition(offset: _mgdlController.text.length), ); } - if (_mmolController.text != mmolText) { + if (!_mmolFocus.hasFocus && _mmolController.text != mmolText) { _mmolController.text = mmolText; _mmolController.selection = TextSelection.fromPosition( TextPosition(offset: _mmolController.text.length), @@ -81,7 +82,7 @@ class _BloodCholesterolWidgetState extends State { focusNode: _mgdlFocus, onChanged: (value) { if (_isProgrammaticChange) return; - provider.onBloodCholesterolChanged(value, 'mg/dL'); + provider.onCholesterolMgdlChanged(value); }, ).paddingOnly(top: 16.h), Row( @@ -96,24 +97,21 @@ class _BloodCholesterolWidgetState extends State { width: 40.h, height: 40.h, ).onPress(() { + // Unfocus both fields before switching + _mgdlFocus.unfocus(); + _mmolFocus.unfocus(); provider.switchBloodCholesterolValues(); - if (provider.cholActiveUnit == 'mg/dL') { - _mgdlFocus.requestFocus(); - } else { - _mmolFocus.requestFocus(); - } }), ], ), _buildInputField( label: "MMOL/L", - hint: "6.7", + hint: "3.1", controller: _mmolController, focusNode: _mmolFocus, onChanged: (value) { if (_isProgrammaticChange) return; - - provider.onBloodCholesterolChanged(value, 'mmol/L'); + provider.onCholesterolMmolChanged(value); }, ).paddingOnly(bottom: 16.h), const Divider(height: 1, color: Color(0xFFEEEEEE)), diff --git a/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart b/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart index 86b4c1e..cf7cc61 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/blood_sugar.dart @@ -51,14 +51,16 @@ class _BloodSugarWidgetState extends State { _isProgrammaticChange = true; final mgdlText = provider.mgdlValue ?? ''; final mmolText = provider.mmolValue ?? ''; - if (_mgdlController.text != mgdlText) { + + // Only update if focus is not on this field (to avoid cursor jumping) + if (!_mgdlFocus.hasFocus && _mgdlController.text != mgdlText) { _mgdlController.text = mgdlText; _mgdlController.selection = TextSelection.fromPosition( TextPosition(offset: _mgdlController.text.length), ); } - if (_mmolController.text != mmolText) { + if (!_mmolFocus.hasFocus && _mmolController.text != mmolText) { _mmolController.text = mmolText; _mmolController.selection = TextSelection.fromPosition( TextPosition(offset: _mmolController.text.length), @@ -84,7 +86,7 @@ class _BloodSugarWidgetState extends State { focusNode: _mgdlFocus, onChanged: (value) { if (_isProgrammaticChange) return; - provider.onBloodSugarChanged(value, 'mg/dL'); + provider.onBloodSugarMgdlChanged(value); }, ).paddingOnly(top: 16.h), Row( @@ -99,12 +101,10 @@ class _BloodSugarWidgetState extends State { width: 40.h, height: 40.h, ).onPress(() { + // Unfocus both fields before switching + _mgdlFocus.unfocus(); + _mmolFocus.unfocus(); provider.switchBloodSugarValues(); - if (provider.activeUnit == 'mg/dL') { - _mgdlFocus.requestFocus(); - } else { - _mmolFocus.requestFocus(); - } }), ], ), @@ -115,8 +115,7 @@ class _BloodSugarWidgetState extends State { focusNode: _mmolFocus, onChanged: (value) { if (_isProgrammaticChange) return; - - provider.onBloodSugarChanged(value, 'mmol/L'); + provider.onBloodSugarMmolChanged(value); }, ).paddingOnly(bottom: 16.h), const Divider(height: 1, color: Color(0xFFEEEEEE)), diff --git a/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart b/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart index 17ad1f9..1c8c99e 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/triglycerides.dart @@ -53,14 +53,15 @@ class _TriglyceridesWidgetState extends State { final mgdlText = provider.triMgdlValue ?? ''; final mmolText = provider.triMmolValue ?? ''; - if (_mgdlController.text != mgdlText) { + // Only update if focus is not on this field (to avoid cursor jumping) + if (!_mgdlFocus.hasFocus && _mgdlController.text != mgdlText) { _mgdlController.text = mgdlText; _mgdlController.selection = TextSelection.fromPosition( TextPosition(offset: _mgdlController.text.length), ); } - if (_mmolController.text != mmolText) { + if (!_mmolFocus.hasFocus && _mmolController.text != mmolText) { _mmolController.text = mmolText; _mmolController.selection = TextSelection.fromPosition( TextPosition(offset: _mmolController.text.length), @@ -85,7 +86,7 @@ class _TriglyceridesWidgetState extends State { focusNode: _mgdlFocus, onChanged: (value) { if (_isProgrammaticChange) return; - provider.onTriglyceridesChanged(value, 'mg/dL'); + provider.onTriglyceridesMgdlChanged(value); }, ).paddingOnly(top: 16.h), @@ -101,13 +102,10 @@ class _TriglyceridesWidgetState extends State { width: 40.h, height: 40.h, ).onPress(() { + // Unfocus both fields before switching + _mgdlFocus.unfocus(); + _mmolFocus.unfocus(); provider.switchTriglyceridesValues(); - - if (provider.triActiveUnit == 'mg/dL') { - _mgdlFocus.requestFocus(); - } else { - _mmolFocus.requestFocus(); - } }), ], ), @@ -119,7 +117,7 @@ class _TriglyceridesWidgetState extends State { focusNode: _mmolFocus, onChanged: (value) { if (_isProgrammaticChange) return; - provider.onTriglyceridesChanged(value, 'mmol/L'); + provider.onTriglyceridesMmolChanged(value); }, ).paddingOnly(bottom: 16.h), @@ -170,7 +168,6 @@ class _TriglyceridesWidgetState extends State { child: TextField( controller: controller, focusNode: focusNode, - keyboardType: const TextInputType.numberWithOptions(decimal: true), onChanged: onChanged, @@ -185,6 +182,7 @@ class _TriglyceridesWidgetState extends State { style: TextStyle( fontSize: 32.f, fontWeight: FontWeight.bold, + color: Colors.black87, ), ), ), From 0e26505692b093f9be41bb9b3bdcc0bdb38ba1cf Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Wed, 31 Dec 2025 10:04:05 +0300 Subject: [PATCH 45/55] covid page inprogress --- lib/core/utils/utils.dart | 11 +- .../hmg_services/hmg_services_repo.dart | 98 +++ .../hmg_services/hmg_services_view_model.dart | 76 ++- .../covid_get_test_proceedure_resp.dart | 33 + .../get_covid_payment_info_resp.dart | 105 ++++ .../laser/laser_appointment.dart | 1 + .../covid19test/covid_19_questionnaire.dart | 156 ++--- .../covid19test/covid_payment_screen.dart | 565 ++++++++++++++++++ .../covid19test/covid_review_screen.dart | 441 ++++++++++++++ 9 files changed, 1416 insertions(+), 70 deletions(-) create mode 100644 lib/features/hmg_services/models/resq_models/covid_get_test_proceedure_resp.dart create mode 100644 lib/features/hmg_services/models/resq_models/get_covid_payment_info_resp.dart create mode 100644 lib/presentation/covid19test/covid_payment_screen.dart create mode 100644 lib/presentation/covid19test/covid_review_screen.dart diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart index 38d04b9..7e1e5d4 100644 --- a/lib/core/utils/utils.dart +++ b/lib/core/utils/utils.dart @@ -722,7 +722,16 @@ class Utils { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Image.asset(AppAssets.mada, width: 25.h, height: 25.h), - Image.asset(AppAssets.tamaraEng, width: 25.h, height: 25.h), + Image.asset( + AppAssets.tamaraEng, + width: 25.h, + height: 25.h, + fit: BoxFit.contain, + errorBuilder: (context, error, stackTrace) { + debugPrint('Failed to load Tamara PNG in payment methods: $error'); + return Utils.buildSvgWithAssets(icon: AppAssets.tamara, width: 25.h, height: 25.h, fit: BoxFit.contain); + }, + ), Image.asset(AppAssets.visa, width: 25.h, height: 25.h), Image.asset(AppAssets.mastercard, width: 25.h, height: 25.h), Image.asset(AppAssets.applePay, width: 25.h, height: 25.h), diff --git a/lib/features/hmg_services/hmg_services_repo.dart b/lib/features/hmg_services/hmg_services_repo.dart index b2b3709..851ac93 100644 --- a/lib/features/hmg_services/hmg_services_repo.dart +++ b/lib/features/hmg_services/hmg_services_repo.dart @@ -17,6 +17,8 @@ import 'package:hmg_patient_app_new/services/logger_service.dart'; import 'models/req_models/create_e_referral_model.dart'; import 'models/req_models/send_activation_code_ereferral_req_model.dart'; +import 'models/resq_models/covid_get_test_proceedure_resp.dart'; +import 'models/resq_models/get_covid_payment_info_resp.dart'; import 'models/resq_models/relationship_type_resp_mode.dart'; import 'models/resq_models/search_e_referral_resp_model.dart'; @@ -60,7 +62,9 @@ abstract class HmgServicesRepo { Future>>> searchEReferral(SearchEReferralRequestModel requestModel); + Future>>> getCovidTestProcedures(); + Future>> getCovidPaymentInfo(String procedureID, int projectID); } class HmgServicesRepoImp implements HmgServicesRepo { @@ -816,4 +820,98 @@ class HmgServicesRepoImp implements HmgServicesRepo { } } + + @override + Future>>> getCovidTestProcedures() async { + + try { + GenericApiModel>? apiResponse; + Failure? failure; + + await apiClient.post( + GET_COVID_DRIVETHRU_PROCEDURES_LIST, + body: {"TestTypeEnum":2,"TestProcedureEnum":3,}, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + loggerService.logError("Covid Test Procedure : $error, Status: $statusCode"); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + List covidTestProcedure = []; + + if (response['COVID19_TestProceduresList'] != null && response['COVID19_TestProceduresList'] is List) { + final servicesList = response['COVID19_TestProceduresList'] as List; + + for (var serviceJson in servicesList) { + if (serviceJson is Map) { + covidTestProcedure.add(Covid19GetTestProceduresResp.fromJson(serviceJson)); + } + } + } + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: covidTestProcedure, + ); + } catch (e) { + loggerService.logError("Error parsing E-Referral services: ${e.toString()}"); + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + log("Unknown error in Search Referral: ${e.toString()}"); + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>> getCovidPaymentInfo(String procedureID, int projectID) async { + + try { + GenericApiModel? apiResponse; + Failure? failure; + + await apiClient.post( + GET_COVID_DRIVETHRU_PAYMENT_INFO, + body: {"TestTypeEnum":2,"TestProcedureEnum":3, "ProcedureId":procedureID, "ProjectID":projectID,}, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + loggerService.logError("Covid Test Procedure : $error, Status: $statusCode"); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + + Covid19GetPaymentInfo covidPaymentInfo = Covid19GetPaymentInfo.fromJson(response["COVID19_PatientShare"]); + + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: covidPaymentInfo, + ); + } catch (e) { + loggerService.logError("Error parsing E-Referral services: ${e.toString()}"); + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + log("Unknown error in Search Referral: ${e.toString()}"); + return Left(UnknownFailure(e.toString())); + } + } + + } diff --git a/lib/features/hmg_services/hmg_services_view_model.dart b/lib/features/hmg_services/hmg_services_view_model.dart index 5da0860..d702cab 100644 --- a/lib/features/hmg_services/hmg_services_view_model.dart +++ b/lib/features/hmg_services/hmg_services_view_model.dart @@ -10,6 +10,7 @@ import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/crea import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/order_update_req_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/search_e_referral_req_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/req_models/send_activation_code_ereferral_req_model.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/covid_get_test_proceedure_resp.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_all_cities_resp_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_all_orders_resp_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_services_resp_model.dart'; @@ -19,6 +20,7 @@ import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'models/req_models/check_activation_e_referral_req_model.dart'; +import 'models/resq_models/get_covid_payment_info_resp.dart'; import 'models/resq_models/relationship_type_resp_mode.dart'; import 'models/ui_models/covid_questionnare_model.dart'; @@ -60,7 +62,8 @@ class HmgServicesViewModel extends ChangeNotifier { List relationTypes = []; List getAllCitiesList = []; List searchReferralList = []; - + List covidTestProcedureList = []; + Covid19GetPaymentInfo? covidPaymentInfo; Future getOrdersList() async {} @@ -783,4 +786,75 @@ class HmgServicesViewModel extends ChangeNotifier { return []; } } + + + Future getCovidProcedureList({ + + Function(dynamic)? onSuccess, + Function(String)? onError, + }) async { + notifyListeners(); + + final result = await hmgServicesRepo.getCovidTestProcedures(); + + result.fold( + (failure) async { + notifyListeners(); + await errorHandlerService.handleError(failure: failure); + if (onError != null) { + onError(failure.toString()); + } + }, + (apiResponse) { + if (apiResponse.messageStatus == 1) { + covidTestProcedureList = apiResponse.data ?? []; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } else { + notifyListeners(); + if (onError != null) { + onError(apiResponse.errorMessage ?? 'Unknown error'); + } + } + }, + ); + } + + + Future getPaymentInfo({ + String? procedureID, + int? projectID, + Function(dynamic)? onSuccess, + Function(String)? onError, + }) async { + notifyListeners(); + + final result = await hmgServicesRepo.getCovidPaymentInfo(procedureID!, projectID!); + + result.fold( + (failure) async { + notifyListeners(); + await errorHandlerService.handleError(failure: failure); + if (onError != null) { + onError(failure.toString()); + } + }, + (apiResponse) { + if (apiResponse.messageStatus == 1) { + covidPaymentInfo = apiResponse.data; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } else { + notifyListeners(); + if (onError != null) { + onError(apiResponse.errorMessage ?? 'Unknown error'); + } + } + }, + ); + } } diff --git a/lib/features/hmg_services/models/resq_models/covid_get_test_proceedure_resp.dart b/lib/features/hmg_services/models/resq_models/covid_get_test_proceedure_resp.dart new file mode 100644 index 0000000..c27f1e7 --- /dev/null +++ b/lib/features/hmg_services/models/resq_models/covid_get_test_proceedure_resp.dart @@ -0,0 +1,33 @@ +import 'dart:convert'; + +class Covid19GetTestProceduresResp { + String? procedureId; + String? procedureName; + String? procedureNameN; + String? setupId; + + Covid19GetTestProceduresResp({ + this.procedureId, + this.procedureName, + this.procedureNameN, + this.setupId, + }); + + factory Covid19GetTestProceduresResp.fromRawJson(String str) => Covid19GetTestProceduresResp.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory Covid19GetTestProceduresResp.fromJson(Map json) => Covid19GetTestProceduresResp( + procedureId: json["ProcedureID"], + procedureName: json["ProcedureName"], + procedureNameN: json["ProcedureNameN"], + setupId: json["SetupID"], + ); + + Map toJson() => { + "ProcedureID": procedureId, + "ProcedureName": procedureName, + "ProcedureNameN": procedureNameN, + "SetupID": setupId, + }; +} diff --git a/lib/features/hmg_services/models/resq_models/get_covid_payment_info_resp.dart b/lib/features/hmg_services/models/resq_models/get_covid_payment_info_resp.dart new file mode 100644 index 0000000..5f95263 --- /dev/null +++ b/lib/features/hmg_services/models/resq_models/get_covid_payment_info_resp.dart @@ -0,0 +1,105 @@ +import 'dart:convert'; + +class Covid19GetPaymentInfo { + dynamic propertyChanged; + int? cashPriceField; + int? cashPriceTaxField; + int? cashPriceWithTaxField; + int? companyIdField; + String? companyNameField; + int? companyShareWithTaxField; + dynamic errCodeField; + int? groupIdField; + dynamic insurancePolicyNoField; + String? messageField; + dynamic patientCardIdField; + int? patientShareField; + double? patientShareWithTaxField; + double? patientTaxAmountField; + int? policyIdField; + dynamic policyNameField; + dynamic procedureIdField; + String? procedureNameField; + dynamic setupIdField; + int? statusCodeField; + dynamic subPolicyNoField; + + Covid19GetPaymentInfo({ + this.propertyChanged, + this.cashPriceField, + this.cashPriceTaxField, + this.cashPriceWithTaxField, + this.companyIdField, + this.companyNameField, + this.companyShareWithTaxField, + this.errCodeField, + this.groupIdField, + this.insurancePolicyNoField, + this.messageField, + this.patientCardIdField, + this.patientShareField, + this.patientShareWithTaxField, + this.patientTaxAmountField, + this.policyIdField, + this.policyNameField, + this.procedureIdField, + this.procedureNameField, + this.setupIdField, + this.statusCodeField, + this.subPolicyNoField, + }); + + factory Covid19GetPaymentInfo.fromRawJson(String str) => Covid19GetPaymentInfo.fromJson(json.decode(str)); + + String toRawJson() => json.encode(toJson()); + + factory Covid19GetPaymentInfo.fromJson(Map json) => Covid19GetPaymentInfo( + propertyChanged: json["PropertyChanged"], + cashPriceField: json["cashPriceField"], + cashPriceTaxField: json["cashPriceTaxField"], + cashPriceWithTaxField: json["cashPriceWithTaxField"], + companyIdField: json["companyIdField"], + companyNameField: json["companyNameField"], + companyShareWithTaxField: json["companyShareWithTaxField"], + errCodeField: json["errCodeField"], + groupIdField: json["groupIDField"], + insurancePolicyNoField: json["insurancePolicyNoField"], + messageField: json["messageField"], + patientCardIdField: json["patientCardIDField"], + patientShareField: json["patientShareField"], + patientShareWithTaxField: json["patientShareWithTaxField"]?.toDouble(), + patientTaxAmountField: json["patientTaxAmountField"]?.toDouble(), + policyIdField: json["policyIdField"], + policyNameField: json["policyNameField"], + procedureIdField: json["procedureIdField"], + procedureNameField: json["procedureNameField"], + setupIdField: json["setupIDField"], + statusCodeField: json["statusCodeField"], + subPolicyNoField: json["subPolicyNoField"], + ); + + Map toJson() => { + "PropertyChanged": propertyChanged, + "cashPriceField": cashPriceField, + "cashPriceTaxField": cashPriceTaxField, + "cashPriceWithTaxField": cashPriceWithTaxField, + "companyIdField": companyIdField, + "companyNameField": companyNameField, + "companyShareWithTaxField": companyShareWithTaxField, + "errCodeField": errCodeField, + "groupIDField": groupIdField, + "insurancePolicyNoField": insurancePolicyNoField, + "messageField": messageField, + "patientCardIDField": patientCardIdField, + "patientShareField": patientShareField, + "patientShareWithTaxField": patientShareWithTaxField, + "patientTaxAmountField": patientTaxAmountField, + "policyIdField": policyIdField, + "policyNameField": policyNameField, + "procedureIdField": procedureIdField, + "procedureNameField": procedureNameField, + "setupIDField": setupIdField, + "statusCodeField": statusCodeField, + "subPolicyNoField": subPolicyNoField, + }; +} diff --git a/lib/presentation/book_appointment/laser/laser_appointment.dart b/lib/presentation/book_appointment/laser/laser_appointment.dart index 28f0f2d..d14e5dd 100644 --- a/lib/presentation/book_appointment/laser/laser_appointment.dart +++ b/lib/presentation/book_appointment/laser/laser_appointment.dart @@ -1,6 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart' show CapExtension; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/laser_body_parts.dart'; diff --git a/lib/presentation/covid19test/covid_19_questionnaire.dart b/lib/presentation/covid19test/covid_19_questionnaire.dart index 8d7e8bd..b9ac008 100644 --- a/lib/presentation/covid19test/covid_19_questionnaire.dart +++ b/lib/presentation/covid19test/covid_19_questionnaire.dart @@ -7,10 +7,13 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_view_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/ui_models/covid_questionnare_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/presentation/covid19test/covid_review_screen.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/CustomSwitch.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.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'; @@ -46,87 +49,104 @@ class _Covid19QuestionnaireState extends State { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColors.bgScaffoldColor, - body: Column(children: [ - Expanded( - child: CollapsingListView( + return CollapsingListView( title: "COVID-19", - child: Padding( + bottomChild: Container( + padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + hasShadow: true, + customBorder: BorderRadius.only( + topLeft: Radius.circular(24.r), + topRight: Radius.circular(24.r), + ), + ),child: CustomButton( + text: "Next".needTranslation, + onPressed: () { + moveToNextPage(context); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w600, + borderRadius: 12.r, + height: 56.h, + )), + child: SingleChildScrollView( + child: Padding( padding: EdgeInsets.all(24.w), child: Column( children: [ - Expanded( - child: SingleChildScrollView( - child: Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 24.r, - hasShadow: false, - ), - child: Padding( - padding: EdgeInsets.all(20.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "Please answer below questionnaire:".toText14( - color: AppColors.textColor, - weight: FontWeight.w500, - ), - SizedBox(height: 20.h), - // Question list - ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: qaList.length, - separatorBuilder: (context, index) => SizedBox(height: 16.h), - itemBuilder: (context, index) { - final question = qaList[index]; - final isAnswerYes = question.ans == 1; + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(20.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Please answer below questionnaire:".toText14( + color: AppColors.textColor, + weight: FontWeight.w500, + ), + SizedBox(height: 20.h), + // Question list + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: qaList.length, + separatorBuilder: (context, index) => SizedBox(height: 16.h), + itemBuilder: (context, index) { + final question = qaList[index]; + final isAnswerYes = question.ans == 1; - return Row( - children: [ - Expanded( - child: (question.questionEn ?? '').toText14( - color: AppColors.textColor, - weight: FontWeight.w400, - ), - ), - SizedBox(width: 12.w), - CustomSwitch( - value: isAnswerYes, - onChanged: (value) => _toggleAnswer(index, value), - ), - ], - ); - }, - ), - ], + return Row( + children: [ + Expanded( + child: (question.questionEn ?? '').toText14( + color: AppColors.textColor, + weight: FontWeight.w400, + ), + ), + SizedBox(width: 12.w), + CustomSwitch( + value: isAnswerYes, + onChanged: (value) => _toggleAnswer(index, value), + ), + ], + ); + }, ), - ), + ], ), ), ), SizedBox(height: 16.h), // Next button - CustomButton( - text: "Next".needTranslation, - onPressed: () { - // Handle next action - }, - backgroundColor: AppColors.primaryRedColor, - borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, - fontSize: 16.f, - fontWeight: FontWeight.w600, - borderRadius: 12.r, - height: 56.h, - ), + ], ), + ), + ), - ), - ), - ])); + ); + + + } + moveToNextPage(BuildContext context) async{ + LoaderBottomSheet.showLoader(); + await hmgServicesViewModel.getCovidProcedureList(); + await hmgServicesViewModel.getPaymentInfo(procedureID: hmgServicesViewModel.covidTestProcedureList[0].procedureId!); + LoaderBottomSheet.hideLoader(); + Navigator.of(context) + .push( + CustomPageRoute( + page: CovidReviewScreen(selectedHospital: widget.selectedHospital, qaList: qaList), + ), + ); } } diff --git a/lib/presentation/covid19test/covid_payment_screen.dart b/lib/presentation/covid19test/covid_payment_screen.dart new file mode 100644 index 0000000..42e7736 --- /dev/null +++ b/lib/presentation/covid19test/covid_payment_screen.dart @@ -0,0 +1,565 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/payfort/payfort_view_model.dart'; +import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.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/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:provider/provider.dart'; +import 'package:smooth_corner/smooth_corner.dart'; + +// Added imports required by this file +import 'package:hmg_patient_app_new/widgets/in_app_browser/InAppBrowser.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; + +/// A reusable payment screen for COVID-related payments. +/// +/// This screen re-uses the same UI pattern and payment flow used by +/// `AppointmentPaymentPage` (in-app browser, Apple Pay and payfort status checks), +/// but it keeps the post-payment handling generic (shows success / failure) +/// so it can be safely used for COVID test purchases without appointment-specific APIs. +class CovidPaymentScreen extends StatefulWidget { + final double amount; + final int projectID; + final int clinicID; + final String procedureId; + final double taxAmount; + final String title; + + const CovidPaymentScreen({ + super.key, + required this.amount, + required this.projectID, + required this.clinicID, + required this.procedureId, + this.taxAmount = 0.0, + this.title = "COVID Payment", + }); + + @override + State createState() => _CovidPaymentScreenState(); +} + +class _CovidPaymentScreenState extends State { + late PayfortViewModel payfortViewModel; + late AppState appState; + + MyInAppBrowser? browser; + String selectedPaymentMethod = ""; + String transID = ""; + + bool isShowTamara = false; // placeholder: could be enabled based on remote config + + @override + void initState() { + super.initState(); + // initialize payfort view model when the widget is ready + scheduleMicrotask(() { + payfortViewModel = Provider.of(context, listen: false); + payfortViewModel.initPayfortViewModel(); + payfortViewModel.setIsApplePayConfigurationLoading(false); + // Optionally compute if Tamara should be shown by calling a remote config API. + // For now keep it false (unless the app provides an API for it). + // Enable Tamara payment option for COVID screen + setState(() { + isShowTamara = true; + }); + }); + } + + @override + Widget build(BuildContext context) { + appState = getIt.get(); + payfortViewModel = Provider.of(context); + + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: widget.title.needTranslation, + bottomChild: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: false, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + "Total amount to pay".needTranslation.toText18(isBold: true).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Amount before tax".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol(( (widget.amount - widget.taxAmount).toString()).toText16(isBold: true), AppColors.blackColor, 13, isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "VAT 15%".needTranslation.toText14(isBold: true, color: AppColors.greyTextColor), + // Show VAT amount passed from review screen + Utils.getPaymentAmountWithSymbol((widget.taxAmount.toString()).toText14(isBold: true, color: AppColors.greyTextColor), AppColors.greyTextColor, 13, isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + SizedBox(height: 17.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol(widget.amount.toString().toText24(isBold: true), AppColors.blackColor, 17, isSaudiCurrency: true), + ], + ).paddingSymmetrical(24.h, 0.h), + + // Apple Pay (iOS) + Platform.isIOS + ? Utils.buildSvgWithAssets( + icon: AppAssets.apple_pay_button, + width: 200.h, + height: 80.h, + fit: BoxFit.contain, + ).paddingSymmetrical(24.h, 0.h).onPress(() { + if (Utils.havePrivilege(103)) { + startApplePay(); + } else { + openPaymentURL("ApplePay"); + } + }) + : SizedBox(height: 12.h), + SizedBox(height: 12.h), + + // Action buttons: Cancel + Next (Next opens default payment flow - e.g. Visa) + // Padding( + // padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 24.h), + // child: Row( + // children: [ + // Expanded( + // child: CustomButton( + // height: 56.h, + // text: LocaleKeys.cancel.tr(), + // onPressed: () { + // Navigator.of(context).pop(); + // }, + // backgroundColor: AppColors.secondaryLightRedColor, + // borderColor: AppColors.secondaryLightRedColor, + // textColor: AppColors.primaryRedColor, + // icon: AppAssets.cancel, + // iconColor: AppColors.primaryRedColor, + // borderRadius: 12.r, + // ), + // ), + // SizedBox(width: 8.h), + // Expanded( + // child: CustomButton( + // height: 56.h, + // text: "Next".needTranslation, + // onPressed: () { + // // Default to Visa for Next + // selectedPaymentMethod = "VISA"; + // openPaymentURL("visa"); + // }, + // backgroundColor: AppColors.primaryRedColor, + // borderColor: AppColors.primaryRedColor, + // textColor: AppColors.whiteColor, + // fontSize: 16.f, + // fontWeight: FontWeight.w500, + // borderRadius: 12.r, + // padding: EdgeInsets.symmetric(horizontal: 10.w), + // icon: AppAssets.add_icon, + // iconColor: AppColors.whiteColor, + // iconSize: 18.h, + // ), + // ), + // ], + // ), + // ), + ], + ), + ).paddingSymmetrical(0.h, 0.h), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + + // MADA tile + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.mada, width: 72.h, height: 25.h), + SizedBox(height: 16.h), + "Mada".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "MADA"; + openPaymentURL("MADA"); + }), + + SizedBox(height: 16.h), + + // Visa / Mastercard tile + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.asset(AppAssets.visa, width: 50.h, height: 50.h), + SizedBox(width: 8.h), + Image.asset(AppAssets.mastercard, width: 40.h, height: 40.h), + ], + ), + SizedBox(height: 16.h), + "Visa or Mastercard".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "VISA"; + openPaymentURL("VISA"); + }), + + SizedBox(height: 16.h), + + // Optional Tamara tile (shown only if enabled) + isShowTamara + ? Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + AppAssets.tamaraEng, + width: 72.h, + height: 25.h, + fit: BoxFit.contain, + // If PNG fails to load for any reason, log and fallback to SVG asset + errorBuilder: (context, error, stackTrace) { + debugPrint('Failed to load Tamara PNG asset: $error'); + return Utils.buildSvgWithAssets( + icon: AppAssets.tamara, + width: 72.h, + height: 25.h, + fit: BoxFit.contain, + ); + }, + ), + SizedBox(height: 16.h), + "Tamara".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(width: 8.h), + const Spacer(), + Transform.flip( + flipX: appState.isArabic(), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, + iconColor: AppColors.blackColor, + width: 18.h, + height: 13.h, + fit: BoxFit.contain, + ), + ), + ], + ).paddingSymmetrical(16.h, 16.h), + ).paddingSymmetrical(24.h, 0.h).onPress(() { + selectedPaymentMethod = "TAMARA"; + openPaymentURL("TAMARA"); + }) + : SizedBox.shrink(), + + SizedBox(height: 24.h), + + // Bottom payment summary + + SizedBox(height: 24.h), + ], + ), + ), + + ), + ); + } + + void onBrowserLoadStart(String url) { + // Generic loader hook: detect success / error patterns from the in-app browser. + // Keep parsing defensive: use Uri.parse where possible. + try { + final uri = Uri.tryParse(url); + if (selectedPaymentMethod == "TAMARA" && uri != null) { + // tamara returns different query param names depending on platform; defensive checks + final params = uri.queryParameters; + if (params.isNotEmpty) { + // example keys: 'status', 'AuthorizePaymentId' (android) or 'paymentStatus', 'orderId' (iOS) + } + } + } catch (e) { + debugPrint('onBrowserLoadStart parse error: $e'); + } + + MyInAppBrowser.successURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = true; + return; + } + }); + + MyInAppBrowser.errorURLS.forEach((element) { + if (url.contains(element)) { + browser?.close(); + MyInAppBrowser.isPaymentDone = false; + return; + } + }); + } + + void onBrowserExit(bool isPaymentMade) async { + // When browser closes, check payment status using payfort view model + await checkPaymentStatus(); + } + + Future checkPaymentStatus() async { + LoaderBottomSheet.showLoader(loadingText: "Checking payment status, Please wait...".needTranslation); + try { + await payfortViewModel.checkPaymentStatus(transactionID: transID, onSuccess: (apiResponse) async { + // treat any successful responseMessage as success; otherwise show generic error + final success = payfortViewModel.payfortCheckPaymentStatusResponseModel?.responseMessage?.toLowerCase() == 'success'; + LoaderBottomSheet.hideLoader(); + if (success) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getSuccessWidget(loadingText: "Payment successful".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }); + } catch (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err.toString()), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + + void openPaymentURL(String paymentMethod) { + browser = MyInAppBrowser(onExitCallback: onBrowserExit, onLoadStartCallback: onBrowserLoadStart, context: context); + transID = Utils.getAppointmentTransID(widget.projectID, widget.clinicID, DateTime.now().millisecondsSinceEpoch); + + // Open payment browser with essential parameters; many fields are simplified here + browser?.openPaymentBrowser( + widget.amount, + "COVID Test Payment", + transID, + widget.projectID.toString(), + "CustID_${appState.getAuthenticatedUser()?.patientId ?? ''}@HMG.com", + selectedPaymentMethod, + appState.getAuthenticatedUser()?.patientType.toString() ?? "", + appState.getAuthenticatedUser() != null ? "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}" : "", + appState.getAuthenticatedUser()?.patientId.toString() ?? "", + appState.getAuthenticatedUser() ?? (null as dynamic), + browser!, + false, + "2", + "", + context, + DateTime.now().toString(), + "", + 0, + 0, + "3", + ); + } + + void startApplePay() async { + showCommonBottomSheet( + context, + child: Utils.getLoadingWidget(), + callBackFunc: (str) {}, + title: "", + height: ResponsiveExtension.screenHeight * 0.3, + isCloseButtonVisible: false, + isDismissible: false, + isFullScreen: false, + ); + + transID = Utils.getAppointmentTransID(widget.projectID, widget.clinicID, DateTime.now().millisecondsSinceEpoch); + + // Prepare a minimal apple pay request using payfortViewModel's configuration + try { + await payfortViewModel.getPayfortConfigurations(serviceId: 0, projectId: widget.projectID, integrationId: 2); + + // Build minimal apple pay request (model omitted here to keep things generic) + ApplePayInsertRequest applePayInsertRequest = ApplePayInsertRequest( + clientRequestID: transID, + clinicID: widget.clinicID, + currency: appState.getAuthenticatedUser() != null && appState.getAuthenticatedUser()!.outSa == 0 ? "SAR" : "AED", + customerEmail: "CustID_${appState.getAuthenticatedUser()?.patientId ?? ''}@HMG.com", + customerID: appState.getAuthenticatedUser()?.patientId, + customerName: appState.getAuthenticatedUser() != null ? "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}" : "", + deviceToken: await Utils.getStringFromPrefs(CacheConst.pushToken), + voipToken: await Utils.getStringFromPrefs(CacheConst.voipToken), + doctorID: 0, + projectID: widget.projectID.toString(), + serviceID: "0", + channelID: 3, + patientID: appState.getAuthenticatedUser()?.patientId, + patientTypeID: appState.getAuthenticatedUser()?.patientType, + patientOutSA: appState.getAuthenticatedUser()?.outSa, + appointmentDate: DateTime.now().toString(), + appointmentNo: 0, + orderDescription: "COVID Test Payment", + liveServiceID: "0", + latitude: "0.0", + longitude: "0.0", + amount: widget.amount.toString(), + isSchedule: "0", + language: appState.isArabic() ? 'ar' : 'en', + languageID: appState.isArabic() ? 1 : 2, + userName: appState.getAuthenticatedUser()?.patientId, + responseContinueURL: "http://hmg.com/Documents/success.html", + backClickUrl: "http://hmg.com/Documents/success.html", + paymentOption: "ApplePay", + isMobSDK: true, + merchantReference: transID, + merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel?.merchantIdentifier, + commandType: "PURCHASE", + signature: payfortViewModel.payfortProjectDetailsRespModel?.signature, + accessCode: payfortViewModel.payfortProjectDetailsRespModel?.accessCode, + shaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel?.shaRequest, + shaResponsePhrase: payfortViewModel.payfortProjectDetailsRespModel?.shaResponse, + returnURL: "", + ); + + await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) { + // Start apple pay flow + payfortViewModel.paymentWithApplePay( + customerName: appState.getAuthenticatedUser() != null ? "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}" : "", + customerEmail: "CustID_${appState.getAuthenticatedUser()?.patientId ?? ''}@HMG.com", + orderDescription: "COVID Test Payment", + orderAmount: widget.amount, + merchantReference: transID, + merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel?.merchantIdentifier ?? "", + applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel?.accessCode ?? "", + applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel?.shaRequest ?? "", + currency: appState.getAuthenticatedUser() != null && appState.getAuthenticatedUser()!.outSa == 0 ? "SAR" : "AED", + onFailed: (failureResult) async { + Navigator.of(context).pop(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: failureResult.message.toString()), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }, + onSucceeded: (successResult) async { + Navigator.of(context).pop(); + selectedPaymentMethod = successResult.paymentOption ?? "VISA"; + await checkPaymentStatus(); + }, + ); + }).catchError((e) { + Navigator.of(context).pop(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: e.toString()), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + } catch (e) { + Navigator.of(context).pop(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: e.toString()), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + } + diff --git a/lib/presentation/covid19test/covid_review_screen.dart b/lib/presentation/covid19test/covid_review_screen.dart new file mode 100644 index 0000000..7ccbb02 --- /dev/null +++ b/lib/presentation/covid19test/covid_review_screen.dart @@ -0,0 +1,441 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/hmg_services/hmg_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/covid_get_test_proceedure_resp.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/ui_models/covid_questionnare_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.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 'package:hmg_patient_app_new/presentation/covid19test/covid_payment_screen.dart'; + +class CovidReviewScreen extends StatefulWidget { + + final HospitalsModel selectedHospital; + final List qaList; + + const CovidReviewScreen({super.key, required this.selectedHospital, required this.qaList}); + + @override + State createState() => _CovidReviewScreenState(); +} + +class _CovidReviewScreenState extends State { + + late HmgServicesViewModel hmgServicesViewModel; + bool _acceptedTerms =false; + Covid19GetTestProceduresResp? _selectedProcedure; + @override + void initState() { + super.initState(); + hmgServicesViewModel = Provider.of(context, listen: false); + scheduleMicrotask(() { + + }); + + } + + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: "COVID-19", + bottomChild: Consumer(builder: (context, vm, _) { + final info = vm.covidPaymentInfo; + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: SizedBox( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (info == null) ...[ + // show a placeholder/loading while payment info is null + SizedBox(height: 24.h), + Center(child: CircularProgressIndicator()), + SizedBox(height: 24.h), + ] else ...[ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Amount before tax".needTranslation.toText18(isBold: true), + Utils.getPaymentAmountWithSymbol( + (info.patientShareField ?? 0).toString().toText16(isBold: true), + AppColors.blackColor, + 13, + isSaudiCurrency: true), + ], + ), + SizedBox(height: 4.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Tax Amount".needTranslation.toText14(isBold: true), + Utils.getPaymentAmountWithSymbol( + (info.patientTaxAmountField ?? 0).toString().toText16(isBold: true), + AppColors.blackColor, + 13, + isSaudiCurrency: true) + ], + ), + SizedBox(height: 18.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: 150.h, + child: Utils.getPaymentMethods(), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Utils.getPaymentAmountWithSymbol( + (info.patientShareWithTaxField ?? 0).toString().toText24(isBold: true), + AppColors.blackColor, + 17, + isSaudiCurrency: true), + ], + ), + ], + ) + ], + ).paddingOnly(left: 16.h, top: 24.h, right: 16.h, bottom: 0.h), + + GestureDetector( + onTap: () { + setState(() { + _acceptedTerms = !_acceptedTerms; + }); + }, + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + hasShadow: false, + ), + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), + child: Row( + children: [ + Container( + width: 20.w, + height: 20.h, + decoration: BoxDecoration( + color: _acceptedTerms + ? AppColors.primaryRedColor + : AppColors.whiteColor, + border: Border.all( + color: _acceptedTerms + ? AppColors.primaryRedColor + : AppColors.greyTextColor.withValues(alpha: 0.3), + width: 2, + ), + borderRadius: BorderRadius.circular(4.r), + ), + child: _acceptedTerms + ? Icon( + Icons.check, + size: 14.h, + color: AppColors.whiteColor, + ) + : null, + ), + SizedBox(width: 12.w), + Expanded( + child: RichText( + text: TextSpan( + style: TextStyle( + fontSize: 14.f, + color: AppColors.textColor, + fontWeight: FontWeight.w400, + ), + children: [ + const TextSpan(text: "I agree to the "), + TextSpan( + text: "terms and conditions", + style: TextStyle( + color: AppColors.primaryRedColor, + fontWeight: FontWeight.w600, + decoration: TextDecoration.underline, + decorationColor: AppColors.primaryRedColor, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + // Two-button layout: Cancel (left) and Next (right) + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 24.h), + child: Row( + children: [ + Expanded( + child: CustomButton( + height: 56.h, + text: LocaleKeys.cancel.tr(), + onPressed: () { + Navigator.of(context).pop(); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + // icon: AppAssets.cancel, + // iconColor: AppColors.primaryRedColor, + borderRadius: 12.r, + ), + ), + SizedBox(width: 8.h), + Expanded( + child: CustomButton( + height: 56.h, + text: "Next".needTranslation, + onPressed: () async { + // Validate selection and payment info + if (_selectedProcedure == null) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Please select a procedure".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + return; + } + + if (info == null) { + // If payment info missing, attempt to fetch + LoaderBottomSheet.showLoader(); + try { + await hmgServicesViewModel.getPaymentInfo(procedureID: _selectedProcedure!.procedureId!); + } catch (e) { + debugPrint('getPaymentInfo error: $e'); + } finally { + LoaderBottomSheet.hideLoader(); + } + + if (hmgServicesViewModel.covidPaymentInfo == null) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Payment information not available".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + return; + } + } + + // Compute amount and project/clinic IDs defensively + final paymentInfo = hmgServicesViewModel.covidPaymentInfo ?? info!; + final double amount = paymentInfo.patientShareWithTaxField ?? (paymentInfo.patientShareField?.toDouble() ?? 0.0); + + // projectID may be int or string; parse defensively + int projectID = 0; + try { + final p = widget.selectedHospital.mainProjectID; + if (p is int) projectID = p; + else if (p is String) projectID = int.tryParse(p) ?? 0; + } catch (_) {} + + int clinicID = 0; + try { + clinicID = int.tryParse(widget.selectedHospital.setupID ?? '') ?? int.tryParse(widget.selectedHospital.iD?.toString() ?? '') ?? 0; + } catch (_) {} + + // Navigate to payment screen + Navigator.of(context).push( + CustomPageRoute( + page: CovidPaymentScreen( + amount: amount, + projectID: projectID, + clinicID: clinicID, + procedureId: _selectedProcedure!.procedureId ?? '', + taxAmount: paymentInfo.patientTaxAmountField?.toDouble() ?? 0.0, + ), + ), + ); + }, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: AppColors.whiteColor, + fontSize: 16.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + // icon: AppAssets.add_icon, + // iconColor: AppColors.whiteColor, + iconSize: 18.h, + ), + ), + ], + ), + ) + ] + ], + ), + ), + ); + }), + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + "Please select the procedure:".toText14( + color: AppColors.textColor, + weight: FontWeight.w500, + ), + SizedBox(height: 16.h), + + Consumer( + builder: (context, vm, _) { + final procedures = vm.covidTestProcedureList; + + // ensure default selection is first item (once available) + if (_selectedProcedure == null && procedures.isNotEmpty) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + setState(() { + _selectedProcedure = procedures[0]; + }); + + // also fetch payment info for default selection and show loader while loading + if (procedures[0].procedureId != null) { + LoaderBottomSheet.showLoader(); + hmgServicesViewModel + .getPaymentInfo(procedureID: procedures[0].procedureId!) + .whenComplete(() { + LoaderBottomSheet.hideLoader(); + }); + } + } + }); + } + + // Use a shrink-wrapped ListView.separated and match prescription styling + return Container( + + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.h), + child: ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: procedures.length, + separatorBuilder: (context, index) => Divider( + height: 1.h, + thickness: 1.h, + color: AppColors.borderOnlyColor.withValues(alpha: 0.05), + ).paddingOnly(top:8,bottom:16.h), + itemBuilder: (context, index) { + final item = procedures[index]; + // Let the radio option widget manage its own padding to avoid doubled spacing + return _buildRadioOption(value: item, title: item.procedureName ?? ''); + }, + ).paddingOnly(bottom:16.h) + ), + ); + }, + ), + ], + ), + ), + ), + ); + + } + + Widget _buildRadioOption({ + required Covid19GetTestProceduresResp value, + required String title, + }) { + final bool isSelected = _selectedProcedure?.procedureId == value.procedureId; + + return GestureDetector( + onTap: () async { + setState(() { + _selectedProcedure = value; + }); + + // show bottomsheet loader while fetching payment info + if (value.procedureId != null) { + LoaderBottomSheet.showLoader(); + try { + await hmgServicesViewModel.getPaymentInfo(procedureID: value.procedureId!, projectID: widget.selectedHospital.mainProjectID); + } catch (e) { + debugPrint('getPaymentInfo error: $e'); + } finally { + LoaderBottomSheet.hideLoader(); + } + } + }, + + + child: Row( + children: [ + Container( + width: 20.h, + height: 20.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: isSelected + ? AppColors.primaryRedColor + : AppColors.greyTextColor.withValues(alpha: 0.3), + width: 2, + ), + ), + child: isSelected + ? Center( + child: Container( + width: 10.h, + height: 10.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColors.primaryRedColor, + ), + ), + ) + : null, + ), + SizedBox(width: 12.h), + Expanded( + child: title.toText14( + color: AppColors.textColor, + weight: FontWeight.w400, + ), + ), + ], + ) + // Keep only bottom padding here and rely on the surrounding container's left/right inset + .paddingOnly(left: 0.h, right: 0.h, top: 0.h, bottom: 12.h), + ); + + } + } From d4dd475e0b9b000333c8d9c7f381ccc2d5d643b6 Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Wed, 31 Dec 2025 10:33:00 +0300 Subject: [PATCH 46/55] Added Graph --- lib/core/cache_consts.dart | 1 + lib/core/common_models/data_points.dart | 24 +- lib/core/dependencies.dart | 60 +- lib/core/location_util.dart | 49 +- lib/core/post_params_model.dart | 27 +- lib/core/utils/date_util.dart | 60 +- lib/core/utils/local_notifications.dart | 191 ----- lib/core/utils/push_notification_handler.dart | 25 +- lib/core/utils/utils.dart | 5 +- lib/extensions/string_extensions.dart | 5 +- .../water_monitor/water_monitor_repo.dart | 1 - .../water_monitor_view_model.dart | 319 +++++-- lib/main.dart | 9 +- .../water_consumption_screen.dart | 810 +++++++++--------- .../water_monitor_settings_screen.dart | 25 +- .../widgets/hydration_tips_widget.dart | 62 ++ .../widgets/water_action_buttons_widget.dart | 176 ++++ .../widgets/water_bottle_widget.dart | 112 +++ .../water_consumption_progress_widget.dart | 10 +- .../widgets/water_intake_summary_widget.dart | 116 +++ lib/routes/app_routes.dart | 3 - lib/services/notification_service.dart | 373 ++++++++ lib/splashPage.dart | 29 +- lib/theme/colors.dart | 4 + lib/widgets/chip/app_custom_chip_widget.dart | 10 +- lib/widgets/graph/custom_graph.dart | 129 +-- pubspec.yaml | 1 + 27 files changed, 1711 insertions(+), 925 deletions(-) delete mode 100644 lib/core/utils/local_notifications.dart create mode 100644 lib/presentation/water_monitor/widgets/hydration_tips_widget.dart create mode 100644 lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart create mode 100644 lib/presentation/water_monitor/widgets/water_bottle_widget.dart create mode 100644 lib/presentation/water_monitor/widgets/water_intake_summary_widget.dart create mode 100644 lib/services/notification_service.dart diff --git a/lib/core/cache_consts.dart b/lib/core/cache_consts.dart index bcbb185..8deb8bd 100644 --- a/lib/core/cache_consts.dart +++ b/lib/core/cache_consts.dart @@ -63,6 +63,7 @@ class CacheConst { static const String pharmacyAutorzieToken = 'PHARMACY_AUTORZIE_TOKEN'; static const String h2oUnit = 'H2O_UNIT'; static const String h2oReminder = 'H2O_REMINDER'; + static const String waterReminderEnabled = 'WATER_REMINDER_ENABLED'; static const String livecareClinicData = 'LIVECARE_CLINIC_DATA'; static const String doctorScheduleDateSel = 'DOCTOR_SCHEDULE_DATE_SEL'; static const String appointmentHistoryMedical = 'APPOINTMENT_HISTORY_MEDICAL'; diff --git a/lib/core/common_models/data_points.dart b/lib/core/common_models/data_points.dart index 3f5065c..f156ecb 100644 --- a/lib/core/common_models/data_points.dart +++ b/lib/core/common_models/data_points.dart @@ -1,26 +1,26 @@ - - ///class used to provide value for the [DynamicResultChart] to plot the values class DataPoint { ///values that is displayed on the graph and dot is plotted on this final double value; + ///label shown on the bottom of the graph String label; String referenceValue; String actualValue; - String? unitOfMeasurement ; + String? unitOfMeasurement; + DateTime time; String displayTime; - DataPoint( - {required this.value, - required this.label, - required this.referenceValue, - required this.actualValue, - required this.time, - required this.displayTime, - this.unitOfMeasurement - }); + DataPoint({ + required this.value, + required this.label, + required this.actualValue, + required this.time, + required this.displayTime, + this.unitOfMeasurement, + this.referenceValue = '', + }); @override String toString() { diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index ebf7695..489af59 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -1,4 +1,5 @@ import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:get_it/get_it.dart'; import 'package:hmg_patient_app_new/core/api/api_client.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; @@ -47,7 +48,6 @@ import 'package:hmg_patient_app_new/features/todo_section/todo_section_repo.dart import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_repo.dart'; import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/services/analytics/analytics_service.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; @@ -56,6 +56,7 @@ import 'package:hmg_patient_app_new/services/firebase_service.dart'; import 'package:hmg_patient_app_new/services/localauth_service.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/services/notification_service.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:local_auth/local_auth.dart'; import 'package:logger/web.dart'; @@ -104,6 +105,13 @@ class AppDependencies { final sharedPreferences = await SharedPreferences.getInstance(); getIt.registerLazySingleton(() => CacheServiceImp(sharedPreferences: sharedPreferences, loggerService: getIt())); + + final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + getIt.registerLazySingleton(() => NotificationServiceImp( + flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin, + loggerService: getIt(), + )); + getIt.registerLazySingleton(() => ApiClientImp(appState: getIt())); getIt.registerLazySingleton( () => LocalAuthService(loggerService: getIt(), localAuth: getIt()), @@ -140,7 +148,8 @@ class AppDependencies { () => RadiologyViewModel(radiologyRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()), ); - getIt.registerLazySingleton(() => PrescriptionsViewModel(prescriptionsRepo: getIt(), errorHandlerService: getIt(), navServices: getIt())); + getIt.registerLazySingleton( + () => PrescriptionsViewModel(prescriptionsRepo: getIt(), errorHandlerService: getIt(), navServices: getIt())); getIt.registerLazySingleton(() => InsuranceViewModel(insuranceRepo: getIt(), errorHandlerService: getIt())); @@ -149,19 +158,15 @@ class AppDependencies { getIt.registerLazySingleton( () => AppointmentRatingViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); - getIt.registerLazySingleton(() => AppointmentRatingViewModel(myAppointmentsRepo: getIt(), errorHandlerService: getIt(), appState: getIt())); getIt.registerLazySingleton( - () => PayfortViewModel( - payfortRepo: getIt(), - errorHandlerService: getIt(), - ), + () => PayfortViewModel(payfortRepo: getIt(), errorHandlerService: getIt()), ); getIt.registerLazySingleton( () => HabibWalletViewModel( habibWalletRepo: getIt(), - errorHandlerService: getIt(), + errorHandlerService: getIt() ), ); @@ -201,6 +206,7 @@ class AppDependencies { errorHandlerService: getIt(), localAuthService: getIt()), ); + getIt.registerLazySingleton(() => ProfileSettingsViewModel()); getIt.registerLazySingleton(() => DateRangeSelectorRangeViewModel()); @@ -208,21 +214,19 @@ class AppDependencies { getIt.registerLazySingleton(() => DoctorFilterViewModel()); getIt.registerLazySingleton( - () => AppointmentViaRegionViewmodel( - navigationService: getIt(), - appState: getIt(), - ), + () => AppointmentViaRegionViewmodel(navigationService: getIt(), appState: getIt()), ); getIt.registerLazySingleton( () => EmergencyServicesViewModel( - locationUtils: getIt(), - navServices: getIt(), - emergencyServicesRepo: getIt(), - appState: getIt(), - errorHandlerService: getIt(), - appointmentRepo: getIt(), - dialogService: getIt()), + locationUtils: getIt(), + navServices: getIt(), + emergencyServicesRepo: getIt(), + appState: getIt(), + errorHandlerService: getIt(), + appointmentRepo: getIt(), + dialogService: getIt(), + ), ); getIt.registerLazySingleton( @@ -235,9 +239,7 @@ class AppDependencies { getIt.registerLazySingleton(() => HealthCalcualtorViewModel()); - getIt.registerLazySingleton( - () => TodoSectionViewModel(todoSectionRepo: getIt(), errorHandlerService: getIt()), - ); + getIt.registerLazySingleton(() => TodoSectionViewModel(todoSectionRepo: getIt(), errorHandlerService: getIt())); getIt.registerLazySingleton( () => SymptomsCheckerViewModel( @@ -246,6 +248,7 @@ class AppDependencies { appState: getIt(), ), ); + getIt.registerLazySingleton( () => HmgServicesViewModel( bookAppointmentsRepo: getIt(), @@ -265,19 +268,8 @@ class AppDependencies { ), ); - getIt.registerLazySingleton( - () => HealthProvider(), - ); + getIt.registerLazySingleton(() => HealthProvider()); getIt.registerLazySingleton(() => WaterMonitorViewModel(waterMonitorRepo: getIt())); - - // Screen-specific VMs → Factory - // getIt.registerFactory( - // () => BookAppointmentsViewModel( - // bookAppointmentsRepo: getIt(), - // dialogService: getIt(), - // errorHandlerService: getIt(), - // ), - // ); } } diff --git a/lib/core/location_util.dart b/lib/core/location_util.dart index 487b228..9dcdbb5 100644 --- a/lib/core/location_util.dart +++ b/lib/core/location_util.dart @@ -12,8 +12,9 @@ import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; -import 'package:huawei_location/huawei_location.dart' as HmsLocation show FusedLocationProviderClient, Location, LocationSettingsRequest, LocationRequest; -import 'package:location/location.dart' show Location, PermissionStatus, LocationData; +import 'package:huawei_location/huawei_location.dart' as HmsLocation + show FusedLocationProviderClient, Location, LocationSettingsRequest, LocationRequest; +import 'package:location/location.dart' show Location; import 'package:permission_handler/permission_handler.dart' show Permission, PermissionListActions, PermissionStatusGetters, openAppSettings; class LocationUtils { @@ -59,37 +60,22 @@ class LocationUtils { // } void getLocation( - {Function(LatLng)? onSuccess, - VoidCallback? onFailure, - bool isShowConfirmDialog = false, - VoidCallback? onLocationDeniedForever}) async { + {Function(LatLng)? onSuccess, VoidCallback? onFailure, bool isShowConfirmDialog = false, VoidCallback? onLocationDeniedForever}) async { this.isShowConfirmDialog = isShowConfirmDialog; if (Platform.isIOS) { - getCurrentLocation( - onFailure: onFailure, - onSuccess: onSuccess, - onLocationDeniedForever: onLocationDeniedForever); + getCurrentLocation(onFailure: onFailure, onSuccess: onSuccess, onLocationDeniedForever: onLocationDeniedForever); return; } if (await isGMSDevice ?? true) { - getCurrentLocation( - onFailure: onFailure, - onSuccess: onSuccess, - onLocationDeniedForever: onLocationDeniedForever); + getCurrentLocation(onFailure: onFailure, onSuccess: onSuccess, onLocationDeniedForever: onLocationDeniedForever); return; } - getHMSLocation( - onFailure: onFailure, - onSuccess: onSuccess, - onLocationDeniedForever: onLocationDeniedForever); + getHMSLocation(onFailure: onFailure, onSuccess: onSuccess, onLocationDeniedForever: onLocationDeniedForever); } - void getCurrentLocation( - {Function(LatLng)? onSuccess, - VoidCallback? onFailure, - VoidCallback? onLocationDeniedForever}) async { + void getCurrentLocation({Function(LatLng)? onSuccess, VoidCallback? onFailure, VoidCallback? onLocationDeniedForever}) async { var location = Location(); bool isLocationEnabled = await location.serviceEnabled(); @@ -113,14 +99,12 @@ class LocationUtils { } } else if (permissionGranted == LocationPermission.deniedForever) { appState.resetLocation(); - if(onLocationDeniedForever == null && isShowConfirmDialog){ + if (onLocationDeniedForever == null && isShowConfirmDialog) { showCommonBottomSheetWithoutHeight( title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), navigationService.navigatorKey.currentContext!, child: Utils.getWarningWidget( - loadingText: - "Please grant location permission from app settings to see better results" - .needTranslation, + loadingText: "Please grant location permission from app settings to see better results".needTranslation, isShowActionButtons: true, onCancelTap: () { navigationService.pop(); @@ -253,10 +237,7 @@ class LocationUtils { appState.userLong = locationData.longitude; } - void getHMSLocation( - {VoidCallback? onFailure, - Function(LatLng p1)? onSuccess, - VoidCallback? onLocationDeniedForever}) async { + void getHMSLocation({VoidCallback? onFailure, Function(LatLng p1)? onSuccess, VoidCallback? onLocationDeniedForever}) async { try { var location = Location(); HmsLocation.FusedLocationProviderClient locationService = HmsLocation.FusedLocationProviderClient()..initFusedLocationService(); @@ -279,14 +260,12 @@ class LocationUtils { permissionGranted = await Geolocator.requestPermission(); if (permissionGranted == LocationPermission.deniedForever) { appState.resetLocation(); - if(onLocationDeniedForever == null && isShowConfirmDialog){ + if (onLocationDeniedForever == null && isShowConfirmDialog) { showCommonBottomSheetWithoutHeight( title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), navigationService.navigatorKey.currentContext!, child: Utils.getWarningWidget( - loadingText: - "Please grant location permission from app settings to see better results" - .needTranslation, + loadingText: "Please grant location permission from app settings to see better results".needTranslation, isShowActionButtons: true, onCancelTap: () { navigationService.pop(); @@ -311,7 +290,7 @@ class LocationUtils { HmsLocation.Location data = await locationService.getLastLocation(); if (data.latitude == null || data.longitude == null) { - appState.resetLocation(); + appState.resetLocation(); HmsLocation.LocationRequest request = HmsLocation.LocationRequest() ..priority = HmsLocation.LocationRequest.PRIORITY_HIGH_ACCURACY ..interval = 1000 // 1 second diff --git a/lib/core/post_params_model.dart b/lib/core/post_params_model.dart index cf52306..e13eb5c 100644 --- a/lib/core/post_params_model.dart +++ b/lib/core/post_params_model.dart @@ -14,19 +14,20 @@ class PostParamsModel { String? sessionID; String? setupID; - PostParamsModel( - {this.versionID, - this.channel, - this.languageID, - this.logInTokenID, - this.tokenID, - this.language, - this.ipAddress, - this.generalId, - this.latitude, - this.longitude, - this.deviceTypeID, - this.sessionID}); + PostParamsModel({ + this.versionID, + this.channel, + this.languageID, + this.logInTokenID, + this.tokenID, + this.language, + this.ipAddress, + this.generalId, + this.latitude, + this.longitude, + this.deviceTypeID, + this.sessionID, + }); PostParamsModel.fromJson(Map json) { versionID = json['VersionID']; diff --git a/lib/core/utils/date_util.dart b/lib/core/utils/date_util.dart index a42a44d..746d2a7 100644 --- a/lib/core/utils/date_util.dart +++ b/lib/core/utils/date_util.dart @@ -6,8 +6,6 @@ class DateUtil { /// convert String To Date function /// [date] String we want to convert static DateTime convertStringToDate(String? date) { - - if (date == null) return DateTime.now(); if (date.isEmpty) return DateTime.now(); @@ -522,6 +520,64 @@ class DateUtil { } return ""; } + + /// Get short month name from full month name + /// [monthName] Full month name like "January" + /// Returns short form like "Jan" + static String getShortMonthName(String monthName) { + switch (monthName.toLowerCase()) { + case 'january': + return 'Jan'; + case 'february': + return 'Feb'; + case 'march': + return 'Mar'; + case 'april': + return 'Apr'; + case 'may': + return 'May'; + case 'june': + return 'Jun'; + case 'july': + return 'Jul'; + case 'august': + return 'Aug'; + case 'september': + return 'Sep'; + case 'october': + return 'Oct'; + case 'november': + return 'Nov'; + case 'december': + return 'Dec'; + default: + return monthName; // Return as-is if not recognized + } + } + + /// Get short weekday name from full weekday name + /// [weekDayName] Full weekday name like "Monday" + /// Returns short form like "Mon" + static String getShortWeekDayName(String weekDayName) { + switch (weekDayName.toLowerCase().trim()) { + case 'monday': + return 'Mon'; + case 'tuesday': + return 'Tue'; + case 'wednesday': + return 'Wed'; + case 'thursday': + return 'Thu'; + case 'friday': + return 'Fri'; + case 'saturday': + return 'Sat'; + case 'sunday': + return 'Sun'; + default: + return weekDayName; // Return as-is if not recognized + } + } } extension OnlyDate on DateTime { diff --git a/lib/core/utils/local_notifications.dart b/lib/core/utils/local_notifications.dart deleted file mode 100644 index aba01f8..0000000 --- a/lib/core/utils/local_notifications.dart +++ /dev/null @@ -1,191 +0,0 @@ -import 'dart:math'; -import 'dart:typed_data'; - -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; - -final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); - -class LocalNotification { - Function(String payload)? _onNotificationClick; - static LocalNotification? _instance; - - static LocalNotification? getInstance() { - return _instance; - } - - static init({required Function(String payload) onNotificationClick}) { - if (_instance == null) { - _instance = LocalNotification(); - _instance?._onNotificationClick = onNotificationClick; - _instance?._initialize(); - } else { - // assert(false,(){ - // //TODO fix it - // "LocalNotification Already Initialized"; - // }); - } - } - - _initialize() async { - try { - var initializationSettingsAndroid = new AndroidInitializationSettings('app_icon'); - var initializationSettingsIOS = DarwinInitializationSettings(); - var initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsIOS); - await flutterLocalNotificationsPlugin.initialize( - initializationSettings, - onDidReceiveNotificationResponse: (NotificationResponse notificationResponse) { - switch (notificationResponse.notificationResponseType) { - case NotificationResponseType.selectedNotification: - // selectNotificationStream.add(notificationResponse.payload); - break; - case NotificationResponseType.selectedNotificationAction: - // if (notificationResponse.actionId == navigationActionId) { - // selectNotificationStream.add(notificationResponse.payload); - // } - break; - } - }, - // onDidReceiveBackgroundNotificationResponse: notificationTapBackground, - ); - } catch (ex) { - print(ex.toString()); - } - // flutterLocalNotificationsPlugin.initialize(initializationSettings, onDidReceiveNotificationResponse: (NotificationResponse notificationResponse) - // { - // switch (notificationResponse.notificationResponseType) { - // case NotificationResponseType.selectedNotification: - // // selectNotificationStream.add(notificationResponse.payload); - // break; - // case NotificationResponseType.selectedNotificationAction: - // // if (notificationResponse.actionId == navigationActionId) { - // // selectNotificationStream.add(notificationResponse.payload); - // } - // // break; - // },} - // - // , - // - // ); - } - - // void notificationTapBackground(NotificationResponse notificationResponse) { - // // ignore: avoid_print - // print('notification(${notificationResponse.id}) action tapped: ' - // '${notificationResponse.actionId} with' - // ' payload: ${notificationResponse.payload}'); - // if (notificationResponse.input?.isNotEmpty ?? false) { - // // ignore: avoid_print - // print('notification action tapped with input: ${notificationResponse.input}'); - // } - // } - - var _random = new Random(); - - _randomNumber({int from = 100000}) { - return _random.nextInt(from); - } - - _vibrationPattern() { - var vibrationPattern = Int64List(4); - vibrationPattern[0] = 0; - vibrationPattern[1] = 1000; - vibrationPattern[2] = 5000; - vibrationPattern[3] = 2000; - - return vibrationPattern; - } - - Future? showNow({required String title, required String subtitle, required String payload}) { - Future.delayed(Duration(seconds: 1)).then((result) async { - var androidPlatformChannelSpecifics = AndroidNotificationDetails( - 'com.hmg.local_notification', - 'HMG', - channelDescription: 'HMG', - importance: Importance.max, - priority: Priority.high, - ticker: 'ticker', - vibrationPattern: _vibrationPattern(), - ongoing: true, - autoCancel: false, - usesChronometer: true, - when: DateTime.now().millisecondsSinceEpoch - 120 * 1000, - ); - var iOSPlatformChannelSpecifics = DarwinNotificationDetails(); - var platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics); - await flutterLocalNotificationsPlugin.show(25613, title, subtitle, platformChannelSpecifics, payload: payload).catchError((err) { - print(err); - }); - }); - } - - Future scheduleNotification({required DateTime scheduledNotificationDateTime, required String title, required String description}) async { - ///vibrationPattern - var vibrationPattern = Int64List(4); - vibrationPattern[0] = 0; - vibrationPattern[1] = 1000; - vibrationPattern[2] = 5000; - vibrationPattern[3] = 2000; - - // var androidPlatformChannelSpecifics = AndroidNotificationDetails('active-prescriptions', 'ActivePrescriptions', - // channelDescription: 'ActivePrescriptionsDescription', - // // icon: 'secondary_icon', - // sound: RawResourceAndroidNotificationSound('slow_spring_board'), - // - // ///change it to be as ionic - // // largeIcon: DrawableResourceAndroidBitmap('sample_large_icon'),///change it to be as ionic - // vibrationPattern: vibrationPattern, - // enableLights: true, - // color: const Color.fromARGB(255, 255, 0, 0), - // ledColor: const Color.fromARGB(255, 255, 0, 0), - // ledOnMs: 1000, - // ledOffMs: 500); - // var iOSPlatformChannelSpecifics = DarwinNotificationDetails(sound: 'slow_spring_board.aiff'); - - // /change it to be as ionic - // var platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics); - // await flutterLocalNotificationsPlugin.schedule(0, title, description, scheduledNotificationDateTime, platformChannelSpecifics); - } - - ///Repeat notification every day at approximately 10:00:00 am - Future showDailyAtTime() async { - // var time = Time(10, 0, 0); - // var androidPlatformChannelSpecifics = AndroidNotificationDetails('repeatDailyAtTime channel id', 'repeatDailyAtTime channel name', channelDescription: 'repeatDailyAtTime description'); - // var iOSPlatformChannelSpecifics = DarwinNotificationDetails(); - // var platformChannelSpecifics = NotificationDetails( - // androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); - // await flutterLocalNotificationsPlugin.showDailyAtTime( - // 0, - // 'show daily title', - // 'Daily notification shown at approximately ${_toTwoDigitString(time.hour)}:${_toTwoDigitString(time.minute)}:${_toTwoDigitString(time.second)}', - // time, - // platformChannelSpecifics); - } - - ///Repeat notification weekly on Monday at approximately 10:00:00 am - Future showWeeklyAtDayAndTime() async { - // var time = Time(10, 0, 0); - // var androidPlatformChannelSpecifics = AndroidNotificationDetails('show weekly channel id', 'show weekly channel name', channelDescription: 'show weekly description'); - // var iOSPlatformChannelSpecifics = DarwinNotificationDetails(); - // var platformChannelSpecifics = NotificationDetails( - // androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); - // await flutterLocalNotificationsPlugin.showWeeklyAtDayAndTime( - // 0, - // 'show weekly title', - // 'Weekly notification shown on Monday at approximately ${_toTwoDigitString(time.hour)}:${_toTwoDigitString(time.minute)}:${_toTwoDigitString(time.second)}', - // Day.Monday, - // time, - // platformChannelSpecifics); - } - - String _toTwoDigitString(int value) { - return value.toString().padLeft(2, '0'); - } - - Future cancelNotification() async { - await flutterLocalNotificationsPlugin.cancel(0); - } - - Future cancelAllNotifications() async { - await flutterLocalNotificationsPlugin.cancelAll(); - } -} diff --git a/lib/core/utils/push_notification_handler.dart b/lib/core/utils/push_notification_handler.dart index a96b805..88e8cc8 100644 --- a/lib/core/utils/push_notification_handler.dart +++ b/lib/core/utils/push_notification_handler.dart @@ -15,16 +15,11 @@ import 'package:flutter_callkit_incoming/entities/notification_params.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_ios_voip_kit_karmm/call_state_type.dart'; import 'package:flutter_ios_voip_kit_karmm/flutter_ios_voip_kit.dart'; -// import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; - -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:hmg_patient_app_new/core/utils/local_notifications.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:uuid/uuid.dart'; -import '../cache_consts.dart'; - // |--> Push Notification Background @pragma('vm:entry-point') Future backgroundMessageHandler(dynamic message) async { @@ -36,7 +31,7 @@ Future backgroundMessageHandler(dynamic message) async { // showCallkitIncoming(message); _incomingCall(message.data); return; - } else {} + } } callPage(String sessionID, String token) async {} @@ -323,7 +318,7 @@ class PushNotificationHandler { if (fcmToken != null) onToken(fcmToken); // } } catch (ex) { - print("Notification Exception: " + ex.toString()); + print("Notification Exception: $ex"); } FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); } @@ -331,7 +326,7 @@ class PushNotificationHandler { if (Platform.isIOS) { final permission = await FirebaseMessaging.instance.requestPermission(); await FirebaseMessaging.instance.getAPNSToken().then((value) async { - log("APNS token: " + value.toString()); + log("APNS token: $value"); await Utils.saveStringFromPrefs(CacheConst.apnsToken, value.toString()); }); await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions( @@ -378,14 +373,14 @@ class PushNotificationHandler { }); FirebaseMessaging.instance.getToken().then((String? token) { - print("Push Notification getToken: " + token!); + print("Push Notification getToken: ${token!}"); onToken(token!); }).catchError((err) { print(err); }); FirebaseMessaging.instance.onTokenRefresh.listen((fcm_token) { - print("Push Notification onTokenRefresh: " + fcm_token); + print("Push Notification onTokenRefresh: $fcm_token"); onToken(fcm_token); }); @@ -401,7 +396,7 @@ class PushNotificationHandler { } newMessage(RemoteMessage remoteMessage) async { - print("Remote Message: " + remoteMessage.data.toString()); + print("Remote Message: ${remoteMessage.data}"); if (remoteMessage.data.isEmpty) { return; } @@ -427,7 +422,7 @@ class PushNotificationHandler { } onToken(String token) async { - print("Push Notification Token: " + token); + print("Push Notification Token: $token"); await Utils.saveStringFromPrefs(CacheConst.pushToken, token); } @@ -441,9 +436,7 @@ class PushNotificationHandler { Future requestPermissions() async { try { if (Platform.isIOS) { - await flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation() - ?.requestPermissions(alert: true, badge: true, sound: true); + await FirebaseMessaging.instance.requestPermission(alert: true, badge: true, sound: true); } else if (Platform.isAndroid) { Map statuses = await [ Permission.notification, diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart index 38d04b9..5a99cda 100644 --- a/lib/core/utils/utils.dart +++ b/lib/core/utils/utils.dart @@ -351,10 +351,10 @@ class Utils { ).center; } - static Widget getSuccessWidget({String? loadingText}) { + static Widget getSuccessWidget({String? loadingText, CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center}) { return Column( mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: crossAxisAlignment, children: [ Lottie.asset(AppAnimations.checkmark, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), SizedBox(height: 8.h), @@ -876,7 +876,6 @@ class Utils { launchUrl(uri, mode: LaunchMode.inAppBrowserView); } - static Color getCardBorderColor(int currentQueueStatus) { switch (currentQueueStatus) { case 0: diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index b4442cb..75c57a7 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -23,14 +23,15 @@ extension CapExtension on String { extension EmailValidator on String { Widget get toWidget => Text(this); - Widget toText8({Color? color, bool isBold = false, int? maxlines, FontStyle? fontStyle, TextOverflow? textOverflow}) => Text( + Widget toText8({Color? color, FontWeight? fontWeight, bool isBold = false, int? maxlines, FontStyle? fontStyle, TextOverflow? textOverflow}) => + Text( this, maxLines: maxlines, overflow: textOverflow, style: TextStyle( fontSize: 8.f, fontStyle: fontStyle ?? FontStyle.normal, - fontWeight: isBold ? FontWeight.bold : FontWeight.normal, + fontWeight: fontWeight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: 0, ), diff --git a/lib/features/water_monitor/water_monitor_repo.dart b/lib/features/water_monitor/water_monitor_repo.dart index f52c971..73c2ea2 100644 --- a/lib/features/water_monitor/water_monitor_repo.dart +++ b/lib/features/water_monitor/water_monitor_repo.dart @@ -74,7 +74,6 @@ class WaterMonitorRepoImp implements WaterMonitorRepo { }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { try { - log("response h2oGetUserDetail: ${response.toString()}"); // Extract only the specific key from the API response as requested dynamic extracted; if (response is Map && response.containsKey('UserDetailData_New')) { diff --git a/lib/features/water_monitor/water_monitor_view_model.dart b/lib/features/water_monitor/water_monitor_view_model.dart index 4ad8f1e..c079b5e 100644 --- a/lib/features/water_monitor/water_monitor_view_model.dart +++ b/lib/features/water_monitor/water_monitor_view_model.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.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_state.dart'; +import 'package:hmg_patient_app_new/core/cache_consts.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/water_monitor/models/insert_user_activity_request_model.dart'; @@ -13,7 +15,9 @@ import 'package:hmg_patient_app_new/features/water_monitor/models/user_progress_ import 'package:hmg_patient_app_new/features/water_monitor/models/water_cup_model.dart'; import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_repo.dart'; import 'package:hmg_patient_app_new/routes/app_routes.dart'; +import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/services/notification_service.dart'; class WaterMonitorViewModel extends ChangeNotifier { WaterMonitorRepo waterMonitorRepo; @@ -78,9 +82,11 @@ class WaterMonitorViewModel extends ChangeNotifier { // Network/data final AppState _appState = GetIt.instance(); final NavigationService _navigationService = GetIt.instance(); + final CacheService _cacheService = GetIt.instance(); bool _isLoading = false; dynamic _userDetailData; + bool _isWaterReminderEnabled = false; // Progress data lists List _todayProgressList = []; @@ -92,6 +98,8 @@ class WaterMonitorViewModel extends ChangeNotifier { dynamic get userDetailData => _userDetailData; + bool get isWaterReminderEnabled => _isWaterReminderEnabled; + // Getters for progress data List get todayProgressList => _todayProgressList; @@ -117,12 +125,19 @@ class WaterMonitorViewModel extends ChangeNotifier { // Initialize method to be called when needed Future initialize() async { - _loadSettings(); _initializeDefaultCups(); + _loadReminderEnabledState(); await fetchUserDetailsForMonitoring(); + // Fetch daily progress to get consumed amount and daily goal await fetchUserProgressForMonitoring(); } + /// Load reminder enabled state from cache + void _loadReminderEnabledState() { + _isWaterReminderEnabled = _cacheService.getBool(key: CacheConst.waterReminderEnabled) ?? false; + log('Water reminder enabled state loaded: $_isWaterReminderEnabled'); + } + /// Map selected duration to ProgressType enum ProgressType _getProgressTypeFromDuration() { switch (_selectedDuration) { @@ -150,7 +165,7 @@ class WaterMonitorViewModel extends ChangeNotifier { return; } - final mobile = (authenticated.mobileNumber ?? '').replaceAll('+', ''); + final mobile = (authenticated.mobileNumber ?? '').replaceAll('+', '').replaceFirst(RegExp(r'^0'), ''); final identification = authenticated.patientIdentificationNo ?? ''; final progressType = _getProgressTypeFromDuration(); @@ -177,6 +192,19 @@ class WaterMonitorViewModel extends ChangeNotifier { } } + // Update consumed amount and daily goal from API response + if (_todayProgressList.isNotEmpty) { + final todayData = _todayProgressList.first; + if (todayData.quantityConsumed != null) { + _totalConsumedMl = todayData.quantityConsumed!.toInt(); + log('Updated consumed from API: $_totalConsumedMl ml'); + } + if (todayData.quantityLimit != null) { + _dailyGoalMl = todayData.quantityLimit!.toInt(); + log('Updated daily goal from API: $_dailyGoalMl ml'); + } + } + break; case ProgressType.week: @@ -231,19 +259,11 @@ class WaterMonitorViewModel extends ChangeNotifier { result.fold((failure) { _userDetailData = null; }, (apiModel) { - log("_userDetailData: ${apiModel.data.toString()}"); _userDetailData = apiModel.data; // Populate form fields from the fetched data if (_userDetailData != null) { _populateFormFields(_userDetailData); - - // Calculate and set daily water goal based on the fetched user details - final calculatedGoal = calculateDailyWaterIntake(); - log("calculatedGoal: $calculatedGoal"); - if (calculatedGoal > 0) { - setDailyGoal(calculatedGoal.toInt()); - } } }); } catch (e) { @@ -514,49 +534,6 @@ class WaterMonitorViewModel extends ChangeNotifier { return null; } - // Calculate water intake based on user data - double calculateDailyWaterIntake() { - if (!isValid) return 0; - - final weight = double.parse(weightController.text.trim()); - final weightInKg = _convertWeightToKg(weight, _selectedWeightUnit); - - // Base calculation: 30-35ml per kg of body weight - double baseIntake = weightInKg * 33; - - // Adjust for activity level - double activityMultiplier = _getActivityMultiplier(); - double totalIntake = baseIntake * activityMultiplier; - - return totalIntake; // in ml - } - - double _convertWeightToKg(double weight, String unit) { - switch (unit) { - case 'kg': - return weight; - case 'lb': - return weight * 0.453592; - default: - return weight; - } - } - - double _getActivityMultiplier() { - switch (_selectedActivityLevel) { - case "Almost Inactive (no exercise)": - return 1.0; - case "Lightly active": - return 1.1; - case "Lightly active (1-3) days per week": - return 1.2; - case "Super active (very hard exercise)": - return 1.4; - default: - return 1.1; - } - } - String _getApiCompatibleGender() { if (_selectedGender == "Female") { return "F"; @@ -624,16 +601,12 @@ class WaterMonitorViewModel extends ChangeNotifier { notifyListeners(); return false; }, - (apiModel) { + (apiModel) async { // Update local data with response _userDetailData = apiModel.data; - // Calculate and set daily goal based on the inputs - final calculatedGoal = calculateDailyWaterIntake(); - log("calculatedGoal: $calculatedGoal"); - if (calculatedGoal > 0) { - setDailyGoal(calculatedGoal.toInt()); - } + // Fetch daily progress to get the updated goal and consumed data from API + await fetchUserProgressForMonitoring(); _isLoading = false; notifyListeners(); @@ -678,11 +651,6 @@ class WaterMonitorViewModel extends ChangeNotifier { return ""; } - // Load settings - Future _loadSettings() async { - notifyListeners(); - } - @override void dispose() { nameController.dispose(); @@ -694,8 +662,8 @@ class WaterMonitorViewModel extends ChangeNotifier { List _cups = []; String? _selectedCupId; - int _totalConsumedMl = 1000; - int _dailyGoalMl = 2000; + int _totalConsumedMl = 0; // Loaded from API + int _dailyGoalMl = 0; // Loaded from API // Calibration: portion of the bottle SVG height that is fillable (0.0 - 1.0) double _fillableHeightPercent = 0.7; @@ -788,7 +756,6 @@ class WaterMonitorViewModel extends ChangeNotifier { return "${wakingHoursStart.toString().padLeft(2, '0')}:00 AM"; } - // If after waking hours, next drink is tomorrow morning if (currentHour >= wakingHoursEnd) { return "Tomorrow ${wakingHoursStart.toString().padLeft(2, '0')}:00 AM"; } @@ -956,13 +923,6 @@ class WaterMonitorViewModel extends ChangeNotifier { notifyListeners(); } - void addWaterIntake() { - if (selectedCup != null) { - _totalConsumedMl += selectedCup!.capacityMl; - notifyListeners(); - } - } - // Returns the currently selected cup capacity in ml (0 if none) int get selectedCupCapacityMl => selectedCup?.capacityMl ?? 0; @@ -982,11 +942,6 @@ class WaterMonitorViewModel extends ChangeNotifier { } } - void resetDaily() { - _totalConsumedMl = 0; - notifyListeners(); - } - /// Insert user activity (record water intake) Future insertUserActivity({required int quantityIntake}) async { try { @@ -1023,16 +978,29 @@ class WaterMonitorViewModel extends ChangeNotifier { }, (apiModel) { log("Insert user activity success: ${apiModel.data.toString()}"); - // Update consumed amount from the response + // Update consumed amount and goal from the response if (apiModel.data != null && apiModel.data is List && (apiModel.data as List).isNotEmpty) { final progressData = (apiModel.data as List).first; - if (progressData is Map && progressData.containsKey('QuantityConsumed')) { - final consumed = progressData['QuantityConsumed']; - if (consumed != null) { - _totalConsumedMl = (consumed is num) ? consumed.toInt() : int.tryParse(consumed.toString()) ?? _totalConsumedMl; + if (progressData is Map) { + // Update consumed amount + if (progressData.containsKey('QuantityConsumed')) { + final consumed = progressData['QuantityConsumed']; + if (consumed != null) { + _totalConsumedMl = (consumed is num) ? consumed.toInt() : int.tryParse(consumed.toString()) ?? _totalConsumedMl; + log('Updated consumed after insert: $_totalConsumedMl ml'); + } + } + // Update daily goal + if (progressData.containsKey('QuantityLimit')) { + final limit = progressData['QuantityLimit']; + if (limit != null) { + _dailyGoalMl = (limit is num) ? limit.toInt() : int.tryParse(limit.toString()) ?? _dailyGoalMl; + log('Updated daily goal after insert: $_dailyGoalMl ml'); + } } } + // Refresh progress data to ensure consistency fetchUserProgressForMonitoring(); } @@ -1086,13 +1054,25 @@ class WaterMonitorViewModel extends ChangeNotifier { (apiModel) { log("Undo user activity success: ${apiModel.data.toString()}"); - // Update consumed amount from the response + // Update consumed amount and goal from the response if (apiModel.data != null && apiModel.data is List && (apiModel.data as List).isNotEmpty) { final progressData = (apiModel.data as List).first; - if (progressData is Map && progressData.containsKey('QuantityConsumed')) { - final consumed = progressData['QuantityConsumed']; - if (consumed != null) { - _totalConsumedMl = (consumed is num) ? consumed.toInt() : int.tryParse(consumed.toString()) ?? _totalConsumedMl; + if (progressData is Map) { + // Update consumed amount + if (progressData.containsKey('QuantityConsumed')) { + final consumed = progressData['QuantityConsumed']; + if (consumed != null) { + _totalConsumedMl = (consumed is num) ? consumed.toInt() : int.tryParse(consumed.toString()) ?? _totalConsumedMl; + log('Updated consumed after undo: $_totalConsumedMl ml'); + } + } + // Update daily goal + if (progressData.containsKey('QuantityLimit')) { + final limit = progressData['QuantityLimit']; + if (limit != null) { + _dailyGoalMl = (limit is num) ? limit.toInt() : int.tryParse(limit.toString()) ?? _dailyGoalMl; + log('Updated daily goal after undo: $_dailyGoalMl ml'); + } } } } @@ -1109,4 +1089,163 @@ class WaterMonitorViewModel extends ChangeNotifier { return false; } } + + /// Schedule water reminders based on user's reminder settings + Future scheduleWaterReminders() async { + try { + final notificationService = getIt.get(); + + // Request permission first + final hasPermission = await notificationService.requestPermissions(); + if (!hasPermission) { + log('Notification permission denied'); + return false; + } + + // Calculate reminder times based on _selectedNumberOfReminders + final reminderTimes = _calculateReminderTimes(); + + if (reminderTimes.isEmpty) { + log('No reminder times calculated'); + return false; + } + + // Schedule water reminders + await notificationService.scheduleWaterReminders( + reminderTimes: reminderTimes, + title: 'Time to Drink Water! 💧'.needTranslation, + body: 'Stay hydrated! Drink ${selectedCupCapacityMl}ml of water.'.needTranslation, + ); + + // Save reminder enabled state to cache + _isWaterReminderEnabled = true; + await _cacheService.saveBool(key: CacheConst.waterReminderEnabled, value: true); + + log('Scheduled ${reminderTimes.length} water reminders successfully'); + notifyListeners(); + return true; + } catch (e) { + log('Exception in scheduleWaterReminders: $e'); + return false; + } + } + + /// Calculate reminder times based on selected number of reminders + List _calculateReminderTimes() { + try { + final remindersPerDay = int.tryParse(_selectedNumberOfReminders.replaceAll(' Time', '').trim()) ?? 3; + + const wakingHoursStart = 6; // 6 AM + const wakingHoursEnd = 22; // 10 PM + const totalWakingHours = wakingHoursEnd - wakingHoursStart; + + final intervalHours = totalWakingHours / remindersPerDay; + + List times = []; + final now = DateTime.now(); + + for (int i = 0; i < remindersPerDay; i++) { + final hourDecimal = wakingHoursStart + (i * intervalHours); + final hour = hourDecimal.floor(); + final minute = ((hourDecimal - hour) * 60).round(); + + final reminderTime = DateTime( + now.year, + now.month, + now.day, + hour, + minute, + ); + + times.add(reminderTime); + } + + return times; + } catch (e) { + log('Error calculating reminder times: $e'); + return []; + } + } + + /// Cancel all water reminders + Future cancelWaterReminders() async { + try { + final notificationService = GetIt.instance(); + + // Get pending notifications and cancel water reminders (IDs 5000-5999) + final pendingNotifications = await notificationService.getPendingNotifications(); + for (final notification in pendingNotifications) { + if (notification.id >= 5000 && notification.id < 6000) { + await notificationService.cancelNotification(notification.id); + } + } + + // Save reminder disabled state to cache + _isWaterReminderEnabled = false; + await _cacheService.saveBool(key: CacheConst.waterReminderEnabled, value: false); + + log('Cancelled all water reminders'); + notifyListeners(); + return true; + } catch (e) { + log('Exception in cancelWaterReminders: $e'); + return false; + } + } + + /// Get list of scheduled water reminder times + Future> getScheduledReminderTimes() async { + try { + final notificationService = GetIt.instance(); + final pendingNotifications = await notificationService.getPendingNotifications(); + + List times = []; + for (final notification in pendingNotifications) { + if (notification.id >= 5000 && notification.id < 6000) { + // Note: PendingNotificationRequest doesn't contain scheduled time + // We can only return the calculated times based on current settings + times = _calculateReminderTimes(); + break; + } + } + + return times; + } catch (e) { + log('Exception in getScheduledReminderTimes: $e'); + return []; + } + } + + /// Schedule a test notification after 5 seconds + /// Useful for testing notification functionality + Future scheduleTestNotification() async { + try { + final notificationService = GetIt.instance(); + + // Request permission first + final hasPermission = await notificationService.requestPermissions(); + if (!hasPermission) { + log('Notification permission denied for test notification'); + return false; + } + + // Schedule notification 5 seconds from now + final scheduledTime = DateTime.now().add(const Duration(seconds: 5)); + + await notificationService.scheduleNotification( + id: 9999, + // Use a unique ID for test notifications + title: 'Time to Drink Water! 💧'.needTranslation, + body: 'Stay hydrated! Drink ${selectedCupCapacityMl}ml of water.'.needTranslation, + scheduledDate: scheduledTime, + payload: 'test_notification', + ); + + log('Test notification scheduled for 5 seconds from now'); + return true; + } catch (e) { + log('Exception in scheduleTestNotification: $e'); + return false; + } + } } diff --git a/lib/main.dart b/lib/main.dart index 20daf63..9600d5e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -33,7 +33,6 @@ import 'package:hmg_patient_app_new/features/smartwatch_health_data/health_provi import 'package:hmg_patient_app_new/features/symptoms_checker/symptoms_checker_view_model.dart'; import 'package:hmg_patient_app_new/features/todo_section/todo_section_view_model.dart'; import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; -import 'package:hmg_patient_app_new/presentation/health_calculators/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/presentation/health_calculators_and_converts/health_calculator_view_model.dart'; import 'package:hmg_patient_app_new/routes/app_routes.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; @@ -73,7 +72,7 @@ Future callInitializations() async { WidgetsFlutterBinding.ensureInitialized(); await EasyLocalization.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); - AppDependencies.addDependencies(); + await AppDependencies.addDependencies(); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); HttpOverrides.global = MyHttpOverrides(); await callAppStateInitializations(); @@ -192,11 +191,7 @@ class MyApp extends StatelessWidget { return MaterialApp( title: 'Dr. AlHabib', builder: (context, mchild) { - return MediaQuery( - data: MediaQuery.of(context).copyWith( - textScaler: TextScaler.linear(1.0), - ), - child: mchild!); + return MediaQuery(data: MediaQuery.of(context).copyWith(textScaler: TextScaler.linear(1.0)), child: mchild!); }, showSemanticsDebugger: false, debugShowCheckedModeBanner: false, diff --git a/lib/presentation/water_monitor/water_consumption_screen.dart b/lib/presentation/water_monitor/water_consumption_screen.dart index 625839e..a7a5e60 100644 --- a/lib/presentation/water_monitor/water_consumption_screen.dart +++ b/lib/presentation/water_monitor/water_consumption_screen.dart @@ -1,22 +1,23 @@ -import 'dart:developer'; -import 'dart:math' as math; - +import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.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/common_models/data_points.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.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/water_monitor/water_monitor_view_model.dart'; -import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/bottle_shape_clipper.dart'; -import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart'; -import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/water_consumption_progress_widget.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/hydration_tips_widget.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/water_intake_summary_widget.dart'; import 'package:hmg_patient_app_new/services/dialog_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/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/graph/custom_graph.dart'; import 'package:provider/provider.dart'; import 'package:shimmer/shimmer.dart'; @@ -32,360 +33,39 @@ class _WaterConsumptionScreenState extends State { void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { - final vm = context.read(); - await vm.initialize(); - log('WaterMonitor initialized: consumed=${vm.totalConsumedMl}, goal=${vm.dailyGoalMl}, progress=${vm.progressPercent}'); + await _refreshData(); }); } - Widget _buildHydrationTipsWidget() { - return Container( - margin: EdgeInsets.symmetric(horizontal: 24.w), - padding: EdgeInsets.all(16.h), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 24.r, - hasShadow: true, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.bulb_icon, width: 24.w, height: 24.h), - SizedBox(width: 8.w), - "Tips to stay hydrated".needTranslation.toText16(isBold: true), - ], - ), - SizedBox(height: 8.h), - " • ${"Drink before you feel thirsty"}".needTranslation.toText12( - fontWeight: FontWeight.w500, - color: AppColors.textColorLight, - ), - SizedBox(height: 4.h), - " • ${"Keep a refillable bottle next to you"}".needTranslation.toText12( - fontWeight: FontWeight.w500, - color: AppColors.textColorLight, - ), - SizedBox(height: 4.h), - " • ${"Track your daily intake to stay motivated"}".needTranslation.toText12( - fontWeight: FontWeight.w500, - color: AppColors.textColorLight, - ), - SizedBox(height: 4.h), - " • ${"Choose sparkling water instead of soda"}".needTranslation.toText12( - fontWeight: FontWeight.w500, - color: AppColors.textColorLight, - ), - SizedBox(height: 8.h), - ], - ), - ); - } - - Widget _buildWaterIntakeSummaryWidget() { - return Container( - width: double.infinity, - padding: EdgeInsets.all(24.w), - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - AppColors.blueGradientColorOne, - AppColors.blueGradientColorTwo, - ], - ), - ), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - flex: isTablet ? 2 : 3, - child: Consumer(builder: (context, vm, _) { - if (vm.isLoading) { - // show shimmer placeholder while fetching server-side user details - return _buildLoadingShimmer(isForHistory: false); - } - - final goalMl = vm.dailyGoalMl; - final consumed = vm.totalConsumedMl; - final remaining = (goalMl - consumed) > 0 ? (goalMl - consumed) : 0; - final completedPercent = "${(vm.progress * 100).clamp(0.0, 100.0).toStringAsFixed(0)}%"; - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "Next Drink Time".toText18(weight: FontWeight.w600, color: AppColors.textColor), - vm.nextDrinkTime.toText32(weight: FontWeight.w600, color: AppColors.blueColor), - SizedBox(height: 12.h), - _buildStatusColumn(title: "Your Goal".needTranslation, subTitle: "${goalMl}ml"), - SizedBox(height: 8.h), - _buildStatusColumn(title: "Remaining".needTranslation, subTitle: "${remaining}ml"), - SizedBox(height: 8.h), - _buildStatusColumn(title: "Completed".needTranslation, subTitle: completedPercent, subTitleColor: AppColors.successColor), - SizedBox(height: 8.h), - _buildStatusColumn( - title: "Hydration Status".needTranslation, - subTitle: vm.hydrationStatus, - subTitleColor: vm.hydrationStatusColor, - ), - ], - ); - }), - ), - SizedBox(width: isTablet ? 32 : 16.w), - Expanded( - flex: isTablet ? 1 : 2, - child: _buildWaterBottleWidget(), - ), - ], - ), - _buildBottomActionWidgets(), - ], - ), - ); - } - - Widget _buildStatusColumn({required String title, required String subTitle, Color? subTitleColor}) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "$title: ".toText16(weight: FontWeight.w500, color: AppColors.textColor), - subTitle.toText12( - fontWeight: FontWeight.w600, - color: subTitleColor ?? AppColors.greyTextColor, - ), - ], - ); + /// Refresh data by calling initialize on the view model + Future _refreshData() async { + final vm = context.read(); + await vm.initialize(); } - Widget _buildWaterBottleWidget() { - return Consumer( - builder: (context, vm, _) { - final progressPercent = (vm.progress * 100).clamp(0.0, 100.0); - log("progressPercent: $progressPercent"); - - // SVG aspect ratio - const svgAspectRatio = 315.0 / 143.0; // ~2.2 - - // Responsive bottle sizing with device-specific constraints - double bottleWidth; - if (isTablet) { - // Tablet: use logical pixels (not scaled) with a reasonable max - bottleWidth = math.min(SizeUtils.width * 0.15, 180.0); // 15% of width, max 180 - } else if (isFoldable) { - // Foldable: moderate scaling - bottleWidth = math.min(100.w, 160.0); - } else { - // Phone: use your responsive . w with a cap - bottleWidth = math.min(120.w, 140.0); - } - - final bottleHeight = bottleWidth * svgAspectRatio; - - // Fillable area percentages (calibrated to your SVG) - final fillableHeightPercent = 0.7; - const fillableWidthPercent = 0.8; - - final fillableHeight = bottleHeight * fillableHeightPercent; - final fillableWidth = bottleWidth * fillableWidthPercent; - - // Device-specific positioning offsets - final double leftOffset = isTablet ? 4.w : 8.w; - final double bottomOffset = isTablet ? -65.h : -78.h; - - return SizedBox( - height: bottleHeight, - width: bottleWidth, - child: Stack( - fit: StackFit.expand, - alignment: Alignment.center, - children: [ - // Bottle SVG outline - Center( - child: Utils.buildSvgWithAssets( - icon: AppAssets.waterBottle, - height: bottleHeight, - width: bottleWidth, - fit: BoxFit.contain, - ), - ), - - // Wave and bubbles clipped to bottle shape - Positioned.fill( - left: leftOffset, - bottom: bottomOffset, - child: Center( - child: SizedBox( - width: fillableWidth, - height: fillableHeight, - child: ClipPath( - clipper: BottleShapeClipper(), - child: Stack( - alignment: Alignment.bottomCenter, - children: [ - // Animated wave - Positioned( - child: WaterConsumptionProgressWidget( - progress: progressPercent, - size: math.min(fillableWidth, fillableHeight), - containerWidth: fillableWidth, - containerHeight: fillableHeight, - waveDuration: const Duration(milliseconds: 3000), - waveColor: AppColors.blueColor, - ), - ), - - // Bubbles (only show if progress > 10%) - if (progressPercent > 10) - Positioned( - bottom: fillableHeight * 0.12, - child: Utils.buildSvgWithAssets( - icon: AppAssets.waterBottleOuterBubbles, - // Cap bubble size based on device type - height: isTablet ? math.min(45.0, fillableHeight * 0.2) : math.min(55.0, fillableHeight * 0.22), - width: fillableWidth * 0.65, - ), - ), - ], - ), - ), - ), - ), - ), - ], + Widget _buildLoadingShimmer({bool isForHistory = true}) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.all(0.w), + itemCount: 4, + separatorBuilder: (_, __) => SizedBox(height: 12.h), + itemBuilder: (context, index) { + return Shimmer.fromColors( + baseColor: AppColors.shimmerBaseColor, + highlightColor: AppColors.shimmerHighlightColor, + child: Container( + height: isForHistory ? 60.h : 40.h, + decoration: BoxDecoration( + color: AppColors.whiteColor, + borderRadius: BorderRadius.circular(10.r), + ), ), ); }, ); } - _buildBottomActionWidgets() { - return Consumer(builder: (context, vm, _) { - final cupAmount = vm.selectedCupCapacityMl; - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - InkWell( - onTap: () async { - // Undo last activity via API - if (cupAmount > 0) { - await vm.undoUserActivity(); - } - }, - child: Utils.buildSvgWithAssets( - icon: AppAssets.minimizeIcon, - height: 20.w, - width: 20.w, - iconColor: AppColors.textColor, - ), - ), - Container( - margin: EdgeInsets.symmetric(horizontal: 4.w), - padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 4.h), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.blueColor, - borderRadius: 99.r, - hasShadow: true, - ), - child: (cupAmount > 0 ? "+ $cupAmount ml" : "+ 0ml").toText12( - fontWeight: FontWeight.w600, - color: AppColors.whiteColor, - ), - ), - InkWell( - onTap: () async { - // Insert user activity via API - if (cupAmount > 0) { - await vm.insertUserActivity(quantityIntake: cupAmount); - } - }, - child: Utils.buildSvgWithAssets( - icon: AppAssets.addIconDark, - ), - ), - ], - ), - SizedBox(height: 8.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _buildActionButton( - onTap: () => showSwitchCupBottomSheet(context), - overlayWidget: AppAssets.refreshIcon, - title: "Switch Cup".needTranslation, - icon: Utils.buildSvgWithAssets(icon: AppAssets.glassIcon, height: 24.w, width: 24.w), - ), - _buildActionButton( - onTap: () {}, - title: "Add Water".needTranslation, - icon: Utils.buildSvgWithAssets(icon: AppAssets.glassIcon, height: 24.w, width: 24.w), - ), - _buildActionButton( - onTap: () => context.navigateWithName(AppRoutes.waterMonitorSettingsScreen), - title: "Settings".needTranslation, - icon: Icon( - Icons.settings, - color: AppColors.blueColor, - size: 24.w, - ), - ), - ], - ), - ], - ); - }); - } - - _buildActionButton({String? overlayWidget, required String title, required Widget icon, required VoidCallback onTap}) { - return InkWell( - onTap: onTap, - child: Column( - children: [ - Stack( - children: [ - Container( - height: 46.w, - width: 46.w, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.blueColor.withValues(alpha: 0.14), - borderRadius: 12.r, - hasShadow: true, - ), - child: Center(child: icon), - ), - if (overlayWidget != null) ...[ - Positioned( - top: 0, - right: 0, - child: Container( - padding: EdgeInsets.all(2.w), - height: 16.w, - width: 16.w, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.blueColor, - borderRadius: 100.r, - hasShadow: true, - ), - child: Center(child: Utils.buildSvgWithAssets(icon: AppAssets.refreshIcon, iconColor: AppColors.whiteColor)), - ), - ), - ] - ], - ), - SizedBox(height: 4.h), - title.toText10(), - ], - ), - ); - } - Widget buildHistoryListTile({required String title, required String subTitle}) { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -452,44 +132,14 @@ class _WaterConsumptionScreenState extends State { ), ], ), - if (!viewModel.isGraphView) - _buildHistoryListView(viewModel) - else - Center( - child: Padding( - padding: EdgeInsets.symmetric(vertical: 32.h), - child: "Graph view coming soon".toText14(color: AppColors.greyTextColor), - ), - ), + SizedBox(height: 12.h), + if (!viewModel.isGraphView) _buildHistoryListView(viewModel) else _buildHistoryFlowchart() ], ); }), ); } - Widget _buildLoadingShimmer({bool isForHistory = true}) { - return ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - padding: EdgeInsets.all(0.w), - itemCount: 4, - separatorBuilder: (_, __) => SizedBox(height: 12.h), - itemBuilder: (context, index) { - return Shimmer.fromColors( - baseColor: Colors.grey[300]!, - highlightColor: Colors.grey[100]!, - child: Container( - height: isForHistory ? 60.h : 40.h, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(10.r), - ), - ), - ); - }, - ); - } - Widget _buildHistoryListView(WaterMonitorViewModel viewModel) { final selectedDuration = viewModel.selectedDurationFilter; @@ -524,14 +174,19 @@ class _WaterConsumptionScreenState extends State { } } else if (selectedDuration == 'Weekly') { if (viewModel.weekProgressList.isNotEmpty) { - for (var dayData in viewModel.weekProgressList) { + // Show today + last 6 days (total 7 days) + final totalDays = viewModel.weekProgressList.length; + final startIndex = totalDays > 7 ? totalDays - 7 : 0; + final weekDataToShow = viewModel.weekProgressList.skip(startIndex).toList(); + + for (var dayData in weekDataToShow) { listItems.add( buildHistoryListTile( title: dayData.dayName ?? 'Unknown', subTitle: "${dayData.percentageConsumed?.toStringAsFixed(1) ?? '0'}%", ), ); - if (dayData != viewModel.weekProgressList.last) { + if (dayData != weekDataToShow.last) { listItems.add(Divider(height: 1, color: AppColors.dividerColor)); } } @@ -547,14 +202,20 @@ class _WaterConsumptionScreenState extends State { } } else if (selectedDuration == 'Monthly') { if (viewModel.monthProgressList.isNotEmpty) { - for (var monthData in viewModel.monthProgressList) { + // Show current month + last 6 months (total 7 months) + // Reverse order to show oldest to newest (top to bottom) + final totalMonths = viewModel.monthProgressList.length; + final startIndex = totalMonths > 7 ? totalMonths - 7 : 0; + final monthDataToShow = viewModel.monthProgressList.skip(startIndex).toList().reversed.toList(); + + for (var monthData in monthDataToShow) { listItems.add( buildHistoryListTile( title: monthData.monthName ?? 'Unknown', subTitle: "${monthData.percentageConsumed?.toStringAsFixed(1) ?? '0'}%", ), ); - if (monthData != viewModel.monthProgressList.last) { + if (monthData != monthDataToShow.last) { listItems.add(Divider(height: 1, color: AppColors.dividerColor)); } } @@ -572,10 +233,7 @@ class _WaterConsumptionScreenState extends State { // Return scrollable list with min and max height constraints return ConstrainedBox( - constraints: BoxConstraints( - minHeight: 80.h, - maxHeight: 270.h, - ), + constraints: BoxConstraints(minHeight: 80.h, maxHeight: 270.h), child: viewModel.isLoading ? _buildLoadingShimmer().paddingOnly(top: 16.h) : listItems.isEmpty @@ -592,6 +250,197 @@ class _WaterConsumptionScreenState extends State { ); } + Widget _buildHistoryFlowchart() { + return Consumer( + builder: (context, viewModel, _) { + final selectedDuration = viewModel.selectedDurationFilter; + + // Build dynamic data points based on selected duration + List dataPoints = []; + + if (selectedDuration == 'Daily') { + // For daily, we show a single bar/point with today's percentage + if (viewModel.todayProgressList.isNotEmpty) { + final todayData = viewModel.todayProgressList.first; + final percentage = todayData.percentageConsumed?.toDouble() ?? 0.0; + dataPoints.add( + DataPoint( + value: percentage, + actualValue: percentage.toStringAsFixed(1), + label: 'Today', + displayTime: 'Today', + unitOfMeasurement: '%', + time: DateTime.now(), + ), + ); + } + } else if (selectedDuration == 'Weekly') { + // For weekly, show today + last 6 days (total 7 days) + if (viewModel.weekProgressList.isNotEmpty) { + final totalDays = viewModel.weekProgressList.length; + final startIndex = totalDays > 7 ? totalDays - 7 : 0; + final weekDataToShow = viewModel.weekProgressList.skip(startIndex).toList(); + + for (var dayData in weekDataToShow) { + final percentage = dayData.percentageConsumed?.toDouble() ?? 0.0; + final dayName = dayData.dayName ?? 'Day ${dayData.dayNumber}'; + dataPoints.add( + DataPoint( + value: percentage, + actualValue: percentage.toStringAsFixed(1), + label: DateUtil.getShortWeekDayName(dayName), + displayTime: dayName, + unitOfMeasurement: '%', + time: DateTime.now(), + ), + ); + } + } + } else if (selectedDuration == 'Monthly') { + // For monthly, show current month + last 6 months (total 7 months) + // Reverse order to show oldest to newest (left to right) + if (viewModel.monthProgressList.isNotEmpty) { + final totalMonths = viewModel.monthProgressList.length; + final startIndex = totalMonths > 7 ? totalMonths - 7 : 0; + final monthDataToShow = viewModel.monthProgressList.skip(startIndex).toList().reversed.toList(); + + for (var monthData in monthDataToShow) { + final percentage = monthData.percentageConsumed?.toDouble() ?? 0.0; + final monthName = monthData.monthName ?? 'Month ${monthData.monthNumber}'; + dataPoints.add( + DataPoint( + value: percentage, + actualValue: percentage.toStringAsFixed(1), + label: DateUtil.getShortMonthName(monthName), + displayTime: monthName, + unitOfMeasurement: '%', + time: DateTime.now(), + ), + ); + } + } + } + + // If no data, show empty state + if (dataPoints.isEmpty) { + return Container( + padding: EdgeInsets.symmetric(vertical: 80.h), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.bar_chart, size: 48.w, color: AppColors.greyTextColor.withValues(alpha: 0.5)), + SizedBox(height: 12.h), + "No chart data available".toText14(color: AppColors.greyTextColor), + ], + ), + ), + ); + } + + // Show loading shimmer while fetching data + if (viewModel.isLoading) { + return Container( + padding: EdgeInsets.symmetric(vertical: 40.h), + child: _buildLoadingShimmer(), + ); + } + + // Define ranges for percentage (0-100%) + const double low = 25.0; // Below 25% is low + const double medium = 50.0; // 25-50% is medium + const double good = 75.0; // 50-75% is good + const double maxY = 100.0; // Max is 100% + + return CustomGraph( + dataPoints: dataPoints, + makeGraphBasedOnActualValue: true, + leftLabelReservedSize: 50.w, + leftLabelInterval: 25, + showGridLines: true, + maxY: maxY, + minY: 0, + maxX: dataPoints.length > 1 ? dataPoints.length.toDouble() - 0.75 : 1.0, + minX: -0.2, + horizontalInterval: 25, + // Grid lines every 25% + showShadow: true, + getDrawingHorizontalLine: (value) { + // Draw dashed lines at 25%, 50%, 75% + if (value == low || value == medium || value == good) { + return FlLine( + color: AppColors.greyTextColor.withValues(alpha: 0.3), + strokeWidth: 1.5, + dashArray: [8, 4], + ); + } + return FlLine(color: AppColors.transparent, strokeWidth: 0); + }, + leftLabelFormatter: (value) { + // Show percentage labels at key points + if (value == 0) return '0%'.toText10(weight: FontWeight.w600); + if (value == 25) return '25%'.toText10(weight: FontWeight.w600); + if (value == 50) return '50%'.toText10(weight: FontWeight.w600); + if (value == 75) return '75%'.toText10(weight: FontWeight.w600); + if (value == 100) return '100%'.toText10(weight: FontWeight.w600); + return SizedBox.shrink(); + }, + graphColor: AppColors.successColor, + graphShadowColor: AppColors.successColor.withValues(alpha: 0.15), + bottomLabelFormatter: (value, data) { + if (data.isEmpty) return SizedBox.shrink(); + + // Only show labels for whole number positions (not fractional) + if ((value - value.round()).abs() > 0.01) { + return SizedBox.shrink(); + } + + int index = value.round(); + if (index < 0 || index >= data.length) return SizedBox.shrink(); + + // For daily, show only index 0 + if (selectedDuration == 'Daily' && index == 0) { + return Padding( + padding: EdgeInsets.only(top: 8.h), + child: data[index].label.toText10( + weight: FontWeight.w600, + color: AppColors.labelTextColor, + ), + ); + } + + // For weekly, show all 7 days (today + last 6 days) + if (selectedDuration == 'Weekly' && index < 7) { + return Padding( + padding: EdgeInsets.only(top: 8.h), + child: data[index].label.toText10( + weight: FontWeight.w600, + color: AppColors.labelTextColor, + ), + ); + } + + // For monthly, show all 7 months (current month + last 6 months) + if (selectedDuration == 'Monthly' && index < 7) { + return Padding( + padding: EdgeInsets.only(top: 8.h), + child: data[index].label.toText10( + weight: FontWeight.w600, + color: AppColors.labelTextColor, + ), + ); + } + + return SizedBox.shrink(); + }, + scrollDirection: selectedDuration == 'Monthly' ? Axis.horizontal : Axis.vertical, + height: 250.h, + spotColor: AppColors.successColor, + ); + }, + ); + } + // Reusable method to build selection row widget Widget _buildSelectionRow({ required String value, @@ -634,7 +483,7 @@ class _WaterConsumptionScreenState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: items.length, @@ -667,43 +516,162 @@ class _WaterConsumptionScreenState extends State { ); } + /// Handle reminder button tap (Set or Cancel) + Future _handleReminderButtonTap(WaterMonitorViewModel viewModel) async { + if (viewModel.isWaterReminderEnabled) { + // Cancel reminders + _showCancelReminderConfirmation(viewModel); + } else { + // Set reminders + await _setReminders(viewModel); + } + } + + /// Show confirmation bottom sheet before cancelling reminders + void _showCancelReminderConfirmation(WaterMonitorViewModel viewModel) { + showCommonBottomSheetWithoutHeight( + title: 'Notice'.needTranslation, + context, + child: Utils.getWarningWidget( + loadingText: "Are you sure you want to cancel all water reminders?".needTranslation, + isShowActionButtons: true, + onCancelTap: () { + Navigator.pop(context); + }, + onConfirmTap: () async { + Navigator.pop(context); + await _cancelReminders(viewModel); + }, + ), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + isDismissible: true, + ); + } + + /// Set water reminders + Future _setReminders(WaterMonitorViewModel viewModel) async { + // Schedule reminders + final success = await viewModel.scheduleWaterReminders(); + + if (success) { + final times = await viewModel.getScheduledReminderTimes(); + _showReminderScheduledDialog(times); + } + } + + /// Cancel water reminders + Future _cancelReminders(WaterMonitorViewModel viewModel) async { + final success = await viewModel.cancelWaterReminders(); + } + + /// Show bottom sheet with scheduled reminder times + void _showReminderScheduledDialog(List times) { + showCommonBottomSheetWithoutHeight( + title: 'Reminders Set!'.needTranslation, + context, + isCloseButtonVisible: false, + isDismissible: false, + child: Padding( + padding: EdgeInsets.only(top: 16.w, left: 16.w, right: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Utils.getSuccessWidget(loadingText: 'Daily water reminders scheduled at:'.needTranslation), + SizedBox(height: 16.h), + Wrap( + spacing: 8.w, + runSpacing: 8.h, + children: times + .map( + (time) => AppCustomChipWidget( + icon: AppAssets.bell, + iconColor: AppColors.quickLoginColor, + richText: _formatTime(time).toText14(), + padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 8.h), + ), + ) + .toList(), + ), + + SizedBox(height: 24.h), + + // OK button + Row( + children: [ + Expanded( + child: CustomButton( + height: 56.h, + text: 'OK'.needTranslation, + onPressed: () => Navigator.of(context).pop(), + textColor: AppColors.whiteColor, + ), + ), + ], + ), + ], + ), + ), + callBackFunc: () {}, + ); + } + + /// Format DateTime to readable time string + String _formatTime(DateTime time) { + final hour = time.hour; + final minute = time.minute; + final hour12 = hour > 12 ? hour - 12 : (hour == 0 ? 12 : hour); + final period = hour >= 12 ? 'PM' : 'AM'; + return '${hour12.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')} $period'; + } + @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( title: "Water Consumption".needTranslation, - bottomChild: Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 24.r, - hasShadow: true, - ), - child: Padding( - padding: EdgeInsets.all(24.w), - child: CustomButton( - text: "Set Reminder".needTranslation, - textColor: AppColors.successColor, - backgroundColor: AppColors.successLightBgColor, - onPressed: () {}, - icon: AppAssets.bell, - iconColor: AppColors.successColor, - borderRadius: 12.r, - borderColor: AppColors.transparent, - padding: EdgeInsets.symmetric(vertical: 14.h), - ), - ), + bottomChild: Consumer( + builder: (context, viewModel, child) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(24.w), + child: CustomButton( + text: viewModel.isWaterReminderEnabled ? "Cancel Reminders".needTranslation : "Set Reminder".needTranslation, + textColor: viewModel.isWaterReminderEnabled ? AppColors.errorColor : AppColors.successColor, + backgroundColor: viewModel.isWaterReminderEnabled ? AppColors.errorColor.withValues(alpha: 0.1) : AppColors.successLightBgColor, + onPressed: () => _handleReminderButtonTap(viewModel), + icon: viewModel.isWaterReminderEnabled ? null : AppAssets.bell, + iconColor: viewModel.isWaterReminderEnabled ? AppColors.errorColor : AppColors.successColor, + borderRadius: 12.r, + borderColor: AppColors.transparent, + padding: EdgeInsets.symmetric(vertical: 14.h), + ), + ), + ); + }, ), - child: Column( - children: [ - SizedBox(height: 16.h), - _buildWaterIntakeSummaryWidget(), - SizedBox(height: 16.h), - _buildHistoryGraphOrList(), - SizedBox(height: 16.h), - _buildHydrationTipsWidget(), - SizedBox(height: 16.h), - ], + child: RefreshIndicator( + onRefresh: _refreshData, + color: AppColors.blueColor, + backgroundColor: AppColors.whiteColor, + child: Column( + children: [ + SizedBox(height: 16.h), + const WaterIntakeSummaryWidget(), + SizedBox(height: 16.h), + _buildHistoryGraphOrList(), + SizedBox(height: 16.h), + const HydrationTipsWidget(), + SizedBox(height: 16.h), + ], + ), ), ), ); diff --git a/lib/presentation/water_monitor/water_monitor_settings_screen.dart b/lib/presentation/water_monitor/water_monitor_settings_screen.dart index 5f1bce5..45a39e6 100644 --- a/lib/presentation/water_monitor/water_monitor_settings_screen.dart +++ b/lib/presentation/water_monitor/water_monitor_settings_screen.dart @@ -12,10 +12,23 @@ 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:provider/provider.dart'; -class WaterMonitorSettingsScreen extends StatelessWidget { +class WaterMonitorSettingsScreen extends StatefulWidget { const WaterMonitorSettingsScreen({super.key}); - void _showSnackbar(String text, BuildContext context) { + @override + State createState() => _WaterMonitorSettingsScreenState(); +} + +class _WaterMonitorSettingsScreenState extends State { + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + context.read().initialize(); + }); + } + + void _showSnackbar(String text) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(text), @@ -266,9 +279,7 @@ class WaterMonitorSettingsScreen extends StatelessWidget { if (!success && viewModel.validationError != null) { _showSnackBar(context, viewModel.validationError!); } else if (success) { - _showSnackBar(context, "Settings saved successfully".needTranslation); - // Navigate back on success - Navigator.pop(context); + _showSnackBar(context, "Settings saved successfully"); } }, borderRadius: 12.r, @@ -339,7 +350,9 @@ class WaterMonitorSettingsScreen extends StatelessWidget { content: Text(message), duration: const Duration(seconds: 3), behavior: SnackBarBehavior.floating, - backgroundColor: message.contains('successfully') ? Colors.green : AppColors.errorColor, + backgroundColor: message.contains('successfully') + ? Colors.green + : AppColors.errorColor, ), ); } diff --git a/lib/presentation/water_monitor/widgets/hydration_tips_widget.dart b/lib/presentation/water_monitor/widgets/hydration_tips_widget.dart new file mode 100644 index 0000000..df55886 --- /dev/null +++ b/lib/presentation/water_monitor/widgets/hydration_tips_widget.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.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/utils/utils.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/theme/colors.dart'; + +class HydrationTipsWidget extends StatelessWidget { + const HydrationTipsWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 24.w), + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: true, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Utils.buildSvgWithAssets( + icon: AppAssets.bulb_icon, + width: 24.w, + height: 24.h, + ), + SizedBox(width: 8.w), + "Tips to stay hydrated".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(height: 8.h), + " • ${"Drink before you feel thirsty"}".needTranslation.toText12( + fontWeight: FontWeight.w500, + color: AppColors.textColorLight, + ), + SizedBox(height: 4.h), + " • ${"Keep a refillable bottle next to you"}".needTranslation.toText12( + fontWeight: FontWeight.w500, + color: AppColors.textColorLight, + ), + SizedBox(height: 4.h), + " • ${"Track your daily intake to stay motivated"}".needTranslation.toText12( + fontWeight: FontWeight.w500, + color: AppColors.textColorLight, + ), + SizedBox(height: 4.h), + " • ${"Choose sparkling water instead of soda"}".needTranslation.toText12( + fontWeight: FontWeight.w500, + color: AppColors.textColorLight, + ), + SizedBox(height: 8.h), + ], + ), + ); + } +} + diff --git a/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart b/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart new file mode 100644 index 0000000..510926c --- /dev/null +++ b/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart @@ -0,0 +1,176 @@ +import 'package:flutter/material.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/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/water_monitor/water_monitor_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart'; + +class WaterActionButtonsWidget extends StatelessWidget { + const WaterActionButtonsWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Consumer(builder: (context, vm, _) { + final cupAmount = vm.selectedCupCapacityMl; + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InkWell( + onTap: () async { + if (cupAmount > 0) { + await vm.undoUserActivity(); + } + }, + child: Utils.buildSvgWithAssets( + icon: AppAssets.minimizeIcon, + height: 20.w, + width: 20.w, + iconColor: AppColors.textColor, + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 4.w), + padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.blueColor, + borderRadius: 99.r, + hasShadow: true, + ), + child: (cupAmount > 0 ? "+ $cupAmount ml" : "+ 0ml").toText12( + fontWeight: FontWeight.w600, + color: AppColors.whiteColor, + ), + ), + InkWell( + onTap: () async { + if (cupAmount > 0) { + await vm.insertUserActivity(quantityIntake: cupAmount); + } + }, + child: Utils.buildSvgWithAssets( + icon: AppAssets.addIconDark, + ), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildActionButton( + context: context, + onTap: () => showSwitchCupBottomSheet(context), + overlayWidget: AppAssets.refreshIcon, + title: "Switch Cup".needTranslation, + icon: Utils.buildSvgWithAssets(icon: AppAssets.glassIcon, height: 24.w, width: 24.w), + ), + _buildActionButton( + context: context, + onTap: () async { + final success = await vm.scheduleTestNotification(); + if (success) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Test notification will appear in 5 seconds!'.needTranslation), + backgroundColor: AppColors.blueColor, + behavior: SnackBarBehavior.floating, + margin: EdgeInsets.all(16.w), + duration: const Duration(seconds: 2), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Failed to schedule test notification'.needTranslation), + backgroundColor: AppColors.errorColor, + behavior: SnackBarBehavior.floating, + margin: EdgeInsets.all(16.w), + ), + ); + } + }, + title: "Test Alert".needTranslation, + icon: Icon( + Icons.notifications_outlined, + color: AppColors.blueColor, + size: 24.w, + ), + ), + _buildActionButton( + context: context, + onTap: () => context.navigateWithName(AppRoutes.waterMonitorSettingsScreen), + title: "Settings".needTranslation, + icon: Icon( + Icons.settings, + color: AppColors.blueColor, + size: 24.w, + ), + ), + ], + ), + ], + ); + }); + } + + Widget _buildActionButton({ + required BuildContext context, + String? overlayWidget, + required String title, + required Widget icon, + required VoidCallback onTap, + }) { + return InkWell( + onTap: onTap, + child: Column( + children: [ + Stack( + children: [ + Container( + height: 46.w, + width: 46.w, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.blueColor.withValues(alpha: 0.14), + borderRadius: 12.r, + hasShadow: true, + ), + child: Center(child: icon), + ), + if (overlayWidget != null) ...[ + Positioned( + top: 0, + right: 0, + child: Container( + padding: EdgeInsets.all(2.w), + height: 16.w, + width: 16.w, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.blueColor, + borderRadius: 100.r, + hasShadow: true, + ), + child: Center( + child: Utils.buildSvgWithAssets( + icon: AppAssets.refreshIcon, + iconColor: AppColors.whiteColor, + ), + ), + ), + ), + ] + ], + ), + SizedBox(height: 4.h), + title.toText10(), + ], + ), + ); + } +} diff --git a/lib/presentation/water_monitor/widgets/water_bottle_widget.dart b/lib/presentation/water_monitor/widgets/water_bottle_widget.dart new file mode 100644 index 0000000..b681e32 --- /dev/null +++ b/lib/presentation/water_monitor/widgets/water_bottle_widget.dart @@ -0,0 +1,112 @@ +import 'dart:math' as math; + +import 'package:flutter/material.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/utils/utils.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/bottle_shape_clipper.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/water_consumption_progress_widget.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart'; + +class WaterBottleWidget extends StatelessWidget { + const WaterBottleWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, vm, _) { + final progressPercent = (vm.progress * 100).clamp(0.0, 100.0); + + // SVG aspect ratio + const svgAspectRatio = 315.0 / 143.0; // ~2.2 + + // Responsive bottle sizing with device-specific constraints + double bottleWidth; + if (isTablet) { + bottleWidth = math.min(SizeUtils.width * 0.15, 180.0); + } else if (isFoldable) { + bottleWidth = math.min(100.w, 160.0); + } else { + bottleWidth = math.min(120.w, 140.0); + } + + final bottleHeight = bottleWidth * svgAspectRatio; + + // Fillable area percentages + final fillableHeightPercent = 0.7; + const fillableWidthPercent = 0.8; + + final fillableHeight = bottleHeight * fillableHeightPercent; + final fillableWidth = bottleWidth * fillableWidthPercent; + + // Device-specific positioning offsets + final double leftOffset = isTablet ? 4.w : 8.w; + final double bottomOffset = isTablet ? -65.h : -78.h; + + return SizedBox( + height: bottleHeight, + width: bottleWidth, + child: Stack( + fit: StackFit.expand, + alignment: Alignment.center, + children: [ + // Bottle SVG outline + Center( + child: Utils.buildSvgWithAssets( + icon: AppAssets.waterBottle, + height: bottleHeight, + width: bottleWidth, + fit: BoxFit.contain, + ), + ), + + // Wave and bubbles clipped to bottle shape + Positioned.fill( + left: leftOffset, + bottom: bottomOffset, + child: Center( + child: SizedBox( + width: fillableWidth, + height: fillableHeight, + child: ClipPath( + clipper: BottleShapeClipper(), + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + // Animated wave + Positioned( + child: WaterConsumptionProgressWidget( + progress: progressPercent, + size: math.min(fillableWidth, fillableHeight), + containerWidth: fillableWidth, + containerHeight: fillableHeight, + waveDuration: const Duration(milliseconds: 3000), + waveColor: AppColors.blueColor, + ), + ), + + // Bubbles (only show if progress > 10%) + if (progressPercent > 10) + Positioned( + bottom: fillableHeight * 0.12, + child: Utils.buildSvgWithAssets( + icon: AppAssets.waterBottleOuterBubbles, + height: isTablet ? math.min(45.0, fillableHeight * 0.2) : math.min(55.0, fillableHeight * 0.22), + width: fillableWidth * 0.65, + ), + ), + ], + ), + ), + ), + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/presentation/water_monitor/widgets/water_consumption_progress_widget.dart b/lib/presentation/water_monitor/widgets/water_consumption_progress_widget.dart index 993d7ce..08350a1 100644 --- a/lib/presentation/water_monitor/widgets/water_consumption_progress_widget.dart +++ b/lib/presentation/water_monitor/widgets/water_consumption_progress_widget.dart @@ -11,15 +11,7 @@ class WaterConsumptionProgressWidget extends StatefulWidget { final double? containerHeight; final Duration? waveDuration; - const WaterConsumptionProgressWidget({ - super.key, - required this.progress, - this.size = 100, - this.waveColor, - this.containerWidth, - this.containerHeight, - this.waveDuration, - }); + const WaterConsumptionProgressWidget({super.key, required this.progress, this.size = 100, this.waveColor, this.containerWidth, this.containerHeight, this.waveDuration}); @override State createState() => _WaterConsumptionProgressWidgetState(); diff --git a/lib/presentation/water_monitor/widgets/water_intake_summary_widget.dart b/lib/presentation/water_monitor/widgets/water_intake_summary_widget.dart new file mode 100644 index 0000000..094cc38 --- /dev/null +++ b/lib/presentation/water_monitor/widgets/water_intake_summary_widget.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/water_action_buttons_widget.dart'; +import 'package:hmg_patient_app_new/presentation/water_monitor/widgets/water_bottle_widget.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:provider/provider.dart'; +import 'package:shimmer/shimmer.dart'; + +class WaterIntakeSummaryWidget extends StatelessWidget { + const WaterIntakeSummaryWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + padding: EdgeInsets.all(24.w), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + AppColors.blueGradientColorOne, + AppColors.blueGradientColorTwo, + ], + ), + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: isTablet ? 2 : 3, + child: Consumer(builder: (context, vm, _) { + if (vm.isLoading) { + return _buildLoadingShimmer(); + } + + final goalMl = vm.dailyGoalMl; + final consumed = vm.totalConsumedMl; + final remaining = (goalMl - consumed) > 0 ? (goalMl - consumed) : 0; + final completedPercent = "${(vm.progress * 100).clamp(0.0, 100.0).toStringAsFixed(0)}%"; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Next Drink Time".needTranslation.toText18(weight: FontWeight.w600, color: AppColors.textColor), + vm.nextDrinkTime.toText32(weight: FontWeight.w600, color: AppColors.blueColor), + SizedBox(height: 12.h), + _buildStatusColumn(title: "Your Goal".needTranslation, subTitle: "${goalMl}ml"), + SizedBox(height: 8.h), + _buildStatusColumn(title: "Remaining".needTranslation, subTitle: "${remaining}ml"), + SizedBox(height: 8.h), + _buildStatusColumn(title: "Completed".needTranslation, subTitle: completedPercent, subTitleColor: AppColors.successColor), + SizedBox(height: 8.h), + _buildStatusColumn( + title: "Hydration Status".needTranslation, + subTitle: vm.hydrationStatus, + subTitleColor: vm.hydrationStatusColor, + ), + ], + ); + }), + ), + SizedBox(width: isTablet ? 32 : 16.w), + Expanded( + flex: isTablet ? 1 : 2, + child: const WaterBottleWidget(), + ), + ], + ), + const WaterActionButtonsWidget(), + ], + ), + ); + } + + Widget _buildStatusColumn({required String title, required String subTitle, Color? subTitleColor}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "$title: ".toText16(weight: FontWeight.w500, color: AppColors.textColor), + subTitle.toText12( + fontWeight: FontWeight.w600, + color: subTitleColor ?? AppColors.greyTextColor, + ), + ], + ); + } + + Widget _buildLoadingShimmer() { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.all(0.w), + itemCount: 4, + separatorBuilder: (_, __) => SizedBox(height: 12.h), + itemBuilder: (context, index) { + return Shimmer.fromColors( + baseColor: AppColors.shimmerBaseColor, + highlightColor: AppColors.shimmerHighlightColor, + child: Container( + height: 40.h, + decoration: BoxDecoration( + color: AppColors.whiteColor, + borderRadius: BorderRadius.circular(10.r), + ), + ), + ); + }, + ); + } +} diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index f4b9954..9b045dc 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -85,11 +85,8 @@ class AppRoutes { userInfoFlowManager: (context) => UserInfoFlowManager(), smartWatches: (context) => SmartwatchInstructionsPage(), huaweiHealthExample: (context) => HuaweiHealthExample(), - healthCalculatorsPage: (context) => HealthCalculatorsPage(), waterConsumptionScreen: (context) => WaterConsumptionScreen(), waterMonitorSettingsScreen: (context) => WaterMonitorSettingsScreen(), - - // healthCalculatorsPage: (context) => HealthCalculatorsPage(type: HealthCalConEnum.calculator), healthConvertersPage: (context) => HealthCalculatorsPage(type: HealthCalConEnum.converter) }; diff --git a/lib/services/notification_service.dart b/lib/services/notification_service.dart new file mode 100644 index 0000000..fd154c6 --- /dev/null +++ b/lib/services/notification_service.dart @@ -0,0 +1,373 @@ +import 'dart:typed_data'; + +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; +import 'package:timezone/data/latest_all.dart' as tz; +import 'package:timezone/timezone.dart' as tz show TZDateTime, local, setLocalLocation, getLocation; + +/// Abstract class defining the notification service interface +abstract class NotificationService { + /// Initialize the notification service + Future initialize({Function(String payload)? onNotificationClick}); + + /// Request notification permissions (mainly for iOS) + Future requestPermissions(); + + /// Show an immediate notification + Future showNotification({ + required String title, + required String body, + String? payload, + }); + + /// Schedule a notification at a specific date and time + Future scheduleNotification({ + required int id, + required String title, + required String body, + required DateTime scheduledDate, + String? payload, + }); + + /// Schedule daily notifications at specific times + Future scheduleDailyNotifications({ + required List times, + required String title, + required String body, + String? payload, + }); + + /// Schedule water reminder notifications + Future scheduleWaterReminders({ + required List reminderTimes, + required String title, + required String body, + }); + + /// Cancel a specific notification by id + Future cancelNotification(int id); + + /// Cancel all scheduled notifications + Future cancelAllNotifications(); + + /// Get list of pending notifications + Future> getPendingNotifications(); +} + +/// Implementation of NotificationService following the project architecture +class NotificationServiceImp implements NotificationService { + final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; + final LoggerService loggerService; + + NotificationServiceImp({required this.flutterLocalNotificationsPlugin, required this.loggerService}); + + // Channel IDs for different notification types + static const String _waterReminderChannelId = 'water_reminder_channel'; + static const String _waterReminderChannelName = 'Water Reminders'; + static const String _waterReminderChannelDescription = 'Daily water intake reminders'; + + static const String _generalChannelId = 'hmg_general_channel'; + static const String _generalChannelName = 'HMG Notifications'; + static const String _generalChannelDescription = 'General notifications from HMG'; + + Function(String payload)? _onNotificationClick; + + @override + Future initialize({Function(String payload)? onNotificationClick}) async { + try { + // Initialize timezone database + tz.initializeTimeZones(); + + // Set local timezone (you can also use a specific timezone if needed) + // For example: tz.setLocalLocation(tz.getLocation('Asia/Riyadh')); + final locationName = DateTime.now().timeZoneName; + try { + tz.setLocalLocation(tz.getLocation(locationName)); + } catch (e) { + // Fallback to UTC if specific timezone not found + loggerService.logInfo('Could not set timezone $locationName, using UTC'); + tz.setLocalLocation(tz.getLocation('UTC')); + } + + _onNotificationClick = onNotificationClick; + + const androidSettings = AndroidInitializationSettings('app_icon'); + const iosSettings = DarwinInitializationSettings( + requestAlertPermission: true, + requestBadgePermission: true, + requestSoundPermission: true, + ); + + const initializationSettings = InitializationSettings( + android: androidSettings, + iOS: iosSettings, + ); + + await flutterLocalNotificationsPlugin.initialize( + initializationSettings, + onDidReceiveNotificationResponse: _handleNotificationResponse, + ); + + loggerService.logInfo('NotificationService initialized successfully'); + } catch (ex) { + loggerService.logError('Failed to initialize NotificationService: $ex'); + } + } + + /// Handle notification tap + void _handleNotificationResponse(NotificationResponse response) { + try { + if (response.payload != null && _onNotificationClick != null) { + _onNotificationClick!(response.payload!); + } + loggerService.logInfo('Notification tapped: ${response.payload}'); + } catch (ex) { + loggerService.logError('Error handling notification response: $ex'); + } + } + + @override + Future requestPermissions() async { + try { + // Request permissions for iOS + final result = + await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation()?.requestPermissions( + alert: true, + badge: true, + sound: true, + ); + + // For Android 13+, permissions are requested at runtime + final androidResult = await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation() + ?.requestNotificationsPermission(); + + loggerService.logInfo('Notification permissions: iOS=${result ?? true}, Android=${androidResult ?? true}'); + return result ?? androidResult ?? true; + } catch (ex) { + loggerService.logError('Error requesting notification permissions: $ex'); + return false; + } + } + + @override + Future showNotification({ + required String title, + required String body, + String? payload, + }) async { + try { + final androidDetails = AndroidNotificationDetails( + _generalChannelId, + _generalChannelName, + channelDescription: _generalChannelDescription, + importance: Importance.high, + priority: Priority.high, + vibrationPattern: _getVibrationPattern(), + ); + + const iosDetails = DarwinNotificationDetails(); + + final notificationDetails = NotificationDetails( + android: androidDetails, + iOS: iosDetails, + ); + + await flutterLocalNotificationsPlugin.show( + DateTime.now().millisecondsSinceEpoch ~/ 1000, + title, + body, + notificationDetails, + payload: payload, + ); + + loggerService.logInfo('Notification shown: $title'); + } catch (ex) { + loggerService.logError('Error showing notification: $ex'); + } + } + + @override + Future scheduleNotification({ + required int id, + required String title, + required String body, + required DateTime scheduledDate, + String? payload, + }) async { + try { + final androidDetails = AndroidNotificationDetails( + _generalChannelId, + _generalChannelName, + channelDescription: _generalChannelDescription, + importance: Importance.high, + priority: Priority.high, + vibrationPattern: _getVibrationPattern(), + ); + + const iosDetails = DarwinNotificationDetails(); + + final notificationDetails = NotificationDetails( + android: androidDetails, + iOS: iosDetails, + ); + + await flutterLocalNotificationsPlugin.zonedSchedule( + id, + title, + body, + tz.TZDateTime.from(scheduledDate, tz.local), + notificationDetails, + androidScheduleMode: AndroidScheduleMode.exactAllowWhileIdle, + payload: payload, + ); + + loggerService.logInfo('Notification scheduled for: $scheduledDate'); + } catch (ex) { + loggerService.logError('Error scheduling notification: $ex'); + } + } + + @override + Future scheduleDailyNotifications({ + required List times, + required String title, + required String body, + String? payload, + }) async { + try { + for (int i = 0; i < times.length; i++) { + final time = times[i]; + await scheduleNotification( + id: i + 1000, + // Offset ID to avoid conflicts + title: title, + body: body, + scheduledDate: time, + payload: payload, + ); + } + + loggerService.logInfo('Scheduled ${times.length} daily notifications'); + } catch (ex) { + loggerService.logError('Error scheduling daily notifications: $ex'); + } + } + + @override + Future scheduleWaterReminders({ + required List reminderTimes, + required String title, + required String body, + }) async { + try { + // Cancel existing water reminders first + await _cancelWaterReminders(); + + final androidDetails = AndroidNotificationDetails( + _waterReminderChannelId, + _waterReminderChannelName, + channelDescription: _waterReminderChannelDescription, + importance: Importance.high, + priority: Priority.high, + vibrationPattern: _getVibrationPattern(), + icon: 'app_icon', + styleInformation: const BigTextStyleInformation(''), + ); + + const iosDetails = DarwinNotificationDetails( + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + + final notificationDetails = NotificationDetails( + android: androidDetails, + iOS: iosDetails, + ); + + for (int i = 0; i < reminderTimes.length; i++) { + final reminderTime = reminderTimes[i]; + final notificationId = 5000 + i; // Use 5000+ range for water reminders + + // Schedule for today if time hasn't passed, otherwise schedule for tomorrow + DateTime scheduledDate = reminderTime; + if (scheduledDate.isBefore(DateTime.now())) { + scheduledDate = scheduledDate.add(const Duration(days: 1)); + } + + await flutterLocalNotificationsPlugin.zonedSchedule( + notificationId, + title, + body, + tz.TZDateTime.from(scheduledDate, tz.local), + notificationDetails, + androidScheduleMode: AndroidScheduleMode.exactAllowWhileIdle, + matchDateTimeComponents: DateTimeComponents.time, // Repeat daily at the same time + payload: 'water_reminder_$i', + ); + } + + loggerService.logInfo('Scheduled ${reminderTimes.length} water reminders'); + } catch (ex) { + loggerService.logError('Error scheduling water reminders: $ex'); + } + } + + /// Cancel all water reminders (IDs 5000-5999) + Future _cancelWaterReminders() async { + try { + final pendingNotifications = await getPendingNotifications(); + for (final notification in pendingNotifications) { + if (notification.id >= 5000 && notification.id < 6000) { + await cancelNotification(notification.id); + } + } + loggerService.logInfo('Cancelled all water reminders'); + } catch (ex) { + loggerService.logError('Error cancelling water reminders: $ex'); + } + } + + @override + Future cancelNotification(int id) async { + try { + await flutterLocalNotificationsPlugin.cancel(id); + loggerService.logInfo('Cancelled notification with ID: $id'); + } catch (ex) { + loggerService.logError('Error cancelling notification: $ex'); + } + } + + @override + Future cancelAllNotifications() async { + try { + await flutterLocalNotificationsPlugin.cancelAll(); + loggerService.logInfo('Cancelled all notifications'); + } catch (ex) { + loggerService.logError('Error cancelling all notifications: $ex'); + } + } + + @override + Future> getPendingNotifications() async { + try { + final pending = await flutterLocalNotificationsPlugin.pendingNotificationRequests(); + loggerService.logInfo('Found ${pending.length} pending notifications'); + return pending; + } catch (ex) { + loggerService.logError('Error getting pending notifications: $ex'); + return []; + } + } + + /// Get vibration pattern for notifications + Int64List _getVibrationPattern() { + final vibrationPattern = Int64List(4); + vibrationPattern[0] = 0; + vibrationPattern[1] = 500; + vibrationPattern[2] = 500; + vibrationPattern[3] = 500; + return vibrationPattern; + } +} diff --git a/lib/splashPage.dart b/lib/splashPage.dart index bd7afa5..043eefd 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -5,30 +5,30 @@ import 'package:flutter_callkit_incoming/entities/call_event.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_zoom_videosdk/native/zoom_videosdk.dart'; import 'package:get_it/get_it.dart'; -import 'package:hmg_patient_app_new/presentation/onboarding/onboarding_screen.dart'; -import 'package:hmg_patient_app_new/presentation/onboarding/splash_animation_screen.dart'; import 'package:hmg_patient_app_new/core/api_consts.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/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; - -// import 'package:hmg_patient_app_new/presentation/authantication/login.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; +import 'package:hmg_patient_app_new/presentation/onboarding/onboarding_screen.dart'; +import 'package:hmg_patient_app_new/presentation/onboarding/splash_animation_screen.dart'; import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/call_screen.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/services/notification_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:lottie/lottie.dart'; -import 'package:provider/provider.dart'; import 'core/cache_consts.dart'; -import 'core/utils/local_notifications.dart'; import 'core/utils/push_notification_handler.dart'; class SplashPage extends StatefulWidget { + const SplashPage({super.key}); + @override _SplashScreenState createState() => _SplashScreenState(); } @@ -47,9 +47,13 @@ class _SplashScreenState extends State { ); await authVm.getServicePrivilege(); Timer(Duration(seconds: 2, milliseconds: 500), () async { - bool isAppOpenedFromCall = await GetIt.instance().getBool(key: CacheConst.isAppOpenedFromCall) ?? false; + bool isAppOpenedFromCall = getIt.get().getBool(key: CacheConst.isAppOpenedFromCall) ?? false; - LocalNotification.init(onNotificationClick: (payload) {}); + // Initialize NotificationService using dependency injection + final notificationService = getIt.get(); + await notificationService.initialize(onNotificationClick: (payload) { + // Handle notification click here + }); if (isAppOpenedFromCall) { navigateToTeleConsult(); @@ -78,7 +82,8 @@ class _SplashScreenState extends State { // GetIt.instance().remove(key: CacheConst.isAppOpenedFromCall); Utils.removeFromPrefs(CacheConst.isAppOpenedFromCall); - Navigator.of(GetIt.instance().navigatorKey.currentContext!).pushReplacement(FadePage(page: SplashAnimationScreen(routeWidget: LandingNavigation()))); + Navigator.of(GetIt.instance().navigatorKey.currentContext!) + .pushReplacement(FadePage(page: SplashAnimationScreen(routeWidget: LandingNavigation()))); Navigator.pushReplacementNamed( // context, GetIt.instance().navigatorKey.currentContext!, @@ -216,7 +221,7 @@ class _SplashScreenState extends State { @override void initState() { - authVm = context.read(); + authVm = getIt(); super.initState(); initializeStuff(); } @@ -225,6 +230,8 @@ class _SplashScreenState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.whiteColor, - body: Lottie.asset(AppAnimations.loadingAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 80.h, height: 80.h, fit: BoxFit.fill).center); + body: Lottie.asset(AppAnimations.loadingAnimation, + repeat: true, reverse: false, frameRate: FrameRate(60), width: 80.h, height: 80.h, fit: BoxFit.fill) + .center); } } diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 4494ce4..6dfb207 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -104,4 +104,8 @@ class AppColors { static const Color blueColor = Color(0xFF4EB5FF); static const Color blueGradientColorOne = Color(0xFFF1F7FD); static const Color blueGradientColorTwo = Color(0xFFD9EFFF); + + // Shimmer + static const Color shimmerBaseColor = Color(0xFFE0E0E0); + static const Color shimmerHighlightColor = Color(0xFFF5F5F5); } diff --git a/lib/widgets/chip/app_custom_chip_widget.dart b/lib/widgets/chip/app_custom_chip_widget.dart index 8be16b7..69d82b7 100644 --- a/lib/widgets/chip/app_custom_chip_widget.dart +++ b/lib/widgets/chip/app_custom_chip_widget.dart @@ -72,11 +72,11 @@ class AppCustomChipWidget extends StatelessWidget { ? Image.asset(icon, width: iconS, height: iconS) : Utils.buildSvgWithAssets( icon: icon, - width: iconS, - height: iconS, - iconColor: iconHasColor ? iconColor : null, - fit: BoxFit.contain, - ) + width: iconS, + height: iconS, + iconColor: iconHasColor ? iconColor : null, + fit: BoxFit.contain, + ) : SizedBox.shrink(), label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), padding: padding, diff --git a/lib/widgets/graph/custom_graph.dart b/lib/widgets/graph/custom_graph.dart index b955b32..e04d978 100644 --- a/lib/widgets/graph/custom_graph.dart +++ b/lib/widgets/graph/custom_graph.dart @@ -1,8 +1,9 @@ -import 'package:flutter/material.dart'; import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/common_models/data_points.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; + /// A customizable line graph widget using `fl_chart`. /// /// Displays a line chart with configurable axis labels, colors, and data points. @@ -56,67 +57,69 @@ class CustomGraph extends StatelessWidget { final FontWeight? bottomLabelFontWeight; final double? leftLabelInterval; final double? leftLabelReservedSize; + final double? bottomLabelReservedSize; final bool? showGridLines; final GetDrawingGridLine? getDrawingHorizontalLine; final double? horizontalInterval; final double? minY; final bool showShadow; + final double? cutOffY; final RangeAnnotations? rangeAnnotations; ///creates the left label and provide it to the chart as it will be used by other part of the application so the label will be different for every chart final Widget Function(double) leftLabelFormatter; - final Widget Function(double , List) bottomLabelFormatter; - + final Widget Function(double, List) bottomLabelFormatter; final Axis scrollDirection; final bool showBottomTitleDates; final bool isFullScreeGraph; final bool makeGraphBasedOnActualValue; - const CustomGraph({ - super.key, - required this.dataPoints, - required this.leftLabelFormatter, - this.width, - required this.scrollDirection, - required this.height, - this.maxY, - this.maxX, - this.showBottomTitleDates = true, - this.isFullScreeGraph = false, - this.spotColor = AppColors.bgGreenColor, - this.graphColor = AppColors.bgGreenColor, - this.graphShadowColor = AppColors.graphGridColor, - this.graphGridColor = AppColors.graphGridColor, - this.bottomLabelColor = AppColors.textColor, - this.bottomLabelFontWeight = FontWeight.w500, - this.bottomLabelSize, - this.leftLabelInterval, - this.leftLabelReservedSize, - this.makeGraphBasedOnActualValue = false, - required this.bottomLabelFormatter, - this.minX, - this.showGridLines = false, - this.getDrawingHorizontalLine, - this.horizontalInterval, - this.minY, - this.showShadow = false, - this.rangeAnnotations - }); + const CustomGraph( + {super.key, + required this.dataPoints, + required this.leftLabelFormatter, + this.width, + required this.scrollDirection, + required this.height, + this.maxY, + this.maxX, + this.showBottomTitleDates = true, + this.isFullScreeGraph = false, + this.spotColor = AppColors.bgGreenColor, + this.graphColor = AppColors.bgGreenColor, + this.graphShadowColor = AppColors.graphGridColor, + this.graphGridColor = AppColors.graphGridColor, + this.bottomLabelColor = AppColors.textColor, + this.bottomLabelFontWeight = FontWeight.w500, + this.bottomLabelSize, + this.leftLabelInterval, + this.leftLabelReservedSize, + this.bottomLabelReservedSize, + this.makeGraphBasedOnActualValue = false, + required this.bottomLabelFormatter, + this.minX, + this.showGridLines = false, + this.getDrawingHorizontalLine, + this.horizontalInterval, + this.minY, + this.showShadow = false, + this.cutOffY = 0, + this.rangeAnnotations}); @override Widget build(BuildContext context) { return Material( - color: Colors.white, - child: SizedBox( - width: width, - height: height, - child: LineChart( - LineChartData( - minY: minY??0, + color: Colors.white, + child: SizedBox( + width: width, + height: height, + child: LineChart( + LineChartData( + minY: minY ?? 0, maxY: maxY, maxX: maxX, - minX: minX , + minX: minX, lineTouchData: LineTouchData( getTouchLineEnd: (_, __) => 0, getTouchedSpotIndicator: (barData, indicators) { @@ -149,11 +152,8 @@ class CustomGraph extends StatelessWidget { final dataPoint = dataPoints[spot.x.toInt()]; return LineTooltipItem( - '${dataPoint.actualValue} ${dataPoint.unitOfMeasurement??""} - ${dataPoint.displayTime}', - TextStyle( - color: Colors.black, - fontSize: 12.f, - fontWeight: FontWeight.w500), + '${dataPoint.actualValue} ${dataPoint.unitOfMeasurement ?? ""} - ${dataPoint.displayTime}', + TextStyle(color: Colors.black, fontSize: 12.f, fontWeight: FontWeight.w500), ); } return null; // hides the rest @@ -165,7 +165,7 @@ class CustomGraph extends StatelessWidget { leftTitles: AxisTitles( sideTitles: SideTitles( showTitles: true, - reservedSize: leftLabelReservedSize??80, + reservedSize: leftLabelReservedSize ?? 80, interval: leftLabelInterval ?? .1, // Let fl_chart handle it getTitlesWidget: (value, _) { return leftLabelFormatter(value); @@ -176,9 +176,9 @@ class CustomGraph extends StatelessWidget { axisNameSize: 20, sideTitles: SideTitles( showTitles: showBottomTitleDates, - reservedSize: 20, + reservedSize: bottomLabelReservedSize ?? 20, getTitlesWidget: (value, _) { - return bottomLabelFormatter(value, dataPoints, ); + return bottomLabelFormatter(value, dataPoints); }, interval: 1, // ensures 1:1 mapping with spots ), @@ -197,30 +197,29 @@ class CustomGraph extends StatelessWidget { ), lineBarsData: _buildColoredLineSegments(dataPoints), gridData: FlGridData( - show: showGridLines??true, + show: showGridLines ?? true, drawVerticalLine: false, - horizontalInterval:horizontalInterval, + horizontalInterval: horizontalInterval, // checkToShowHorizontalLine: (value) => // value >= 0 && value <= 100, - getDrawingHorizontalLine: getDrawingHorizontalLine??(value) { - return FlLine( - color: graphGridColor, - strokeWidth: 1, - dashArray: [5, 5], - ); - }, + getDrawingHorizontalLine: getDrawingHorizontalLine ?? + (value) { + return FlLine( + color: graphGridColor, + strokeWidth: 1, + dashArray: [5, 5], + ); + }, ), - rangeAnnotations: rangeAnnotations - ), - ), + rangeAnnotations: rangeAnnotations), ), + ), ); } - List _buildColoredLineSegments(List dataPoints) { final List allSpots = dataPoints.asMap().entries.map((entry) { - double value = (makeGraphBasedOnActualValue)?double.tryParse(entry.value.actualValue)??0.0:entry.value.value; + double value = (makeGraphBasedOnActualValue) ? double.tryParse(entry.value.actualValue) ?? 0.0 : entry.value.value; return FlSpot(entry.key.toDouble(), value); }).toList(); @@ -241,6 +240,8 @@ class CustomGraph extends StatelessWidget { ), belowBarData: BarAreaData( show: showShadow, + applyCutOffY: cutOffY != null, + cutOffY: cutOffY ?? 0, gradient: LinearGradient( colors: [ graphShadowColor, @@ -255,4 +256,4 @@ class CustomGraph extends StatelessWidget { return data; } -} \ No newline at end of file +} diff --git a/pubspec.yaml b/pubspec.yaml index 5590c9e..461d3ab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,6 +30,7 @@ dependencies: # firebase_core: ^3.13.1 permission_handler: ^12.0.1 flutter_local_notifications: ^19.4.1 + timezone: ^0.10.0 provider: ^6.1.5+1 get_it: ^8.2.0 just_audio: ^0.10.4 From 162337b31740b9a66d515b19df641b9661ce3d8d Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 31 Dec 2025 11:53:06 +0300 Subject: [PATCH 47/55] Added appointment nearest gate & floor --- lib/core/api_consts.dart | 2 + .../book_appointments_repo.dart | 39 +++ .../book_appointments_view_model.dart | 32 ++ ...pointment_nearest_gate_response_model.dart | 64 ++++ .../appointment_details_page.dart | 188 ++++++------ .../widgets/appointment_card.dart | 1 + .../laser/laser_appointment.dart | 3 +- .../review_appointment_page.dart | 280 ++++++++++-------- ...ting_appointment_online_checkin_sheet.dart | 1 + .../widgets/appointment_calendar.dart | 1 + 10 files changed, 397 insertions(+), 214 deletions(-) create mode 100644 lib/features/book_appointments/models/resp_models/appointment_nearest_gate_response_model.dart diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index a3cf213..309e9df 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -334,6 +334,8 @@ var GET_PATIENT_SHARE_FOR_WALKIN_APPOINTMENT = 'Services/Doctors.svc/REST/GetChe var CAN_PAY_FOR_FOR_WALKIN_APPOINTMENT = 'Services/Doctors.svc/REST/CanPayForWalkinAppointment'; +var GET_APPOINTMENT_NEAREST_GATE = 'Services/OUTPs.svc/REST/getGateByProjectIDandClinicID'; + //URL to get medicine and pharmacies list var CHANNEL = 3; var GENERAL_ID = 'Cs2020@2016\$2958'; diff --git a/lib/features/book_appointments/book_appointments_repo.dart b/lib/features/book_appointments/book_appointments_repo.dart index f6e83ff..cfd473e 100644 --- a/lib/features/book_appointments/book_appointments_repo.dart +++ b/lib/features/book_appointments/book_appointments_repo.dart @@ -5,6 +5,7 @@ import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/appointment_nearest_gate_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/dental_chief_complaints_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctor_profile_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; @@ -102,6 +103,8 @@ abstract class BookAppointmentsRepo { required int userAge, Function(dynamic)? onSuccess, Function(String)? onError}); + + Future>> getAppointmentNearestGate({required int projectID, required int clinicID}); } class BookAppointmentsRepoImp implements BookAppointmentsRepo { @@ -1046,4 +1049,40 @@ class BookAppointmentsRepoImp implements BookAppointmentsRepo { return Left(UnknownFailure(e.toString())); } } + + @override + Future>> getAppointmentNearestGate({required int projectID, required int clinicID}) async { + Map mapRequest = {"ProjectID": projectID, "ClinicID": clinicID}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_APPOINTMENT_NEAREST_GATE, + body: mapRequest, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final nearestGateResponse = AppointmentNearestGateResponseModel.fromJson(response['getGateByProjectIDandClinicIDList'][0]); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: nearestGateResponse, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } } diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index ae74ffb..cbed940 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -14,6 +14,7 @@ import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_repo.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/LaserCategoryType.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/free_slot.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/appointment_nearest_gate_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/dental_chief_complaints_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctor_profile_response_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; @@ -44,6 +45,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { bool isDoctorsListLoading = false; bool isDoctorProfileLoading = false; bool isDoctorSearchByNameStarted = false; + bool isAppointmentNearestGateLoading = false; bool isLiveCareSchedule = false; bool isGetDocForHealthCal = false; @@ -132,6 +134,8 @@ class BookAppointmentsViewModel extends ChangeNotifier { PatientAppointmentShareResponseModel? patientWalkInAppointmentShareResponseModel; + AppointmentNearestGateResponseModel? appointmentNearestGateResponseModel; + ///variables for laser clinic List femaleLaserCategory = [ LaserCategoryType(1, 'bodyString'), @@ -1343,4 +1347,32 @@ class BookAppointmentsViewModel extends ChangeNotifier { }, ); } + + Future getAppointmentNearestGate({required int projectID, required int clinicID, Function(dynamic)? onSuccess, Function(String)? onError}) async { + isAppointmentNearestGateLoading = true; + notifyListeners(); + + final result = await bookAppointmentsRepo.getAppointmentNearestGate(projectID: projectID, clinicID: clinicID); + + result.fold( + (failure) async { + if (onError != null) { + onError(failure.message); + } + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + appointmentNearestGateResponseModel = apiResponse.data!; + isAppointmentNearestGateLoading = false; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } } diff --git a/lib/features/book_appointments/models/resp_models/appointment_nearest_gate_response_model.dart b/lib/features/book_appointments/models/resp_models/appointment_nearest_gate_response_model.dart new file mode 100644 index 0000000..bdaa4e2 --- /dev/null +++ b/lib/features/book_appointments/models/resp_models/appointment_nearest_gate_response_model.dart @@ -0,0 +1,64 @@ +class AppointmentNearestGateResponseModel { + String? clinicDescription; + String? clinicDescriptionN; + int? clinicID; + String? clinicLocation; + String? clinicLocationN; + int? gender; + int? iD; + String? nearestGateNumber; + String? nearestGateNumberN; + int? projectID; + String? projectName; + String? projectNameN; + int? rowID; + + AppointmentNearestGateResponseModel( + {this.clinicDescription, + this.clinicDescriptionN, + this.clinicID, + this.clinicLocation, + this.clinicLocationN, + this.gender, + this.iD, + this.nearestGateNumber, + this.nearestGateNumberN, + this.projectID, + this.projectName, + this.projectNameN, + this.rowID}); + + AppointmentNearestGateResponseModel.fromJson(Map json) { + clinicDescription = json['ClinicDescription']; + clinicDescriptionN = json['ClinicDescriptionN']; + clinicID = json['ClinicID']; + clinicLocation = json['ClinicLocation']; + clinicLocationN = json['ClinicLocationN']; + gender = json['Gender']; + iD = json['ID']; + nearestGateNumber = json['NearestGateNumber']; + nearestGateNumberN = json['NearestGateNumberN']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + projectNameN = json['ProjectNameN']; + rowID = json['RowID']; + } + + Map toJson() { + final Map data = Map(); + data['ClinicDescription'] = clinicDescription; + data['ClinicDescriptionN'] = clinicDescriptionN; + data['ClinicID'] = clinicID; + data['ClinicLocation'] = clinicLocation; + data['ClinicLocationN'] = clinicLocationN; + data['Gender'] = gender; + data['ID'] = iD; + data['NearestGateNumber'] = nearestGateNumber; + data['NearestGateNumberN'] = nearestGateNumberN; + data['ProjectID'] = projectID; + data['ProjectName'] = projectName; + data['ProjectNameN'] = projectNameN; + data['RowID'] = rowID; + return data; + } +} diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 7b605b9..7b2439c 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -4,6 +4,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/calender_utils_new.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; @@ -31,6 +33,7 @@ import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_deta 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/chip/app_custom_chip_widget.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'; @@ -132,10 +135,7 @@ class _AppointmentDetailsPageState extends State { }, onCancelTap: () async { myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); - var isEventAddedOrRemoved = await CalenderUtilsNew.instance.checkAndRemove( id:"${widget.patientAppointmentHistoryResponseModel.appointmentNo}", ); - setState(() { - myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); - }); + LoaderBottomSheet.showLoader(loadingText: "Cancelling Appointment, Please Wait...".needTranslation); await myAppointmentsViewModel.cancelAppointment( patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, @@ -155,6 +155,11 @@ class _AppointmentDetailsPageState extends State { isFullScreen: false, ); }); + + var isEventAddedOrRemoved = await CalenderUtilsNew.instance.checkAndRemove( id:"${widget.patientAppointmentHistoryResponseModel.appointmentNo}", ); + setState(() { + myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); + }); }, onRescheduleTap: () async { openDoctorScheduleCalendar(); @@ -164,90 +169,105 @@ class _AppointmentDetailsPageState extends State { !AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) ? Column( children: [ - Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 20.r, - hasShadow: false, - ), - child: Padding( - padding: EdgeInsets.all(16.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - "Appointment Status".needTranslation.toText16(isBold: true), - ], - ), - SizedBox(height: 4.h), - (!AppointmentType.isConfirmed(widget.patientAppointmentHistoryResponseModel) - ? "Not Confirmed".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500) - : "Confirmed".needTranslation.toText12(color: AppColors.successColor, fontWeight: FontWeight.w500)), - SizedBox(height: 16.h), - //TODO Add countdown timer in case of LiveCare Appointment - widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false - ? Row( - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 40.h, height: 40.h), - SizedBox(width: 12.w), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "The doctor will call you once the appointment time approaches." - .needTranslation - .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), - ], + Consumer(builder: (context, bookAppointmentsVM, child) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.r, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + "Appointment Status".needTranslation.toText16(isBold: true), + ], + ), + SizedBox(height: 4.h), + (!AppointmentType.isConfirmed(widget.patientAppointmentHistoryResponseModel) + ? "Not Confirmed".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500) + : "Confirmed".needTranslation.toText12(color: AppColors.successColor, fontWeight: FontWeight.w500)), + SizedBox(height: 16.h), + //TODO Add countdown timer in case of LiveCare Appointment + widget.patientAppointmentHistoryResponseModel.isLiveCareAppointment ?? false + ? Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "The doctor will call you once the appointment time approaches." + .needTranslation + .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500), + ], + ), ), - ), - ], - ) - : Stack( - children: [ - ClipRRect( - clipBehavior: Clip.hardEdge, - borderRadius: BorderRadius.circular(24.r), - // Todo: what is this???? Api Key??? 😲 - child: Image.network( - "https://maps.googleapis.com/maps/api/staticmap?center=${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&zoom=14&size=350x165&maptype=roadmap&markers=color:red%7C${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&key=${ApiKeyConstants.googleMapsApiKey}", - fit: BoxFit.contain, + ], + ) + : Stack( + children: [ + ClipRRect( + clipBehavior: Clip.hardEdge, + borderRadius: BorderRadius.circular(24.r), + // Todo: what is this???? Api Key??? 😲 + child: Image.network( + "https://maps.googleapis.com/maps/api/staticmap?center=${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&zoom=14&size=350x165&maptype=roadmap&markers=color:red%7C${widget.patientAppointmentHistoryResponseModel.latitude},${widget.patientAppointmentHistoryResponseModel.longitude}&key=${ApiKeyConstants.googleMapsApiKey}", + fit: BoxFit.contain, + ), ), - ), - Positioned( - bottom: 0, - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.785, - child: CustomButton( - text: "Get Directions".needTranslation, - onPressed: () { - MapsLauncher.launchCoordinates( - double.parse(widget.patientAppointmentHistoryResponseModel.latitude!), - double.parse(widget.patientAppointmentHistoryResponseModel.longitude!), - widget.patientAppointmentHistoryResponseModel.projectName); - }, - backgroundColor: AppColors.textColor.withValues(alpha: 0.8), - borderColor: AppointmentType.getNextActionButtonColor( - widget.patientAppointmentHistoryResponseModel.nextAction) - .withValues(alpha: 0.01), - textColor: AppColors.whiteColor, - fontSize: 14.f, - fontWeight: FontWeight.w500, - borderRadius: 12.r, - padding: EdgeInsets.symmetric(horizontal: 10.w), - height: 40.h, - icon: AppAssets.directions_icon, - iconColor: AppColors.whiteColor, - iconSize: 14.h, - ).paddingAll(12.h), + Positioned( + bottom: 0, + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.785, + child: CustomButton( + text: "Get Directions".needTranslation, + onPressed: () { + MapsLauncher.launchCoordinates(double.parse(widget.patientAppointmentHistoryResponseModel.latitude!), + double.parse(widget.patientAppointmentHistoryResponseModel.longitude!), widget.patientAppointmentHistoryResponseModel.projectName); + }, + backgroundColor: AppColors.textColor.withValues(alpha: 0.8), + borderColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), + textColor: AppColors.whiteColor, + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), + height: 40.h, + icon: AppAssets.directions_icon, + iconColor: AppColors.whiteColor, + iconSize: 14.h, + ).paddingAll(12.h), + ), ), - ), - ], - ), - ], + ], + ), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 8.w, + runSpacing: 8.h, + children: [ + AppCustomChipWidget( + labelText: bookAppointmentsVM.isAppointmentNearestGateLoading + ? "Floor: Ground Floor" + : "Floor: ${getIt.get().isArabic() ? bookAppointmentsViewModel.appointmentNearestGateResponseModel!.clinicLocationN : bookAppointmentsViewModel.appointmentNearestGateResponseModel!.clinicLocation}", + ).toShimmer2(isShow: bookAppointmentsVM.isAppointmentNearestGateLoading), + AppCustomChipWidget( + labelText: + "Nearest Gate: ${getIt.get().isArabic() ? bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumberN : bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumber}") + .toShimmer2(isShow: bookAppointmentsVM.isAppointmentNearestGateLoading), + ], + ), + ], + ), ), - ), - ), + ); + }), SizedBox(height: 16.h), Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index 57e19ca..6849253 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -372,6 +372,7 @@ class AppointmentCard extends StatelessWidget { ), ); } else { + bookAppointmentsViewModel.getAppointmentNearestGate(projectID: patientAppointmentHistoryResponseModel.projectID, clinicID: patientAppointmentHistoryResponseModel.clinicID); Navigator.of(context) .push( CustomPageRoute( diff --git a/lib/presentation/book_appointment/laser/laser_appointment.dart b/lib/presentation/book_appointment/laser/laser_appointment.dart index 28f0f2d..144c261 100644 --- a/lib/presentation/book_appointment/laser/laser_appointment.dart +++ b/lib/presentation/book_appointment/laser/laser_appointment.dart @@ -1,6 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.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/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/laser_body_parts.dart'; @@ -81,7 +82,7 @@ class LaserAppointment extends StatelessWidget { activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null,LocaleKeys.malE.tr()), - CustomTabBarModel(null,"Female".needTranslation.tr()), + CustomTabBarModel(null, "Female".needTranslation), ], onTabChange: (index) { var viewmodel = context.read(); diff --git a/lib/presentation/book_appointment/review_appointment_page.dart b/lib/presentation/book_appointment/review_appointment_page.dart index 40abd40..0ee7a33 100644 --- a/lib/presentation/book_appointment/review_appointment_page.dart +++ b/lib/presentation/book_appointment/review_appointment_page.dart @@ -50,146 +50,168 @@ class _ReviewAppointmentPageState extends State { Expanded( child: CollapsingListView( title: LocaleKeys.reviewAppointment.tr(context: context), - child: SingleChildScrollView( - padding: EdgeInsets.symmetric(horizontal: 24.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 24.h), - LocaleKeys.docInfo.tr(context: context).toText16(isBold: true), - SizedBox(height: 16.h), - Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 24.h, - hasShadow: false, - ), - child: Padding( - padding: EdgeInsets.all(16.h), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Image.network( - bookAppointmentsViewModel.selectedDoctor.doctorImageURL!, - width: 50.h, - height: 50.h, - fit: BoxFit.cover, - ).circle(100), - SizedBox(width: 8.h), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - SizedBox( - width: MediaQuery.of(context).size.width * 0.49, - child: - "${bookAppointmentsViewModel.selectedDoctor.doctorTitle} ${bookAppointmentsViewModel.selectedDoctor.name}".toString().toText16(isBold: true, maxlines: 1), - ), - Image.network( - bookAppointmentsViewModel.selectedDoctor.nationalityFlagURL!, - width: 20.h, - height: 15.h, - fit: BoxFit.cover, - ), - ], - ), - SizedBox(height: 2.h), - (bookAppointmentsViewModel.selectedDoctor.speciality!.isNotEmpty ? bookAppointmentsViewModel.selectedDoctor.speciality!.first : "") - .toString() - .toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor, maxLine: 1), - ], - ), - ], - ), - SizedBox(height: 12.h), - Wrap( - direction: Axis.horizontal, - spacing: 8.h, - runSpacing: 8.h, - children: [ - AppCustomChipWidget( - labelText: "${LocaleKeys.clinic.tr(context: context)}: ${bookAppointmentsViewModel.selectedDoctor.clinicName}".needTranslation, - ), - AppCustomChipWidget( - labelText: "${LocaleKeys.branch.tr(context: context)} ${bookAppointmentsViewModel.selectedDoctor.projectName}".needTranslation, - ), - AppCustomChipWidget( - labelText: - "${LocaleKeys.date.tr(context: context)}: ${bookAppointmentsViewModel.isWaitingAppointmentSelected ? DateUtil.formatDateToDate(DateTime.now(), false) : bookAppointmentsViewModel.selectedAppointmentDate}" - .needTranslation, - ), - AppCustomChipWidget( - labelText: - "${LocaleKeys.time.tr(context: context)}: ${bookAppointmentsViewModel.isWaitingAppointmentSelected ? "Waiting Appointment".needTranslation : bookAppointmentsViewModel.selectedAppointmentTime}" - .needTranslation, - ), - ], - ), - ], + child: Consumer(builder: (context, bookAppointmentsVM, child) { + return SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 24.h), + LocaleKeys.docInfo.tr(context: context).toText16(isBold: true), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: false, ), - ), - ), - SizedBox(height: 24.h), - LocaleKeys.patientInfo.tr(context: context).toText16(isBold: true), - SizedBox(height: 16.h), - Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 24.h, - hasShadow: false, - ), - child: Padding( - padding: EdgeInsets.all(16.h), - child: Row( - children: [ - Image.asset( - appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg, - width: 52.h, - height: 52.h, - ), - SizedBox(width: 8.h), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}".toText16(isBold: true), - SizedBox(height: 8.h), - AppCustomChipWidget(labelText: "${appState.getAuthenticatedUser()!.age} Years Old"), - ], - ), - ], + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.network( + bookAppointmentsViewModel.selectedDoctor.doctorImageURL!, + width: 50.h, + height: 50.h, + fit: BoxFit.cover, + ).circle(100), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + SizedBox( + width: MediaQuery.of(context).size.width * 0.49, + child: "${bookAppointmentsViewModel.selectedDoctor.doctorTitle} ${bookAppointmentsViewModel.selectedDoctor.name}" + .toString() + .toText16(isBold: true, maxlines: 1), + ), + Image.network( + bookAppointmentsViewModel.selectedDoctor.nationalityFlagURL!, + width: 20.h, + height: 15.h, + fit: BoxFit.cover, + ), + ], + ), + SizedBox(height: 2.h), + (bookAppointmentsViewModel.selectedDoctor.speciality!.isNotEmpty ? bookAppointmentsViewModel.selectedDoctor.speciality!.first : "") + .toString() + .toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor, maxLine: 1), + ], + ), + ], + ), + SizedBox(height: 12.h), + Wrap( + direction: Axis.horizontal, + spacing: 8.h, + runSpacing: 8.h, + children: [ + AppCustomChipWidget( + labelText: "${LocaleKeys.clinic.tr(context: context)}: ${bookAppointmentsViewModel.selectedDoctor.clinicName}".needTranslation, + ), + AppCustomChipWidget( + labelText: "${LocaleKeys.branch.tr(context: context)} ${bookAppointmentsViewModel.selectedDoctor.projectName}".needTranslation, + ), + AppCustomChipWidget( + labelText: + "${LocaleKeys.date.tr(context: context)}: ${bookAppointmentsViewModel.isWaitingAppointmentSelected ? DateUtil.formatDateToDate(DateTime.now(), false) : bookAppointmentsViewModel.selectedAppointmentDate}" + .needTranslation, + ), + AppCustomChipWidget( + labelText: + "${LocaleKeys.time.tr(context: context)}: ${bookAppointmentsViewModel.isWaitingAppointmentSelected ? "Waiting Appointment".needTranslation : bookAppointmentsViewModel.selectedAppointmentTime}" + .needTranslation, + ), + ], + ), + ], + ), ), ), - ), - SizedBox(height: 24.h), - "Hospital Information".needTranslation.toText16(isBold: true), - SizedBox(height: 16.h), - Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 12.h, - hasShadow: false, + SizedBox(height: 24.h), + LocaleKeys.patientInfo.tr(context: context).toText16(isBold: true), + SizedBox(height: 16.h), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Row( + children: [ + Image.asset( + appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.maleImg : AppAssets.femaleImg, + width: 52.h, + height: 52.h, + ), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}".toText16(isBold: true), + SizedBox(height: 8.h), + AppCustomChipWidget(labelText: "${appState.getAuthenticatedUser()!.age} Years Old"), + ], + ), + ], + ), + ), ), - child: Padding( - padding: EdgeInsets.all(16.h), - child: Row( - children: [ - bookAppointmentsViewModel.selectedDoctor.projectName!.toText16(isBold: true), - ], + SizedBox(height: 24.h), + "Hospital Information".needTranslation.toText16(isBold: true), + SizedBox(height: 16.h), + Container( + width: double.infinity, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.r, + hasShadow: false, + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + bookAppointmentsViewModel.selectedDoctor.projectName!.toText16(isBold: true), + SizedBox(height: 8.h), + Wrap( + direction: Axis.horizontal, + spacing: 8.w, + runSpacing: 8.h, + children: [ + AppCustomChipWidget( + labelText: bookAppointmentsVM.isAppointmentNearestGateLoading + ? "Floor: Ground Floor" + : "Floor: ${getIt.get().isArabic() ? bookAppointmentsViewModel.appointmentNearestGateResponseModel!.clinicLocationN : bookAppointmentsViewModel.appointmentNearestGateResponseModel!.clinicLocation}", + ).toShimmer2(isShow: bookAppointmentsVM.isAppointmentNearestGateLoading), + AppCustomChipWidget( + labelText: + "Nearest Gate: ${getIt.get().isArabic() ? bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumberN : bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumber}") + .toShimmer2(isShow: bookAppointmentsVM.isAppointmentNearestGateLoading), + ], + ), + ], + ), ), ), - ), - ], - ), - ), + ], + ), + ); + }), ), ), Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, - borderRadius: 24.h, + borderRadius: 24.r, hasShadow: true, ), child: CustomButton( diff --git a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_online_checkin_sheet.dart b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_online_checkin_sheet.dart index 8a04843..4a2a304 100644 --- a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_online_checkin_sheet.dart +++ b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_online_checkin_sheet.dart @@ -142,6 +142,7 @@ class WaitingAppointmentOnlineCheckinSheet extends StatelessWidget { bookAppointmentsViewModel.waitingAppointmentProjectID, onSuccess: (value) { LoaderBottomSheet.hideLoader(); + bookAppointmentsViewModel.getAppointmentNearestGate(projectID: bookAppointmentsViewModel.waitingAppointmentProjectID, clinicID: bookAppointmentsViewModel.waitingAppointmentDoctor!.clinicID!); bookAppointmentsViewModel.setIsWaitingAppointmentSelected(true); Navigator.of(context).push( CustomPageRoute( diff --git a/lib/presentation/book_appointment/widgets/appointment_calendar.dart b/lib/presentation/book_appointment/widgets/appointment_calendar.dart index b2666b6..3a9f57d 100644 --- a/lib/presentation/book_appointment/widgets/appointment_calendar.dart +++ b/lib/presentation/book_appointment/widgets/appointment_calendar.dart @@ -185,6 +185,7 @@ class _AppointmentCalendarState extends State { ), ); } else { + bookAppointmentsViewModel.getAppointmentNearestGate(projectID: bookAppointmentsViewModel.selectedDoctor.projectID!, clinicID: bookAppointmentsViewModel.selectedDoctor.clinicID!); bookAppointmentsViewModel.setSelectedAppointmentDateTime(selectedDate, selectedTime); Navigator.of(context).pop(); Navigator.of(context).push( From e9590a15d384ebf448424e87511285d95967e2c0 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 31 Dec 2025 12:39:15 +0300 Subject: [PATCH 48/55] updates & fixes --- .../appointment_details_page.dart | 1 - .../appointments/my_appointments_page.dart | 81 ++----------------- lib/presentation/lab/lab_orders_page.dart | 2 +- 3 files changed, 9 insertions(+), 75 deletions(-) diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index 7b2439c..dae8d25 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -155,7 +155,6 @@ class _AppointmentDetailsPageState extends State { isFullScreen: false, ); }); - var isEventAddedOrRemoved = await CalenderUtilsNew.instance.checkAndRemove( id:"${widget.patientAppointmentHistoryResponseModel.appointmentNo}", ); setState(() { myAppointmentsViewModel.setAppointmentReminder(isEventAddedOrRemoved, widget.patientAppointmentHistoryResponseModel); diff --git a/lib/presentation/appointments/my_appointments_page.dart b/lib/presentation/appointments/my_appointments_page.dart index abf2464..eb72bc6 100644 --- a/lib/presentation/appointments/my_appointments_page.dart +++ b/lib/presentation/appointments/my_appointments_page.dart @@ -22,6 +22,7 @@ import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointme 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/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/date_range_calender.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; @@ -187,18 +188,9 @@ class _MyAppointmentsPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - CustomButton( - text: "${myAppointmentsVM.patientAppointmentsViewList[index].patientDoctorAppointmentList!.length} Appointments", - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 30.h, - ), + AppCustomChipWidget( + labelText: + "${myAppointmentsVM.patientAppointmentsViewList[index].patientDoctorAppointmentList!.length} Appointments"), Icon(isExpanded ? Icons.expand_less : Icons.expand_more), ], ), @@ -224,7 +216,7 @@ class _MyAppointmentsPageState extends State { child: isExpanded ? Container( key: ValueKey(index), - padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), + padding: EdgeInsets.symmetric(horizontal: 0.w, vertical: 0.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -232,63 +224,6 @@ class _MyAppointmentsPageState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Image.network( - appointment.doctorImageURL!, - width: 24.h, - height: 24.h, - fit: BoxFit.fill, - ).circle(100), - SizedBox(width: 8.h), - Expanded(child: appointment.doctorNameObj!.toText14(weight: FontWeight.w500)), - ], - ), - SizedBox(height: 8.h), - Row( - children: [ - CustomButton( - text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(appointment.appointmentDate), false), - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 24.h, - ), - SizedBox(width: 8.h), - CustomButton( - text: myAppointmentsVM.isAppointmentsSortByClinic ? appointment.projectName! : appointment.clinicName!, - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 24.h, - ), - SizedBox(width: 8.h), - CustomButton( - text: appointment.statusDesc ?? "", - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 24.h, - ), - ], - ), - SizedBox(height: 8.h), AppointmentCard( patientAppointmentHistoryResponseModel: appointment, myAppointmentsViewModel: myAppointmentsViewModel, @@ -296,9 +231,9 @@ class _MyAppointmentsPageState extends State { isLoading: false, isFromHomePage: false, ), - SizedBox(height: 12.h), - Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), - SizedBox(height: 12.h), + SizedBox(height: 8.h), + Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h).paddingSymmetrical(16.w, 0.h), + SizedBox(height: 8.h), ], ); }), diff --git a/lib/presentation/lab/lab_orders_page.dart b/lib/presentation/lab/lab_orders_page.dart index c131275..90651f1 100644 --- a/lib/presentation/lab/lab_orders_page.dart +++ b/lib/presentation/lab/lab_orders_page.dart @@ -1 +1 @@ -import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return CollapsingToolbar( title: LocaleKeys.labResults.tr(), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: Consumer( builder: (context, model, child) { return SingleChildScrollView( physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.all(24.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, "By Visit".needTranslation), CustomTabBarModel(null, "By Test".needTranslation), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), ), ], ), if (activeIndex == 0) Padding( padding: EdgeInsets.symmetric(vertical: 10.h), child: Row( children: [ CustomButton( text: LocaleKeys.byClinic.tr(context: context), onPressed: () { model.setIsSortByClinic(true); }, backgroundColor: model.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, borderColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), textColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), SizedBox(width: 8.h), CustomButton( text: LocaleKeys.byHospital.tr(context: context), onPressed: () { model.setIsSortByClinic(false); }, backgroundColor: model.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, borderColor: model.isSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, textColor: model.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ], ), ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? // By Visit - show grouped view when available model.isLabOrdersLoading ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: 5, itemBuilder: (context, index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ), ) : (model.patientLabOrdersViewList.isNotEmpty ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.patientLabOrdersViewList.length, itemBuilder: (context, index) { final group = model.patientLabOrdersViewList[index]; final isExpanded = expandedIndex == index; return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, margin: EdgeInsets.symmetric(vertical: 8.h), decoration: RoundedRectangleBorder() .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), child: InkWell( onTap: () { setState(() { expandedIndex = isExpanded ? null : index; }); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.all(16.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ CustomButton( text: "${group.length} ${'results'.needTranslation}", onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 30.h, ), Icon(isExpanded ? Icons.expand_less : Icons.expand_more), ], ), SizedBox(height: 8.h), Text( model.isSortByClinic ? (group.first.clinicDescription ?? 'Unknown') : (group.first.projectName ?? 'Unknown'), style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w600), overflow: TextOverflow.ellipsis, ), ], ), ), AnimatedSwitcher( duration: Duration(milliseconds: 500), switchInCurve: Curves.easeIn, switchOutCurve: Curves.easeOut, transitionBuilder: (Widget child, Animation animation) { return FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, axisAlignment: 0.0, child: child, ), ); }, child: isExpanded ? Container( key: ValueKey(index), padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ...group.map((order) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisSize: MainAxisSize.min, children: [ Image.network( order.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", width: 24.h, height: 24.h, fit: BoxFit.cover, ).circle(100), SizedBox(width: 8.h), Expanded(child: (order.doctorName ?? order.doctorNameEnglish ?? "").toString().toText14(weight: FontWeight.w500)), ], ), SizedBox(height: 8.h), Row( children: [ CustomButton( text: ("Order No: ".needTranslation + order.orderNo!), onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 24.h, ), SizedBox(width: 8.h), CustomButton( text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 24.h, ), ], ), SizedBox(height: 8.h), Row( children: [ CustomButton( text: model.isSortByClinic ? (order.clinicDescription ?? "") : (order.projectName ?? ""), onPressed: () {}, backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, fontSize: 10, fontWeight: FontWeight.w500, borderRadius: 8, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 24.h, ), ], ), // SizedBox(height: 8.h), Row( children: [ Expanded(flex: 2, child: SizedBox()), // Expanded( // flex: 1, // child: Container( // height: 40.h, // width: 40.w, // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( // color: AppColors.textColor, // borderRadius: 12, // ), // child: Padding( // padding: EdgeInsets.all(12.h), // child: Transform.flip( // flipX: _appState.isArabic(), // child: Utils.buildSvgWithAssets( // icon: AppAssets.forward_arrow_icon_small, // iconColor: AppColors.whiteColor, // fit: BoxFit.contain, // ), // ), // ), // ).onPress(() { // model.currentlySelectedPatientOrder = order; // labProvider.getPatientLabResultByHospital(order); // labProvider.getPatientSpecialResult(order); // Navigator.of(context).push( // CustomPageRoute(page: LabResultByClinic(labOrder: order)), // ); // }), // ) Expanded( flex:2, child: CustomButton( icon: AppAssets.view_report_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, text: "View Results".needTranslation, onPressed: () { model.currentlySelectedPatientOrder = order; labProvider.getPatientLabResultByHospital(order); labProvider.getPatientSpecialResult(order); Navigator.of(context).push( CustomPageRoute(page: LabResultByClinic(labOrder: order)), ); }, backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, fontSize: 14, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ) ], ), SizedBox(height: 12.h), Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), SizedBox(height: 12.h), ], ); }).toList(), ], ), ) : SizedBox.shrink(), ), ], ), ), ), ), )); }, ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation)) : // By Test or other tabs keep existing behavior (model.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) : AlphabeticScroll( alpahbetsAvailable: model.indexedCharacterForUniqueTest, details: model.uniqueTestsList, labViewModel: model, rangeViewModel: rangeViewModel, appState: _appState, ) ], ) ); }, ), ); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file +import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.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/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return CollapsingToolbar( title: LocaleKeys.labResults.tr(), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: Consumer( builder: (context, model, child) { return SingleChildScrollView( physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.all(24.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, "By Visit".needTranslation), CustomTabBarModel(null, "By Test".needTranslation), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), ), ], ), if (activeIndex == 0) Padding( padding: EdgeInsets.symmetric(vertical: 10.h), child: Row( children: [ CustomButton( text: LocaleKeys.byClinic.tr(context: context), onPressed: () { model.setIsSortByClinic(true); }, backgroundColor: model.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, borderColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), textColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), SizedBox(width: 8.h), CustomButton( text: LocaleKeys.byHospital.tr(context: context), onPressed: () { model.setIsSortByClinic(false); }, backgroundColor: model.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, borderColor: model.isSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, textColor: model.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ], ), ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? // By Visit - show grouped view when available model.isLabOrdersLoading ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: 5, itemBuilder: (context, index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ), ) : (model.patientLabOrdersViewList.isNotEmpty ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.patientLabOrdersViewList.length, itemBuilder: (context, index) { final group = model.patientLabOrdersViewList[index]; final isExpanded = expandedIndex == index; return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, margin: EdgeInsets.symmetric(vertical: 8.h), decoration: RoundedRectangleBorder() .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), child: InkWell( onTap: () { setState(() { expandedIndex = isExpanded ? null : index; }); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.all(16.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ AppCustomChipWidget(labelText: "${group.length} ${'results'.needTranslation}"), Icon(isExpanded ? Icons.expand_less : Icons.expand_more), ], ), SizedBox(height: 8.h), Text( model.isSortByClinic ? (group.first.clinicDescription ?? 'Unknown') : (group.first.projectName ?? 'Unknown'), style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w600), overflow: TextOverflow.ellipsis, ), ], ), ), AnimatedSwitcher( duration: Duration(milliseconds: 500), switchInCurve: Curves.easeIn, switchOutCurve: Curves.easeOut, transitionBuilder: (Widget child, Animation animation) { return FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, axisAlignment: 0.0, child: child, ), ); }, child: isExpanded ? Container( key: ValueKey(index), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 0.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ...group.map((order) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisSize: MainAxisSize.min, children: [ Image.network( order.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", width: 24.w, height: 24.h, fit: BoxFit.cover, ).circle(100), SizedBox(width: 8.h), Expanded(child: (order.doctorName ?? order.doctorNameEnglish ?? "").toString().toText14(weight: FontWeight.w500)), ], ), SizedBox(height: 8.h), Wrap( direction: Axis.horizontal, spacing: 4.h, runSpacing: 4.h, children: [ AppCustomChipWidget( labelText: ("Order No: ".needTranslation + order.orderNo!), ), AppCustomChipWidget( labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), ), AppCustomChipWidget( labelText: model.isSortByClinic ? (order.clinicDescription ?? "") : (order.projectName ?? ""), ), ], ), // Row( // children: [ // CustomButton( // text: ("Order No: ".needTranslation + order.orderNo!), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // SizedBox(width: 8.h), // CustomButton( // text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), // SizedBox(height: 8.h), // Row( // children: [ // CustomButton( // text: model.isSortByClinic ? (order.clinicDescription ?? "") : (order.projectName ?? ""), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), SizedBox(height: 12.h), Row( children: [ Expanded(flex: 2, child: SizedBox()), // Expanded( // flex: 1, // child: Container( // height: 40.h, // width: 40.w, // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( // color: AppColors.textColor, // borderRadius: 12, // ), // child: Padding( // padding: EdgeInsets.all(12.h), // child: Transform.flip( // flipX: _appState.isArabic(), // child: Utils.buildSvgWithAssets( // icon: AppAssets.forward_arrow_icon_small, // iconColor: AppColors.whiteColor, // fit: BoxFit.contain, // ), // ), // ), // ).onPress(() { // model.currentlySelectedPatientOrder = order; // labProvider.getPatientLabResultByHospital(order); // labProvider.getPatientSpecialResult(order); // Navigator.of(context).push( // CustomPageRoute(page: LabResultByClinic(labOrder: order)), // ); // }), // ) Expanded( flex:2, child: CustomButton( icon: AppAssets.view_report_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, text: "View Results".needTranslation, onPressed: () { model.currentlySelectedPatientOrder = order; labProvider.getPatientLabResultByHospital(order); labProvider.getPatientSpecialResult(order); Navigator.of(context).push( CustomPageRoute(page: LabResultByClinic(labOrder: order)), ); }, backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, fontSize: 14, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ) ], ), SizedBox(height: 12.h), Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), SizedBox(height: 12.h), ], ); }).toList(), ], ), ) : SizedBox.shrink(), ), ], ), ), ), ), )); }, ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation)) : // By Test or other tabs keep existing behavior (model.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) : AlphabeticScroll( alpahbetsAvailable: model.indexedCharacterForUniqueTest, details: model.uniqueTestsList, labViewModel: model, rangeViewModel: rangeViewModel, appState: _appState, ) ], ) ); }, ), ); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file From 0e2de5a55dad1de41a271794ea2249c739f9401e Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Wed, 31 Dec 2025 15:43:00 +0300 Subject: [PATCH 49/55] Completed Graph --- .../water_monitor/water_monitor_repo.dart | 18 +- .../water_monitor_view_model.dart | 49 +++- .../water_consumption_screen.dart | 244 ++++++++++++++---- .../widgets/water_action_buttons_widget.dart | 14 +- 4 files changed, 262 insertions(+), 63 deletions(-) diff --git a/lib/features/water_monitor/water_monitor_repo.dart b/lib/features/water_monitor/water_monitor_repo.dart index 73c2ea2..14a74a7 100644 --- a/lib/features/water_monitor/water_monitor_repo.dart +++ b/lib/features/water_monitor/water_monitor_repo.dart @@ -127,9 +127,17 @@ class WaterMonitorRepoImp implements WaterMonitorRepo { }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { try { - // Try a few likely nested keys and fall back to the full response + // Extract progress data and history data dynamic extracted; + dynamic historyData; + if (response is Map) { + // Extract history data (available for all progress types) + if (response.containsKey('UserProgressHistoryData')) { + historyData = response['UserProgressHistoryData']; + } + + // Extract progress data based on type switch (progressType) { case ProgressType.today: if (response.containsKey('UserProgressForTodayData')) { @@ -162,11 +170,17 @@ class WaterMonitorRepoImp implements WaterMonitorRepo { extracted = response; } + // Package both progress data and history data + final combinedData = { + 'progressData': extracted, + 'historyData': historyData, + }; + apiResponse = GenericApiModel( messageStatus: messageStatus, statusCode: statusCode, errorMessage: errorMessage, - data: extracted, + data: combinedData, ); } catch (e) { failure = DataParsingFailure(e.toString()); diff --git a/lib/features/water_monitor/water_monitor_view_model.dart b/lib/features/water_monitor/water_monitor_view_model.dart index c079b5e..2e3dbc3 100644 --- a/lib/features/water_monitor/water_monitor_view_model.dart +++ b/lib/features/water_monitor/water_monitor_view_model.dart @@ -152,6 +152,20 @@ class WaterMonitorViewModel extends ChangeNotifier { } } + /// Map selected duration to ProgressType enum + int _getProgressIdFromDuration() { + switch (_selectedDuration) { + case 'Daily': + return 1; + case 'Weekly': + return 2; + case 'Monthly': + return 3; + default: + return 1; + } + } + /// Fetch user progress data based on selected duration Future fetchUserProgressForMonitoring() async { try { @@ -182,11 +196,34 @@ class WaterMonitorViewModel extends ChangeNotifier { // Parse the response based on progress type try { - if (apiModel.data != null && apiModel.data is List) { + // Extract progressData and historyData from combined response + dynamic progressData; + dynamic historyData; + + if (apiModel.data is Map && apiModel.data.containsKey('progressData')) { + progressData = apiModel.data['progressData']; + historyData = apiModel.data['historyData']; + } else { + // Fallback to old structure + progressData = apiModel.data; + } + + // Parse history data (available for all progress types, especially for daily) + if (historyData != null && historyData is List) { + _historyList.clear(); + for (var item in historyData) { + if (item is Map) { + _historyList.add(UserProgressHistoryModel.fromJson(item as Map)); + } + } + log('History data parsed: ${_historyList.length} items'); + } + + if (progressData != null && progressData is List) { switch (progressType) { case ProgressType.today: _todayProgressList.clear(); - for (var item in apiModel.data) { + for (var item in progressData) { if (item is Map) { _todayProgressList.add(UserProgressForTodayModel.fromJson(item as Map)); } @@ -209,7 +246,7 @@ class WaterMonitorViewModel extends ChangeNotifier { case ProgressType.week: _weekProgressList.clear(); - for (var item in apiModel.data) { + for (var item in progressData) { if (item is Map) { _weekProgressList.add(UserProgressForWeekModel.fromJson(item as Map)); } @@ -219,7 +256,7 @@ class WaterMonitorViewModel extends ChangeNotifier { case ProgressType.month: _monthProgressList.clear(); - for (var item in apiModel.data) { + for (var item in progressData) { if (item is Map) { _monthProgressList.add(UserProgressForMonthModel.fromJson(item as Map)); } @@ -1036,7 +1073,7 @@ class WaterMonitorViewModel extends ChangeNotifier { // Create request model final requestModel = UndoUserActivityRequestModel( - progress: 1, + progress: _getProgressIdFromDuration(), mobileNumber: mobile, identificationNo: identification, ); @@ -1076,7 +1113,7 @@ class WaterMonitorViewModel extends ChangeNotifier { } } } - + fetchUserProgressForMonitoring(); _isLoading = false; notifyListeners(); return true; diff --git a/lib/presentation/water_monitor/water_consumption_screen.dart b/lib/presentation/water_monitor/water_consumption_screen.dart index a7a5e60..e91abf6 100644 --- a/lib/presentation/water_monitor/water_consumption_screen.dart +++ b/lib/presentation/water_monitor/water_consumption_screen.dart @@ -133,7 +133,7 @@ class _WaterConsumptionScreenState extends State { ], ), SizedBox(height: 12.h), - if (!viewModel.isGraphView) _buildHistoryListView(viewModel) else _buildHistoryFlowchart() + if (!viewModel.isGraphView) _buildHistoryListView(viewModel) else _buildHistoryGraph() ], ); }), @@ -162,6 +162,37 @@ class _WaterConsumptionScreenState extends State { subTitle: "${todayData.percentageConsumed?.toStringAsFixed(1) ?? '0'}%", ), ); + + // Add history data if available (show ALL entries) + if (viewModel.historyList.isNotEmpty) { + listItems.add(Divider(height: 1, color: AppColors.dividerColor)); + listItems.add( + Padding( + padding: EdgeInsets.symmetric(vertical: 8.h), + child: "Water Intake History".toText14( + weight: FontWeight.w600, + color: AppColors.textColor, + ), + ), + ); + + // Show all history entries + for (var history in viewModel.historyList) { + final quantity = "${history.quantity?.toStringAsFixed(0) ?? '0'} ml"; + final time = _formatHistoryDate(history.createdDate ?? ''); + + listItems.add( + buildHistoryListTile( + title: quantity, + subTitle: time, + ), + ); + + if (history != viewModel.historyList.last) { + listItems.add(Divider(height: 1, color: AppColors.dividerColor)); + } + } + } } else { listItems.add( Center( @@ -174,10 +205,12 @@ class _WaterConsumptionScreenState extends State { } } else if (selectedDuration == 'Weekly') { if (viewModel.weekProgressList.isNotEmpty) { - // Show today + last 6 days (total 7 days) + // Show previous 6 days + today (total 7 days) + // API returns data in reverse order (today first), so we reverse it to show oldest to newest (top to bottom) + // This ensures today appears at the end (bottom) final totalDays = viewModel.weekProgressList.length; final startIndex = totalDays > 7 ? totalDays - 7 : 0; - final weekDataToShow = viewModel.weekProgressList.skip(startIndex).toList(); + final weekDataToShow = viewModel.weekProgressList.skip(startIndex).toList().reversed.toList(); for (var dayData in weekDataToShow) { listItems.add( @@ -202,11 +235,11 @@ class _WaterConsumptionScreenState extends State { } } else if (selectedDuration == 'Monthly') { if (viewModel.monthProgressList.isNotEmpty) { - // Show current month + last 6 months (total 7 months) - // Reverse order to show oldest to newest (top to bottom) + // Show last 6 months + current month (total 7 months) + // Show in chronological order: oldest to newest (top to bottom) final totalMonths = viewModel.monthProgressList.length; final startIndex = totalMonths > 7 ? totalMonths - 7 : 0; - final monthDataToShow = viewModel.monthProgressList.skip(startIndex).toList().reversed.toList(); + final monthDataToShow = viewModel.monthProgressList.skip(startIndex).toList(); for (var monthData in monthDataToShow) { listItems.add( @@ -250,7 +283,7 @@ class _WaterConsumptionScreenState extends State { ); } - Widget _buildHistoryFlowchart() { + Widget _buildHistoryGraph() { return Consumer( builder: (context, viewModel, _) { final selectedDuration = viewModel.selectedDurationFilter; @@ -259,8 +292,40 @@ class _WaterConsumptionScreenState extends State { List dataPoints = []; if (selectedDuration == 'Daily') { - // For daily, we show a single bar/point with today's percentage - if (viewModel.todayProgressList.isNotEmpty) { + // For daily, show last 7 history entries with at least 5 minutes difference + if (viewModel.historyList.isNotEmpty) { + // Filter entries with at least 5 minutes difference + List filteredPoints = []; + DateTime? lastTime; + + for (var historyItem in viewModel.historyList) { + final currentTime = _parseHistoryDate(historyItem.createdDate ?? ''); + + // Add if first entry OR if more than 5 minutes difference from last added entry + if (lastTime == null || currentTime.difference(lastTime).inMinutes.abs() >= 5) { + final quantity = historyItem.quantity?.toDouble() ?? 0.0; + final time = _formatHistoryDate(historyItem.createdDate ?? ''); + + filteredPoints.add( + DataPoint( + value: quantity, + actualValue: quantity.toStringAsFixed(0), + label: time, + displayTime: time, + unitOfMeasurement: 'ml', + time: currentTime, + ), + ); + lastTime = currentTime; + } + } + + // Take only last 7 filtered entries + final totalFiltered = filteredPoints.length; + final startIndex = totalFiltered > 7 ? totalFiltered - 7 : 0; + dataPoints = filteredPoints.skip(startIndex).toList(); + } else if (viewModel.todayProgressList.isNotEmpty) { + // Fallback: show today's percentage if no history final todayData = viewModel.todayProgressList.first; final percentage = todayData.percentageConsumed?.toDouble() ?? 0.0; dataPoints.add( @@ -275,11 +340,13 @@ class _WaterConsumptionScreenState extends State { ); } } else if (selectedDuration == 'Weekly') { - // For weekly, show today + last 6 days (total 7 days) + // For weekly, show previous 6 days + today (total 7 days) + // API returns data in reverse order (today first), so we reverse it to show oldest to newest (left to right) + // This ensures today appears at the end (right side) if (viewModel.weekProgressList.isNotEmpty) { final totalDays = viewModel.weekProgressList.length; final startIndex = totalDays > 7 ? totalDays - 7 : 0; - final weekDataToShow = viewModel.weekProgressList.skip(startIndex).toList(); + final weekDataToShow = viewModel.weekProgressList.skip(startIndex).toList().reversed.toList(); for (var dayData in weekDataToShow) { final percentage = dayData.percentageConsumed?.toDouble() ?? 0.0; @@ -297,12 +364,12 @@ class _WaterConsumptionScreenState extends State { } } } else if (selectedDuration == 'Monthly') { - // For monthly, show current month + last 6 months (total 7 months) - // Reverse order to show oldest to newest (left to right) + // For monthly, show last 6 months + current month (total 7 months) + // Show in chronological order: oldest to newest (left to right) if (viewModel.monthProgressList.isNotEmpty) { final totalMonths = viewModel.monthProgressList.length; final startIndex = totalMonths > 7 ? totalMonths - 7 : 0; - final monthDataToShow = viewModel.monthProgressList.skip(startIndex).toList().reversed.toList(); + final monthDataToShow = viewModel.monthProgressList.skip(startIndex).toList(); for (var monthData in monthDataToShow) { final percentage = monthData.percentageConsumed?.toDouble() ?? 0.0; @@ -329,9 +396,14 @@ class _WaterConsumptionScreenState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Icon(Icons.bar_chart, size: 48.w, color: AppColors.greyTextColor.withValues(alpha: 0.5)), + Utils.buildSvgWithAssets( + icon: AppAssets.graphIcon, + iconColor: AppColors.greyTextColor.withValues(alpha: 0.5), + height: 32.w, + width: 32.w, + ), SizedBox(height: 12.h), - "No chart data available".toText14(color: AppColors.greyTextColor), + "No graph data available".toText14(color: AppColors.greyTextColor), ], ), ), @@ -346,43 +418,85 @@ class _WaterConsumptionScreenState extends State { ); } - // Define ranges for percentage (0-100%) - const double low = 25.0; // Below 25% is low - const double medium = 50.0; // 25-50% is medium - const double good = 75.0; // 50-75% is good - const double maxY = 100.0; // Max is 100% + // Configure graph based on selected duration + double maxY; + double minY; + double horizontalInterval; + double leftLabelInterval; + + if (selectedDuration == 'Daily') { + // For daily (quantity in ml), use max available cup size + // Get the biggest cup from available cups + final maxCupSize = viewModel.cups.isEmpty ? 500.0 : viewModel.cups.map((cup) => cup.capacityMl.toDouble()).reduce((a, b) => a > b ? a : b); + + maxY = maxCupSize; + minY = 0; + // Divide into 4 intervals (5 labels: 0, 1/4, 1/2, 3/4, max) + horizontalInterval = maxY / 4; + leftLabelInterval = maxY / 4; + } else { + // For weekly/monthly (percentage), use 0-100% + maxY = 100.0; + minY = 0; + horizontalInterval = 25; + leftLabelInterval = 25; + } return CustomGraph( + bottomLabelReservedSize: 30, dataPoints: dataPoints, makeGraphBasedOnActualValue: true, - leftLabelReservedSize: 50.w, - leftLabelInterval: 25, + leftLabelReservedSize: 50.h, showGridLines: true, maxY: maxY, - minY: 0, + minY: minY, maxX: dataPoints.length > 1 ? dataPoints.length.toDouble() - 0.75 : 1.0, - minX: -0.2, - horizontalInterval: 25, - // Grid lines every 25% + horizontalInterval: horizontalInterval, + leftLabelInterval: leftLabelInterval, showShadow: true, getDrawingHorizontalLine: (value) { - // Draw dashed lines at 25%, 50%, 75% - if (value == low || value == medium || value == good) { - return FlLine( - color: AppColors.greyTextColor.withValues(alpha: 0.3), - strokeWidth: 1.5, - dashArray: [8, 4], - ); + // Draw dashed lines at intervals + if (selectedDuration == 'Daily') { + // For daily, draw lines every 50 or 100 ml + if (value % horizontalInterval == 0 && value > 0) { + return FlLine( + color: AppColors.greyTextColor.withValues(alpha: 0.3), + strokeWidth: 1.5, + dashArray: [8, 4], + ); + } + } else { + // For weekly/monthly, draw lines at 25%, 50%, 75% + if (value == 25 || value == 50 || value == 75) { + return FlLine( + color: AppColors.successColor.withValues(alpha: 0.3), + strokeWidth: 1.5, + dashArray: [8, 4], + ); + } } return FlLine(color: AppColors.transparent, strokeWidth: 0); }, leftLabelFormatter: (value) { - // Show percentage labels at key points - if (value == 0) return '0%'.toText10(weight: FontWeight.w600); - if (value == 25) return '25%'.toText10(weight: FontWeight.w600); - if (value == 50) return '50%'.toText10(weight: FontWeight.w600); - if (value == 75) return '75%'.toText10(weight: FontWeight.w600); - if (value == 100) return '100%'.toText10(weight: FontWeight.w600); + if (selectedDuration == 'Daily') { + // Show exactly 5 labels: 0, 1/4, 1/2, 3/4, max + // Check if value matches one of the 5 positions + final interval = maxY / 4; + final positions = [0.0, interval, interval * 2, interval * 3, maxY]; + + for (var position in positions) { + if ((value - position).abs() < 1) { + return '${value.toInt()}ml'.toText10(weight: FontWeight.w600); + } + } + } else { + // Show percentage labels + if (value == 0) return '0%'.toText10(weight: FontWeight.w600); + if (value == 25) return '25%'.toText10(weight: FontWeight.w600); + if (value == 50) return '50%'.toText10(weight: FontWeight.w600); + if (value == 75) return '75%'.toText10(weight: FontWeight.w600); + if (value == 100) return '100%'.toText10(weight: FontWeight.w600); + } return SizedBox.shrink(); }, graphColor: AppColors.successColor, @@ -398,12 +512,12 @@ class _WaterConsumptionScreenState extends State { int index = value.round(); if (index < 0 || index >= data.length) return SizedBox.shrink(); - // For daily, show only index 0 - if (selectedDuration == 'Daily' && index == 0) { + // For daily, show all 7 time labels (last 7 entries) + if (selectedDuration == 'Daily' && index < 7) { return Padding( - padding: EdgeInsets.only(top: 8.h), - child: data[index].label.toText10( - weight: FontWeight.w600, + padding: EdgeInsets.only(top: 5.h), + child: data[index].label.toText8( + fontWeight: FontWeight.w600, color: AppColors.labelTextColor, ), ); @@ -412,7 +526,7 @@ class _WaterConsumptionScreenState extends State { // For weekly, show all 7 days (today + last 6 days) if (selectedDuration == 'Weekly' && index < 7) { return Padding( - padding: EdgeInsets.only(top: 8.h), + padding: EdgeInsets.only(top: 5.h), child: data[index].label.toText10( weight: FontWeight.w600, color: AppColors.labelTextColor, @@ -423,7 +537,7 @@ class _WaterConsumptionScreenState extends State { // For monthly, show all 7 months (current month + last 6 months) if (selectedDuration == 'Monthly' && index < 7) { return Padding( - padding: EdgeInsets.only(top: 8.h), + padding: EdgeInsets.only(top: 5.h), child: data[index].label.toText10( weight: FontWeight.w600, color: AppColors.labelTextColor, @@ -626,6 +740,42 @@ class _WaterConsumptionScreenState extends State { return '${hour12.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')} $period'; } + /// Format history date from /Date(milliseconds+0300)/ format + String _formatHistoryDate(String dateString) { + try { + // Parse the /Date(milliseconds+0300)/ format + final regex = RegExp(r'\/Date\((\d+)'); + final match = regex.firstMatch(dateString); + if (match != null) { + final milliseconds = int.tryParse(match.group(1)!); + if (milliseconds != null) { + final dateTime = DateTime.fromMillisecondsSinceEpoch(milliseconds); + return _formatTime(dateTime); + } + } + } catch (e) { + return dateString; + } + return dateString; + } + + /// Parse history date from /Date(milliseconds+0300)/ format to DateTime + DateTime _parseHistoryDate(String dateString) { + try { + final regex = RegExp(r'\/Date\((\d+)'); + final match = regex.firstMatch(dateString); + if (match != null) { + final milliseconds = int.tryParse(match.group(1)!); + if (milliseconds != null) { + return DateTime.fromMillisecondsSinceEpoch(milliseconds); + } + } + } catch (e) { + // Return current time as fallback + } + return DateTime.now(); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart b/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart index 510926c..31f8fdb 100644 --- a/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart +++ b/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart @@ -30,8 +30,8 @@ class WaterActionButtonsWidget extends StatelessWidget { }, child: Utils.buildSvgWithAssets( icon: AppAssets.minimizeIcon, - height: 20.w, - width: 20.w, + height: 20.h, + width: 20.h, iconColor: AppColors.textColor, ), ), @@ -56,6 +56,8 @@ class WaterActionButtonsWidget extends StatelessWidget { }, child: Utils.buildSvgWithAssets( icon: AppAssets.addIconDark, + height: 20.h, + width: 20.h, ), ), ], @@ -96,12 +98,8 @@ class WaterActionButtonsWidget extends StatelessWidget { ); } }, - title: "Test Alert".needTranslation, - icon: Icon( - Icons.notifications_outlined, - color: AppColors.blueColor, - size: 24.w, - ), + title: "Plain Water".needTranslation, + icon: Utils.buildSvgWithAssets(icon: AppAssets.glassIcon, height: 24.w, width: 24.w), ), _buildActionButton( context: context, From 81e0680cb315da3853088b0e5319f041bb83fc2a Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Wed, 31 Dec 2025 17:00:37 +0300 Subject: [PATCH 50/55] fixed routing again and again. --- .../water_monitor_settings_screen.dart | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/lib/presentation/water_monitor/water_monitor_settings_screen.dart b/lib/presentation/water_monitor/water_monitor_settings_screen.dart index 45a39e6..ca42b26 100644 --- a/lib/presentation/water_monitor/water_monitor_settings_screen.dart +++ b/lib/presentation/water_monitor/water_monitor_settings_screen.dart @@ -20,22 +20,8 @@ class WaterMonitorSettingsScreen extends StatefulWidget { } class _WaterMonitorSettingsScreenState extends State { - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - context.read().initialize(); - }); - } - - void _showSnackbar(String text) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(text), - backgroundColor: AppColors.errorColor, - ), - ); - } + // No need to call initialize() here since it's already called in water_consumption_screen + // The ViewModel is shared via Provider, so data is already loaded // Reusable method to build selection row widget Widget _buildSelectionRow({ From 40f6cafb4870aa1958dddcfc064e40871c450ddf Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Wed, 31 Dec 2025 17:10:12 +0300 Subject: [PATCH 51/55] fixed routing again and again. --- lib/features/water_monitor/water_monitor_view_model.dart | 1 - .../water_monitor/water_monitor_settings_screen.dart | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/features/water_monitor/water_monitor_view_model.dart b/lib/features/water_monitor/water_monitor_view_model.dart index 2e3dbc3..787dc05 100644 --- a/lib/features/water_monitor/water_monitor_view_model.dart +++ b/lib/features/water_monitor/water_monitor_view_model.dart @@ -641,7 +641,6 @@ class WaterMonitorViewModel extends ChangeNotifier { (apiModel) async { // Update local data with response _userDetailData = apiModel.data; - // Fetch daily progress to get the updated goal and consumed data from API await fetchUserProgressForMonitoring(); diff --git a/lib/presentation/water_monitor/water_monitor_settings_screen.dart b/lib/presentation/water_monitor/water_monitor_settings_screen.dart index ca42b26..4e89d71 100644 --- a/lib/presentation/water_monitor/water_monitor_settings_screen.dart +++ b/lib/presentation/water_monitor/water_monitor_settings_screen.dart @@ -336,9 +336,7 @@ class _WaterMonitorSettingsScreenState extends State content: Text(message), duration: const Duration(seconds: 3), behavior: SnackBarBehavior.floating, - backgroundColor: message.contains('successfully') - ? Colors.green - : AppColors.errorColor, + backgroundColor: message.contains('successfully') ? Colors.green : AppColors.errorColor, ), ); } From afe169d2d9f883ce6bd077c0fc0c45b5c59bab93 Mon Sep 17 00:00:00 2001 From: Sultan khan Date: Wed, 31 Dec 2025 17:17:46 +0300 Subject: [PATCH 52/55] silent login fix --- .../authentication/authentication_repo.dart | 8 +- .../hmg_services/hmg_services_repo.dart | 54 +++ .../hmg_services/hmg_services_view_model.dart | 39 +++ .../resq_models/vital_sign_respo_model.dart | 259 +++++++++++++++ .../covid19test/covid_19_questionnaire.dart | 2 +- .../hmg_services/services_page.dart | 28 +- .../vital_sign/vital_sign_page.dart | 308 ++++++++++++++++++ lib/routes/app_routes.dart | 5 +- 8 files changed, 688 insertions(+), 15 deletions(-) create mode 100644 lib/features/hmg_services/models/resq_models/vital_sign_respo_model.dart create mode 100644 lib/presentation/vital_sign/vital_sign_page.dart diff --git a/lib/features/authentication/authentication_repo.dart b/lib/features/authentication/authentication_repo.dart index 4a1517c..9b09c43 100644 --- a/lib/features/authentication/authentication_repo.dart +++ b/lib/features/authentication/authentication_repo.dart @@ -260,10 +260,10 @@ class AuthenticationRepoImp implements AuthenticationRepo { newRequest.forRegisteration = newRequest.isRegister ?? false; newRequest.isRegister = false; //silent login case removed token and login token - // if(newRequest.logInTokenID.isEmpty && newRequest.isSilentLogin == true && (newRequest.loginType==1 || newRequest.loginType==4)) { - // newRequest.logInTokenID = null; - // newRequest.deviceToken = null; - // } + if(newRequest.logInTokenID.isEmpty && newRequest.isSilentLogin == true && (newRequest.loginType==1 || newRequest.loginType==4)) { + newRequest.logInTokenID = null; + newRequest.deviceToken = null; + } } diff --git a/lib/features/hmg_services/hmg_services_repo.dart b/lib/features/hmg_services/hmg_services_repo.dart index 851ac93..37a813d 100644 --- a/lib/features/hmg_services/hmg_services_repo.dart +++ b/lib/features/hmg_services/hmg_services_repo.dart @@ -21,6 +21,7 @@ import 'models/resq_models/covid_get_test_proceedure_resp.dart'; import 'models/resq_models/get_covid_payment_info_resp.dart'; import 'models/resq_models/relationship_type_resp_mode.dart'; import 'models/resq_models/search_e_referral_resp_model.dart'; +import 'models/resq_models/vital_sign_respo_model.dart'; abstract class HmgServicesRepo { Future>>> getAllComprehensiveCheckupOrders(); @@ -65,6 +66,8 @@ abstract class HmgServicesRepo { Future>>> getCovidTestProcedures(); Future>> getCovidPaymentInfo(String procedureID, int projectID); + + Future>>> getPatientVitalSign(); } class HmgServicesRepoImp implements HmgServicesRepo { @@ -913,5 +916,56 @@ class HmgServicesRepoImp implements HmgServicesRepo { } } + @override + Future>>> getPatientVitalSign() async { + Map requestBody = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + + await apiClient.post( + GET_PATIENT_VITAL_SIGN, + body: requestBody, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + loggerService.logError("Patient Vital Sign API Failed: $error, Status: $statusCode"); + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + List vitalSignList = []; + + if (response['PatientVitalSignList'] != null && response['PatientVitalSignList'] is List) { + final vitalSignsList = response['PatientVitalSignList'] as List; + + for (var vitalSignJson in vitalSignsList) { + if (vitalSignJson is Map) { + vitalSignList.add(VitalSignResModel.fromJson(vitalSignJson)); + } + } + } + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: errorMessage, + data: vitalSignList, + ); + } catch (e) { + loggerService.logError("Error parsing Patient Vital Sign: ${e.toString()}"); + failure = DataParsingFailure(e.toString()); + } + }, + ); + + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + log("Unknown error in getPatientVitalSign: ${e.toString()}"); + return Left(UnknownFailure(e.toString())); + } + } + } diff --git a/lib/features/hmg_services/hmg_services_view_model.dart b/lib/features/hmg_services/hmg_services_view_model.dart index d702cab..b620c6d 100644 --- a/lib/features/hmg_services/hmg_services_view_model.dart +++ b/lib/features/hmg_services/hmg_services_view_model.dart @@ -15,6 +15,7 @@ import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_all_orders_resp_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/get_cmc_services_resp_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/search_e_referral_resp_model.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/vital_sign_respo_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart'; import 'package:hmg_patient_app_new/services/error_handler_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; @@ -37,6 +38,7 @@ class HmgServicesViewModel extends ChangeNotifier { bool isCmcServicesLoading = false; bool isUpdatingOrder = false; bool isHospitalListLoading = false; + bool isVitalSignLoading = false; // HHC specific loading states bool isHhcOrdersLoading = false; @@ -47,6 +49,7 @@ class HmgServicesViewModel extends ChangeNotifier { List hospitalsList = []; List filteredHospitalsList = []; HospitalsModel? selectedHospital; + List vitalSignList = []; // HHC specific lists List hhcOrdersList = []; @@ -857,4 +860,40 @@ class HmgServicesViewModel extends ChangeNotifier { }, ); } + + Future getPatientVitalSign({ + Function(dynamic)? onSuccess, + Function(String)? onError, + }) async { + isVitalSignLoading = true; + notifyListeners(); + + final result = await hmgServicesRepo.getPatientVitalSign(); + + result.fold( + (failure) async { + isVitalSignLoading = false; + notifyListeners(); + await errorHandlerService.handleError(failure: failure); + if (onError != null) { + onError(failure.toString()); + } + }, + (apiResponse) { + isVitalSignLoading = false; + if (apiResponse.messageStatus == 1) { + vitalSignList = apiResponse.data ?? []; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } else { + notifyListeners(); + if (onError != null) { + onError(apiResponse.errorMessage ?? 'Unknown error'); + } + } + }, + ); + } } diff --git a/lib/features/hmg_services/models/resq_models/vital_sign_respo_model.dart b/lib/features/hmg_services/models/resq_models/vital_sign_respo_model.dart new file mode 100644 index 0000000..bc93f59 --- /dev/null +++ b/lib/features/hmg_services/models/resq_models/vital_sign_respo_model.dart @@ -0,0 +1,259 @@ +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; + +class VitalSignResModel { + var transNo; + var projectID; + var weightKg; + var heightCm; + var temperatureCelcius; + var pulseBeatPerMinute; + var respirationBeatPerMinute; + var bloodPressureLower; + var bloodPressureHigher; + var sAO2; + var fIO2; + var painScore; + var bodyMassIndex; + var headCircumCm; + var leanBodyWeightLbs; + var idealBodyWeightLbs; + var temperatureCelciusMethod; + var pulseRhythm; + var respirationPattern; + var bloodPressureCuffLocation; + var bloodPressureCuffSize; + var bloodPressurePatientPosition; + var painLocation; + var painDuration; + var painCharacter; + var painFrequency; + bool? isPainManagementDone; + var status; + bool? isVitalsRequired; + var patientID; + var createdOn; + var doctorID; + var clinicID; + var triageCategory; + var gCScore; + var lineItemNo; + DateTime? vitalSignDate; + var actualTimeTaken; + var sugarLevel; + var fBS; + var rBS; + var observationType; + var heartRate; + var muscleTone; + var reflexIrritability; + var bodyColor; + var isFirstAssessment; + var dateofBirth; + var timeOfBirth; + var bloodPressure; + var bloodPressureCuffLocationDesc; + var bloodPressureCuffSizeDesc; + var bloodPressurePatientPositionDesc; + var clinicName; + var doctorImageURL; + var doctorName; + var painScoreDesc; + var pulseRhythmDesc; + var respirationPatternDesc; + var temperatureCelciusMethodDesc; + var time; + + VitalSignResModel( + {this.transNo, + this.projectID, + this.weightKg, + this.heightCm, + this.temperatureCelcius, + this.pulseBeatPerMinute, + this.respirationBeatPerMinute, + this.bloodPressureLower, + this.bloodPressureHigher, + this.sAO2, + this.fIO2, + this.painScore, + this.bodyMassIndex, + this.headCircumCm, + this.leanBodyWeightLbs, + this.idealBodyWeightLbs, + this.temperatureCelciusMethod, + this.pulseRhythm, + this.respirationPattern, + this.bloodPressureCuffLocation, + this.bloodPressureCuffSize, + this.bloodPressurePatientPosition, + this.painLocation, + this.painDuration, + this.painCharacter, + this.painFrequency, + this.isPainManagementDone, + this.status, + this.isVitalsRequired, + this.patientID, + this.createdOn, + this.doctorID, + this.clinicID, + this.triageCategory, + this.gCScore, + this.lineItemNo, + this.vitalSignDate, + this.actualTimeTaken, + this.sugarLevel, + this.fBS, + this.rBS, + this.observationType, + this.heartRate, + this.muscleTone, + this.reflexIrritability, + this.bodyColor, + this.isFirstAssessment, + this.dateofBirth, + this.timeOfBirth, + this.bloodPressure, + this.bloodPressureCuffLocationDesc, + this.bloodPressureCuffSizeDesc, + this.bloodPressurePatientPositionDesc, + this.clinicName, + this.doctorImageURL, + this.doctorName, + this.painScoreDesc, + this.pulseRhythmDesc, + this.respirationPatternDesc, + this.temperatureCelciusMethodDesc, + this.time}); + + VitalSignResModel.fromJson(Map json) { + transNo = json['TransNo']; + projectID = json['ProjectID']; + weightKg = json['WeightKg']; + heightCm = json['HeightCm']; + temperatureCelcius = json['TemperatureCelcius']; + pulseBeatPerMinute = json['PulseBeatPerMinute']; + respirationBeatPerMinute = json['RespirationBeatPerMinute']; + bloodPressureLower = json['BloodPressureLower']; + bloodPressureHigher = json['BloodPressureHigher']; + sAO2 = json['SAO2']; + fIO2 = json['FIO2']; + painScore = json['PainScore']; + bodyMassIndex = json['BodyMassIndex']; + headCircumCm = json['HeadCircumCm']; + leanBodyWeightLbs = json['LeanBodyWeightLbs']; + idealBodyWeightLbs = json['IdealBodyWeightLbs']; + temperatureCelciusMethod = json['TemperatureCelciusMethod']; + pulseRhythm = json['PulseRhythm']; + respirationPattern = json['RespirationPattern']; + bloodPressureCuffLocation = json['BloodPressureCuffLocation']; + bloodPressureCuffSize = json['BloodPressureCuffSize']; + bloodPressurePatientPosition = json['BloodPressurePatientPosition']; + painLocation = json['PainLocation']; + painDuration = json['PainDuration']; + painCharacter = json['PainCharacter']; + painFrequency = json['PainFrequency']; + isPainManagementDone = json['IsPainManagementDone']; + status = json['Status']; + isVitalsRequired = json['IsVitalsRequired']; + patientID = json['PatientID']; + createdOn = json['CreatedOn']; + doctorID = json['DoctorID']; + clinicID = json['ClinicID']; + triageCategory = json['TriageCategory']; + gCScore = json['GCScore']; + lineItemNo = json['LineItemNo']; + vitalSignDate = DateUtil.convertStringToDate(json['CreatedOn']); + actualTimeTaken = json['ActualTimeTaken']; + sugarLevel = json['SugarLevel']; + fBS = json['FBS']; + rBS = json['RBS']; + observationType = json['ObservationType']; + heartRate = json['HeartRate']; + muscleTone = json['MuscleTone']; + reflexIrritability = json['ReflexIrritability']; + bodyColor = json['BodyColor']; + isFirstAssessment = json['IsFirstAssessment']; + dateofBirth = json['DateofBirth']; + timeOfBirth = json['TimeOfBirth']; + bloodPressure = json['BloodPressure']; + bloodPressureCuffLocationDesc = json['BloodPressureCuffLocationDesc']; + bloodPressureCuffSizeDesc = json['BloodPressureCuffSizeDesc']; + bloodPressurePatientPositionDesc = json['BloodPressurePatientPositionDesc']; + clinicName = json['ClinicName']; + doctorImageURL = json['DoctorImageURL']; + doctorName = json['DoctorName']; + painScoreDesc = json['PainScoreDesc']; + pulseRhythmDesc = json['PulseRhythmDesc']; + respirationPatternDesc = json['RespirationPatternDesc']; + temperatureCelciusMethodDesc = json['TemperatureCelciusMethodDesc']; + time = json['Time']; + } + + Map toJson() { + final Map data = new Map(); + data['TransNo'] = this.transNo; + data['ProjectID'] = this.projectID; + data['WeightKg'] = this.weightKg; + data['HeightCm'] = this.heightCm; + data['TemperatureCelcius'] = this.temperatureCelcius; + data['PulseBeatPerMinute'] = this.pulseBeatPerMinute; + data['RespirationBeatPerMinute'] = this.respirationBeatPerMinute; + data['BloodPressureLower'] = this.bloodPressureLower; + data['BloodPressureHigher'] = this.bloodPressureHigher; + data['SAO2'] = this.sAO2; + data['FIO2'] = this.fIO2; + data['PainScore'] = this.painScore; + data['BodyMassIndex'] = this.bodyMassIndex; + data['HeadCircumCm'] = this.headCircumCm; + data['LeanBodyWeightLbs'] = this.leanBodyWeightLbs; + data['IdealBodyWeightLbs'] = this.idealBodyWeightLbs; + data['TemperatureCelciusMethod'] = this.temperatureCelciusMethod; + data['PulseRhythm'] = this.pulseRhythm; + data['RespirationPattern'] = this.respirationPattern; + data['BloodPressureCuffLocation'] = this.bloodPressureCuffLocation; + data['BloodPressureCuffSize'] = this.bloodPressureCuffSize; + data['BloodPressurePatientPosition'] = this.bloodPressurePatientPosition; + data['PainLocation'] = this.painLocation; + data['PainDuration'] = this.painDuration; + data['PainCharacter'] = this.painCharacter; + data['PainFrequency'] = this.painFrequency; + data['IsPainManagementDone'] = this.isPainManagementDone; + data['Status'] = this.status; + data['IsVitalsRequired'] = this.isVitalsRequired; + data['PatientID'] = this.patientID; + data['CreatedOn'] = this.createdOn; + data['DoctorID'] = this.doctorID; + data['ClinicID'] = this.clinicID; + data['TriageCategory'] = this.triageCategory; + data['GCScore'] = this.gCScore; + data['LineItemNo'] = this.lineItemNo; + data['VitalSignDate'] = this.vitalSignDate; + data['ActualTimeTaken'] = this.actualTimeTaken; + data['SugarLevel'] = this.sugarLevel; + data['FBS'] = this.fBS; + data['RBS'] = this.rBS; + data['ObservationType'] = this.observationType; + data['HeartRate'] = this.heartRate; + data['MuscleTone'] = this.muscleTone; + data['ReflexIrritability'] = this.reflexIrritability; + data['BodyColor'] = this.bodyColor; + data['IsFirstAssessment'] = this.isFirstAssessment; + data['DateofBirth'] = this.dateofBirth; + data['TimeOfBirth'] = this.timeOfBirth; + data['BloodPressure'] = this.bloodPressure; + data['BloodPressureCuffLocationDesc'] = this.bloodPressureCuffLocationDesc; + data['BloodPressureCuffSizeDesc'] = this.bloodPressureCuffSizeDesc; + data['BloodPressurePatientPositionDesc'] = + this.bloodPressurePatientPositionDesc; + data['ClinicName'] = this.clinicName; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorName'] = this.doctorName; + data['PainScoreDesc'] = this.painScoreDesc; + data['PulseRhythmDesc'] = this.pulseRhythmDesc; + data['RespirationPatternDesc'] = this.respirationPatternDesc; + data['TemperatureCelciusMethodDesc'] = this.temperatureCelciusMethodDesc; + data['Time'] = this.time; + return data; + } +} diff --git a/lib/presentation/covid19test/covid_19_questionnaire.dart b/lib/presentation/covid19test/covid_19_questionnaire.dart index b9ac008..8608d80 100644 --- a/lib/presentation/covid19test/covid_19_questionnaire.dart +++ b/lib/presentation/covid19test/covid_19_questionnaire.dart @@ -102,7 +102,7 @@ class _Covid19QuestionnaireState extends State { separatorBuilder: (context, index) => SizedBox(height: 16.h), itemBuilder: (context, index) { final question = qaList[index]; - final isAnswerYes = question.ans == 1; + final isAnswerYes = question.ans == 1; return Row( children: [ diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index bf0b7f5..217a384 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -100,15 +100,25 @@ class ServicesPage extends StatelessWidget { LoaderBottomSheet.hideLoader(); }); }), - HmgServicesComponentModel( - 11, - "Covid 19 Test".needTranslation, - "".needTranslation, - AppAssets.covid19icon, - bgColor: AppColors.covid29Color, - true, - route: AppRoutes.covid19Test, - ) + // 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, diff --git a/lib/presentation/vital_sign/vital_sign_page.dart b/lib/presentation/vital_sign/vital_sign_page.dart new file mode 100644 index 0000000..858e801 --- /dev/null +++ b/lib/presentation/vital_sign/vital_sign_page.dart @@ -0,0 +1,308 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.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/hmg_services/hmg_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/hmg_services/models/resq_models/vital_sign_respo_model.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/chip/app_custom_chip_widget.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:provider/provider.dart'; + +class VitalSignPage extends StatefulWidget { + const VitalSignPage({super.key}); + + @override + State createState() => _VitalSignPageState(); +} + +class _VitalSignPageState extends State { + @override + void initState() { + super.initState(); + final HmgServicesViewModel hmgServicesViewModel = context.read(); + + scheduleMicrotask(() async { + LoaderBottomSheet.showLoader(loadingText: 'Loading Vital Signs...'); + await hmgServicesViewModel.getPatientVitalSign( + onSuccess: (_) { + LoaderBottomSheet.hideLoader(); + }, + onError: (_) { + LoaderBottomSheet.hideLoader(); + }, + ); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: CollapsingListView( + title: 'Vital Signs', + child: Consumer( + builder: (context, viewModel, child) { + + // Get the latest vital sign data (first item in the list) + VitalSignResModel? latestVitalSign = viewModel.vitalSignList.isNotEmpty + ? viewModel.vitalSignList.first + : null; + + return SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 16.h), + + // Main content with body image + Padding( + padding: EdgeInsets.symmetric(horizontal: 24.h), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Left side - Vital Sign Cards + Expanded( + child: Column( + children: [ + // BMI Card + _buildVitalSignCard( + icon: AppAssets.activity, + iconColor: AppColors.successColor, + iconBgColor: AppColors.successColor.withValues(alpha: 0.1), + label: 'BMI', + value: latestVitalSign?.bodyMassIndex?.toString() ?? '--', + unit: '', + chipText: _getBMIStatus(latestVitalSign?.bodyMassIndex), + chipBgColor: AppColors.successColor.withValues(alpha: 0.1), + chipTextColor: AppColors.successColor, + ), + SizedBox(height: 16.h), + + // Height Card + _buildVitalSignCard( + icon: AppAssets.height, + iconColor: AppColors.infoColor, + iconBgColor: AppColors.infoColor.withValues(alpha: 0.1), + label: 'Height', + value: latestVitalSign?.heightCm?.toString() ?? '--', + unit: 'cm', + ), + SizedBox(height: 16.h), + + // Weight Card + _buildVitalSignCard( + icon: AppAssets.weight, + iconColor: AppColors.successColor, + iconBgColor: AppColors.successColor.withValues(alpha: 0.1), + label: 'Weight', + value: latestVitalSign?.weightKg?.toString() ?? '--', + unit: 'kg', + chipText: 'Normal', + chipBgColor: AppColors.successColor.withValues(alpha: 0.1), + chipTextColor: AppColors.successColor, + ), + SizedBox(height: 16.h), + + // Blood Pressure Card + _buildVitalSignCard( + icon: AppAssets.activity, + iconColor: AppColors.warningColor, + iconBgColor: AppColors.warningColor.withValues(alpha: 0.1), + label: 'Blood Pressure', + value: latestVitalSign != null && + latestVitalSign.bloodPressureHigher != null && + latestVitalSign.bloodPressureLower != null + ? '${latestVitalSign.bloodPressureHigher}/${latestVitalSign.bloodPressureLower}' + : '--', + unit: '', + ), + SizedBox(height: 16.h), + + // Temperature Card + _buildVitalSignCard( + icon: AppAssets.activity, + iconColor: AppColors.errorColor, + iconBgColor: AppColors.errorColor.withValues(alpha: 0.1), + label: 'Temperature', + value: latestVitalSign?.temperatureCelcius?.toString() ?? '--', + unit: '°C', + ), + ], + ), + ), + + SizedBox(width: 16.h), + + // Right side - Body Image and Heart Rate + Respiratory Rate + Expanded( + child: Column( + children: [ + // Body anatomy image + Container( + height: 280.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Center( + child: Image.asset( + AppAssets.fullBodyFront, + height: 260.h, + fit: BoxFit.contain, + ), + ), + ), + SizedBox(height: 16.h), + + // Heart Rate Card + _buildVitalSignCard( + icon: AppAssets.heart, + iconColor: AppColors.errorColor, + iconBgColor: AppColors.errorColor.withValues(alpha: 0.1), + label: 'Heart Rate', + value: latestVitalSign?.heartRate?.toString() ?? + latestVitalSign?.pulseBeatPerMinute?.toString() ?? '--', + unit: 'bpm', + chipText: 'Normal', + chipBgColor: AppColors.successColor.withValues(alpha: 0.1), + chipTextColor: AppColors.successColor, + ), + SizedBox(height: 16.h), + + // Respiratory rate Card + _buildVitalSignCard( + icon: AppAssets.activity, + iconColor: AppColors.successColor, + iconBgColor: AppColors.successColor.withValues(alpha: 0.1), + label: 'Respiratory rate', + value: latestVitalSign?.respirationBeatPerMinute?.toString() ?? '--', + unit: 'bpm', + chipText: 'Normal', + chipBgColor: AppColors.successColor.withValues(alpha: 0.1), + chipTextColor: AppColors.successColor, + ), + ], + ), + ), + ], + ), + ), + + SizedBox(height: 60.h), + ], + ), + ); + }, + ), + ), + ); + } + + String? _getBMIStatus(dynamic bmi) { + if (bmi == null) return null; + double bmiValue = double.tryParse(bmi.toString()) ?? 0; + if (bmiValue < 18.5) return 'Underweight'; + if (bmiValue < 25) return 'Normal'; + if (bmiValue < 30) return 'Overweight'; + return 'Obese'; + } + + Widget _buildVitalSignCard({ + required String icon, + required Color iconColor, + required Color iconBgColor, + required String label, + required String value, + required String unit, + String? chipText, + Color? chipBgColor, + Color? chipTextColor, + }) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: true, + ), + child: Padding( + padding: EdgeInsets.all(12.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + // Icon with background + Container( + padding: EdgeInsets.all(8.h), + decoration: BoxDecoration( + color: iconBgColor, + borderRadius: BorderRadius.circular(12.r), + ), + child: Utils.buildSvgWithAssets( + icon: icon, + width: 16.w, + height: 16.h, + iconColor: iconColor, + fit: BoxFit.contain, + ), + ), + SizedBox(width: 8.w), + Expanded( + child: label.toText10( + color: AppColors.textColorLight, + weight: FontWeight.w500, + ), + ), + // Forward arrow + Utils.buildSvgWithAssets( + icon: AppAssets.arrow_forward, + width: 16.w, + height: 16.h, + iconColor: AppColors.textColorLight, + fit: BoxFit.contain, + ), + ], + ), + SizedBox(height: 12.h), + + // Value + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + value.toText18( + isBold: true, + color: AppColors.textColor, + ), + if (unit.isNotEmpty) ...[ + SizedBox(width: 4.w), + unit.toText12( + color: AppColors.textColorLight, + ), + ], + ], + ), + + // Chip if available + if (chipText != null) ...[ + SizedBox(height: 8.h), + AppCustomChipWidget( + labelText: chipText, + backgroundColor: chipBgColor, + textColor: chipTextColor, + padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 4.h), + ), + ], + ], + ), + ), + ); + } +} + diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index f0acd5b..78045b5 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -22,6 +22,7 @@ import 'package:hmg_patient_app_new/presentation/symptoms_checker/triage_screen. import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection.dart'; import 'package:hmg_patient_app_new/presentation/symptoms_checker/user_info_selection/user_info_flow_manager.dart'; import 'package:hmg_patient_app_new/presentation/tele_consultation/zoom/call_screen.dart'; +import 'package:hmg_patient_app_new/presentation/vital_sign/vital_sign_page.dart'; import 'package:hmg_patient_app_new/presentation/water_monitor/water_consumption_screen.dart'; import 'package:hmg_patient_app_new/presentation/water_monitor/water_monitor_settings_screen.dart'; import 'package:hmg_patient_app_new/splashPage.dart'; @@ -45,6 +46,7 @@ class AppRoutes { static const String smartWatches = '/smartWatches'; static const String huaweiHealthExample = '/huaweiHealthExample'; static const String covid19Test = '/covid19Test'; + static const String vitalSign = '/vitalSign'; //appointments static const String bookAppointmentPage = '/bookAppointmentPage'; @@ -92,6 +94,7 @@ class AppRoutes { waterConsumptionScreen: (context) => WaterConsumptionScreen(), waterMonitorSettingsScreen: (context) => WaterMonitorSettingsScreen(), healthCalculatorsPage: (context) => HealthCalculatorsPage(type: HealthCalConEnum.calculator), - healthConvertersPage: (context) => HealthCalculatorsPage(type: HealthCalConEnum.converter) + healthConvertersPage: (context) => HealthCalculatorsPage(type: HealthCalConEnum.converter), + vitalSign: (context) => VitalSignPage() }; } From a29c0dd6bc9780c2200cc51b8010f96784f607d0 Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Thu, 1 Jan 2026 12:37:14 +0300 Subject: [PATCH 53/55] fixed the suggested design changes. (Not reminder ones) --- .../water_monitor_view_model.dart | 67 ++++++++++++++++-- .../hmg_services/services_page.dart | 70 ++++++++++++++----- .../water_consumption_screen.dart | 33 ++++++--- .../water_monitor_settings_screen.dart | 22 ++++-- .../widgets/cup_bottomsheet_widgets.dart | 1 + .../widgets/water_action_buttons_widget.dart | 51 +++++--------- .../widgets/water_intake_summary_widget.dart | 15 +++- lib/widgets/chip/app_custom_chip_widget.dart | 4 +- lib/widgets/graph/custom_graph.dart | 10 +-- 9 files changed, 190 insertions(+), 83 deletions(-) diff --git a/lib/features/water_monitor/water_monitor_view_model.dart b/lib/features/water_monitor/water_monitor_view_model.dart index 787dc05..01167fe 100644 --- a/lib/features/water_monitor/water_monitor_view_model.dart +++ b/lib/features/water_monitor/water_monitor_view_model.dart @@ -18,6 +18,7 @@ import 'package:hmg_patient_app_new/routes/app_routes.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/services/notification_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; class WaterMonitorViewModel extends ChangeNotifier { WaterMonitorRepo waterMonitorRepo; @@ -277,7 +278,7 @@ class WaterMonitorViewModel extends ChangeNotifier { } } - Future fetchUserDetailsForMonitoring() async { + Future fetchUserDetailsForMonitoring({Function(dynamic)? onSuccess, Function(String)? onError}) async { try { _isLoading = true; @@ -287,14 +288,21 @@ class WaterMonitorViewModel extends ChangeNotifier { if (authenticated == null) { _isLoading = false; notifyListeners(); + if (onError != null) onError('User not authenticated'); return; } final mobile = (authenticated.mobileNumber ?? '').replaceAll('+', ''); final identification = authenticated.patientIdentificationNo ?? ''; - final result = await waterMonitorRepo.getUserDetailsForWaterMonitoring(progress: 1, mobileNumber: mobile, identificationNo: identification); + final result = await waterMonitorRepo.getUserDetailsForWaterMonitoring( + progress: 1, + mobileNumber: mobile, + identificationNo: identification, + ); + result.fold((failure) { _userDetailData = null; + if (onError != null) onError(failure.message); }, (apiModel) { _userDetailData = apiModel.data; @@ -302,9 +310,12 @@ class WaterMonitorViewModel extends ChangeNotifier { if (_userDetailData != null) { _populateFormFields(_userDetailData); } + + if (onSuccess != null) onSuccess(_userDetailData); }); } catch (e) { _userDetailData = null; + if (onError != null) onError(e.toString()); } finally { _isLoading = false; notifyListeners(); @@ -424,6 +435,48 @@ class WaterMonitorViewModel extends ChangeNotifier { } } + /// Populate form fields from authenticated user data (for new users) + void populateFromAuthenticatedUser() { + try { + final authenticated = _appState.getAuthenticatedUser(); + if (authenticated == null) return; + + // Name - use firstName if available + if (authenticated.firstName != null && authenticated.firstName!.isNotEmpty) { + nameController.text = authenticated.firstName!; + } + + // Gender - map from patient gender + if (authenticated.gender != null) { + final gender = (authenticated.gender == 1 ? 'male' : 'female').toLowerCase(); + if (gender.contains('m') || gender == 'male') { + _selectedGender = 'Male'; + } else if (gender.contains('f') || gender == 'female') { + _selectedGender = 'Female'; + } + } + + // Age - calculate from DOB if available + if (authenticated.dateofBirth != null && authenticated.dateofBirth!.isNotEmpty) { + final age = _calculateAgeFromDOB(authenticated.dateofBirth!); + if (age > 0) { + ageController.text = age.toString(); + } + } + + // Set default units and activity level + _selectedHeightUnit = 'cm'; + _selectedWeightUnit = 'kg'; + _selectedActivityLevel = 'Lightly active'; + _selectedNumberOfReminders = '3 Time'; + + log('Form fields populated from authenticated user: ${authenticated.firstName}'); + notifyListeners(); + } catch (e) { + log('Error populating from authenticated user: $e'); + } + } + // Reset all fields to default void resetFields() { nameController.clear(); @@ -755,15 +808,15 @@ class WaterMonitorViewModel extends ChangeNotifier { final percent = progressPercent; if (percent >= 90) { - return const Color(0xFF00C853); // Dark Green + return AppColors.successColor; // Dark Green } else if (percent >= 70) { - return const Color(0xFF4CAF50); // Green + return AppColors.successColor; // Green } else if (percent >= 50) { - return const Color(0xFFFFC107); // Amber + return AppColors.warningColorYellow; //orange } else if (percent >= 30) { - return const Color(0xFFFF9800); // Orange + return AppColors.warningColorYellow; // Orange } else { - return const Color(0xFFF44336); // Red + return AppColors.errorColor; // Red } } diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index bf0b7f5..ee9542b 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -6,12 +6,14 @@ 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/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'; @@ -77,29 +79,31 @@ class ServicesPage extends StatelessWidget { 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) { + 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(); - }); - }), + // }, onError: (err) { + // LoaderBottomSheet.hideLoader(); + // }); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + }); + }, + ), HmgServicesComponentModel( 11, "Covid 19 Test".needTranslation, @@ -143,7 +147,37 @@ class ServicesPage extends StatelessWidget { AppAssets.daily_water_monitor_icon, bgColor: AppColors.whiteColor, true, - route: AppRoutes.waterConsumptionScreen, + 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!; + + // Fetch user details first to check if user has data + await waterMonitorVM.fetchUserDetailsForMonitoring( + onSuccess: (userDetail) { + LoaderBottomSheet.hideLoader(); + + // Navigate based on whether user has data or not + if (userDetail == null) { + // No data found, populate form with authenticated user data + waterMonitorVM.populateFromAuthenticatedUser(); + // Navigate to settings screen + context.navigateWithName(AppRoutes.waterMonitorSettingsScreen); + } else { + // Data exists, navigate to consumption screen + context.navigateWithName(AppRoutes.waterConsumptionScreen); + } + }, + onError: (error) { + LoaderBottomSheet.hideLoader(); + + // On error, navigate to consumption screen (it will handle the error state) + context.navigateWithName(AppRoutes.waterConsumptionScreen); + }, + ); + }, ), HmgServicesComponentModel( 11, diff --git a/lib/presentation/water_monitor/water_consumption_screen.dart b/lib/presentation/water_monitor/water_consumption_screen.dart index e91abf6..5d08bcd 100644 --- a/lib/presentation/water_monitor/water_consumption_screen.dart +++ b/lib/presentation/water_monitor/water_consumption_screen.dart @@ -126,14 +126,27 @@ class _WaterConsumptionScreenState extends State { ), SizedBox(width: 8.w), InkWell( - onTap: () => _showHistoryDurationBottomsheet(context, viewModel), - child: Utils.buildSvgWithAssets(icon: AppAssets.doctor_calendar_icon, height: 24.h, width: 24.h)) + onTap: () => _showHistoryDurationBottomsheet(context, viewModel), + child: Container( + padding: EdgeInsets.symmetric(vertical: 6.h, horizontal: 6.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + backgroundColor: AppColors.greyColor, + borderRadius: 8.r, + hasShadow: true, + ), + child: Row( + children: [ + viewModel.selectedDurationFilter.toText12(fontWeight: FontWeight.w500), + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down), + ], + ), + ), + ) ], ), ], ), - SizedBox(height: 12.h), - if (!viewModel.isGraphView) _buildHistoryListView(viewModel) else _buildHistoryGraph() + if (!viewModel.isGraphView) _buildHistoryListView(viewModel) else ...[SizedBox(height: 16.h), _buildHistoryGraph()] ], ); }), @@ -450,6 +463,7 @@ class _WaterConsumptionScreenState extends State { showGridLines: true, maxY: maxY, minY: minY, + showLinePoints: true, maxX: dataPoints.length > 1 ? dataPoints.length.toDouble() - 0.75 : 1.0, horizontalInterval: horizontalInterval, leftLabelInterval: leftLabelInterval, @@ -515,7 +529,7 @@ class _WaterConsumptionScreenState extends State { // For daily, show all 7 time labels (last 7 entries) if (selectedDuration == 'Daily' && index < 7) { return Padding( - padding: EdgeInsets.only(top: 5.h), + padding: EdgeInsets.only(top: 10.h), child: data[index].label.toText8( fontWeight: FontWeight.w600, color: AppColors.labelTextColor, @@ -526,7 +540,7 @@ class _WaterConsumptionScreenState extends State { // For weekly, show all 7 days (today + last 6 days) if (selectedDuration == 'Weekly' && index < 7) { return Padding( - padding: EdgeInsets.only(top: 5.h), + padding: EdgeInsets.only(top: 10.h), child: data[index].label.toText10( weight: FontWeight.w600, color: AppColors.labelTextColor, @@ -537,11 +551,8 @@ class _WaterConsumptionScreenState extends State { // For monthly, show all 7 months (current month + last 6 months) if (selectedDuration == 'Monthly' && index < 7) { return Padding( - padding: EdgeInsets.only(top: 5.h), - child: data[index].label.toText10( - weight: FontWeight.w600, - color: AppColors.labelTextColor, - ), + padding: EdgeInsets.only(top: 10.h), + child: data[index].label.toText10(weight: FontWeight.w600, color: AppColors.labelTextColor), ); } diff --git a/lib/presentation/water_monitor/water_monitor_settings_screen.dart b/lib/presentation/water_monitor/water_monitor_settings_screen.dart index 4e89d71..1b783ca 100644 --- a/lib/presentation/water_monitor/water_monitor_settings_screen.dart +++ b/lib/presentation/water_monitor/water_monitor_settings_screen.dart @@ -142,10 +142,10 @@ class _WaterMonitorSettingsScreenState extends State } // Reusable method to build text field - Widget _buildTextField(TextEditingController controller, String hintText) { + Widget _buildTextField(TextEditingController controller, String hintText, {TextInputType keyboardType = TextInputType.name}) { return TextField( controller: controller, - keyboardType: TextInputType.number, + keyboardType: keyboardType, maxLines: 1, cursorHeight: 14.h, textAlignVertical: TextAlignVertical.center, @@ -293,19 +293,31 @@ class _WaterMonitorSettingsScreenState extends State _buildSettingsRow( icon: AppAssets.calendarGrey, label: "Age (11-120) yrs".needTranslation, - inputField: _buildTextField(viewModel.ageController, '20'), + inputField: _buildTextField( + viewModel.ageController, + '20', + keyboardType: TextInputType.number, + ), ), _buildSettingsRow( icon: AppAssets.heightIcon, label: "Height".needTranslation, - inputField: _buildTextField(viewModel.heightController, '175'), + inputField: _buildTextField( + viewModel.heightController, + '175', + keyboardType: TextInputType.number, + ), unit: viewModel.selectedHeightUnit, onUnitTap: () => _showHeightUnitSelectionBottomSheet(context, viewModel), ), _buildSettingsRow( icon: AppAssets.weightScaleIcon, label: "Weight".needTranslation, - inputField: _buildTextField(viewModel.weightController, '75'), + inputField: _buildTextField( + viewModel.weightController, + '75', + keyboardType: TextInputType.number, + ), unit: viewModel.selectedWeightUnit, onUnitTap: () => _showWeightUnitSelectionBottomsheet(context, viewModel), ), diff --git a/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart b/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart index 013ac7b..4ffa30d 100644 --- a/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart +++ b/lib/presentation/water_monitor/widgets/cup_bottomsheet_widgets.dart @@ -313,6 +313,7 @@ class _CustomizeCupBottomSheetState extends State { viewModel.selectCup(newCup.id); Navigator.pop(context); + Navigator.pop(context); }, backgroundColor: AppColors.primaryRedColor, textColor: AppColors.whiteColor, diff --git a/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart b/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart index 31f8fdb..6546f77 100644 --- a/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart +++ b/lib/presentation/water_monitor/widgets/water_action_buttons_widget.dart @@ -17,6 +17,8 @@ class WaterActionButtonsWidget extends StatelessWidget { Widget build(BuildContext context) { return Consumer(builder: (context, vm, _) { final cupAmount = vm.selectedCupCapacityMl; + final isGoalAchieved = vm.progressPercent >= 100 || vm.nextDrinkTime.toLowerCase().contains('goal achieved'); + return Column( children: [ Row( @@ -48,16 +50,21 @@ class WaterActionButtonsWidget extends StatelessWidget { color: AppColors.whiteColor, ), ), - InkWell( - onTap: () async { - if (cupAmount > 0) { - await vm.insertUserActivity(quantityIntake: cupAmount); - } - }, - child: Utils.buildSvgWithAssets( - icon: AppAssets.addIconDark, - height: 20.h, - width: 20.h, + Opacity( + opacity: isGoalAchieved ? 0.4 : 1.0, + child: InkWell( + onTap: isGoalAchieved + ? null + : () async { + if (cupAmount > 0) { + await vm.insertUserActivity(quantityIntake: cupAmount); + } + }, + child: Utils.buildSvgWithAssets( + icon: AppAssets.addIconDark, + height: 20.h, + width: 20.h, + ), ), ), ], @@ -75,29 +82,7 @@ class WaterActionButtonsWidget extends StatelessWidget { ), _buildActionButton( context: context, - onTap: () async { - final success = await vm.scheduleTestNotification(); - if (success) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Test notification will appear in 5 seconds!'.needTranslation), - backgroundColor: AppColors.blueColor, - behavior: SnackBarBehavior.floating, - margin: EdgeInsets.all(16.w), - duration: const Duration(seconds: 2), - ), - ); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Failed to schedule test notification'.needTranslation), - backgroundColor: AppColors.errorColor, - behavior: SnackBarBehavior.floating, - margin: EdgeInsets.all(16.w), - ), - ); - } - }, + onTap: () async {}, title: "Plain Water".needTranslation, icon: Utils.buildSvgWithAssets(icon: AppAssets.glassIcon, height: 24.w, width: 24.w), ), diff --git a/lib/presentation/water_monitor/widgets/water_intake_summary_widget.dart b/lib/presentation/water_monitor/widgets/water_intake_summary_widget.dart index 094cc38..137f6a3 100644 --- a/lib/presentation/water_monitor/widgets/water_intake_summary_widget.dart +++ b/lib/presentation/water_monitor/widgets/water_intake_summary_widget.dart @@ -47,8 +47,19 @@ class WaterIntakeSummaryWidget extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Next Drink Time".needTranslation.toText18(weight: FontWeight.w600, color: AppColors.textColor), - vm.nextDrinkTime.toText32(weight: FontWeight.w600, color: AppColors.blueColor), + // Don't show label if goal is achieved + if (!vm.nextDrinkTime.toLowerCase().contains('goal achieved')) + // Show "Tomorrow" if nextDrinkTime contains "tomorrow", otherwise "Next Drink Time" + (vm.nextDrinkTime.toLowerCase().contains('tomorrow') ? "Tomorrow" : "Next Drink Time") + .needTranslation + .toText18(weight: FontWeight.w600, color: AppColors.textColor), + + // Extract only time if "tomorrow" is present, otherwise show as is + (vm.nextDrinkTime.toLowerCase().contains('tomorrow') + ? vm.nextDrinkTime.replaceAll(RegExp(r'tomorrow', caseSensitive: false), '').trim() + : vm.nextDrinkTime) + .toText32(weight: FontWeight.w600, color: AppColors.blueColor), + SizedBox(height: 12.h), _buildStatusColumn(title: "Your Goal".needTranslation, subTitle: "${goalMl}ml"), SizedBox(height: 8.h), diff --git a/lib/widgets/chip/app_custom_chip_widget.dart b/lib/widgets/chip/app_custom_chip_widget.dart index 69d82b7..8597b3e 100644 --- a/lib/widgets/chip/app_custom_chip_widget.dart +++ b/lib/widgets/chip/app_custom_chip_widget.dart @@ -78,7 +78,7 @@ class AppCustomChipWidget extends StatelessWidget { fit: BoxFit.contain, ) : SizedBox.shrink(), - label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), + label: richText ?? (labelText?? "").toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), padding: padding, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, labelPadding: labelPadding ?? EdgeInsetsDirectional.only(end: deleteIcon?.isNotEmpty == true ? 2.w : 8.w), @@ -104,7 +104,7 @@ class AppCustomChipWidget extends StatelessWidget { ) : Chip( materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor, isCenter: true), + label: richText ?? (labelText?? "").toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor, isCenter: true), padding: EdgeInsets.zero, backgroundColor: backgroundColor, shape: shape ?? diff --git a/lib/widgets/graph/custom_graph.dart b/lib/widgets/graph/custom_graph.dart index e04d978..1f5d806 100644 --- a/lib/widgets/graph/custom_graph.dart +++ b/lib/widgets/graph/custom_graph.dart @@ -63,6 +63,7 @@ class CustomGraph extends StatelessWidget { final double? horizontalInterval; final double? minY; final bool showShadow; + final bool showLinePoints; final double? cutOffY; final RangeAnnotations? rangeAnnotations; @@ -104,6 +105,7 @@ class CustomGraph extends StatelessWidget { this.horizontalInterval, this.minY, this.showShadow = false, + this.showLinePoints = false, this.cutOffY = 0, this.rangeAnnotations}); @@ -195,7 +197,7 @@ class CustomGraph extends StatelessWidget { top: BorderSide.none, ), ), - lineBarsData: _buildColoredLineSegments(dataPoints), + lineBarsData: _buildColoredLineSegments(dataPoints, showLinePoints), gridData: FlGridData( show: showGridLines ?? true, drawVerticalLine: false, @@ -217,7 +219,7 @@ class CustomGraph extends StatelessWidget { ); } - List _buildColoredLineSegments(List dataPoints) { + List _buildColoredLineSegments(List dataPoints, bool showLinePoints) { final List allSpots = dataPoints.asMap().entries.map((entry) { double value = (makeGraphBasedOnActualValue) ? double.tryParse(entry.value.actualValue) ?? 0.0 : entry.value.value; return FlSpot(entry.key.toDouble(), value); @@ -235,9 +237,7 @@ class CustomGraph extends StatelessWidget { begin: Alignment.centerLeft, end: Alignment.centerRight, ), - dotData: FlDotData( - show: false, - ), + dotData: FlDotData(show: showLinePoints), belowBarData: BarAreaData( show: showShadow, applyCutOffY: cutOffY != null, From 57f693e0d951b747116c3a2c10e60372458affd6 Mon Sep 17 00:00:00 2001 From: faizatflutter Date: Thu, 1 Jan 2026 12:41:27 +0300 Subject: [PATCH 54/55] fixed the suggested design changes. (Not reminder ones) --- .../hmg_services/services_page.dart | 43 +++++++------------ 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 8525535..1380ad9 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -79,23 +79,22 @@ class ServicesPage extends StatelessWidget { 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(), - ), - ); + 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(); // }); @@ -159,30 +158,20 @@ class ServicesPage extends StatelessWidget { 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!; - - // Fetch user details first to check if user has data await waterMonitorVM.fetchUserDetailsForMonitoring( onSuccess: (userDetail) { LoaderBottomSheet.hideLoader(); - - // Navigate based on whether user has data or not if (userDetail == null) { - // No data found, populate form with authenticated user data waterMonitorVM.populateFromAuthenticatedUser(); - // Navigate to settings screen context.navigateWithName(AppRoutes.waterMonitorSettingsScreen); } else { - // Data exists, navigate to consumption screen context.navigateWithName(AppRoutes.waterConsumptionScreen); } }, onError: (error) { LoaderBottomSheet.hideLoader(); - - // On error, navigate to consumption screen (it will handle the error state) context.navigateWithName(AppRoutes.waterConsumptionScreen); }, ); From 213662e718bd7c8042a3319206122680751e42cc Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 1 Jan 2026 12:54:04 +0300 Subject: [PATCH 55/55] updates --- lib/core/api/api_client.dart | 2 +- lib/features/prescriptions/prescriptions_repo.dart | 1 + .../appointments/appointment_details_page.dart | 4 ++-- .../appointments/widgets/appointment_card.dart | 8 +++++++- .../insurance/insurance_approval_details_page.dart | 2 +- .../insurance/widgets/patient_insurance_card.dart | 5 +++-- lib/presentation/medical_file/medical_file_page.dart | 7 +++++-- .../medical_report/medical_reports_page.dart | 4 ++-- .../prescriptions/prescription_detail_page.dart | 10 +++++++++- 9 files changed, 31 insertions(+), 12 deletions(-) diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 039787b..f366329 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -210,7 +210,7 @@ class ApiClientImp implements ApiClient { final int statusCode = response.statusCode; log("uri: ${Uri.parse(url.trim())}"); log("body: ${json.encode(body)}"); - log("response.body: ${response.body}"); + // log("response.body: ${response.body}"); if (statusCode < 200 || statusCode >= 400) { onFailure('Error While Fetching data', statusCode, failureType: StatusCodeFailure("Error While Fetching data")); logApiEndpointError(endPoint, 'Error While Fetching data', statusCode); diff --git a/lib/features/prescriptions/prescriptions_repo.dart b/lib/features/prescriptions/prescriptions_repo.dart index e7a4f07..c6e7150 100644 --- a/lib/features/prescriptions/prescriptions_repo.dart +++ b/lib/features/prescriptions/prescriptions_repo.dart @@ -182,6 +182,7 @@ class PrescriptionsRepoImp implements PrescriptionsRepo { "To": Utils.appState.getAuthenticatedUser()!.emailAddress, "SetupID": prescriptionsResponseModel.setupID, "IsDownload": true, + "isDentalAllowedBackend": false, }; try { diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index dae8d25..bd81584 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -246,7 +246,7 @@ class _AppointmentDetailsPageState extends State { ], ), SizedBox(height: 8.h), - Wrap( + bookAppointmentsViewModel.appointmentNearestGateResponseModel != null ? Wrap( direction: Axis.horizontal, spacing: 8.w, runSpacing: 8.h, @@ -261,7 +261,7 @@ class _AppointmentDetailsPageState extends State { "Nearest Gate: ${getIt.get().isArabic() ? bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumberN : bookAppointmentsVM.appointmentNearestGateResponseModel!.nearestGateNumber}") .toShimmer2(isShow: bookAppointmentsVM.isAppointmentNearestGateLoading), ], - ), + ) : SizedBox.shrink(), ], ), ), diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index 6849253..64dc803 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -179,7 +179,13 @@ class AppointmentCard extends StatelessWidget { ? '${patientAppointmentHistoryResponseModel.clinicName!.substring(0, 12)}...' : patientAppointmentHistoryResponseModel.clinicName!), ).toShimmer2(isShow: isLoading), - AppCustomChipWidget(labelText: isLoading ? 'Olaya' : patientAppointmentHistoryResponseModel.projectName!).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + labelText: isLoading + ? 'Olaya' + : patientAppointmentHistoryResponseModel.projectName!.length > 15 + ? '${patientAppointmentHistoryResponseModel.projectName!.substring(0, 12)}...' + : patientAppointmentHistoryResponseModel.projectName!) + .toShimmer2(isShow: isLoading), AppCustomChipWidget( labelPadding: EdgeInsetsDirectional.only(start: -4.w, end: 6.w), icon: AppAssets.appointment_calendar_icon, diff --git a/lib/presentation/insurance/insurance_approval_details_page.dart b/lib/presentation/insurance/insurance_approval_details_page.dart index 150b15c..415d66f 100644 --- a/lib/presentation/insurance/insurance_approval_details_page.dart +++ b/lib/presentation/insurance/insurance_approval_details_page.dart @@ -146,7 +146,7 @@ class InsuranceApprovalDetailsPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "${LocaleKeys.usageStatus.tr(context: context)}: ".toText14(isBold: true), - insuranceApprovalResponseModel.apporvalDetails!.isInvoicedDesc!.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + (insuranceApprovalResponseModel.apporvalDetails!.isInvoicedDesc ?? "").toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), ], ), ], diff --git a/lib/presentation/insurance/widgets/patient_insurance_card.dart b/lib/presentation/insurance/widgets/patient_insurance_card.dart index 3d774d3..fde5811 100644 --- a/lib/presentation/insurance/widgets/patient_insurance_card.dart +++ b/lib/presentation/insurance/widgets/patient_insurance_card.dart @@ -48,8 +48,9 @@ class PatientInsuranceCard extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}".toText18(isBold: true), - "Policy: ${insuranceCardDetailsModel.insurancePolicyNo}".toText12(isBold: true, color: AppColors.lightGrayColor), + SizedBox( + width: MediaQuery.of(context).size.width * 0.45, child: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}".toText18(isBold: true)), + "Policy: ${insuranceCardDetailsModel.insurancePolicyNo}".needTranslation.toText12(isBold: true, color: AppColors.lightGrayColor), ], ), AppCustomChipWidget( diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index 27b11fa..c9603b5 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -180,8 +180,11 @@ class _MedicalFilePageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}" - .toText18(isBold: true, weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1), + SizedBox( + width: MediaQuery.of(context).size.width * 0.6, + child: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}" + .toText18(isBold: true, weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 2), + ), SizedBox(height: 4.h), Wrap( direction: Axis.horizontal, diff --git a/lib/presentation/medical_report/medical_reports_page.dart b/lib/presentation/medical_report/medical_reports_page.dart index cb78479..f6d7576 100644 --- a/lib/presentation/medical_report/medical_reports_page.dart +++ b/lib/presentation/medical_report/medical_reports_page.dart @@ -84,7 +84,7 @@ class _MedicalReportsPageState extends State { // ), // ], // ).paddingSymmetrical(24.h, 0.h), - SizedBox(height: 20.h), + SizedBox(height: 8.h), Row( children: [ CustomButton( @@ -162,7 +162,7 @@ class _MedicalReportsPageState extends State { patientMedicalReportResponseModel: PatientMedicalReportResponseModel(), medicalFileViewModel: medicalFileVM, isLoading: true, - ).paddingSymmetrical(24.h, 8.h) + ).paddingSymmetrical(0.h, 8.h) : medicalFileViewModel.patientMedicalReportList.isNotEmpty ? AnimationConfiguration.staggeredList( position: index, diff --git a/lib/presentation/prescriptions/prescription_detail_page.dart b/lib/presentation/prescriptions/prescription_detail_page.dart index a38ff92..a6c6965 100644 --- a/lib/presentation/prescriptions/prescription_detail_page.dart +++ b/lib/presentation/prescriptions/prescription_detail_page.dart @@ -219,7 +219,15 @@ class _PrescriptionDetailPageState extends State { text: widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? LocaleKeys.resendOrder.tr(context: context) : LocaleKeys.prescriptionDeliveryError.tr(context: context), - onPressed: () {}, + onPressed: () async { + if (widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported!) { + LoaderBottomSheet.showLoader(loadingText: "Fetching prescription details...".needTranslation); + await prescriptionsViewModel.getPrescriptionDetails(widget.prescriptionsResponseModel, onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + prescriptionsViewModel.initiatePrescriptionDelivery(); + }); + } + }, backgroundColor: widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? AppColors.successColor : AppColors.greyF7Color, borderColor: AppColors.successColor.withOpacity(0.01), textColor:

|SX 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 Ar~m)} literal 0 HcmV?d00001 diff --git a/assets/images/png/smartwatches/apple-watch-5.jpg b/assets/images/png/smartwatches/apple-watch-5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c497eac836991d41ea8de2846d91b29c10fa772 GIT binary patch literal 31231 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 TqJ<3W-+RK8Vu5R@e|r8OUakK+ literal 0 HcmV?d00001 diff --git a/assets/images/png/smartwatches/bloodoxygen_icon.svg b/assets/images/png/smartwatches/bloodoxygen_icon.svg new file mode 100644 index 0000000..0971a30 --- /dev/null +++ b/assets/images/png/smartwatches/bloodoxygen_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/png/smartwatches/calories_icon.svg b/assets/images/png/smartwatches/calories_icon.svg new file mode 100644 index 0000000..660ce0d --- /dev/null +++ b/assets/images/png/smartwatches/calories_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/png/smartwatches/distance_icon.svg b/assets/images/png/smartwatches/distance_icon.svg new file mode 100644 index 0000000..29dcf3d --- /dev/null +++ b/assets/images/png/smartwatches/distance_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/png/smartwatches/galaxy_fit_3.jpg b/assets/images/png/smartwatches/galaxy_fit_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff0583446594031279f4fefcc27a0d5da4483f26 GIT binary patch literal 47012 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 literal 0 HcmV?d00001 diff --git a/assets/images/png/smartwatches/galaxy_watch_7.webp b/assets/images/png/smartwatches/galaxy_watch_7.webp new file mode 100644 index 0000000000000000000000000000000000000000..09748b42cd5b4c64fa778f4b421ca7fa6c2001d5 GIT binary patch literal 35172 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�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