From ee0b5b6e436860d870bfbba5d2b46f09b8ccd6e4 Mon Sep 17 00:00:00 2001 From: "taha.alam" Date: Wed, 22 Jan 2025 16:48:37 +0300 Subject: [PATCH] WD: Styling and desgin changes of vital signs values --- lib/config/localized_values.dart | 9 + lib/uitl/translations_delegate_base.dart | 29 +- .../components/scan_condition_checklist.dart | 26 +- lib/vital_signs/components/scan_status.dart | 11 +- lib/vital_signs/components/start_button.dart | 5 +- .../components/vital_sign_widget.dart | 246 +++++++++++---- lib/vital_signs/data/vitals_benchmark.dart | 281 +++++++++++++++--- lib/vital_signs/result_screen.dart | 10 +- 8 files changed, 501 insertions(+), 116 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 3d78b400..f649f3f3 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -2194,4 +2194,13 @@ const Map localizedValues = { "moderatelyHigh": {"en": "Moderately high", "ar": "مرتفع بشكل معتدل"}, "possiblyLow": {"en": "Possibly low", "ar": "ربما منخفض"}, "slightylyHigh": {"en": "Slightly high", "ar": "مرتفع قليلا"}, + 'frameRate': {'ar': 'معدل الإطارات', 'en': 'FrameRate'}, + 'movement': {'ar': 'الحركة', 'en': 'Movement'}, + 'centered': {'ar': 'مركّز', 'en': 'Centered'}, + 'lighting': {'ar': 'الإضاءة', 'en': 'Lighting'}, + 'scanningConditions': {'ar': 'شروط المسح', 'en': 'Scanning Conditions'}, + 'serverReady': {'ar': 'الخادم جاهز', 'en': 'Server Ready'}, + 'analyzingData': {'ar': 'تحليل البيانات...', 'en': 'Analyzing Data...'}, + 'collectingData': {'ar': 'جمع البيانات...', 'en': 'Collecting Data...'}, + 'waitingData': {'ar': 'انتظار البيانات...', 'en': 'Waiting Data...'}, }; diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 1c56d66b..d9f66a2f 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -3056,10 +3056,33 @@ class TranslationBase { String get oxygenSaturation => localizedValues["oxygenSaturation"][locale.languageCode]; String get stress => localizedValues["stress"][locale.languageCode]; String get respiratoryRate => localizedValues["respiratoryRate"][locale.languageCode]; - String get BMI => localizedValues["respiratoryRate"][locale.languageCode]; + + String get BMI => localizedValues["bmi"][locale.languageCode]; String get generalWellness => localizedValues["generalWellness"][locale.languageCode]; String get cvd => localizedValues["cvd"][locale.languageCode]; + String get frameRate => localizedValues['frameRate'][locale.languageCode]; + + String get movement => localizedValues['movement'][locale.languageCode]; + + String get centered => localizedValues['centered'][locale.languageCode]; + + String get lighting => localizedValues['lighting'][locale.languageCode]; + + String get scanningConditions => + localizedValues['scanningConditions'][locale.languageCode]; + + String get serverReady => localizedValues['serverReady'][locale.languageCode]; + + String get analyzingData => + localizedValues['analyzingData']?[locale.languageCode] ?? ''; + + String get collectingData => + localizedValues['collectingData']?[locale.languageCode] ?? ''; + + String get waitingData => + localizedValues['waitingData']?[locale.languageCode] ?? ''; + String getValue(String name) { switch (name) { case 'normal': @@ -3082,6 +3105,10 @@ class TranslationBase { return possiblyLow; case 'moderatelyHigh': return moderatelyHigh; + case 'systolic-lng': + return systolicLng; + case 'diastolic-lng': + return diastolicLng; default: throw ArgumentError('Invalid name: $name'); } diff --git a/lib/vital_signs/components/scan_condition_checklist.dart b/lib/vital_signs/components/scan_condition_checklist.dart index bbc281b5..a55428ea 100644 --- a/lib/vital_signs/components/scan_condition_checklist.dart +++ b/lib/vital_signs/components/scan_condition_checklist.dart @@ -1,6 +1,8 @@ import 'package:diplomaticquarterapp/theme/colors.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; import 'package:vital_sign_camera/vital_sign_camera.dart'; + import 'scan_condition.dart'; class ScanConditionChecklist extends StatelessWidget { @@ -17,7 +19,7 @@ class ScanConditionChecklist extends StatelessWidget { @override Widget build(BuildContext context) { return SizedBox( - height: deviceSize.width*0.35, + height: deviceSize.width * 0.4, child: Material( color:Colors.white, child: Padding( @@ -25,8 +27,8 @@ class ScanConditionChecklist extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text( - "Scanning Conditions", + Text( + TranslationBase.of(context).scanningConditions, style: TextStyle( fontSize: 15, color: CustomColors.accentColor, @@ -41,15 +43,18 @@ class ScanConditionChecklist extends StatelessWidget { child: Column( children: [ ScanCondition( - scanConditionName: "Lighting", + scanConditionName: + TranslationBase.of(context).lighting, isConditionSatisfied: conditions.lighting, ), ScanCondition( - scanConditionName: "Distance", + scanConditionName: + TranslationBase.of(context).distance, isConditionSatisfied: conditions.distance, ), ScanCondition( - scanConditionName: "Centered", + scanConditionName: + TranslationBase.of(context).centered, isConditionSatisfied: conditions.centered, ), ], @@ -60,15 +65,18 @@ class ScanConditionChecklist extends StatelessWidget { child: Column( children: [ ScanCondition( - scanConditionName: "Movement", + scanConditionName: + TranslationBase.of(context).movement, isConditionSatisfied: conditions.movement, ), ScanCondition( - scanConditionName: "FrameRate", + scanConditionName: + TranslationBase.of(context).frameRate, isConditionSatisfied: conditions.frameRate, ), ScanCondition( - scanConditionName: "Server Ready", + scanConditionName: + TranslationBase.of(context).serverReady, isConditionSatisfied: conditions.serverReady, ), ], diff --git a/lib/vital_signs/components/scan_status.dart b/lib/vital_signs/components/scan_status.dart index 007063dd..d211a59b 100644 --- a/lib/vital_signs/components/scan_status.dart +++ b/lib/vital_signs/components/scan_status.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; import 'package:vital_sign_camera/vital_sign_camera.dart'; @@ -25,7 +26,7 @@ class ScanStatus extends StatelessWidget { ), ), Text( - getScanStage(), + getScanStage(context), style: const TextStyle( fontSize: 16, color: Colors.white, @@ -37,13 +38,13 @@ class ScanStatus extends StatelessWidget { ); } - String getScanStage() { + String getScanStage(context) { if (stage == GetHealthStage.waitingData) { - return 'Waiting Data...'; + return TranslationBase.of(context).waitingData; } else if (stage == GetHealthStage.collectingData) { - return 'Collecting Data...'; + return TranslationBase.of(context).collectingData; } else if (stage == GetHealthStage.analyzingData) { - return 'Analyzing Data...'; + return TranslationBase.of(context).analyzingData; } return ''; // idle } diff --git a/lib/vital_signs/components/start_button.dart b/lib/vital_signs/components/start_button.dart index b0001881..6aae114b 100644 --- a/lib/vital_signs/components/start_button.dart +++ b/lib/vital_signs/components/start_button.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/theme/colors.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; class StartButton extends StatelessWidget { @@ -25,8 +26,8 @@ class StartButton extends StatelessWidget { backgroundColor: (disabled) ? Colors.grey : CustomColors.accentColor, elevation: 8, ), - child: const Text( - "START", + child: Text( + TranslationBase.of(context).start, style: TextStyle( fontSize: 14, ), diff --git a/lib/vital_signs/components/vital_sign_widget.dart b/lib/vital_signs/components/vital_sign_widget.dart index 0cc7d2fd..8bc3aaf9 100644 --- a/lib/vital_signs/components/vital_sign_widget.dart +++ b/lib/vital_signs/components/vital_sign_widget.dart @@ -1,7 +1,5 @@ import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/uitl/utils_new.dart'; -import 'package:diplomaticquarterapp/vital_signs/data/vitals_benchmark.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -9,7 +7,9 @@ class VitalSignWidget extends StatelessWidget { final String vitalSignName; final String vitalSignValue; final String vectorUrl; - final RangeConditionWithTitle condition; + final dynamic condition; + final Map? lookupValues; + final Map? bloodPressureValues; final Color? textColor; const VitalSignWidget({ @@ -19,6 +19,8 @@ class VitalSignWidget extends StatelessWidget { this.textColor, required this.condition, required this.vectorUrl, + this.lookupValues, + this.bloodPressureValues, }) : super(key: key); @override @@ -70,10 +72,13 @@ class VitalSignWidget extends StatelessWidget { SizedBox( width: 8, ), - - Status( + if (lookupValues != null) + Status( status: - "${TranslationBase.of(context).getValue(condition.current?.quantitativeInterpretation ?? '')}") + "${TranslationBase.of(context).getValue(condition.current?.quantitativeInterpretation ?? '')}", + originalData: + condition.current?.quantitativeInterpretation ?? '', + ) // Text( // "${TranslationBase.of(context).getValue(condition.current?.quantitativeInterpretation ?? '')}", // style: TextStyle( @@ -90,24 +95,95 @@ class VitalSignWidget extends StatelessWidget { // SizedBox( // height: 30, // child: Row(mainAxisSize: MainAxisSize.max, children: [ - // Expanded( - // flex: 1, - // child: ListView.separated( - // separatorBuilder: (_, __) => SizedBox( - // width: 8, - // ), - // scrollDirection: Axis.horizontal, - // shrinkWrap: true, - // itemCount: condition.condition?.length ?? 0, - // itemBuilder: (_, index) => RangeWidget( - // title: condition.condition?[index].title ?? 'test', - // isSelected: condition.condition?[index] - // .isInRange(vitalSignValue) == - // true, - // ), - // ), - // ), - // ]), + if (lookupValues != null) + Flexible( + flex: 1, + child: ListView.separated( + physics: NeverScrollableScrollPhysics(), + separatorBuilder: (_, __) => SizedBox( + width: 8, + ), + shrinkWrap: true, + itemCount: lookupValues?.length ?? 0, + itemBuilder: (_, index) { + var key = lookupValues?.keys.elementAt(index); + return RangeWidget( + title: key ?? '', + values: lookupValues?[key] ?? [], + isSelected: false, + ); + }), + ), + + if (bloodPressureValues != null) + Flexible( + flex: 1, + child: ListView.separated( + separatorBuilder: (_, __) => SizedBox( + width: 8, + ), + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: bloodPressureValues?.length ?? 0, + itemBuilder: (_, index) { + var key = bloodPressureValues?.keys.elementAt(index); + print( + 'the ssize is ${(bloodPressureValues?[key]?.length ?? 1) * 40} '); + // return RangeWidget( + // title: key??'', + // values: lookupValues?[key]??[],isSelected: false, + // ); + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + TranslationBase.of(context) + .getValue(key ?? ''), + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, fontSize: 16), + ), + Status( + status: + "${TranslationBase.of(context).getValue(condition.getValue(key)?.quantitativeInterpretation ?? '')}", + originalData: condition + .getValue(key) + ?.quantitativeInterpretation ?? + '', + ) + ], + ), + SizedBox(height: 8), + SizedBox( + height: 220, + child: ListView.separated( + separatorBuilder: (_, __) => SizedBox( + width: 8, + ), + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: + bloodPressureValues?[key]?.length ?? 0, + itemBuilder: (_, index) { + var title = bloodPressureValues?[key] + ?.keys + .elementAt(index); + + return RangeWidget( + title: title ?? '', + values: bloodPressureValues?[key] + ?[title] ?? + [], + isSelected: false, + ); + })) + ], + ); + }), + ), + // ]), // ), SizedBox( height: 8, @@ -146,43 +222,102 @@ class VitalSignWidget extends StatelessWidget { class RangeWidget extends StatelessWidget { final String title; + final List values; final bool isSelected; - const RangeWidget({super.key, required this.title, required this.isSelected}); + const RangeWidget( + {super.key, + required this.title, + required this.isSelected, + required this.values}); @override Widget build(BuildContext context) { - return SizedBox( - height: 30, - child: Material( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(3), - ), - // color: Color(0xFF359846), - color: (isSelected) - ? CustomColors.accentColor - : CustomColors.lightGreyColor, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Center( - child: Text( - title, - textAlign: TextAlign.center, - style: TextStyle( - color: (isSelected) ? Colors.white : Colors.black, - fontSize: 12), + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + SizedBox( + height: 30, + child: Material( + shape: RoundedRectangleBorder( + borderRadius: BorderRadiusDirectional.only( + topStart: Radius.circular(8), + bottomStart: Radius.circular(8), + ), + ), + // color: Color(0xFF359846), + color: CustomColors.lightGreyColor, + child: Padding( + padding: const EdgeInsets.only( + top: 4.0, bottom: 4, right: 8, left: 8), + child: Text( + TranslationBase.of(context).getValue(title), + textAlign: TextAlign.center, + style: TextStyle(color: Colors.black, fontSize: 12), + ), + ), ), ), - ), + Expanded( + child: Material( + shape: RoundedRectangleBorder( + borderRadius: BorderRadiusDirectional.only( + topEnd: Radius.circular(8), + bottomEnd: Radius.circular(8), + ), + ), + // color: Color(0xFF359846), + color: getColor(title), + child: SizedBox( + height: 30, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: List.generate( + values.length, + (index) => Row( + children: [ + Text( + values[index], + textAlign: TextAlign.center, + style: + TextStyle(color: Colors.white, fontSize: 12), + ), + SizedBox( + width: 8, + ) + ], + ), + ), + ), + ), + )), + ) + ], ), ); } + + getColor(title) { + switch (title) { + case "excellent": + return Color(0xFF275b45); + case "good": + return Color(0xFF507a3d); + case "poor": + return Color(0xFFa86452); + case "atRisk": + return Color(0xFFa2494b); + } + } } class Status extends StatelessWidget { final String status; + final String originalData; - const Status({super.key, required this.status}); + const Status({super.key, required this.status, required this.originalData}); @override Widget build(BuildContext context) { @@ -191,23 +326,24 @@ class Status extends StatelessWidget { borderRadius: BorderRadius.circular(3), ), // color: Color(0xFF359846), - color: (status.toLowerCase() == 'good' || - status.toLowerCase() == 'excellent' || - status.toLowerCase() == 'normal') + color: (originalData.toLowerCase() == 'good' || + originalData.toLowerCase() == 'excellent' || + originalData.toLowerCase() == 'normal') ? Color(0xFFD8E8DB) - : (status.toLowerCase() == 'poor' || status.toLowerCase() == 'low') + : (originalData.toLowerCase() == 'poor' || + originalData.toLowerCase() == 'low') ? Color(0xFFD3D37E) : Color(0x98d02127), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), child: Text(status, style: TextStyle( - color: (status.toLowerCase() == 'good' || - status.toLowerCase() == 'excellent' || - status.toLowerCase() == 'normal') + color: (originalData.toLowerCase() == 'good' || + originalData.toLowerCase() == 'excellent' || + originalData.toLowerCase() == 'normal') ? Color(0xFF359846) - : (status.toLowerCase() == 'poor' || - status.toLowerCase() == 'low') + : (originalData.toLowerCase() == 'poor' || + originalData.toLowerCase() == 'low') ? Colors.white : Colors.white, fontSize: 8, diff --git a/lib/vital_signs/data/vitals_benchmark.dart b/lib/vital_signs/data/vitals_benchmark.dart index 8e322b99..f4e448b4 100644 --- a/lib/vital_signs/data/vitals_benchmark.dart +++ b/lib/vital_signs/data/vitals_benchmark.dart @@ -44,17 +44,10 @@ var vital = { }, { "min": 10.8, - "max": 16.4, - "interpretation": "poor", - "quantitativeInterpretation": "low", - "title": "10.8-16.4" - }, - { - "min": 16.4, "max": 35.0, "interpretation": "poor", "quantitativeInterpretation": "low", - "title": "16.4-35.0" + "title": "10.8-16.4" }, { "min": 35.0, @@ -99,7 +92,7 @@ var vital = { { "min": 97, "max": 100, - "interpretation": "good", + "interpretation": "excellent", "quantitativeInterpretation": "normal", "isMaxIncluded": true, "title": "97-100" @@ -110,39 +103,94 @@ var vital = { "unit": "mmHg", "values": [ { - "min": 0, - "max": (90 / 60), - "interpretation": "atRisk", - "quantitativeInterpretation": "low", - "title": "< 90/60" - }, - { - "min": (90 / 60), - "max": (120 / 70), - "interpretation": "excellent", - "quantitativeInterpretation": "normal", - "title": "90/60 - 120/70" - }, - { - "min": (120 / 70), - "max": (130 / 80), - "interpretation": "good", - "quantitativeInterpretation": "normal", - "title": "120/70 - 130/80" - }, - { - "min": (130 / 80), - "max": (140 / 90), - "interpretation": "poor", - "quantitativeInterpretation": "slightlyHigh", - "title": "130/80-140/90" - }, - { - "min": (140 / 90), - "max": 0, - "interpretation": "atRisk", - "quantitativeInterpretation": "high", - "title": "≥ 140/90" + "systolic-lng": { + "min": 0, + "max": 90, + "interpretation": "atRisk", + "quantitativeInterpretation": "low", + "title": "0-90", + "heading": "systolic-lng" + }, + "diastolic-lng": { + "min": 0, + "max": 60, + "interpretation": "atRisk", + "quantitativeInterpretation": "low", + "title": "0-60", + "heading": "diastolic-lng" + } + }, + { + "systolic-lng": { + "min": 90, + "max": 120, + "interpretation": "excellent", + "quantitativeInterpretation": "normal", + "title": "90-120", + "heading": "systolic-lng" + }, + "diastolic-lng": { + "min": 60, + "max": 70, + "interpretation": "excellent", + "quantitativeInterpretation": "normal", + "title": "60-70", + "heading": "diastolic-lng" + } + }, + { + "systolic-lng": { + "min": 120, + "max": 130, + "interpretation": "good", + "quantitativeInterpretation": "normal", + "title": "120-130", + "heading": "systolic-lng" + }, + "diastolic-lng": { + "min": 70, + "max": 80, + "interpretation": "good", + "quantitativeInterpretation": "normal", + "title": "70-80", + "heading": "diastolic-lng" + } + }, + { + "systolic-lng": { + "min": 130, + "max": 140, + "interpretation": "poor", + "quantitativeInterpretation": "slightlyHigh", + "title": "130-140", + "heading": "systolic-lng" + }, + "diastolic-lng": { + "min": 80, + "max": 90, + "interpretation": "poor", + "quantitativeInterpretation": "normal", + "title": "80-90", + "heading": "diastolic-lng" + } + }, + { + "systolic-lng": { + "min": 140, + "max": 0, + "interpretation": "atRisk", + "quantitativeInterpretation": "high", + "title": "140-200", + "heading": "systolic-lng" + }, + "diastolic-lng": { + "min": 90, + "max": 200, + "interpretation": "atRisk", + "quantitativeInterpretation": "high", + "title": "≥ 90", + "heading": "diastolic-lng" + } } ] }, @@ -159,7 +207,7 @@ var vital = { { "min": 18.5, "max": 25, - "interpretation": "poor", + "interpretation": "excellent", "quantitativeInterpretation": "normal", "title": "25-30" },{ @@ -299,6 +347,103 @@ var vital = { }, }; +var vitalValues = { + "HR": { + "excellent": ["60-80"], + "poor": ["80-100"], + "atRisk": ["< 60", "≥ 100"] + }, + "hrvv": { + "excellent": ["≥ 51.5"], + "good": ["35.0-51.5"], + "poor": ["10.8-16.4"], + "atRisk": ["< 10.8"] + }, + "Sp02": { + "excellent": ["97-100"], + "good": ["95-97"], + "poor": ["90-95"], + "atRisk": ["≥ 90"] + }, + "blood_pressure": { + "systolic-lng": { + "excellent": ["90-120"], + "good": ["120-130"], + "poor": ["130-140"], + "atRisk": ["0-90", "140-200"] + }, + "diastolic-lng": { + "excellent": ["60-70"], + "good": ["70-80"], + "poor": ["80-90"], + "atRisk": ["0-60", "≥ 90"] + } + }, + // "bmi": { + // "unit": "", + // "values": [ + // { + // "min": 0, + // "max": 18.5, + // "interpretation": "poor", + // "quantitativeInterpretation": "normal", + // "title": "< 18.5" + // }, + // { + // "min": 18.5, + // "max": 25, + // "interpretation": "excellent", + // "quantitativeInterpretation": "normal", + // "title": "25-30" + // },{ + // "min": 25, + // "max": 30, + // "interpretation": "poor", + // "quantitativeInterpretation": "normal", + // "title": "25-30" + // }, + // { + // "min": 30, + // "max": 40, + // "interpretation": "atRisk", + // "quantitativeInterpretation": "high", + // "title": "30-40" + // }, + // { + // "min": 40, + // "max": 0, + // "interpretation": "atRisk", + // "quantitativeInterpretation": "high", + // "title": "≥40" + // }, + // ] + "bmi": { + "excellent": ["18.5-25"], + "poor": ["< 18.5", "25-30"], + "atRisk": ["30-40", "≥40"], + }, + "respiratoryRate": { + "excellent": ["25-30"], + "poor": ["< 12", "≥ 20"] + }, + "cvd": { + "excellent": ["< 1"], + "Average": ["1-10"], + "poor": ["10-20"], + "atRisk": ["≥ 20"] + }, + "generalWellness": { + "excellent": ["80-100"], + "good": ["40-80"], + "poor": ["< 40"] + }, + "stressLevel": { + "excellent": ["0-2"], + "good": ["2-3"], + "poor": ["80-100"] + } +}; + class RangeConditionWithTitle { String? unit; List? condition; @@ -316,7 +461,56 @@ class RangeConditionWithTitle { } } +class RangeConditionForBloodPressure { + String? unit; + List? condition; + + BloodPressure? systolic; + BloodPressure? diastolic; + + RangeCondition? getValue(String key) { + switch (key) { + case 'systolic-lng': + return systolic?.systolic; + + case 'diastolic-lng': + return diastolic?.diastolic; + } + } + + RangeConditionForBloodPressure({this.unit, this.condition}); + + RangeConditionForBloodPressure.fromJson( + Map json, String formatValueToTwoDp) { + this.unit = json['unit']; + var conditions = json['values'] as List?; + this.condition = conditions + ?.map((item) => BloodPressure.fromJson(item, formatValueToTwoDp)) + .toList(); + print("the value is $formatValueToTwoDp"); + systolic = condition + ?.where((element) => element.systolic?.isSelected == true) + .first; + diastolic = condition + ?.where((element) => element.diastolic?.isSelected == true) + .first; + } +} + +class BloodPressure { + RangeCondition? systolic; + RangeCondition? diastolic; + + BloodPressure.fromJson(Map json, String selectedValue) { + systolic = RangeCondition.fromJson( + json['systolic-lng'], selectedValue.split("/")[0]); + diastolic = RangeCondition.fromJson( + json['diastolic-lng'], selectedValue.split("/")[1]); + } +} + class RangeCondition { + String? heading; double? min; double? max; bool? isMaxIncluded; @@ -336,6 +530,7 @@ class RangeCondition { isMaxIncluded = json['isMaxIncluded']; title = json['title']; isSelected = isInRange(selectedValue); + heading = json['heading']; } bool isInRange(String data) { diff --git a/lib/vital_signs/result_screen.dart b/lib/vital_signs/result_screen.dart index bcbb7d27..b5b37220 100644 --- a/lib/vital_signs/result_screen.dart +++ b/lib/vital_signs/result_screen.dart @@ -52,6 +52,7 @@ class ResultScreen extends StatelessWidget { _holisticAnalysis?.generalWellness != null) VitalSignWidget( textColor: textColor, + lookupValues: vitalValues['generalWellness']!, vitalSignName: TranslationBase.of(context).generalWellness, condition: RangeConditionWithTitle.fromJson( @@ -70,6 +71,7 @@ class ResultScreen extends StatelessWidget { vital['stressLevel']!, formatValueToTwoDp( healthResult?.vitalSigns.stress)), + lookupValues: vitalValues['stressLevel']!, vitalSignValue: formatValueToTwoDp(healthResult?.vitalSigns.stress), vectorUrl: 'assets/images/svg/stress.svg', @@ -81,6 +83,7 @@ class ResultScreen extends StatelessWidget { vital['HR']!, formatValueToTwoDp( healthResult?.vitalSigns.heartRate)), + lookupValues: vitalValues['HR']!, vitalSignValue: formatValueToTwoDp( healthResult?.vitalSigns.heartRate), vectorUrl: 'assets/images/svg/heartrate.svg', @@ -90,9 +93,10 @@ class ResultScreen extends StatelessWidget { VitalSignWidget( textColor: textColor, vitalSignName: "Blood Pressure", - condition: RangeConditionWithTitle.fromJson( + condition: RangeConditionForBloodPressure.fromJson( vital['blood_pressure']!, healthResult?.vitalSigns.bloodPressure ?? ""), + bloodPressureValues: vitalValues['blood_pressure']!, vitalSignValue: healthResult?.vitalSigns.bloodPressure ?? "", vectorUrl: 'assets/images/svg/bloodpressure.svg', @@ -102,6 +106,7 @@ class ResultScreen extends StatelessWidget { vectorUrl: 'assets/images/svg/heartrate.svg', textColor: textColor, vitalSignName: "HRV SDNN", + lookupValues: vitalValues['hrvv']!, condition: RangeConditionWithTitle.fromJson( vital['hrvv']!, formatValueToTwoDp( @@ -112,6 +117,7 @@ class ResultScreen extends StatelessWidget { //oxygen VitalSignWidget( textColor: textColor, + lookupValues: vitalValues['Sp02']!, vitalSignName: TranslationBase.of(context).oxygenSaturation, condition: RangeConditionWithTitle.fromJson( @@ -124,6 +130,7 @@ class ResultScreen extends StatelessWidget { if (_vitalSign?.respiratoryRate != null) VitalSignWidget( textColor: textColor, + lookupValues: vitalValues['respiratoryRate']!, vitalSignName: TranslationBase.of(context).respiratoryRate, condition: RangeConditionWithTitle.fromJson( @@ -138,6 +145,7 @@ class ResultScreen extends StatelessWidget { _holisticAnalysis?.bmi != null) VitalSignWidget( textColor: textColor, + lookupValues: vitalValues['bmi']!, vitalSignName: TranslationBase.of(context).BMI, condition: RangeConditionWithTitle.fromJson( vital['bmi']!,