Commit af7caaf

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-04-02 09:18:28
migrate medicine manager to repository structure
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 7eb298a
Changed files (5)
app
lib
components
model
blood_pressure
medicine
screens
health_data_store
app/lib/components/dialoges/add_medication_dialoge.dart
@@ -1,10 +1,10 @@
 import 'package:blood_pressure_app/components/dialoges/fullscreen_dialoge.dart';
 import 'package:blood_pressure_app/components/settings/color_picker_list_tile.dart';
-import 'package:blood_pressure_app/model/blood_pressure/medicine/medicine.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 
 /// Dialoge to enter values for a [Medicine].
 class AddMedicationDialoge extends StatefulWidget {
@@ -43,10 +43,9 @@ class _AddMedicationDialogeState extends State<AddMedicationDialoge> {
       onActionButtonPressed: () {
         formKey.currentState?.save();
         Navigator.pop(context, Medicine(
-          widget.settings.highestMedIndex,
           designation: _designation ?? '',
-          color: _color,
-          defaultDosis: _defaultDosis,
+          color: _color.value,
+          dosis: _defaultDosis == null ? null : Weight.mg(_defaultDosis!),
         ),);
       },
       bottomAppBar: widget.settings.bottomAppBars,
app/lib/model/blood_pressure/medicine/medicine.dart
@@ -5,6 +5,7 @@ import 'package:blood_pressure_app/model/blood_pressure/medicine/medicine_intake
 import 'package:flutter/material.dart';
 
 /// Description of a specific medicine.
+@deprecated
 class Medicine {
   /// Create a instance from a map created by [toMap].
   factory Medicine.fromMap(Map<String, dynamic> map) => Medicine(
app/lib/screens/subsettings/medicine_manager_screen.dart
@@ -1,17 +1,33 @@
 import 'package:blood_pressure_app/components/dialoges/add_medication_dialoge.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 import 'package:provider/provider.dart';
 
 /// Screen to view and edit medications saved in [Settings].
 ///
 /// This screen allows adding and removing medication but not modifying them in
 /// order to keep the code simple and maintainable.
-class MedicineManagerScreen extends StatelessWidget {
+class MedicineManagerScreen extends StatefulWidget {
   /// Create a screen to manage medications in settings.
   const MedicineManagerScreen({super.key});
 
+  @override
+  State<MedicineManagerScreen> createState() => _MedicineManagerScreenState();
+}
+
+class _MedicineManagerScreenState extends State<MedicineManagerScreen> {
+  List<Medicine> medicines = [];
+
+  @override
+  void initState() {
+    super.initState();
+    RepositoryProvider.of<MedicineRepository>(context).getAll()
+        .then((value) => setState(() => medicines.addAll(value)));
+  }
+
   @override
   Widget build(BuildContext context) {
     final localizations = AppLocalizations.of(context)!;
@@ -19,49 +35,58 @@ class MedicineManagerScreen extends StatelessWidget {
       appBar: AppBar(
         forceMaterialTransparency: true,
       ),
-      body: Center(child: Consumer<Settings>(
-          builder: (context, settings, child) {
-            final medications = settings.medications.where((e) => !e.hidden)
-                .toList();
-            return ListView.builder(
-                itemCount: medications.length + 1,
-                itemBuilder: (context, i) {
-                  if (i == medications.length) { // last row
-                    return ListTile(
-                      leading: const Icon(Icons.add),
-                      title: Text(localizations.addMedication),
-                      onTap: () async {
-                        final medicine = await showAddMedicineDialoge(context,
-                            settings,);
-                        if (medicine != null) settings.addMedication(medicine);
-                      },
-                    );
+      body: Center(
+        child: ListView.builder(
+          itemCount: medicines.length + 1,
+          itemBuilder: (context, i) {
+            if (i == medicines.length) { // last row
+              return ListTile(
+                leading: const Icon(Icons.add),
+                title: Text(localizations.addMedication),
+                onTap: () async {
+                  final medRepo = RepositoryProvider.of<MedicineRepository>(context);
+                  final settings = Provider.of<Settings>(context, listen: false);
+                  final medicine = await showAddMedicineDialoge(context, settings,);
+                  if (medicine != null) {
+                    setState(() {
+                      medicines.add(medicine);
+                      medRepo.add(medicine);
+                    });
                   }
-                  return ListTile(
-                    leading: medications[i].color == Colors.transparent ? null
-                      : Container(
-                        width: 40.0,
-                        height: 40.0,
-                        decoration: BoxDecoration(
-                          color: medications[i].color,
-                          shape: BoxShape.circle,
-                        ),
-                      ),
-                    title: Text(medications[i].designation),
-                    subtitle: Text('${localizations.defaultDosis}: '
-                        '${medications[i].defaultDosis}'),
-                    trailing: IconButton(
-                      icon: const Icon(Icons.delete),
-                      onPressed: () {
-                        settings.removeMedicationAt(i);
-                      },
-                    ),
-                  );
                 },
+              );
+            }
+            return ListTile(
+              leading: medicines[i].color == Colors.transparent.value
+                  || medicines[i].color == null
+                ? null
+                : Container(
+                  width: 40.0,
+                  height: 40.0,
+                  decoration: BoxDecoration(
+                    color: Color(medicines[i].color!),
+                    shape: BoxShape.circle,
+                  ),
+                ),
+              title: Text(medicines[i].designation),
+              // TODO: make localization function
+              subtitle: medicines[i].dosis == null ? null
+                  : Text('${localizations.defaultDosis}: '
+                         '${medicines[i].dosis!.mg} mg'),
+              trailing: IconButton(
+                icon: const Icon(Icons.delete),
+                onPressed: () {
+                  setState(() async {
+                    await RepositoryProvider.of<MedicineRepository>(context)
+                      .remove(medicines[i]);
+                    medicines.removeAt(i);
+                  });
+                },
+              ),
             );
-          },),
+          },
+        ),
       ),
     );
   }
-
-}
\ No newline at end of file
+}
app/lib/main.dart
@@ -110,9 +110,9 @@ Future<Widget> _loadApp() async {
   ],
   child: MultiRepositoryProvider(
     providers: [
-      RepositoryProvider<BloodPressureRepository>(create: (_) => db.bpRepo),
-      RepositoryProvider<MedicineRepository>(create: (_) => db.medRepo),
-      RepositoryProvider<MedicineIntakeRepository>(create:(_) => db.intakeRepo),
+      RepositoryProvider(create: (context) => db.bpRepo),
+      RepositoryProvider(create: (context) => db.medRepo),
+      RepositoryProvider(create: (context) => db.intakeRepo),
     ],
     child: const AppRoot(),
   ),);
health_data_store/lib/health_data_store.dart
@@ -36,3 +36,5 @@ export 'src/types/date_range.dart';
 export 'src/types/medicine.dart';
 export 'src/types/medicine_intake.dart';
 export 'src/types/note.dart';
+export 'src/types/units/pressure.dart';
+export 'src/types/units/weight.dart';