main
1import 'dart:async';
2
3import 'package:blood_pressure_app/components/fullscreen_dialoge.dart';
4import 'package:blood_pressure_app/features/input/forms/add_entry_form.dart';
5import 'package:blood_pressure_app/logging.dart';
6import 'package:blood_pressure_app/model/storage/storage.dart';
7import 'package:flutter/material.dart';
8import 'package:flutter_bloc/flutter_bloc.dart';
9import 'package:blood_pressure_app/l10n/app_localizations.dart';
10import 'package:health_data_store/health_data_store.dart';
11
12/// Input mask for entering measurements.
13class AddEntryDialogue extends StatefulWidget {
14 /// Create a input mask for entering measurements.
15 ///
16 /// This is usually created through the [showAddEntryDialogue] function.
17 const AddEntryDialogue({super.key,
18 this.availableMeds,
19 this.initialRecord,
20 });
21
22 /// Values that are prefilled.
23 ///
24 /// When this is null the timestamp is [DateTime.now] and the other fields
25 /// will be empty.
26 final AddEntryFormValue? initialRecord;
27
28 /// All medicines selectable.
29 ///
30 /// Hides med input when this is empty or null.
31 final List<Medicine>? availableMeds;
32
33 @override
34 State<AddEntryDialogue> createState() => _AddEntryDialogueState();
35}
36
37class _AddEntryDialogueState extends State<AddEntryDialogue> with TypeLogger {
38 final formKey = GlobalKey<AddEntryFormState>();
39
40 void _onSavePressed() {
41 if (formKey.currentState?.validate() ?? false) {
42 final AddEntryFormValue? result = formKey.currentState?.save();
43 logger.finer('Returning result: $result');
44 Navigator.pop(context, result);
45 } else {
46 // Errors are displayed below their specific widgets
47 }
48 }
49
50 @override
51 Widget build(BuildContext context) => FullscreenDialoge(
52 actionButtonText: AppLocalizations.of(context)!.btnSave,
53 onActionButtonPressed: _onSavePressed,
54 bottomAppBar: context.select((Settings s) => s.bottomAppBars),
55 body: AddEntryForm(
56 key: formKey,
57 initialValue: widget.initialRecord,
58 meds: widget.availableMeds ?? [],
59 ),
60 );
61}
62
63/// Shows a dialogue to input a blood pressure measurement or a medication.
64Future<AddEntryFormValue?> showAddEntryDialogue(
65 BuildContext context,
66 MedicineRepository medRepo,
67 [AddEntryFormValue? initialRecord,
68]) async {
69 final meds = await medRepo.getAll();
70 if (context.mounted) {
71 return showDialog<AddEntryFormValue>(
72 context: context, builder: (context) =>
73 AddEntryDialogue(
74 initialRecord: initialRecord,
75 availableMeds: meds,
76 ),
77 );
78 }
79 return null;
80}