Added SmartRingOperations
parent
c1751c05db
commit
b136f63e40
File diff suppressed because one or more lines are too long
@ -0,0 +1,413 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:diplomaticquarterapp/config/size_config.dart';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/checkme_ecg_info_screen.dart';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_bp_model.dart';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_ecg_model.dart';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_glucose_model.dart';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_oxi_model.dart';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_temperature_model.dart';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/smart_ring_models.dart';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class SmartRingInfoScreen extends StatelessWidget {
|
||||
final SmartRingOperationsEnum smartRingOperationsEnum;
|
||||
|
||||
const SmartRingInfoScreen(this.smartRingOperationsEnum);
|
||||
|
||||
String getTrackerNameByEnum(SmartRingOperationsEnum typeEnum) {
|
||||
switch (typeEnum) {
|
||||
case SmartRingOperationsEnum.Temperature:
|
||||
return "Temperature";
|
||||
|
||||
case SmartRingOperationsEnum.BloodOxygen:
|
||||
return "Blood Oxygen";
|
||||
|
||||
case SmartRingOperationsEnum.HeartRateDynamic:
|
||||
return "HeartRate Dynamic";
|
||||
|
||||
case SmartRingOperationsEnum.HeartRateStatic:
|
||||
return "HeartRate Static";
|
||||
|
||||
case SmartRingOperationsEnum.HRV:
|
||||
return "HRV";
|
||||
|
||||
case SmartRingOperationsEnum.BatteryLevel:
|
||||
return "Battery Level";
|
||||
}
|
||||
return "Battery Level";
|
||||
}
|
||||
|
||||
Widget getAllInOneOperationWidgets(MyTrackersViewModel myTrackersVm, SmartRingOperationsEnum smartRingOperationsEnum, BuildContext context) {
|
||||
switch (smartRingOperationsEnum) {
|
||||
case SmartRingOperationsEnum.Temperature:
|
||||
return buildTemperatureWidget(myTrackersVm, context);
|
||||
case SmartRingOperationsEnum.HeartRateStatic:
|
||||
return buildHeartRateStaticWidget(myTrackersVm, context);
|
||||
case SmartRingOperationsEnum.HeartRateDynamic:
|
||||
return buildHeartRateDynamicWidget(myTrackersVm, context);
|
||||
case SmartRingOperationsEnum.HRV:
|
||||
return buildHrvWidget(myTrackersVm, context);
|
||||
case SmartRingOperationsEnum.BloodOxygen:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
case SmartRingOperationsEnum.BatteryLevel:
|
||||
return buildBatteryLevelWidget(myTrackersVm, context);
|
||||
}
|
||||
return getNoDataWidget(context);
|
||||
}
|
||||
|
||||
Widget buildTemperatureWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
|
||||
if (myTrackersVm.filesLoader) {
|
||||
return Center(child: CircularProgressIndicator());
|
||||
} else if (myTrackersVm.smartRingTemperatureHistory != null && myTrackersVm.smartRingTemperatureHistory.isNotEmpty) {
|
||||
return Expanded(
|
||||
child: ListView.separated(
|
||||
itemCount: myTrackersVm.smartRingTemperatureHistory.length,
|
||||
separatorBuilder: (context, index) => SizedBox(height: 14),
|
||||
shrinkWrap: true,
|
||||
reverse: false,
|
||||
itemBuilder: (context, index) {
|
||||
SmartRingGenericModel smartRingTemp = myTrackersVm.smartRingTemperatureHistory[index];
|
||||
return InkWell(
|
||||
onTap: () => Navigator.pop(context),
|
||||
child: Container(
|
||||
decoration: cardRadius(12),
|
||||
padding: EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("Temperature: ${smartRingTemp.value}"),
|
||||
mHeight(4.0),
|
||||
Text("Date: ${smartRingTemp.date}"),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return getNoDataWidget(context);
|
||||
}
|
||||
}
|
||||
|
||||
Widget buildHeartRateDynamicWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
|
||||
if (myTrackersVm.filesLoader) {
|
||||
return Center(child: CircularProgressIndicator());
|
||||
} else if (myTrackersVm.smartRingHeartRateDynamicHistory != null && myTrackersVm.smartRingHeartRateDynamicHistory.isNotEmpty) {
|
||||
return Expanded(
|
||||
child: ListView.separated(
|
||||
itemCount: myTrackersVm.smartRingHeartRateDynamicHistory.length,
|
||||
separatorBuilder: (context, index) => SizedBox(height: 14),
|
||||
shrinkWrap: true,
|
||||
reverse: false,
|
||||
itemBuilder: (context, index) {
|
||||
SmartRingGenericModel smartRingHr = myTrackersVm.smartRingHeartRateDynamicHistory[index];
|
||||
return InkWell(
|
||||
onTap: () => Navigator.pop(context),
|
||||
child: Container(
|
||||
decoration: cardRadius(12),
|
||||
padding: EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("arrayDynamicHR: ${smartRingHr.value}"),
|
||||
mHeight(4.0),
|
||||
Text("Date: ${smartRingHr.date}"),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return getNoDataWidget(context);
|
||||
}
|
||||
}
|
||||
|
||||
Widget buildHeartRateStaticWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
|
||||
if (myTrackersVm.filesLoader) {
|
||||
return Center(child: CircularProgressIndicator());
|
||||
} else if (myTrackersVm.smartRingHeartRateStaticHistory != null && myTrackersVm.smartRingHeartRateStaticHistory.isNotEmpty) {
|
||||
return Expanded(
|
||||
child: ListView.separated(
|
||||
itemCount: myTrackersVm.smartRingHeartRateStaticHistory.length,
|
||||
separatorBuilder: (context, index) => SizedBox(height: 14),
|
||||
shrinkWrap: true,
|
||||
reverse: false,
|
||||
itemBuilder: (context, index) {
|
||||
SmartRingGenericModel smartRingHr = myTrackersVm.smartRingHeartRateStaticHistory[index];
|
||||
return InkWell(
|
||||
onTap: () => Navigator.pop(context),
|
||||
child: Container(
|
||||
decoration: cardRadius(12),
|
||||
padding: EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("onceHeartValue: ${smartRingHr.value}"),
|
||||
mHeight(4.0),
|
||||
Text("Date: ${smartRingHr.date}"),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return getNoDataWidget(context);
|
||||
}
|
||||
}
|
||||
|
||||
Widget buildHrvWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
|
||||
if (myTrackersVm.filesLoader) {
|
||||
return Center(child: CircularProgressIndicator());
|
||||
} else if (myTrackersVm.smartRingHrvHistory != null && myTrackersVm.smartRingHrvHistory.isNotEmpty) {
|
||||
return Expanded(
|
||||
child: ListView.separated(
|
||||
itemCount: myTrackersVm.smartRingHrvHistory.length,
|
||||
separatorBuilder: (context, index) => SizedBox(height: 14),
|
||||
shrinkWrap: true,
|
||||
reverse: false,
|
||||
itemBuilder: (context, index) {
|
||||
SmartRingHrvModel smartRingHrvModel = myTrackersVm.smartRingHrvHistory[index];
|
||||
return InkWell(
|
||||
onTap: () => Navigator.pop(context),
|
||||
child: Container(
|
||||
decoration: cardRadius(12),
|
||||
padding: EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("highBP: ${smartRingHrvModel.highBP}"),
|
||||
mHeight(4.0),
|
||||
Text("lowBP: ${smartRingHrvModel.lowBP}"),
|
||||
mHeight(4.0),
|
||||
Text("stress: ${smartRingHrvModel.stress}"),
|
||||
mHeight(4.0),
|
||||
Text("heartRate: ${smartRingHrvModel.heartRate}"),
|
||||
mHeight(4.0),
|
||||
Text("hrv: ${smartRingHrvModel.hrv}"),
|
||||
mHeight(4.0),
|
||||
Text("vascularAging: ${smartRingHrvModel.vascularAging}"),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return getNoDataWidget(context);
|
||||
}
|
||||
}
|
||||
|
||||
Widget buildBatteryLevelWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
|
||||
if (myTrackersVm.filesLoader) {
|
||||
return Center(child: CircularProgressIndicator());
|
||||
} else if (myTrackersVm.smartRingBatteryLevel != null && myTrackersVm.smartRingBatteryLevel.isNotEmpty) {
|
||||
return Center(
|
||||
child: Text("Battery Level: ${myTrackersVm.smartRingBatteryLevel}"),
|
||||
);
|
||||
} else {
|
||||
return getNoDataWidget(context);
|
||||
}
|
||||
}
|
||||
|
||||
Widget buildECGWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: [
|
||||
if (myTrackersVm.filesLoader) ...[
|
||||
Center(child: CircularProgressIndicator())
|
||||
] else if (myTrackersVm.checkMeEcg != null && myTrackersVm.checkMeEcg.isNotEmpty) ...[
|
||||
Material(
|
||||
child: ListView.separated(
|
||||
itemCount: myTrackersVm.checkMeEcg.length,
|
||||
separatorBuilder: (context, index) => SizedBox(height: 14),
|
||||
shrinkWrap: true,
|
||||
reverse: false,
|
||||
itemBuilder: (context, index) {
|
||||
CheckMeECGModel checkMeECGModel = myTrackersVm.checkMeEcg[index];
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
myTrackersVm.getEcgWaveDataFromCheckMePro(checkMeECGModel.timeString);
|
||||
// Navigator.push(context, MaterialPageRoute(builder: (context) => CheckMeECGInfoScreen(SmartRingOperationsEnum.ECGTracker)));
|
||||
},
|
||||
child: Container(
|
||||
decoration: cardRadius(12),
|
||||
padding: EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("Date: ${checkMeECGModel.date}"),
|
||||
mHeight(8),
|
||||
Text("TimeString: ${checkMeECGModel.timeString}"),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
] else ...[
|
||||
getNoDataWidget(context),
|
||||
]
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildOxiWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: [
|
||||
if (myTrackersVm.filesLoader) ...[
|
||||
Center(child: CircularProgressIndicator())
|
||||
] else if (myTrackersVm.checkMeOxi != null && myTrackersVm.checkMeOxi.isNotEmpty) ...[
|
||||
Material(
|
||||
child: ListView.separated(
|
||||
itemCount: myTrackersVm.checkMeOxi.length,
|
||||
separatorBuilder: (context, index) => SizedBox(height: 14),
|
||||
shrinkWrap: true,
|
||||
reverse: false,
|
||||
itemBuilder: (context, index) {
|
||||
CheckMeOxiModel checkMeOxiModel = myTrackersVm.checkMeOxi[index];
|
||||
return InkWell(
|
||||
onTap: () => Navigator.pop(context),
|
||||
child: Container(
|
||||
decoration: cardRadius(12),
|
||||
padding: EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("PR: ${checkMeOxiModel.pr} PI: ${checkMeOxiModel.pi}"),
|
||||
mHeight(4.0),
|
||||
Text("Oxi: ${checkMeOxiModel.oxy}"),
|
||||
mHeight(4.0),
|
||||
Text("Date: ${checkMeOxiModel.date}"),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
] else ...[
|
||||
getNoDataWidget(context),
|
||||
]
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildBPWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: [
|
||||
if (myTrackersVm.filesLoader) ...[
|
||||
Center(child: CircularProgressIndicator())
|
||||
] else if (myTrackersVm.checkMeBP != null && myTrackersVm.checkMeBP.isNotEmpty) ...[
|
||||
Material(
|
||||
child: ListView.separated(
|
||||
itemCount: myTrackersVm.checkMeBP.length,
|
||||
separatorBuilder: (context, index) => SizedBox(height: 14),
|
||||
shrinkWrap: true,
|
||||
reverse: false,
|
||||
itemBuilder: (context, index) {
|
||||
CheckMeBPModel checkMeBPModel = myTrackersVm.checkMeBP[index];
|
||||
return InkWell(
|
||||
onTap: () => Navigator.pop(context),
|
||||
child: Container(
|
||||
decoration: cardRadius(12),
|
||||
padding: EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("DIA: ${checkMeBPModel.dia} SYS: ${checkMeBPModel.sys}"),
|
||||
mHeight(4.0),
|
||||
Text("PR: ${checkMeBPModel.pr}"),
|
||||
mHeight(4.0),
|
||||
Text("Date: ${checkMeBPModel.date}"),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
] else ...[
|
||||
getNoDataWidget(context),
|
||||
]
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildGlucoseWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: [
|
||||
if (myTrackersVm.filesLoader) ...[
|
||||
Center(child: CircularProgressIndicator())
|
||||
] else if (myTrackersVm.checkMeGlucose != null && myTrackersVm.checkMeGlucose.isNotEmpty) ...[
|
||||
Material(
|
||||
child: ListView.separated(
|
||||
itemCount: myTrackersVm.checkMeGlucose.length,
|
||||
separatorBuilder: (context, index) => SizedBox(height: 14),
|
||||
shrinkWrap: true,
|
||||
reverse: false,
|
||||
itemBuilder: (context, index) {
|
||||
CheckMeGlucoseModel checkMeGlucoseModel = myTrackersVm.checkMeGlucose[index];
|
||||
return InkWell(
|
||||
onTap: () => null,
|
||||
child: Container(
|
||||
decoration: cardRadius(12),
|
||||
padding: EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("Glucose: ${checkMeGlucoseModel.glu}"),
|
||||
mHeight(4.0),
|
||||
Text("Date: ${checkMeGlucoseModel.date}"),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
] else ...[
|
||||
getNoDataWidget(context),
|
||||
]
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AppScaffold(
|
||||
appBarTitle: "${getTrackerNameByEnum(smartRingOperationsEnum)}",
|
||||
showNewAppBar: true,
|
||||
isShowDecPage: false,
|
||||
showNewAppBarTitle: true,
|
||||
backgroundColor: Color(0xffF8F8F8),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.all(24.0),
|
||||
child: Column(
|
||||
children: [
|
||||
Consumer(
|
||||
builder: (BuildContext context, MyTrackersViewModel myTrackersVm, Widget child) {
|
||||
return getAllInOneOperationWidgets(myTrackersVm, smartRingOperationsEnum, context);
|
||||
},
|
||||
),
|
||||
],
|
||||
)),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,76 @@
|
||||
//TEMPERATURE
|
||||
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart';
|
||||
|
||||
String getValueKeyBySmartRingOperation(SmartRingOperationsEnum smartRingOperationsEnum) {
|
||||
switch (smartRingOperationsEnum) {
|
||||
case SmartRingOperationsEnum.Temperature:
|
||||
return "temperature";
|
||||
case SmartRingOperationsEnum.HeartRateStatic:
|
||||
return "onceHeartValue";
|
||||
case SmartRingOperationsEnum.HeartRateDynamic:
|
||||
return "arrayDynamicHR";
|
||||
case SmartRingOperationsEnum.HRV:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
case SmartRingOperationsEnum.BloodOxygen:
|
||||
// TODO: Handle this case.
|
||||
break;
|
||||
case SmartRingOperationsEnum.BatteryLevel:
|
||||
return "batteryLevel";
|
||||
}
|
||||
return "batteryLevel";
|
||||
}
|
||||
|
||||
class SmartRingGenericModel {
|
||||
DateTime date;
|
||||
String value;
|
||||
|
||||
SmartRingGenericModel({this.date, this.value});
|
||||
|
||||
SmartRingGenericModel.fromJson(Map<String, dynamic> json, SmartRingOperationsEnum smartRingOperationsEnum) {
|
||||
date = json['date'] != null ? DateTime.parse(((json["date"] as String).replaceAll(".", "-"))) : DateTime.now();
|
||||
value = json['${getValueKeyBySmartRingOperation(smartRingOperationsEnum)}'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson(SmartRingOperationsEnum smartRingOperationsEnum) {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['date'] = this.date;
|
||||
data['arrayDynamicHR'] = getValueKeyBySmartRingOperation(smartRingOperationsEnum);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class SmartRingHrvModel {
|
||||
String date;
|
||||
String highBP;
|
||||
String stress;
|
||||
String lowBP;
|
||||
String heartRate;
|
||||
String hrv;
|
||||
String vascularAging;
|
||||
|
||||
SmartRingHrvModel({this.date, this.highBP, this.stress, this.lowBP, this.heartRate, this.hrv, this.vascularAging});
|
||||
|
||||
SmartRingHrvModel.fromJson(Map<String, dynamic> json) {
|
||||
date = json['date'];
|
||||
highBP = json['highBP'];
|
||||
stress = json['stress'];
|
||||
lowBP = json['lowBP'];
|
||||
heartRate = json['heartRate'];
|
||||
hrv = json['hrv'];
|
||||
vascularAging = json['vascularAging'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['date'] = this.date;
|
||||
data['highBP'] = this.highBP;
|
||||
data['stress'] = this.stress;
|
||||
data['lowBP'] = this.lowBP;
|
||||
data['heartRate'] = this.heartRate;
|
||||
data['hrv'] = this.hrv;
|
||||
data['vascularAging'] = this.vascularAging;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue