diff --git a/lib/blocs/caches/categorylist/categorylist_cache_bloc.dart b/lib/blocs/caches/categorylist/categorylist_cache_bloc.dart new file mode 100644 index 0000000..e048372 --- /dev/null +++ b/lib/blocs/caches/categorylist/categorylist_cache_bloc.dart @@ -0,0 +1,17 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/categorylist_cache_event.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/categorylist_cache_state.dart'; + +class CategoryListBloc extends Bloc { + CategoryListBloc() : super(CategoryListCacheState([])) { + on((event, emit) { + emit(CategoryListCacheState(event.value)); + }); + on((event, emit) { + emit(state); + }); + on((event, emit) { + emit(state); + }); + } +} diff --git a/lib/blocs/caches/categorylist/categorylist_cache_event.dart b/lib/blocs/caches/categorylist/categorylist_cache_event.dart new file mode 100644 index 0000000..2833987 --- /dev/null +++ b/lib/blocs/caches/categorylist/categorylist_cache_event.dart @@ -0,0 +1,10 @@ +abstract class CategoryListCacheEvent {} + +class CategoryListCacheSet extends CategoryListCacheEvent { + final List value; + CategoryListCacheSet(this.value); +} + +class CategoryListCacheGet extends CategoryListCacheEvent {} + +class CategoryListCacheCheck extends CategoryListCacheEvent {} diff --git a/lib/blocs/caches/categorylist/categorylist_cache_state.dart b/lib/blocs/caches/categorylist/categorylist_cache_state.dart new file mode 100644 index 0000000..c4143df --- /dev/null +++ b/lib/blocs/caches/categorylist/categorylist_cache_state.dart @@ -0,0 +1,5 @@ +class CategoryListCacheState { + final List value; + + CategoryListCacheState(this.value); +} diff --git a/lib/blocs/caches/categorylist/functions/cache_getcategorylist.dart b/lib/blocs/caches/categorylist/functions/cache_getcategorylist.dart new file mode 100644 index 0000000..73a3a32 --- /dev/null +++ b/lib/blocs/caches/categorylist/functions/cache_getcategorylist.dart @@ -0,0 +1,14 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/categorylist_cache_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/categorylist_cache_event.dart'; + +Future cacheGetCategoryList(BuildContext context) async { + try { + final categoryListCache = context.read(); + categoryListCache.add(CategoryListCacheGet()); + return categoryListCache.state.value; + } catch (e) { + return []; + } +} diff --git a/lib/blocs/caches/categorylist/functions/cache_setcategorylist.dart b/lib/blocs/caches/categorylist/functions/cache_setcategorylist.dart new file mode 100644 index 0000000..3451870 --- /dev/null +++ b/lib/blocs/caches/categorylist/functions/cache_setcategorylist.dart @@ -0,0 +1,14 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/categorylist_cache_bloc.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/categorylist_cache_event.dart'; + +Future cacheSetCategoryList(BuildContext context, List value) async { + try { + final categoryListCache = context.read(); + categoryListCache.add(CategoryListCacheSet(value)); + return true; + } catch (e) { + return false; + } +} diff --git a/lib/main.dart b/lib/main.dart index 332dab1..d16c248 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:pharmacy_mobile/auth/auth_gate.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/categorylist_cache_bloc.dart'; import 'package:pharmacy_mobile/blocs/guest/guest_bloc.dart'; import 'package:pharmacy_mobile/blocs/user/user_bloc.dart'; import 'package:pharmacy_mobile/pages/add_category_page.dart'; @@ -124,6 +125,9 @@ class MyApp extends StatelessWidget { BlocProvider( create: (context) => UserBloc(), ), + BlocProvider( + create: (context) => CategoryListBloc(), + ), ], child: MaterialApp.router( debugShowCheckedModeBanner: false, diff --git a/lib/pages/add_generics_page.dart b/lib/pages/add_generics_page.dart index af39f36..a7b49eb 100644 --- a/lib/pages/add_generics_page.dart +++ b/lib/pages/add_generics_page.dart @@ -1,6 +1,7 @@ import 'package:gap/gap.dart'; import 'package:flutter/material.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/functions/cache_getcategorylist.dart'; import 'package:pharmacy_mobile/functions/checkexisting_function.dart'; import 'package:pharmacy_mobile/tables/ref_categories.dart'; import 'package:pharmacy_mobile/tables/ref_generic_names.dart'; @@ -28,7 +29,8 @@ class _AddGenericsPageState extends State { final _nameController = TextEditingController(); final _formKey = GlobalKey(); - bool _isLoading = false; + late bool _isLoading = false; + late final List _categoryListCache = []; late List _categoryList = []; late String _selectedCategory = ''; @@ -52,22 +54,34 @@ class _AddGenericsPageState extends State { } } - void autoRun() async { - if (await InternetConnectionChecker.instance.hasConnection) { - _getList(); - } else { - if (mounted) { - showNotification(context, 'Error: No Internet Connection', false); + Future _getCategory() async { + final categoryListCache = await cacheGetCategoryList(context); - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - context.push('/main'); - } - }); + if (categoryListCache.isNotEmpty) { + setState(() { + _categoryList = categoryListCache; + }); + } else { + if (await InternetConnectionChecker.instance.hasConnection) { + _getList(); + } else { + if (mounted) { + showNotification(context, 'Error: No Internet Connection', false); + + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + context.push('/main'); + } + }); + } } } } + void autoRun() async { + _getCategory(); + } + void _updateCategory(dynamic category) { _selectedCategory = category; } diff --git a/lib/pages/add_manufacturer.dart b/lib/pages/add_manufacturer.dart index 8476b4d..de6a67a 100644 --- a/lib/pages/add_manufacturer.dart +++ b/lib/pages/add_manufacturer.dart @@ -3,7 +3,7 @@ import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:pharmacy_mobile/functions/checkexisting_function.dart'; -import 'package:pharmacy_mobile/tables/ref_manufactorers.dart'; +import 'package:pharmacy_mobile/tables/ref_manufacturers.dart'; import 'package:pharmacy_mobile/widgets/buttonwithprogress_widget.dart'; import 'package:pharmacy_mobile/widgets/form_border_widget2.dart'; import 'package:pharmacy_mobile/widgets/input_form_widget.dart'; @@ -16,33 +16,33 @@ class AddManufacturerPage extends StatefulWidget { const AddManufacturerPage({super.key}); @override - State createState() => _AddManufactorerPageState(); + State createState() => _AddManufacturerPageState(); } -class _AddManufactorerPageState extends State { +class _AddManufacturerPageState extends State { final _formKey = GlobalKey(); final _nameController = TextEditingController(); final _addressController = TextEditingController(); - final _refManufactorers = RefManufactorers(); + final _refManufacturers = RefManufacturers(); late bool _isLoading = false; - void _saveManufactorer() async { + void _saveManufacturer() async { setState(() => _isLoading = true); try { if (await InternetConnectionChecker.instance.hasConnection) { - final existing = await checkExisting(_refManufactorers, _nameController); + final existing = await checkExisting(_refManufacturers, _nameController); if (existing && mounted) { - showNotification(context, 'Manufactorer already listed', false); + showNotification(context, 'Manufacturer already listed', false); return; } - final post = await _refManufactorers.postManufactorer(_nameController.text, _addressController.text); + final post = await _refManufacturers.postManufacturer(_nameController.text, _addressController.text); if (post && mounted) { - showNotification(context, 'Manufactorer added to list', true); + showNotification(context, 'Manufacturer added to list', true); WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { @@ -103,12 +103,12 @@ class _AddManufactorerPageState extends State { // if (_isLoading) // const Center(child: CircularProgressIndicator(color: Colors.white)) // else - // ButtonWidget(text: 'Save Manufactorer', onPressed: _saveManufactorer) + // ButtonWidget(text: 'Save Manufacturer', onPressed: _saveManufacturer) ButtonWithProgressWidget( trigger: _isLoading, progressText: 'Adding Manufacturer', buttonText: 'Save', - onPressed: _saveManufactorer) + onPressed: _saveManufacturer) ], ))) ], diff --git a/lib/pages/add_medicine_page.dart b/lib/pages/add_medicine_page.dart index 1fbd5d7..08f1628 100644 --- a/lib/pages/add_medicine_page.dart +++ b/lib/pages/add_medicine_page.dart @@ -7,7 +7,7 @@ import 'package:pharmacy_mobile/functions/barcode_scan_function.dart'; import 'package:pharmacy_mobile/functions/checkresult_function.dart'; import 'package:pharmacy_mobile/tables/ref_categories.dart'; import 'package:pharmacy_mobile/tables/ref_generic_names.dart'; -import 'package:pharmacy_mobile/tables/ref_manufactorers.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/tables/storage.dart'; @@ -39,7 +39,7 @@ class _AddMedicinePageState extends State { final _refGenericNames = RefGenericNames(); final _refCategories = RefCategories(); final _refTypes = RefTypes(); - final _refManufactorer = RefManufactorers(); + final _refManufacturer = RefManufacturers(); final _refMedicines = RefMedicines(); final _storage = Storage(); final _nameController = TextEditingController(); @@ -51,8 +51,8 @@ class _AddMedicinePageState extends State { late String _selectedCategory = ''; late List _typeList = []; late String _selectedType = ''; - late List _manufactorerList = []; - late String _selectedManufactorer = ''; + late List _manufacturerList = []; + late String _selectedManufacturer = ''; late String uuid = ''; late bool imageUploaded = false; late String imageUrl = ''; @@ -71,10 +71,10 @@ class _AddMedicinePageState extends State { }); } - Future _getManufactorer() async { - _manufactorerList = await _refManufactorer.getList(); + Future _getManufacturer() async { + _manufacturerList = await _refManufacturer.getList(); setState(() { - checkResult(context, _manufactorerList, 'Manufactorer'); + checkResult(context, _manufacturerList, 'Manufacturer'); }); } @@ -82,7 +82,7 @@ class _AddMedicinePageState extends State { if (await InternetConnectionChecker.instance.hasConnection) { await _getGenerics(); await _getTypes(); - await _getManufactorer(); + await _getManufacturer(); // final sample = await _refMedicines.getList2(); } else { @@ -110,8 +110,8 @@ class _AddMedicinePageState extends State { _selectedType = type; } - void _updateManufactorer(dynamic manufactorer) { - _selectedManufactorer = manufactorer; + void _updateManufacturer(dynamic manufacturer) { + _selectedManufacturer = manufacturer; } Future _scanBarcode() async { @@ -142,10 +142,10 @@ class _AddMedicinePageState extends State { final medName = _nameController.text; final medGenericUUID = await _refGenericNames.getUUID(_selectedGeneric); final medTypeUUID = await _refTypes.getUUID(_selectedType); - final medManufactorerUUID = await _refManufactorer.getUUID(_selectedManufactorer); + final medManufacturerUUID = await _refManufacturer.getUUID(_selectedManufacturer); await _refMedicines.postMedicine( - uuid, medName, medManufactorerUUID, medGenericUUID, medTypeUUID, encrpytedBarcode); + uuid, medName, medManufacturerUUID, medGenericUUID, medTypeUUID, encrpytedBarcode); } else { if (mounted) { showNotification(context, 'Error: No Internet Connection', false); @@ -177,13 +177,19 @@ class _AddMedicinePageState extends State { uploaded = await _storage.uploadImage(context, storageName, webpImage, '$imageName.webp'); } - setState(() { - if (!uploaded) { - if (mounted) { - showNotification(context, 'Image Upload failed, try again.', false); - } + if (!uploaded) { + if (mounted) { + showNotification(context, 'Image Upload failed, try again.', false); + return; } - }); + } + + if (imageName.isNotEmpty) { + final url = await _getImageUrl('$imageName.webp'); + setState(() { + imageUrl = url; + }); + } } Future _webpConvert(Uint8List file) async { @@ -197,6 +203,11 @@ class _AddMedicinePageState extends State { return result; } + Future _getImageUrl(String imageName) async { + final image = await _storage.getImageURL('ref_medicines_images', imageName); + return image; + } + @override void initState() { autoRun(); @@ -213,8 +224,8 @@ class _AddMedicinePageState extends State { _selectedCategory = ''; _typeList = []; _selectedType = ''; - _manufactorerList = []; - _selectedManufactorer = ''; + _manufacturerList = []; + _selectedManufacturer = ''; super.dispose(); } @@ -265,10 +276,10 @@ class _AddMedicinePageState extends State { ), const Gap(16), DropDownWidget( - label: 'Manufactorer', - list: _manufactorerList, - listTitle: 'manufactorer_name', - onChanged: _updateManufactorer, + label: 'Manufacturer', + list: _manufacturerList, + listTitle: 'manufacturer_name', + onChanged: _updateManufacturer, ), const Gap(16), InputFormWidget(label: 'Barcode', controller: _barcodeController), diff --git a/lib/pages/customer_pages/customer_search_page.dart b/lib/pages/customer_pages/customer_search_page.dart index e1f9001..f77cec7 100644 --- a/lib/pages/customer_pages/customer_search_page.dart +++ b/lib/pages/customer_pages/customer_search_page.dart @@ -31,7 +31,7 @@ class _CustomerSearchPageState extends State { // late final List _medicinesList = []; Future _getURL() async { - final image = await _storage.getPublicURL('ref_medicines_images', 'a3e430fe-86c1-4d46-9c6a-aed2dae57fef.webp'); + final image = await _storage.getImageURL('ref_medicines_images', 'a3e430fe-86c1-4d46-9c6a-aed2dae57fef.webp'); setState(() { imageUrl = image; }); diff --git a/lib/pages/main_page.dart b/lib/pages/main_page.dart index 9f0b227..c47a9f2 100644 --- a/lib/pages/main_page.dart +++ b/lib/pages/main_page.dart @@ -3,6 +3,9 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; import 'package:pharmacy_mobile/auth/auth_service.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/functions/cache_getcategorylist.dart'; +import 'package:pharmacy_mobile/blocs/caches/categorylist/functions/cache_setcategorylist.dart'; +import 'package:pharmacy_mobile/tables/ref_categories.dart'; import 'package:pharmacy_mobile/widgets/buttonwithprogress_widget.dart'; import 'package:pharmacy_mobile/widgets/menu_widget.dart'; import 'package:pharmacy_mobile/widgets/page_background_widget.dart'; @@ -20,6 +23,7 @@ class MainPage extends StatefulWidget { class _MainPageState extends State { final _authService = AuthService(); + final _refCategories = RefCategories(); late bool _isLoading = false; @@ -45,6 +49,50 @@ class _MainPageState extends State { } } + // void _getList() async { + // _categoryList = await _refCategories.getList(); + + // if (_categoryList.isEmpty) { + // if (mounted) { + // showNotification(context, 'Error: No Categories Found', false); + + // WidgetsBinding.instance.addPostFrameCallback((_) { + // if (mounted) { + // context.push('/main'); + // } + // }); + // } + // } else { + // setState(() => {}); + // } + // } + + Future _getCategoryListCache() async { + final categoryList = await _refCategories.getList(); + + if (categoryList.isNotEmpty) { + // ignore: use_build_context_synchronously + final setCache = await cacheSetCategoryList(context, categoryList); + if (!setCache) { + // ignore: use_build_context_synchronously + showNotification(context, 'Caching failed', false); + } else { + print('Caching Success'); + + } + } + } + + void autoRun() async { + await _getCategoryListCache(); + } + + @override + void initState() { + autoRun(); + super.initState(); + } + @override Widget build(BuildContext context) { return PopScope( diff --git a/lib/pages/register_page.dart b/lib/pages/register_page.dart index 3f4aee8..a1e6951 100644 --- a/lib/pages/register_page.dart +++ b/lib/pages/register_page.dart @@ -1,12 +1,7 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:gap/gap.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:pharmacy_mobile/auth/auth_service.dart'; -import 'package:pharmacy_mobile/blocs/guest/guest_bloc.dart'; -import 'package:pharmacy_mobile/blocs/guest/guest_event.dart'; import 'package:pharmacy_mobile/widgets/buttonwithprogress_widget.dart'; import 'package:pharmacy_mobile/widgets/glossy_container_widget.dart'; import 'package:pharmacy_mobile/widgets/input_form_widget.dart'; diff --git a/lib/tables/ref_manufactorers.dart b/lib/tables/ref_manufacturers.dart similarity index 50% rename from lib/tables/ref_manufactorers.dart rename to lib/tables/ref_manufacturers.dart index b789739..a1cf9b9 100644 --- a/lib/tables/ref_manufactorers.dart +++ b/lib/tables/ref_manufacturers.dart @@ -1,15 +1,15 @@ import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:uuid/uuid.dart'; -class RefManufactorers { +class RefManufacturers { final SupabaseClient _supabase = Supabase.instance.client; Future getList() async { try { final data = await _supabase - .from('ref_manufactorers') - .select('manufactorer_name') - .order('manufactorer_name', ascending: true); + .from('ref_manufacturers') + .select('manufacturer_name') + .order('manufacturer_name', ascending: true); return data.toList(); } catch (e) { return []; @@ -19,20 +19,20 @@ class RefManufactorers { Future getUUID(String name) async { try { final data = - await _supabase.from('ref_manufactorers').select('ref_manufactorers_uuid').eq('manufactorer_name', name); - return data.first['ref_manufactorers_uuid'].toString(); + await _supabase.from('ref_manufacturers').select('ref_manufacturers_uuid').eq('manufacturer_name', name); + return data.first['ref_manufacturers_uuid'].toString(); } catch (e) { return ''; } } - Future postManufactorer(String name, String address) async { + Future postManufacturer(String name, String address) async { try { final genericUUID = Uuid().v4(); await _supabase - .from('ref_manufactorers') - .insert({'ref_manufactorers_uuid': genericUUID, 'manufactorer_name': name, 'manufactorer_address': address}); + .from('ref_manufacturers') + .insert({'ref_manufacturers_uuid': genericUUID, 'manufacturer_name': name, 'manufacturer_address': address}); return true; } catch (e) { return false; diff --git a/lib/tables/storage.dart b/lib/tables/storage.dart index 0d6eb0b..7fbac25 100644 --- a/lib/tables/storage.dart +++ b/lib/tables/storage.dart @@ -36,7 +36,7 @@ class Storage { } } - Future getPublicURL(String storage, String name) async { + Future getImageURL(String storage, String name) async { try { final String file = _supabase.storage.from(storage).getPublicUrl(name); return file;