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}