From 94c042d40328eedda64221c72b91a994e8477c9c Mon Sep 17 00:00:00 2001 From: aitorarana Date: Fri, 20 Mar 2026 15:35:12 +0100 Subject: [PATCH] manual health measurement command --- .../health/presentation/health_screen.dart | 25 ++++++++++++++++ .../presentation/state/health_view_model.dart | 30 +++++++++++++++++++ .../models/send_command_request_model.dart | 2 ++ .../models/send_command_request_model.g.dart | 1 + packages/sf_localizations/assets/l10n/en.json | 3 +- packages/sf_localizations/assets/l10n/es.json | 3 +- .../lib/src/generated/i18n.dart | 1 + 7 files changed, 63 insertions(+), 2 deletions(-) diff --git a/modules/legacy/modules/device_management/lib/src/features/health/presentation/health_screen.dart b/modules/legacy/modules/device_management/lib/src/features/health/presentation/health_screen.dart index 1d60dd31..c1019764 100644 --- a/modules/legacy/modules/device_management/lib/src/features/health/presentation/health_screen.dart +++ b/modules/legacy/modules/device_management/lib/src/features/health/presentation/health_screen.dart @@ -130,6 +130,31 @@ class _HealthScreenState extends ConsumerState ), ], ), + footer: _SaveSection() ); } } + +class _SaveSection extends ConsumerWidget{ + + const _SaveSection(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final theme = ref.read(themePortProvider); + + final vm = ref.read(healthViewModelProvider.notifier); + + return Padding( + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 10), + child: + PrimaryButton( + onPressed: () async { + await vm.measure(); + }, + text: context.translate(I18n.measure), + color: theme.getColorFor(ThemeCode.legacyPrimary) + ) + ); + } +} \ No newline at end of file diff --git a/modules/legacy/modules/device_management/lib/src/features/health/presentation/state/health_view_model.dart b/modules/legacy/modules/device_management/lib/src/features/health/presentation/state/health_view_model.dart index 5cf4a7dd..8db0af12 100644 --- a/modules/legacy/modules/device_management/lib/src/features/health/presentation/state/health_view_model.dart +++ b/modules/legacy/modules/device_management/lib/src/features/health/presentation/state/health_view_model.dart @@ -14,12 +14,14 @@ final healthViewModelProvider = class HealthViewModel extends Notifier { late final HealthRepository _repository; + late final CommandsRepository _commandsRepository; static const int _historyPageSize = 20; @override HealthViewState build() { _repository = ref.read(healthRepositoryProvider); + _commandsRepository = ref.read(commandsRepositoryProvider); _init(); return const HealthViewState(); } @@ -243,4 +245,32 @@ class HealthViewModel extends Notifier { final msg = e.toString(); return msg.startsWith('Exception: ') ? msg.substring(11) : msg; } + + Future measure() async { + + try { + state = state.copyWith( + isLoading: true, + ); + + final device = ref.read(selectedDeviceProvider); + if (device == null) return; + + final request = SendCommandRequestModel( + device: device.identificator, + command: DeviceCommand.requestHeartRate, + ); + + await _commandsRepository.send(request: request); + + state = state.copyWith( + isLoading: false, + ); + } catch (e) { + state = state.copyWith( + isLoading: false, + errorMessage: e.toString(), + ); + } + } } diff --git a/modules/legacy/packages/legacy_shared/lib/src/data/models/send_command_request_model.dart b/modules/legacy/packages/legacy_shared/lib/src/data/models/send_command_request_model.dart index 358627ae..4a95b574 100644 --- a/modules/legacy/packages/legacy_shared/lib/src/data/models/send_command_request_model.dart +++ b/modules/legacy/packages/legacy_shared/lib/src/data/models/send_command_request_model.dart @@ -8,6 +8,8 @@ enum DeviceCommand { factory, @JsonValue('FIND_DEVICE') findDevice, + @JsonValue('REQUEST_HEART_RATE') + requestHeartRate, @JsonValue('RESTART') restart, @JsonValue('REWARDS') diff --git a/modules/legacy/packages/legacy_shared/lib/src/data/models/send_command_request_model.g.dart b/modules/legacy/packages/legacy_shared/lib/src/data/models/send_command_request_model.g.dart index 5b540211..46918b77 100644 --- a/modules/legacy/packages/legacy_shared/lib/src/data/models/send_command_request_model.g.dart +++ b/modules/legacy/packages/legacy_shared/lib/src/data/models/send_command_request_model.g.dart @@ -25,6 +25,7 @@ Map _$SendCommandRequestModelToJson( const _$DeviceCommandEnumMap = { DeviceCommand.factory: 'FACTORY', DeviceCommand.findDevice: 'FIND_DEVICE', + DeviceCommand.requestHeartRate: 'REQUEST_HEART_RATE', DeviceCommand.restart: 'RESTART', DeviceCommand.rewards: 'REWARDS', DeviceCommand.shutdown: 'SHUTDOWN', diff --git a/packages/sf_localizations/assets/l10n/en.json b/packages/sf_localizations/assets/l10n/en.json index 453e907c..2f856234 100755 --- a/packages/sf_localizations/assets/l10n/en.json +++ b/packages/sf_localizations/assets/l10n/en.json @@ -744,5 +744,6 @@ "vibrationOnly": "Vibration only", "silent": "Silent", "syncClockMessage": "Synchronize the device clock with the current time", - "locationWifiNetworksOptional": "WiFi networks (optional)" + "locationWifiNetworksOptional": "WiFi networks (optional)", + "measure": "Measure" } diff --git a/packages/sf_localizations/assets/l10n/es.json b/packages/sf_localizations/assets/l10n/es.json index 7103ef6b..034026f4 100644 --- a/packages/sf_localizations/assets/l10n/es.json +++ b/packages/sf_localizations/assets/l10n/es.json @@ -742,5 +742,6 @@ "vibrationOnly": "Solo vibración", "silent": "Silencio", "syncClockMessage": "Sincroniza el reloj del dispositivo con la hora actual", - "locationWifiNetworksOptional": "Redes WiFi (opcional)" + "locationWifiNetworksOptional": "Redes WiFi (opcional)", + "measure": "Medir" } diff --git a/packages/sf_localizations/lib/src/generated/i18n.dart b/packages/sf_localizations/lib/src/generated/i18n.dart index 9b32f0d6..77afc5bb 100755 --- a/packages/sf_localizations/lib/src/generated/i18n.dart +++ b/packages/sf_localizations/lib/src/generated/i18n.dart @@ -749,4 +749,5 @@ class I18n { static const String wifiSsid = 'wifiSsid'; static const String wifiSsidHint = 'wifiSsidHint'; static const String yesterday = 'yesterday'; + static const String measure = 'measure'; }