manual health measurement command

This commit is contained in:
2026-03-20 15:35:12 +01:00
parent 435a9c04f9
commit 94c042d403
7 changed files with 63 additions and 2 deletions

View File

@@ -130,6 +130,31 @@ class _HealthScreenState extends ConsumerState<HealthScreen>
),
],
),
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)
)
);
}
}

View File

@@ -14,12 +14,14 @@ final healthViewModelProvider =
class HealthViewModel extends Notifier<HealthViewState> {
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<HealthViewState> {
final msg = e.toString();
return msg.startsWith('Exception: ') ? msg.substring(11) : msg;
}
Future<void> 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(),
);
}
}
}

View File

@@ -8,6 +8,8 @@ enum DeviceCommand {
factory,
@JsonValue('FIND_DEVICE')
findDevice,
@JsonValue('REQUEST_HEART_RATE')
requestHeartRate,
@JsonValue('RESTART')
restart,
@JsonValue('REWARDS')

View File

@@ -25,6 +25,7 @@ Map<String, dynamic> _$SendCommandRequestModelToJson(
const _$DeviceCommandEnumMap = {
DeviceCommand.factory: 'FACTORY',
DeviceCommand.findDevice: 'FIND_DEVICE',
DeviceCommand.requestHeartRate: 'REQUEST_HEART_RATE',
DeviceCommand.restart: 'RESTART',
DeviceCommand.rewards: 'REWARDS',
DeviceCommand.shutdown: 'SHUTDOWN',

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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';
}