diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart index 785ebb62..df597d0c 100644 --- a/lib/presentation/book_appointment/select_clinic_page.dart +++ b/lib/presentation/book_appointment/select_clinic_page.dart @@ -89,13 +89,15 @@ class _SelectClinicPageState extends State { child: CustomButton( text: LocaleKeys.bookAppo.tr(context: context), onPressed: () { - 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")); + if (widget.calculatedResult != null && widget.calculatedResult is Map) { + 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, @@ -132,13 +134,13 @@ class _SelectClinicPageState extends State { 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), - ) + 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!); @@ -150,90 +152,90 @@ class _SelectClinicPageState extends State { ), bookAppointmentsVM.isLiveCareSchedule ? ListView.separated( - padding: EdgeInsets.only(top: 24.h), - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemCount: bookAppointmentsVM.isClinicsListLoading - ? 5 - : bookAppointmentsVM.liveCareClinicsList.isNotEmpty - ? bookAppointmentsVM.liveCareClinicsList.length - : 1, + padding: EdgeInsets.only(top: 24.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: bookAppointmentsVM.isClinicsListLoading + ? 5 + : bookAppointmentsVM.liveCareClinicsList.isNotEmpty + ? bookAppointmentsVM.liveCareClinicsList.length + : 1, - // bookAppointmentsVM.isClinicsListLoading ? 5 : bookAppointmentsVM.liveCareClinicsList.length, + // 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: bookAppointmentsVM.liveCareClinicsList.isNotEmpty - ? ClinicCard( - bookAppointmentsVM: bookAppointmentsVM, - liveCareClinicsResponseModel: bookAppointmentsVM.liveCareClinicsList[index], - clinicsListResponseModel: GetClinicsListResponseModel(), - isLoading: bookAppointmentsVM.isClinicsListLoading, - ).onPress(() { - onLiveCareClinicSelected(bookAppointmentsVM.liveCareClinicsList[index]); - }) - : Utils.getNoDataWidget(context), - ), - ), - ), - ); - }, - separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), - ) + 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: bookAppointmentsVM.liveCareClinicsList.isNotEmpty + ? ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: bookAppointmentsVM.liveCareClinicsList[index], + clinicsListResponseModel: GetClinicsListResponseModel(), + isLoading: bookAppointmentsVM.isClinicsListLoading, + ).onPress(() { + onLiveCareClinicSelected(bookAppointmentsVM.liveCareClinicsList[index]); + }) + : Utils.getNoDataWidget(context), + ), + ), + ), + ); + }, + 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), + 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), + ), ], ); }), @@ -272,14 +274,17 @@ class _SelectClinicPageState extends State { } Widget resultWidget({required HealthCalculatorsTypeEnum type, dynamic calculatedResult}) { + if (calculatedResult == null || calculatedResult is! Map) { + return const SizedBox.shrink(); + } AppState appState = getIt(); return Column( children: [ if (type == HealthCalculatorsTypeEnum.bmi) ...[ if (calculatedResult["bmiCategory"] == "Normal") ...[ calorieWidget( - title: calculatedResult["bmiCategory"], - calories: calculatedResult["bmiResult"], + title: calculatedResult["bmiCategory"]?.toString() ?? "", + calories: calculatedResult["bmiResult"] ?? 0, description: LocaleKeys.bmiNormalDescription.tr(), color: Colors.green, icon: Icons.scale, @@ -288,8 +293,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["bmiCategory"] == "Underweight") ...[ calorieWidget( - title: calculatedResult["bmiCategory"], - calories: calculatedResult["bmiResult"], + title: calculatedResult["bmiCategory"]?.toString() ?? "", + calories: calculatedResult["bmiResult"] ?? 0, description: LocaleKeys.bmiUnderweightDescription.tr(), color: Colors.orange, hide: true, @@ -298,8 +303,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["bmiCategory"] == "Overweight") ...[ calorieWidget( - title: calculatedResult["bmiCategory"], - calories: calculatedResult["bmiResult"], + title: calculatedResult["bmiCategory"]?.toString() ?? "", + calories: calculatedResult["bmiResult"] ?? 0, description: LocaleKeys.bmiOverweightDescription.tr(), color: Colors.red, hide: true, @@ -309,8 +314,8 @@ class _SelectClinicPageState extends State { ] else if (type == HealthCalculatorsTypeEnum.calories) ...[ if (calculatedResult["calorieRange"] == "Normal") ...[ calorieWidget( - title: calculatedResult["calorieRange"], - calories: calculatedResult["calories"], + title: calculatedResult["calorieRange"]?.toString() ?? "", + calories: calculatedResult["calories"] ?? 0, description: LocaleKeys.caloriesMaintenanceDescription.tr(), color: Colors.green, icon: Icons.scale, @@ -318,8 +323,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["calorieRange"] == "Low") ...[ calorieWidget( - title: calculatedResult["calorieRange"], - calories: calculatedResult["calories"], + title: calculatedResult["calorieRange"]?.toString() ?? "", + calories: calculatedResult["calories"] ?? 0, description: LocaleKeys.caloriesModerateDeficitDescription.tr(), color: Colors.orange, icon: Icons.trending_down, @@ -327,8 +332,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["calorieRange"] == "High") ...[ calorieWidget( - title: calculatedResult["calorieRange"], - calories: calculatedResult["calories"], + title: calculatedResult["calorieRange"]?.toString() ?? "", + calories: calculatedResult["calories"] ?? 0, description: LocaleKeys.caloriesAggressiveDeficitDescription.tr(), color: Colors.red, icon: Icons.warning_rounded, @@ -337,8 +342,8 @@ class _SelectClinicPageState extends State { ] else if (type == HealthCalculatorsTypeEnum.bodyFat) ...[ if (calculatedResult["fatCategory"] == "Essential Fat" || calculatedResult["fatCategory"] == "Athletes") ...[ calorieWidget( - title: calculatedResult["fatCategory"], - calories: calculatedResult["fatPercentage"], + title: calculatedResult["fatCategory"]?.toString() ?? "", + calories: calculatedResult["fatPercentage"] ?? 0, description: LocaleKeys.bodyFatEssentialDescription.tr(), color: Colors.green, hide: true, @@ -347,8 +352,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["fatCategory"] == "Fitness") ...[ calorieWidget( - title: calculatedResult["fatCategory"], - calories: calculatedResult["fatPercentage"], + title: calculatedResult["fatCategory"]?.toString() ?? "", + calories: calculatedResult["fatPercentage"] ?? 0, description: LocaleKeys.bodyFatFitnessDescription.tr(), color: Colors.green, hide: true, @@ -357,8 +362,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["fatCategory"] == "Average" || calculatedResult["fatCategory"] == "Acceptable") ...[ calorieWidget( - title: calculatedResult["fatCategory"], - calories: calculatedResult["fatPercentage"], + title: calculatedResult["fatCategory"]?.toString() ?? "", + calories: calculatedResult["fatPercentage"] ?? 0, description: LocaleKeys.bodyFatAverageDescription.tr(), color: Colors.orange, hide: true, @@ -367,8 +372,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["fatCategory"] == "Obese" || calculatedResult["fatCategory"] == "Overweight") ...[ calorieWidget( - title: calculatedResult["fatCategory"], - calories: calculatedResult["fatPercentage"], + title: calculatedResult["fatCategory"]?.toString() ?? "", + calories: calculatedResult["fatPercentage"] ?? 0, description: LocaleKeys.bodyFatObeseDescription.tr(), color: Colors.red, hide: true, @@ -379,8 +384,8 @@ class _SelectClinicPageState extends State { ] else if (type == HealthCalculatorsTypeEnum.bmr) ...[ if (calculatedResult["bmrRange"] == "Normal") ...[ calorieWidget( - title: calculatedResult["bmrRange"], - calories: calculatedResult["bmr"], + title: calculatedResult["bmrRange"]?.toString() ?? "", + calories: calculatedResult["bmr"] ?? 0, description: LocaleKeys.bmrNormalDescription.tr(), color: Colors.green, hide: true, @@ -389,8 +394,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["bmrRange"] == "Low") ...[ calorieWidget( - title: calculatedResult["bmrRange"], - calories: calculatedResult["bmr"], + title: calculatedResult["bmrRange"]?.toString() ?? "", + calories: calculatedResult["bmr"] ?? 0, description: LocaleKeys.low.tr(), color: Colors.orange, hide: true, @@ -399,8 +404,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["bmrRange"] == "High") ...[ calorieWidget( - title: calculatedResult["bmrRange"], - calories: calculatedResult["bmr"], + title: calculatedResult["bmrRange"]?.toString() ?? "", + calories: calculatedResult["bmr"] ?? 0, description: LocaleKeys.bmrHighDescription.tr(), color: Colors.red, hide: true, @@ -410,8 +415,8 @@ class _SelectClinicPageState extends State { ] else if (type == HealthCalculatorsTypeEnum.idealBodyWeight) ...[ if (calculatedResult["status"] == "Normal") ...[ calorieWidget( - title: calculatedResult["status"], - calories: calculatedResult["ibw"], + title: calculatedResult["status"]?.toString() ?? "", + calories: calculatedResult["ibw"] ?? 0, hide: true, description: (() { final diff = calculatedResult["difference"]; @@ -432,8 +437,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["status"] == "Underweight") ...[ calorieWidget( - title: calculatedResult["status"], - calories: calculatedResult["ibw"], + title: calculatedResult["status"]?.toString() ?? "", + calories: calculatedResult["ibw"] ?? 0, hide: true, description: (() { final diff = calculatedResult["difference"]; @@ -448,8 +453,8 @@ class _SelectClinicPageState extends State { SizedBox(height: 16.h), ] else if (calculatedResult["status"] == "Overweight") ...[ calorieWidget( - title: calculatedResult["status"], - calories: calculatedResult["ibw"], + title: calculatedResult["status"]?.toString() ?? "", + calories: calculatedResult["ibw"] ?? 0, hide: true, description: (() { final diff = calculatedResult["difference"]; @@ -463,151 +468,41 @@ class _SelectClinicPageState extends State { ), ] ] 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 ") ...[ + if (calculatedResult["dietType"] == "Very Low Crabs" || + calculatedResult["dietType"] == "Low Crabs" || + calculatedResult["dietType"] == "Moderate Crabs" || + calculatedResult["dietType"] == "USDA Guidelines " || + calculatedResult["dietType"] == "Zone Diet") ...[ calorieWidget( - title: calculatedResult["dietType"].toString(), - calories: calculatedResult["totalCalories"], + title: calculatedResult["dietType"]?.toString() ?? "", + calories: calculatedResult["totalCalories"] ?? 0, 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; + final dt = calculatedResult["dietType"]; + if (dt == "Very Low Crabs") { + return '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.'; + } else if (dt == "Low Crabs") { + return '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.'; + } else if (dt == "Moderate Crabs") { + return '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.'; + } else if (dt == "USDA Guidelines ") { + return '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.'; + } else { + return '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.'; + } })(), 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'), + if (calculatedResult["carbsGrams"] != null && calculatedResult["carbsCalories"] != null) + ('Carbohydrates: ' + ((calculatedResult["carbsGrams"] is num) ? (calculatedResult["carbsGrams"] as num).toStringAsFixed(0) : calculatedResult["carbsGrams"].toString()) + 'g = ' + ((calculatedResult["carbsCalories"] is num) ? (calculatedResult["carbsCalories"] as num).toStringAsFixed(0) : calculatedResult["carbsCalories"].toString()) + ' kcal'), + if (calculatedResult["proteinGrams"] != null && calculatedResult["proteinCalories"] != null) + ('Protein: ' + ((calculatedResult["proteinGrams"] is num) ? (calculatedResult["proteinGrams"] as num).toStringAsFixed(0) : calculatedResult["proteinGrams"].toString()) + 'g = ' + ((calculatedResult["proteinCalories"] is num) ? (calculatedResult["proteinCalories"] as num).toStringAsFixed(0) : calculatedResult["proteinCalories"].toString()) + ' kcal'), + if (calculatedResult["fatGrams"] != null && calculatedResult["fatCalories"] != null) + ('Fat: ' + ((calculatedResult["fatGrams"] is num) ? (calculatedResult["fatGrams"] as num).toStringAsFixed(0) : calculatedResult["fatGrams"].toString()) + 'g = ' + ((calculatedResult["fatCalories"] is num) ? (calculatedResult["fatCalories"] as num).toStringAsFixed(0) : calculatedResult["fatCalories"].toString()) + ' kcal'), ], - color: Colors.green, + color: (calculatedResult["dietType"] == "Moderate Crabs" || calculatedResult["dietType"] == "USDA Guidelines ") ? Colors.green : Colors.orange, hide: true, - icon: Icons.scale, + icon: (calculatedResult["dietType"] == "Moderate Crabs" || calculatedResult["dietType"] == "USDA Guidelines ") ? Icons.scale : (calculatedResult["dietType"] == "Zone Diet" ? Icons.warning_rounded : Icons.trending_down), ), 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( @@ -626,21 +521,23 @@ class _SelectClinicPageState extends State { SizedBox( width: 8.w, ), - calculatedResult["lastPeriodDate"].toString().toText16(color: AppColors.successColor, isBold: true), + (calculatedResult["lastPeriodDate"] ?? "").toString().toText16(color: AppColors.successColor, isBold: true), ], ), ], ), - 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), + if (calculatedResult["lastPeriodDay"] != null) ...[ + 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: [ @@ -648,19 +545,21 @@ class _SelectClinicPageState extends State { SizedBox( width: 8.w, ), - calculatedResult["ovulationDate"].toString().toText16(color: AppColors.successColor, isBold: true), + (calculatedResult["ovulationDate"] ?? "").toString().toText16(color: AppColors.successColor, isBold: true), ], ), - 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), + if (calculatedResult["ovulationDay"] != null) ...[ + 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), appState.isArabic() ? "فترة الخصوبة".toText16(color: AppColors.textColor, isBold: true) : "Fertility Window".toText16(color: AppColors.textColor, isBold: true), SizedBox(height: 8.h), @@ -670,7 +569,7 @@ class _SelectClinicPageState extends State { SizedBox( width: 8.w, ), - calculatedResult["fertileWindowStart"].toString().toText13(color: AppColors.successColor, isBold: true), + (calculatedResult["fertileWindowStart"] ?? "").toString().toText13(color: AppColors.successColor, isBold: true), SizedBox( width: 4.w, ), @@ -678,15 +577,15 @@ class _SelectClinicPageState extends State { SizedBox( width: 4.w, ), - calculatedResult["fertileWindowEnd"].toString().toText13(color: AppColors.successColor, isBold: true), + (calculatedResult["fertileWindowEnd"] ?? "").toString().toText13(color: AppColors.successColor, isBold: true), ], ), SizedBox(height: 8.h), appState.isArabic() ? "هذه هي فترة خصوبتك. يساعد الحفاظ على نطاق صحي من السعرات الحرارية في دعم جسمك خلال هذه الفترة، مع مراعاة معدل الأيض الأساسي ومستوى نشاطك. مؤشر كتلة جسمك ضمن النطاق الصحي." - .toText12(height: 1.5, color: AppColors.textColorLight, isBold: true) + .toText12(height: 1.5, color: AppColors.textColorLight, isBold: true) : "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, isBold: true) + .toText12(height: 1.5, color: AppColors.textColorLight, isBold: true) ], ), ), @@ -745,156 +644,166 @@ class _SelectClinicPageState extends State { children: [ Utils.buildSvgWithAssets(icon: AppAssets.pregnancyDueDateAccordion, width: 30.h, height: 30.h), SizedBox(width: 8.w), - calculatedResult["dueDate"].toString().toText16(color: AppColors.successColor, isBold: true), + (calculatedResult["dueDate"] ?? "").toString().toText16(color: AppColors.successColor, isBold: true), ], ), 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), + if (calculatedResult["dueDateDay"] != null) + 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, isBold: true), - 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, isBold: true), - SizedBox( - width: 4.w, - ), - "-".toText16(isBold: true, color: AppColors.successColor), - SizedBox( - width: 4.w, - ), - calculatedResult["firstTrimester"]["end"].toString().toText13(color: AppColors.successColor, isBold: true), - ], - ), - SizedBox(height: 8.h), - ], + if (calculatedResult["firstTrimester"] is Map) ...[ + 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, isBold: true), + Expanded(child: SizedBox(width: 8.h)), + if (calculatedResult["firstTrimester"]?["weeks"] != null) + 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, isBold: true), + SizedBox( + width: 4.w, + ), + "-".toText16(isBold: true, color: AppColors.successColor), + SizedBox( + width: 4.w, + ), + (calculatedResult["firstTrimester"]?["end"] ?? "").toString().toText13(color: AppColors.successColor, isBold: true), + ], + ), + 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, isBold: true), - 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, isBold: true), - SizedBox( - width: 4.w, - ), - "-".toText16(isBold: true, color: AppColors.successColor), - SizedBox( - width: 4.w, - ), - calculatedResult["secondTrimester"]["end"].toString().toText13(color: AppColors.successColor, isBold: true), - ], - ), - SizedBox(height: 8.h), - ], + ], + if (calculatedResult["secondTrimester"] is Map) ...[ + 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, isBold: true), + Expanded(child: SizedBox(width: 8.h)), + if (calculatedResult["secondTrimester"]?["weeks"] != null) + 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, isBold: true), + SizedBox( + width: 4.w, + ), + "-".toText16(isBold: true, color: AppColors.successColor), + SizedBox( + width: 4.w, + ), + (calculatedResult["secondTrimester"]?["end"] ?? "").toString().toText13(color: AppColors.successColor, isBold: true), + ], + ), + 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, isBold: true), - 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, isBold: true), - SizedBox( - width: 4.w, - ), - "-".toText16(isBold: true, color: AppColors.successColor), - SizedBox( - width: 4.w, - ), - calculatedResult["thirdTrimester"]["end"].toString().toText13(color: AppColors.successColor, isBold: true), - ], - ), - SizedBox(height: 8.h), - ], + ], + if (calculatedResult["thirdTrimester"] is Map) ...[ + 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, isBold: true), + Expanded(child: SizedBox(width: 8.h)), + if (calculatedResult["thirdTrimester"]?["weeks"] != null) + 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, isBold: true), + SizedBox( + width: 4.w, + ), + "-".toText16(isBold: true, color: AppColors.successColor), + SizedBox( + width: 4.w, + ), + (calculatedResult["thirdTrimester"]?["end"] ?? "").toString().toText13(color: AppColors.successColor, isBold: true), + ], + ), + SizedBox(height: 8.h), + ], + ), ), - ), + ], ], ) ], @@ -921,6 +830,7 @@ class _SelectClinicPageState extends State { } Widget calorieWidget({required String title, required dynamic calories, required String description, required Color color, required IconData icon, bool hide = false, List? chipsItems}) { + final caloriesNum = (calories is num) ? calories : (double.tryParse(calories?.toString() ?? '') ?? 0); return Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, customBorder: BorderRadius.all(Radius.circular(24.r))), padding: EdgeInsets.all(16.w), @@ -932,7 +842,7 @@ class _SelectClinicPageState extends State { children: [ Row( children: [ - ('${calories.toStringAsFixed(0)}').toText32(color: getTextColor(title), isBold: true), + ('${caloriesNum.toStringAsFixed(0)}').toText32(color: getTextColor(title), isBold: true), SizedBox(width: 10.w), hide ? SizedBox() : 'kcal/day'.toText12(color: AppColors.inputLabelTextColor, isBold: true) ], @@ -947,14 +857,14 @@ class _SelectClinicPageState extends State { 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) + 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(), ), @@ -1117,8 +1027,8 @@ class _SelectClinicPageState extends State { // AppointmentViaRegionViewmodel? viewmodel = null; showCommonBottomSheetWithoutHeight(context, title: "", titleWidget: Consumer(builder: (_, data, __) => getTitle(data)), isDismissible: false, child: Consumer(builder: (context, data, __) { - return getRegionalSelectionWidget(data, context); - }), callBackFunc: () {}); + return getRegionalSelectionWidget(data, context); + }), callBackFunc: () {}); } Widget getRegionalSelectionWidget(AppointmentViaRegionViewmodel data, BuildContext context) { @@ -1148,7 +1058,8 @@ class _SelectClinicPageState extends State { regionalViewModel.setBottomSheetState(AppointmentViaRegionState.DOCTOR_SELECTION); var appointmentsViewModel = Provider.of(context, listen: false); if (appointmentsViewModel.selectedClinic.clinicID == 253) { - appointmentsViewModel.setProjectID(regionalViewModel.selectedHospital?.patientDoctorAppointmentList!.first.iD?.toString() ?? ""); + var id =getProjectId(regionalViewModel); + appointmentsViewModel.setProjectID(id); appointmentsViewModel.resetLaserData(); appointmentsViewModel.getLaserClinic(); regionalViewModel.handleLastStepForClinicForDentalAndLaser(appointmentsViewModel.selectedClinic.clinicID ?? -1); @@ -1157,8 +1068,9 @@ class _SelectClinicPageState extends State { } } else if (regionalViewModel.regionBottomSheetType == RegionBottomSheetType.REGION_FOR_DENTAL_AND_LASER) { var appointmentsViewModel = Provider.of(context, listen: false); + var id =getProjectId(regionalViewModel); regionalViewModel.setBottomSheetState(AppointmentViaRegionState.DOCTOR_SELECTION); - appointmentsViewModel.setProjectID(regionalViewModel.selectedHospital?.hospitalList.first.iD?.toString() ?? ""); + appointmentsViewModel.setProjectID(id); regionalViewModel.handleLastStepForClinicForDentalAndLaser(appointmentsViewModel.selectedClinic.clinicID ?? -1); } }, @@ -1469,4 +1381,17 @@ class _SelectClinicPageState extends State { callBackFunc: () {}, ); } + + String getProjectId(AppointmentViaRegionViewmodel regionalViewModel) { + try { + if(regionalViewModel.selectedHospital?.patientDoctorAppointmentList?.isNotEmpty ?? false) { + return regionalViewModel.selectedHospital!.patientDoctorAppointmentList?.first.projectID?.toString() ?? ""; + } else if(regionalViewModel.selectedHospital?.hospitalList.isNotEmpty ?? false) { + return regionalViewModel.selectedHospital!.hospitalList.first.iD?.toString() ?? ""; + } + } on Exception catch (e) { + + } + return ""; + } } diff --git a/lib/presentation/book_appointment/select_doctor_page.dart b/lib/presentation/book_appointment/select_doctor_page.dart index 661c9a30..cb2555f3 100644 --- a/lib/presentation/book_appointment/select_doctor_page.dart +++ b/lib/presentation/book_appointment/select_doctor_page.dart @@ -53,7 +53,7 @@ class _SelectDoctorPageState extends State { bookAppointmentsViewModel.getLiveCareDoctorsList(); } else { if (bookAppointmentsViewModel.selectedClinic.clinicID == 17) { - if (appState.getAuthenticatedUser()!.age! > 12) { + if (appState.isAuthenticated && appState.getAuthenticatedUser()!.age! > 12) { bookAppointmentsViewModel.getDentalChiefComplaintDoctorsList(); } else { bookAppointmentsViewModel.getDoctorsList(isNearest: false); diff --git a/lib/presentation/book_appointment/widgets/appointment_calendar.dart b/lib/presentation/book_appointment/widgets/appointment_calendar.dart index a95989a6..8d96c12c 100644 --- a/lib/presentation/book_appointment/widgets/appointment_calendar.dart +++ b/lib/presentation/book_appointment/widgets/appointment_calendar.dart @@ -278,7 +278,7 @@ class _AppointmentCalendarState extends State { bookAppointmentsViewModel.setProjectID(bookAppointmentsViewModel.selectedDoctor.projectID.toString()); bookAppointmentsViewModel.setSelectedClinic(selectedClinic); bookAppointmentsViewModel.setIsChiefComplaintsListLoading(true); - if(appState.getAuthenticatedUser()!.age! > 12) { + if(appState.isAuthenticated && appState.getAuthenticatedUser()!.age! > 12) { Navigator.of(context).push( CustomPageRoute( page: DentalChiefComplaintsPage(), 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 3f86e380..42445fab 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 @@ -45,89 +45,110 @@ class _HealthCalculatorDetailedPageState extends State.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + case HealthCalculatorsTypeEnum.calories: + case HealthCalculatorsTypeEnum.bmr: + final map = provider.caloriesResultMap ?? (result is Map ? Map.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + case HealthCalculatorsTypeEnum.idealBodyWeight: + final map = provider.ibwResultMap ?? (result is Map ? Map.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + case HealthCalculatorsTypeEnum.bodyFat: + final map = provider.bodyFatResultMap ?? (result is Map ? Map.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + case HealthCalculatorsTypeEnum.crabsProteinFat: + final map = provider.macrosResultMap ?? (result is Map ? Map.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + case HealthCalculatorsTypeEnum.ovulation: + final map = (provider.ovulationResult is Map) + ? provider.ovulationResult + : (result is Map ? Map.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + case HealthCalculatorsTypeEnum.deliveryDueDate: + final map = (provider.deliveryResult is Map) + ? provider.deliveryResult + : (result is Map ? Map.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + case HealthCalculatorsTypeEnum.bloodSugar: + final map = (provider.bloodSugarResult is Map) + ? provider.bloodSugarResult + : (result is Map ? Map.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + case HealthCalculatorsTypeEnum.bloodCholesterol: + final map = (provider.bloodCholesterolResult is Map) + ? provider.bloodCholesterolResult + : (result is Map ? Map.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + case HealthCalculatorsTypeEnum.triglycerides: + final map = (provider.triglyceridesResult is Map) + ? provider.triglyceridesResult + : (result is Map ? Map.from(result) : null); + calculatedResult = map != null + ? {...map, 'clinicId': widget.clinicID, 'calculationID': widget.calculationID} + : null; + break; + } + }); }, ).paddingSymmetrical(20.w, 24.h), ); @@ -140,68 +161,68 @@ class _HealthCalculatorDetailedPageState extends State