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}