|
|
|
|
@ -21,7 +21,14 @@ import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart';
|
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
|
|
|
|
|
class VitalSignPage extends StatefulWidget {
|
|
|
|
|
const VitalSignPage({super.key});
|
|
|
|
|
final VitalSignResModel? specificVitalSign;
|
|
|
|
|
final bool isFromAppointment;
|
|
|
|
|
|
|
|
|
|
const VitalSignPage({
|
|
|
|
|
super.key,
|
|
|
|
|
this.specificVitalSign,
|
|
|
|
|
this.isFromAppointment = false,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
State<VitalSignPage> createState() => _VitalSignPageState();
|
|
|
|
|
@ -53,10 +60,14 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
return value.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _openDetails(VitalSignDetailsArgs args) {
|
|
|
|
|
void _openDetails(VitalSignDetailsArgs args, VitalSignResModel? targetVitalSign) {
|
|
|
|
|
Navigator.of(context).push(
|
|
|
|
|
CustomPageRoute(
|
|
|
|
|
page: VitalSignDetailsPage(args: args),
|
|
|
|
|
page: VitalSignDetailsPage(
|
|
|
|
|
args: args,
|
|
|
|
|
selectedVitalSign: targetVitalSign,
|
|
|
|
|
isFromAppointment: widget.isFromAppointment,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
@ -75,20 +86,21 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
child: Consumer<HmgServicesViewModel>(
|
|
|
|
|
builder: (context, viewModel, child) {
|
|
|
|
|
|
|
|
|
|
// Get the latest vital sign data (first item in the list)
|
|
|
|
|
VitalSignResModel? latestVitalSign = viewModel.vitalSignList.isNotEmpty
|
|
|
|
|
? viewModel.vitalSignList.first
|
|
|
|
|
: null;
|
|
|
|
|
// Get target vital sign: specificVitalSign if passed, otherwise first in list
|
|
|
|
|
VitalSignResModel? targetVitalSign = widget.specificVitalSign ??
|
|
|
|
|
(viewModel.vitalSignList.isNotEmpty
|
|
|
|
|
? viewModel.vitalSignList.first
|
|
|
|
|
: null);
|
|
|
|
|
|
|
|
|
|
// Debug logging for blood pressure
|
|
|
|
|
// if (latestVitalSign != null) {
|
|
|
|
|
// if (targetVitalSign != null) {
|
|
|
|
|
// print('=== Blood Pressure Debug ===');
|
|
|
|
|
// print('bloodPressureHigher: ${latestVitalSign.bloodPressureHigher}');
|
|
|
|
|
// print('bloodPressureLower: ${latestVitalSign.bloodPressureLower}');
|
|
|
|
|
// print('bloodPressureHigher type: ${latestVitalSign.bloodPressureHigher.runtimeType}');
|
|
|
|
|
// print('bloodPressureLower type: ${latestVitalSign.bloodPressureLower.runtimeType}');
|
|
|
|
|
// print('bloodPressureHigher == 0: ${latestVitalSign.bloodPressureHigher == 0}');
|
|
|
|
|
// print('bloodPressureLower == 0: ${latestVitalSign.bloodPressureLower == 0}');
|
|
|
|
|
// print('bloodPressureHigher: ${targetVitalSign.bloodPressureHigher}');
|
|
|
|
|
// print('bloodPressureLower: ${targetVitalSign.bloodPressureLower}');
|
|
|
|
|
// print('bloodPressureHigher type: ${targetVitalSign.bloodPressureHigher.runtimeType}');
|
|
|
|
|
// print('bloodPressureLower type: ${targetVitalSign.bloodPressureLower.runtimeType}');
|
|
|
|
|
// print('bloodPressureHigher == 0: ${targetVitalSign.bloodPressureHigher == 0}');
|
|
|
|
|
// print('bloodPressureLower == 0: ${targetVitalSign.bloodPressureLower == 0}');
|
|
|
|
|
// print('========================');
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
@ -112,9 +124,9 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
_buildVitalSignCard(
|
|
|
|
|
icon: AppAssets.bmiVital,
|
|
|
|
|
label: LocaleKeys.bmi.tr(context: context),
|
|
|
|
|
value: _formatValue(latestVitalSign?.bodyMassIndex),
|
|
|
|
|
value: _formatValue(targetVitalSign?.bodyMassIndex),
|
|
|
|
|
unit: '',
|
|
|
|
|
status: VitalSignUiModel.bmiStatus(latestVitalSign?.bodyMassIndex),
|
|
|
|
|
status: VitalSignUiModel.bmiStatus(targetVitalSign?.bodyMassIndex),
|
|
|
|
|
onTap: () => _openDetails(
|
|
|
|
|
VitalSignDetailsArgs(
|
|
|
|
|
metric: VitalSignMetric.bmi,
|
|
|
|
|
@ -122,6 +134,7 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
icon: AppAssets.bmiVital,
|
|
|
|
|
unit: '',
|
|
|
|
|
),
|
|
|
|
|
targetVitalSign,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
SizedBox(height: 16.h),
|
|
|
|
|
@ -130,7 +143,7 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
_buildVitalSignCard(
|
|
|
|
|
icon: AppAssets.heightVital,
|
|
|
|
|
label: LocaleKeys.height.tr(context: context),
|
|
|
|
|
value: _formatValue(latestVitalSign?.heightCm),
|
|
|
|
|
value: _formatValue(targetVitalSign?.heightCm),
|
|
|
|
|
unit: 'cm',
|
|
|
|
|
status: null,
|
|
|
|
|
onTap: () => _openDetails(
|
|
|
|
|
@ -140,6 +153,7 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
icon: AppAssets.heightVital,
|
|
|
|
|
unit: 'cm',
|
|
|
|
|
),
|
|
|
|
|
targetVitalSign,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
SizedBox(height: 16.h),
|
|
|
|
|
@ -148,10 +162,10 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
_buildVitalSignCard(
|
|
|
|
|
icon: AppAssets.weightVital,
|
|
|
|
|
label: LocaleKeys.weight.tr(context: context),
|
|
|
|
|
value: _formatValue(latestVitalSign?.weightKg),
|
|
|
|
|
value: _formatValue(targetVitalSign?.weightKg),
|
|
|
|
|
unit: 'kg',
|
|
|
|
|
status: (latestVitalSign?.weightKg != null)
|
|
|
|
|
? VitalSignUiModel.weightStatus(latestVitalSign?.bodyMassIndex)
|
|
|
|
|
status: (targetVitalSign?.weightKg != null)
|
|
|
|
|
? VitalSignUiModel.weightStatus(targetVitalSign?.bodyMassIndex)
|
|
|
|
|
: null,
|
|
|
|
|
onTap: () => _openDetails(
|
|
|
|
|
VitalSignDetailsArgs(
|
|
|
|
|
@ -160,6 +174,7 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
icon: AppAssets.weightVital,
|
|
|
|
|
unit: 'kg',
|
|
|
|
|
),
|
|
|
|
|
targetVitalSign,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
SizedBox(height: 16.h),
|
|
|
|
|
@ -168,18 +183,18 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
_buildVitalSignCard(
|
|
|
|
|
icon: AppAssets.bloodPressure,
|
|
|
|
|
label: LocaleKeys.bloodPressure.tr(context: context),
|
|
|
|
|
value: (latestVitalSign != null &&
|
|
|
|
|
_isValidValue(latestVitalSign.bloodPressureHigher) &&
|
|
|
|
|
_isValidValue(latestVitalSign.bloodPressureLower))
|
|
|
|
|
? '${latestVitalSign.bloodPressureHigher}/${latestVitalSign.bloodPressureLower}'
|
|
|
|
|
value: (targetVitalSign != null &&
|
|
|
|
|
_isValidValue(targetVitalSign.bloodPressureHigher) &&
|
|
|
|
|
_isValidValue(targetVitalSign.bloodPressureLower))
|
|
|
|
|
? '${targetVitalSign.bloodPressureHigher}/${targetVitalSign.bloodPressureLower}'
|
|
|
|
|
: '--',
|
|
|
|
|
unit: '',
|
|
|
|
|
status: (latestVitalSign != null &&
|
|
|
|
|
_isValidValue(latestVitalSign.bloodPressureHigher) &&
|
|
|
|
|
_isValidValue(latestVitalSign.bloodPressureLower))
|
|
|
|
|
status: (targetVitalSign != null &&
|
|
|
|
|
_isValidValue(targetVitalSign.bloodPressureHigher) &&
|
|
|
|
|
_isValidValue(targetVitalSign.bloodPressureLower))
|
|
|
|
|
? VitalSignUiModel.bloodPressureStatus(
|
|
|
|
|
systolic: latestVitalSign.bloodPressureHigher,
|
|
|
|
|
diastolic: latestVitalSign.bloodPressureLower,
|
|
|
|
|
systolic: targetVitalSign.bloodPressureHigher,
|
|
|
|
|
diastolic: targetVitalSign.bloodPressureLower,
|
|
|
|
|
)
|
|
|
|
|
: null,
|
|
|
|
|
onTap: () => _openDetails(
|
|
|
|
|
@ -191,6 +206,7 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
low: 90,
|
|
|
|
|
high: 140,
|
|
|
|
|
),
|
|
|
|
|
targetVitalSign,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
SizedBox(height: 16.h),
|
|
|
|
|
@ -199,7 +215,7 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
_buildVitalSignCard(
|
|
|
|
|
icon: AppAssets.temperature,
|
|
|
|
|
label: LocaleKeys.temperature.tr(context: context),
|
|
|
|
|
value: _formatValue(latestVitalSign?.temperatureCelcius),
|
|
|
|
|
value: _formatValue(targetVitalSign?.temperatureCelcius),
|
|
|
|
|
unit: '°C',
|
|
|
|
|
status: null,
|
|
|
|
|
onTap: () => _openDetails(
|
|
|
|
|
@ -211,6 +227,7 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
low: 36.1,
|
|
|
|
|
high: 37.2,
|
|
|
|
|
),
|
|
|
|
|
targetVitalSign,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
@ -275,9 +292,9 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
child: _buildVitalSignCard(
|
|
|
|
|
icon: AppAssets.heart,
|
|
|
|
|
label: LocaleKeys.heart.tr(context: context),
|
|
|
|
|
value: _formatValue(latestVitalSign?.heartRate ?? latestVitalSign?.pulseBeatPerMinute),
|
|
|
|
|
value: _formatValue(targetVitalSign?.heartRate ?? targetVitalSign?.pulseBeatPerMinute),
|
|
|
|
|
unit: 'bpm',
|
|
|
|
|
status: _isValidValue(latestVitalSign?.heartRate ?? latestVitalSign?.pulseBeatPerMinute) ? VitalSignStatus.normal : null,
|
|
|
|
|
status: _isValidValue(targetVitalSign?.heartRate ?? targetVitalSign?.pulseBeatPerMinute) ? VitalSignStatus.normal : null,
|
|
|
|
|
onTap: () => _openDetails(
|
|
|
|
|
VitalSignDetailsArgs(
|
|
|
|
|
metric: VitalSignMetric.heartRate,
|
|
|
|
|
@ -287,6 +304,7 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
low: 60,
|
|
|
|
|
high: 100,
|
|
|
|
|
),
|
|
|
|
|
targetVitalSign,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
@ -299,9 +317,9 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
_buildVitalSignCard(
|
|
|
|
|
icon: AppAssets.respRate,
|
|
|
|
|
label: LocaleKeys.respirationRate.tr(context: context),
|
|
|
|
|
value: _formatValue(latestVitalSign?.respirationBeatPerMinute),
|
|
|
|
|
value: _formatValue(targetVitalSign?.respirationBeatPerMinute),
|
|
|
|
|
unit: 'bpm',
|
|
|
|
|
status: _isValidValue(latestVitalSign?.respirationBeatPerMinute) ? VitalSignStatus.normal : null,
|
|
|
|
|
status: _isValidValue(targetVitalSign?.respirationBeatPerMinute) ? VitalSignStatus.normal : null,
|
|
|
|
|
onTap: () => _openDetails(
|
|
|
|
|
VitalSignDetailsArgs(
|
|
|
|
|
metric: VitalSignMetric.respiratoryRate,
|
|
|
|
|
@ -311,6 +329,7 @@ class _VitalSignPageState extends State<VitalSignPage> {
|
|
|
|
|
low: 12,
|
|
|
|
|
high: 20,
|
|
|
|
|
),
|
|
|
|
|
targetVitalSign,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
|