From 92df0af8952323c3d77fe2daf5275a7cb776e7f0 Mon Sep 17 00:00:00 2001 From: Patrick Alvin Alcala Date: Fri, 21 Mar 2025 15:33:00 +0800 Subject: [PATCH] add cache for medicines --- .../functions/cache_getmedicinelist.dart | 14 +++++++ .../functions/cache_setmedicinelist.dart | 14 +++++++ .../medicinelist/medicinelist_cache_bloc.dart | 14 +++++++ .../medicinelist_cache_event.dart | 8 ++++ .../medicinelist_cache_state.dart | 5 +++ .../typelist/functions/cache_gettypelist.dart | 1 + lib/main.dart | 4 ++ lib/pages/add_medicine_page.dart | 6 +-- lib/pages/add_stock_page.dart | 39 ++++++++++++++----- lib/pages/main_page.dart | 16 ++++++++ pubspec.lock | 2 +- pubspec.yaml | 1 + 12 files changed, 110 insertions(+), 14 deletions(-) create mode 100644 lib/blocs/caches/medicinelist/functions/cache_getmedicinelist.dart create mode 100644 lib/blocs/caches/medicinelist/functions/cache_setmedicinelist.dart create mode 100644 lib/blocs/caches/medicinelist/medicinelist_cache_bloc.dart create mode 100644 lib/blocs/caches/medicinelist/medicinelist_cache_event.dart create mode 100644 lib/blocs/caches/medicinelist/medicinelist_cache_state.dart diff --git a/lib/blocs/caches/medicinelist/functions/cache_getmedicinelist.dart b/lib/blocs/caches/medicinelist/functions/cache_getmedicinelist.dart new file mode 100644 index 0000000..c9cfc6f --- /dev/null +++ b/lib/blocs/caches/medicinelist/functions/cache_getmedicinelist.dart @@ -0,0 +1,14 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/medicinelist/medicinelist_cache_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/medicinelist/medicinelist_cache_event.dart'; + +Future cacheGetMedicineList(BuildContext context) async { + try { + final medicineListCache = context.read(); + medicineListCache.add(MedicineListCacheGet()); + return medicineListCache.state.value; + } catch (e) { + return []; + } +} diff --git a/lib/blocs/caches/medicinelist/functions/cache_setmedicinelist.dart b/lib/blocs/caches/medicinelist/functions/cache_setmedicinelist.dart new file mode 100644 index 0000000..065cb0c --- /dev/null +++ b/lib/blocs/caches/medicinelist/functions/cache_setmedicinelist.dart @@ -0,0 +1,14 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/medicinelist/medicinelist_cache_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/medicinelist/medicinelist_cache_event.dart'; + +Future cacheSetMedicineList(BuildContext context, List value) async { + try { + final medicineListCache = context.read(); + medicineListCache.add(MedicineListCacheSet(value)); + return true; + } catch (e) { + return false; + } +} diff --git a/lib/blocs/caches/medicinelist/medicinelist_cache_bloc.dart b/lib/blocs/caches/medicinelist/medicinelist_cache_bloc.dart new file mode 100644 index 0000000..556c49d --- /dev/null +++ b/lib/blocs/caches/medicinelist/medicinelist_cache_bloc.dart @@ -0,0 +1,14 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/medicinelist/medicinelist_cache_event.dart'; +import 'package:pharmacy_mobile/blocs/caches/medicinelist/medicinelist_cache_state.dart'; + +class MedicineListBloc extends Bloc { + MedicineListBloc() : super(MedicineListCacheState([])) { + on((event, emit) { + emit(MedicineListCacheState(event.value)); + }); + on((event, emit) { + emit(state); + }); + } +} diff --git a/lib/blocs/caches/medicinelist/medicinelist_cache_event.dart b/lib/blocs/caches/medicinelist/medicinelist_cache_event.dart new file mode 100644 index 0000000..9c4a33a --- /dev/null +++ b/lib/blocs/caches/medicinelist/medicinelist_cache_event.dart @@ -0,0 +1,8 @@ +abstract class MedicineListCacheEvent {} + +class MedicineListCacheSet extends MedicineListCacheEvent { + final List value; + MedicineListCacheSet(this.value); +} + +class MedicineListCacheGet extends MedicineListCacheEvent {} diff --git a/lib/blocs/caches/medicinelist/medicinelist_cache_state.dart b/lib/blocs/caches/medicinelist/medicinelist_cache_state.dart new file mode 100644 index 0000000..e602506 --- /dev/null +++ b/lib/blocs/caches/medicinelist/medicinelist_cache_state.dart @@ -0,0 +1,5 @@ +class MedicineListCacheState { + final List value; + + MedicineListCacheState(this.value); +} diff --git a/lib/blocs/caches/typelist/functions/cache_gettypelist.dart b/lib/blocs/caches/typelist/functions/cache_gettypelist.dart index f92294d..49a10d3 100644 --- a/lib/blocs/caches/typelist/functions/cache_gettypelist.dart +++ b/lib/blocs/caches/typelist/functions/cache_gettypelist.dart @@ -9,6 +9,7 @@ Future cacheGetTypeList(BuildContext context) async { typeListCache.add(TypeListCacheGet()); return typeListCache.state.value; } catch (e) { + print(e); return []; } } diff --git a/lib/main.dart b/lib/main.dart index e76b38c..7adab87 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:pharmacy_mobile/auth/auth_gate.dart'; import 'package:pharmacy_mobile/blocs/caches/categorylist/categorylist_cache_bloc.dart'; import 'package:pharmacy_mobile/blocs/caches/genericlist/genericlist_cache_bloc.dart'; import 'package:pharmacy_mobile/blocs/caches/manufacturerlist/manufacturerlist_cache_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/medicinelist/medicinelist_cache_bloc.dart'; import 'package:pharmacy_mobile/blocs/caches/typelist/typelist_cache_bloc.dart'; import 'package:pharmacy_mobile/blocs/guest/guest_bloc.dart'; import 'package:pharmacy_mobile/blocs/user/user_bloc.dart'; @@ -140,6 +141,9 @@ class MyApp extends StatelessWidget { BlocProvider( create: (context) => ManufacturerListBloc(), ), + BlocProvider( + create: (context) => MedicineListBloc(), + ), ], child: MaterialApp.router( debugShowCheckedModeBanner: false, diff --git a/lib/pages/add_medicine_page.dart b/lib/pages/add_medicine_page.dart index 08da86c..3a1a0e9 100644 --- a/lib/pages/add_medicine_page.dart +++ b/lib/pages/add_medicine_page.dart @@ -1,8 +1,10 @@ +import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:image_picker/image_picker.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart'; +import 'package:path_provider/path_provider.dart'; import 'package:pharmacy_mobile/blocs/caches/genericlist/functions/cache_getgenericlist.dart'; import 'package:pharmacy_mobile/blocs/caches/manufacturerlist/functions/cache_getmanufacturerlist.dart'; import 'package:pharmacy_mobile/blocs/caches/typelist/functions/cache_gettypelist.dart'; @@ -123,15 +125,11 @@ class _AddMedicinePageState extends State { final types = await _getTypesCache(); final manufacturers = await _getManufacturerCache(); - print('generics: $generics, types: $types, manufacturers: $manufacturers'); - if (!generics || !types || !manufacturers) { if (await InternetConnectionChecker.instance.hasConnection) { await _getGenerics(); await _getTypes(); await _getManufacturer(); - - // final sample = await _refMedicines.getList2(); } else { if (mounted) { showNotification(context, 'Error: No Internet Connection', false); diff --git a/lib/pages/add_stock_page.dart b/lib/pages/add_stock_page.dart index f0c3948..c17091c 100644 --- a/lib/pages/add_stock_page.dart +++ b/lib/pages/add_stock_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart'; +import 'package:pharmacy_mobile/blocs/caches/medicinelist/functions/cache_getmedicinelist.dart'; import 'package:pharmacy_mobile/functions/barcode_scan_function.dart'; import 'package:pharmacy_mobile/functions/checkresult_function.dart'; import 'package:pharmacy_mobile/tables/ref_medicines.dart'; @@ -49,17 +50,37 @@ class _AddStockPageState extends State with WidgetsBindingObserver }); } - void autoRun() async { - if (await InternetConnectionChecker.instance.hasConnection) { - _getMedicines(); - } else { - if (mounted) { - showNotification(context, 'Error: No Internet Connection', false); + Future _getMedicinesCache() async { + final cache = await cacheGetMedicineList(context); + print('cache: $cache'); - WidgetsBinding.instance.addPostFrameCallback((_) { - context.push('/main'); - }); + if (cache.isNotEmpty) { + _medicineList = cache; + + return true; + } else { + return false; + } + } + + void autoRun() async { + final medicines = await _getMedicinesCache(); + print('medicines: $medicines'); + + if (!medicines) { + if (await InternetConnectionChecker.instance.hasConnection) { + _getMedicines(); + } else { + if (mounted) { + showNotification(context, 'Error: No Internet Connection', false); + + WidgetsBinding.instance.addPostFrameCallback((_) { + context.push('/main'); + }); + } } + } else { + setState(() {}); } } diff --git a/lib/pages/main_page.dart b/lib/pages/main_page.dart index 4126cdb..9daa456 100644 --- a/lib/pages/main_page.dart +++ b/lib/pages/main_page.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:gap/gap.dart'; @@ -6,10 +8,12 @@ import 'package:pharmacy_mobile/auth/auth_service.dart'; import 'package:pharmacy_mobile/blocs/caches/categorylist/functions/cache_setcategorylist.dart'; import 'package:pharmacy_mobile/blocs/caches/genericlist/functions/cache_setgenericlist.dart'; import 'package:pharmacy_mobile/blocs/caches/manufacturerlist/functions/cache_setmanufacturerlist.dart'; +import 'package:pharmacy_mobile/blocs/caches/medicinelist/functions/cache_setmedicinelist.dart'; import 'package:pharmacy_mobile/blocs/caches/typelist/functions/cache_settypelist.dart'; import 'package:pharmacy_mobile/tables/ref_categories.dart'; import 'package:pharmacy_mobile/tables/ref_generic_names.dart'; import 'package:pharmacy_mobile/tables/ref_manufacturers.dart'; +import 'package:pharmacy_mobile/tables/ref_medicines.dart'; import 'package:pharmacy_mobile/tables/ref_types.dart'; import 'package:pharmacy_mobile/widgets/buttonwithprogress_widget.dart'; import 'package:pharmacy_mobile/widgets/menu_widget.dart'; @@ -32,6 +36,7 @@ class _MainPageState extends State { final _refGenericNames = RefGenericNames(); final _refTypes = RefTypes(); final _refManufacturers = RefManufacturers(); + final _refMedicines = RefMedicines(); late bool _isLoading = false; @@ -115,11 +120,22 @@ class _MainPageState extends State { } } + Future _getMedicineListCache() async { + final medicineList = await _refMedicines.getList(); + + if (medicineList.isNotEmpty) { + // ignore: use_build_context_synchronously + final setCache = await cacheSetMedicineList(context, medicineList); + if (!setCache) {} + } + } + void autoRun() async { await _getCategoryListCache(); await _getGenericListCache(); await _getTypeListCache(); await _getManufacturerListCache(); + await _getMedicineListCache(); } @override diff --git a/pubspec.lock b/pubspec.lock index 55e14c9..3f1f9b3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -665,7 +665,7 @@ packages: source: hosted version: "1.1.0" path_provider: - dependency: transitive + dependency: "direct main" description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" diff --git a/pubspec.yaml b/pubspec.yaml index 9a6416d..dfc2c7d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,6 +28,7 @@ dependencies: redacted: ^1.0.13 flutter_bloc: ^9.1.0 flutter_dotenv: ^5.2.1 + path_provider: ^2.1.5 dev_dependencies: flutter_test: