This commit is contained in:
Patrick Alvin Alcala 2025-02-14 11:57:34 +08:00
parent b45cf8bd73
commit 941e9eaa5b
8 changed files with 91 additions and 19 deletions

View file

@ -2,12 +2,14 @@ import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:image_picker/image_picker.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:pharmacy_mobile/tables/ref_categories.dart'; import 'package:pharmacy_mobile/tables/ref_categories.dart';
import 'package:pharmacy_mobile/tables/ref_generic_names.dart'; import 'package:pharmacy_mobile/tables/ref_generic_names.dart';
import 'package:pharmacy_mobile/tables/ref_manufactorers.dart'; import 'package:pharmacy_mobile/tables/ref_manufactorers.dart';
import 'package:pharmacy_mobile/tables/ref_medicines.dart'; import 'package:pharmacy_mobile/tables/ref_medicines.dart';
import 'package:pharmacy_mobile/tables/ref_types.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/button_widget.dart';
import 'package:pharmacy_mobile/widgets/dropdown_widget.dart'; import 'package:pharmacy_mobile/widgets/dropdown_widget.dart';
import 'package:pharmacy_mobile/widgets/dropdown_wrapper_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/text_widget.dart';
import 'package:pharmacy_mobile/widgets/title_widget.dart'; import 'package:pharmacy_mobile/widgets/title_widget.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:uuid/uuid.dart';
class AddMedicinePage extends StatefulWidget { class AddMedicinePage extends StatefulWidget {
const AddMedicinePage({super.key}); const AddMedicinePage({super.key});
@ -33,6 +36,7 @@ class _AddMedicinePageState extends State<AddMedicinePage> {
final _refTypes = RefTypes(); final _refTypes = RefTypes();
final _refManufactorer = RefManufactorers(); final _refManufactorer = RefManufactorers();
final _refMedicines = RefMedicines(); final _refMedicines = RefMedicines();
final _storage = Storage();
final _nameController = TextEditingController(); final _nameController = TextEditingController();
final FocusNode _focusNode = FocusNode(); final FocusNode _focusNode = FocusNode();
bool _isLoading = false; bool _isLoading = false;
@ -44,6 +48,9 @@ class _AddMedicinePageState extends State<AddMedicinePage> {
late String _selectedType = ''; late String _selectedType = '';
late List _manufactorerList = []; late List _manufactorerList = [];
late String _selectedManufactorer = ''; late String _selectedManufactorer = '';
late String uuid = '';
late bool imageUploaded = false;
late String imageUrl = '';
void _checkResult(List list, String name) { void _checkResult(List list, String name) {
if (list.isEmpty) { if (list.isEmpty) {
@ -84,8 +91,7 @@ class _AddMedicinePageState extends State<AddMedicinePage> {
setState(() {}); setState(() {});
final sample = await _refMedicines.getList2(); // final sample = await _refMedicines.getList2();
log(sample.toString());
} else { } else {
if (mounted) { if (mounted) {
showNotification(context, 'Error: No Internet Connection', false); showNotification(context, 'Error: No Internet Connection', false);
@ -125,7 +131,7 @@ class _AddMedicinePageState extends State<AddMedicinePage> {
final medTypeUUID = await _refTypes.getUUID(_selectedType); final medTypeUUID = await _refTypes.getUUID(_selectedType);
final medManufactorerUUID = await _refManufactorer.getUUID(_selectedManufactorer); final medManufactorerUUID = await _refManufactorer.getUUID(_selectedManufactorer);
await _refMedicines.postMedicine(medName, medManufactorerUUID, medGenericUUID, medTypeUUID); await _refMedicines.postMedicine(uuid, medName, medManufactorerUUID, medGenericUUID, medTypeUUID);
} else { } else {
if (mounted) { if (mounted) {
showNotification(context, 'Error: No Internet Connection', false); showNotification(context, 'Error: No Internet Connection', false);
@ -140,6 +146,20 @@ class _AddMedicinePageState extends State<AddMedicinePage> {
} }
} }
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 @override
void initState() { void initState() {
autoRun(); autoRun();
@ -213,6 +233,17 @@ class _AddMedicinePageState extends State<AddMedicinePage> {
listTitle: 'manufactorer_name', listTitle: 'manufactorer_name',
onChanged: _updateManufactorer)), onChanged: _updateManufactorer)),
const Gap(32), 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) if (_isLoading)
const Center(child: CircularProgressIndicator(color: Colors.white)) const Center(child: CircularProgressIndicator(color: Colors.white))
else else

View file

@ -69,12 +69,7 @@ class _ListStocksPageState extends State<ListStocksPage> {
setState(() { setState(() {
_isLoading = true; _isLoading = true;
}); });
// _stockList = await _stocks.getList(); _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());
setState(() { setState(() {
_isLoading = false; _isLoading = false;

View file

@ -11,6 +11,7 @@ import 'package:pharmacy_mobile/widgets/text_widget.dart';
import 'package:pharmacy_mobile/widgets/title_widget.dart'; import 'package:pharmacy_mobile/widgets/title_widget.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
class LoginPage extends StatefulWidget { class LoginPage extends StatefulWidget {
const LoginPage({super.key}); const LoginPage({super.key});
@ -54,8 +55,12 @@ class _LoginPageState extends State<LoginPage> {
await _authService.signIn(email, password); await _authService.signIn(email, password);
if (mounted) { if (mounted) {
final user = _authService.getCurrentUser();
showNotification(context, 'Login Successful', true); showNotification(context, 'Login Successful', true);
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('user', user.toString());
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) { if (mounted) {
context.push('/main'); context.push('/main');

View file

@ -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/snackbar_widget.dart';
import 'package:pharmacy_mobile/widgets/text_widget.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart';
import 'package:pharmacy_mobile/widgets/title_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}); const MainPage({super.key});
@override
State<MainPage> createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final authService = AuthService(); final authService = AuthService();
void signOut() async { 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( return PopScope(

View file

@ -21,8 +21,8 @@ class RefMedicines {
return data.first['ref_medicines_uuid']; return data.first['ref_medicines_uuid'];
} }
Future<void> postMedicine(String name, String muuid, String guuid, String tuuid) async { Future<void> postMedicine(String uuid, String name, String muuid, String guuid, String tuuid) async {
final uuid = Uuid().v4(); // final uuid = Uuid().v4();
final medicine = { final medicine = {
'ref_medicines_uuid': uuid, 'ref_medicines_uuid': uuid,

View file

@ -1,5 +1,7 @@
import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:image_picker/image_picker.dart';
import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:supabase_flutter/supabase_flutter.dart';
class Storage { class Storage {
@ -25,13 +27,29 @@ class Storage {
} }
} }
Future<void> uploadFile(File file) async { Future<void> uploadFile(XFile image, String name) async {
try { try {
final fileName = file.path.split('/').last; final imageString = await image.readAsString(encoding: utf8);
await _supabase.storage.from('images').upload(fileName, file); final imageFile = File(imageString);
await _supabase.storage.from('images').upload(name, imageFile);
log('upload Complete');
} catch (e) { } catch (e) {
log('Error getting list: $e'); log('Error getting list: $e');
rethrow; rethrow;
} }
} }
Future<String> 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;
}
}
} }

View file

@ -577,13 +577,13 @@ packages:
source: hosted source: hosted
version: "0.28.0" version: "0.28.0"
shared_preferences: shared_preferences:
dependency: transitive dependency: "direct main"
description: description:
name: shared_preferences name: shared_preferences
sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.5" version: "2.5.2"
shared_preferences_android: shared_preferences_android:
dependency: transitive dependency: transitive
description: description:

View file

@ -20,6 +20,7 @@ dependencies:
intl: ^0.20.2 intl: ^0.20.2
internet_connection_checker: ^3.0.1 internet_connection_checker: ^3.0.1
image_picker: ^1.1.2 image_picker: ^1.1.2
shared_preferences: ^2.5.2
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: