diff --git a/lib/pages/add_medicine.dart b/lib/pages/add_medicine.dart index a7ba8f3..d92ff36 100644 --- a/lib/pages/add_medicine.dart +++ b/lib/pages/add_medicine.dart @@ -2,12 +2,14 @@ import 'dart:developer'; 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: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_medicines.dart'; import 'package:pharmacy_mobile/tables/ref_types.dart'; +import 'package:pharmacy_mobile/tables/storage.dart'; import 'package:pharmacy_mobile/widgets/button_widget.dart'; import 'package:pharmacy_mobile/widgets/dropdown_widget.dart'; import 'package:pharmacy_mobile/widgets/dropdown_wrapper_widget.dart'; @@ -18,6 +20,7 @@ import 'package:pharmacy_mobile/widgets/snackbar_widget.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart'; import 'package:pharmacy_mobile/widgets/title_widget.dart'; import 'package:go_router/go_router.dart'; +import 'package:uuid/uuid.dart'; class AddMedicinePage extends StatefulWidget { const AddMedicinePage({super.key}); @@ -33,6 +36,7 @@ class _AddMedicinePageState extends State { final _refTypes = RefTypes(); final _refManufactorer = RefManufactorers(); final _refMedicines = RefMedicines(); + final _storage = Storage(); final _nameController = TextEditingController(); final FocusNode _focusNode = FocusNode(); bool _isLoading = false; @@ -44,6 +48,9 @@ class _AddMedicinePageState extends State { late String _selectedType = ''; late List _manufactorerList = []; late String _selectedManufactorer = ''; + late String uuid = ''; + late bool imageUploaded = false; + late String imageUrl = ''; void _checkResult(List list, String name) { if (list.isEmpty) { @@ -84,8 +91,7 @@ class _AddMedicinePageState extends State { setState(() {}); - final sample = await _refMedicines.getList2(); - log(sample.toString()); + // final sample = await _refMedicines.getList2(); } else { if (mounted) { showNotification(context, 'Error: No Internet Connection', false); @@ -125,7 +131,7 @@ class _AddMedicinePageState extends State { final medTypeUUID = await _refTypes.getUUID(_selectedType); final medManufactorerUUID = await _refManufactorer.getUUID(_selectedManufactorer); - await _refMedicines.postMedicine(medName, medManufactorerUUID, medGenericUUID, medTypeUUID); + await _refMedicines.postMedicine(uuid, medName, medManufactorerUUID, medGenericUUID, medTypeUUID); } else { if (mounted) { showNotification(context, 'Error: No Internet Connection', false); @@ -140,6 +146,20 @@ class _AddMedicinePageState extends State { } } + void _addImage() async { + final imageName = Uuid().v4(); + uuid = imageName; + final ImagePicker picker = ImagePicker(); + final XFile? image = await picker.pickImage(source: ImageSource.gallery); + const storageName = 'ref_medicines_images'; + + if (image == null) { + return; + } + + imageUrl = await _storage.uploadImage(storageName, image, '$imageName.webp'); + } + @override void initState() { autoRun(); @@ -213,6 +233,17 @@ class _AddMedicinePageState extends State { listTitle: 'manufactorer_name', onChanged: _updateManufactorer)), const Gap(32), + // if (imageUrl.isNotEmpty) + ClipRRect( + borderRadius: BorderRadius.circular(12), // Add your desired border radius here + child: Image.network( + 'https://lijihnvjlucyvxfhghqd.supabase.co/storage/v1/object/public/ref_medicines_images//ab033e88-1933-496b-8e11-47bf85d21d8f.webp', + fit: BoxFit.cover, + width: 250, + height: 250)), + // else + // ButtonWidget(text: 'Add Image', onPressed: _addImage), + const Gap(32), if (_isLoading) const Center(child: CircularProgressIndicator(color: Colors.white)) else diff --git a/lib/pages/list_stocks.dart b/lib/pages/list_stocks.dart index 560d955..a53d04e 100644 --- a/lib/pages/list_stocks.dart +++ b/lib/pages/list_stocks.dart @@ -69,12 +69,7 @@ class _ListStocksPageState extends State { setState(() { _isLoading = true; }); - // _stockList = await _stocks.getList(); - // final ff = File('assets/ph_logo.webp'); - // await _storage.uploadFile(ff); - final aa = await _storage.getList(); - // final aa = await _storage.createBucket('aa'); - log(aa.toString()); + _stockList = await _stocks.getList(); setState(() { _isLoading = false; diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index e9e4953..39b1905 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -11,6 +11,7 @@ import 'package:pharmacy_mobile/widgets/text_widget.dart'; import 'package:pharmacy_mobile/widgets/title_widget.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @@ -54,8 +55,12 @@ class _LoginPageState extends State { await _authService.signIn(email, password); if (mounted) { + final user = _authService.getCurrentUser(); showNotification(context, 'Login Successful', true); + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setString('user', user.toString()); + WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { context.push('/main'); diff --git a/lib/pages/main_page.dart b/lib/pages/main_page.dart index f7b32d0..f4220dc 100644 --- a/lib/pages/main_page.dart +++ b/lib/pages/main_page.dart @@ -9,16 +9,38 @@ import 'package:pharmacy_mobile/widgets/page_background_widget.dart'; import 'package:pharmacy_mobile/widgets/snackbar_widget.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart'; import 'package:pharmacy_mobile/widgets/title_widget.dart'; +import 'package:shared_preferences/shared_preferences.dart'; -class MainPage extends StatelessWidget { +class MainPage extends StatefulWidget { const MainPage({super.key}); + @override + State createState() => _MainPageState(); +} + +class _MainPageState extends State { + void _checkLogged() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + bool userStatus = prefs.containsKey('user'); + if (!userStatus) { + // ignore: use_build_context_synchronously + context.go('/'); + } + } + + @override + void initState() { + _checkLogged(); + super.initState(); + } + @override Widget build(BuildContext context) { final authService = AuthService(); void signOut() async { - await authService.signOut().then((_) => {context.push('/'), showNotification(context, 'Logged Out', true)}); + // ignore: use_build_context_synchronously + await authService.signOut().then((_) => {context.go('/'), showNotification(context, 'Logged Out', true)}); } return PopScope( diff --git a/lib/tables/ref_medicines.dart b/lib/tables/ref_medicines.dart index 9c72169..59d1d7e 100644 --- a/lib/tables/ref_medicines.dart +++ b/lib/tables/ref_medicines.dart @@ -21,8 +21,8 @@ class RefMedicines { return data.first['ref_medicines_uuid']; } - Future postMedicine(String name, String muuid, String guuid, String tuuid) async { - final uuid = Uuid().v4(); + Future postMedicine(String uuid, String name, String muuid, String guuid, String tuuid) async { + // final uuid = Uuid().v4(); final medicine = { 'ref_medicines_uuid': uuid, diff --git a/lib/tables/storage.dart b/lib/tables/storage.dart index 9ce22e6..b688049 100644 --- a/lib/tables/storage.dart +++ b/lib/tables/storage.dart @@ -1,5 +1,7 @@ +import 'dart:convert'; import 'dart:developer'; import 'dart:io'; +import 'package:image_picker/image_picker.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class Storage { @@ -25,13 +27,29 @@ class Storage { } } - Future uploadFile(File file) async { + Future uploadFile(XFile image, String name) async { try { - final fileName = file.path.split('/').last; - await _supabase.storage.from('images').upload(fileName, file); + final imageString = await image.readAsString(encoding: utf8); + final imageFile = File(imageString); + await _supabase.storage.from('images').upload(name, imageFile); + log('upload Complete'); } catch (e) { log('Error getting list: $e'); rethrow; } } + + Future uploadImage(String storage, XFile image, String name) async { + try { + final imageBytes = await image.readAsBytes(); + final imagePath = name; + + await _supabase.storage.from(storage).uploadBinary(imagePath, imageBytes); + final imageUrl = _supabase.storage.from(storage).getPublicUrl(imagePath); + return imageUrl; + } catch (e) { + log('Error uploading image: $e'); + rethrow; + } + } } diff --git a/pubspec.lock b/pubspec.lock index 80ead7e..9300a56 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -577,13 +577,13 @@ packages: source: hosted version: "0.28.0" shared_preferences: - dependency: transitive + dependency: "direct main" description: name: shared_preferences - sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a + sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.5.2" shared_preferences_android: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c40612d..ebb5cf1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,6 +20,7 @@ dependencies: intl: ^0.20.2 internet_connection_checker: ^3.0.1 image_picker: ^1.1.2 + shared_preferences: ^2.5.2 dev_dependencies: flutter_test: