main
1import 'package:blood_pressure_app/components/confirm_deletion_dialoge.dart';
2import 'package:blood_pressure_app/features/input/add_entry_dialogue.dart';
3import 'package:blood_pressure_app/features/input/forms/add_entry_form.dart';
4import 'package:blood_pressure_app/features/export_import/export_button.dart';
5import 'package:blood_pressure_app/logging.dart';
6import 'package:blood_pressure_app/model/storage/storage.dart';
7import 'package:blood_pressure_app/screens/error_reporting_screen.dart';
8import 'package:flutter/material.dart';
9import 'package:flutter_bloc/flutter_bloc.dart' hide ProviderNotFoundException;
10import 'package:blood_pressure_app/l10n/app_localizations.dart';
11import 'package:health_data_store/health_data_store.dart';
12import 'package:logging/logging.dart';
13import 'package:provider/provider.dart';
14
15/// Allow high level operations on the repositories in context.
16extension EntryUtils on BuildContext {
17 Logger get _logger => Logger('BPM[context.EntryUtils]');
18
19 /// Open the [AddEntryDialogue] and save received entries.
20 ///
21 /// Follows [ExportSettings.exportAfterEveryEntry]. When [initial] is not null
22 /// the dialoge will be opened in edit mode.
23 Future<void> createEntry([AddEntryFormValue? initial]) async {
24 _logger.finer('createEntry($initial)');
25 try {
26 final recordRepo = RepositoryProvider.of<BloodPressureRepository>(this);
27 final noteRepo = RepositoryProvider.of<NoteRepository>(this);
28 final intakeRepo = RepositoryProvider.of<MedicineIntakeRepository>(this);
29 final weightRepo = RepositoryProvider.of<BodyweightRepository>(this);
30 final exportSettings = Provider.of<ExportSettings>(this, listen: false);
31
32 final entry = await showAddEntryDialogue(this,
33 RepositoryProvider.of<MedicineRepository>(this),
34 initial,
35 );
36 _logger.finest('received $entry from dialog');
37 if (entry != null) {
38 if (initial?.record != null) await recordRepo.remove(initial!.record!);
39 if (initial?.note != null) await noteRepo.remove(initial!.note!);
40 if (initial?.intake != null) await intakeRepo.remove(initial!.intake!);
41 if (initial?.weight != null) await weightRepo.remove(initial!.weight!);
42
43 if (entry.record != null) await recordRepo.add(entry.record!);
44 if (entry.note != null) await noteRepo.add(entry.note!);
45 if (entry.intake != null) await intakeRepo.add(entry.intake!);
46 if(entry.weight != null) await weightRepo.add(entry.weight!);
47
48 /*
49 read<IntervalStoreManager>().mainPage.setToMostRecentInterval();
50 read<IntervalStoreManager>().statsPage.setToMostRecentInterval();
51 read<IntervalStoreManager>().exportPage.setToMostRecentInterval();*/
52
53 _logger.finest('mounted=$mounted');
54 if (!mounted) {
55 _logger.warning('Context no longer mounted');
56 return;
57 }
58
59 log.info(read<IntervalStoreManager>());
60 if (mounted && exportSettings.exportAfterEveryEntry) {
61 performExport(this, false);
62 }
63 }
64 } on ProviderNotFoundException {
65 log.severe('[extension.EntryUtils] createEntry($initial) was called from a context without Provider.');
66 } catch (e, stack) {
67 await ErrorReporting.reportCriticalError('Error opening add measurement dialoge', '$e\n$stack',);
68 }
69 }
70
71 /// Delete record and note of an entry from the repositories.
72 Future<void> deleteEntry(FullEntry entry) async {
73 try {
74 final localizations = AppLocalizations.of(this)!;
75 final settings = Provider.of<Settings>(this, listen: false);
76 final bpRepo = RepositoryProvider.of<BloodPressureRepository>(this);
77 final noteRepo = RepositoryProvider.of<NoteRepository>(this);
78 final intakeRepo = RepositoryProvider.of<MedicineIntakeRepository>(this);
79 final messenger = ScaffoldMessenger.of(this);
80
81 bool confirmedDeletion = true;
82 if (settings.confirmDeletion) {
83 confirmedDeletion = await showConfirmDeletionDialoge(this);
84 }
85
86 if (confirmedDeletion) {
87 await bpRepo.remove(entry.$1);
88 await noteRepo.remove(entry.$2);
89 await Future.forEach(entry.$3, intakeRepo.remove);
90 messenger.removeCurrentSnackBar();
91 messenger.showSnackBar(SnackBar(
92 content: Text(localizations.deletionConfirmed),
93 action: SnackBarAction(
94 label: localizations.btnUndo,
95 onPressed: () async {
96 await bpRepo.add(entry.$1);
97 await noteRepo.add(entry.$2);
98 },
99 ),
100 ),);
101 }
102 } on ProviderNotFoundException {
103 log.severe('[extension.EntryUtils] deleteEntry($entry) was called from a context without Provider.');
104 }
105 }
106}