From b6b7ab6e84f486f579e610076b7efd986a2a3fca Mon Sep 17 00:00:00 2001 From: Patrick Alvin Alcala Date: Wed, 22 Jan 2025 16:23:32 +0800 Subject: [PATCH] update --- lib/auth/auth_gate.dart | 4 +- lib/main.dart | 11 ++++- lib/pages/index_page.dart | 2 +- lib/pages/login_page.dart | 82 +++++++++++------------------------- lib/pages/main_page.dart | 66 +++++++++++++++++++++++++++++ lib/widgets/menu_widget.dart | 33 +++++++++++++++ pubspec.lock | 16 +++++++ pubspec.yaml | 2 + 8 files changed, 155 insertions(+), 61 deletions(-) create mode 100644 lib/pages/main_page.dart create mode 100644 lib/widgets/menu_widget.dart diff --git a/lib/auth/auth_gate.dart b/lib/auth/auth_gate.dart index e0ca52e..1639820 100644 --- a/lib/auth/auth_gate.dart +++ b/lib/auth/auth_gate.dart @@ -14,7 +14,9 @@ class AuthGate extends StatelessWidget { if (snapshot.connectionState == ConnectionState.waiting) { return Scaffold( body: Center( - child: CircularProgressIndicator(), + child: CircularProgressIndicator( + color: Colors.green, + ), ), ); } diff --git a/lib/main.dart b/lib/main.dart index 9236ebc..6be6e68 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:pharmacy_mobile/pages/index_page.dart'; +import 'package:pharmacy_mobile/auth/auth_gate.dart'; +// import 'package:pharmacy_mobile/pages/index_page.dart'; import 'package:pharmacy_mobile/pages/login_page.dart'; import 'package:go_router/go_router.dart'; +import 'package:pharmacy_mobile/pages/main_page.dart'; import 'package:pharmacy_mobile/pages/register_page.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; @@ -32,7 +34,7 @@ final _router = GoRouter( GoRoute( name: 'index', // Optional, add name to your routes. Allows you navigate by name instead of path path: '/', - builder: (context, state) => IndexPage(), + builder: (context, state) => AuthGate(), ), GoRoute( name: 'login', @@ -44,6 +46,11 @@ final _router = GoRouter( path: '/register', builder: (context, state) => RegisterPage(), ), + GoRoute( + name: 'main', + path: '/main', + builder: (context, state) => MainPage(), + ), ], ); diff --git a/lib/pages/index_page.dart b/lib/pages/index_page.dart index e510607..c10e249 100644 --- a/lib/pages/index_page.dart +++ b/lib/pages/index_page.dart @@ -41,7 +41,7 @@ class IndexPage extends StatelessWidget { width: 256, cacheWidth: (256 * MediaQuery.of(context).devicePixelRatio).round()), ), const Gap(16), - TextButton(onPressed: () => {context.push('/login')}, child: Text('data')) + TextButton(onPressed: () => {context.push('/login')}, child: const Text('Login')) ], ), ), diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 2ce4ac1..8b7c19b 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:gap/gap.dart'; import 'package:pharmacy_mobile/auth/auth_service.dart'; import 'package:pharmacy_mobile/main.dart'; import 'dart:developer'; +import 'package:quickalert/quickalert.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @@ -17,16 +19,30 @@ class _LoginPageState extends State { final _emailController = TextEditingController(); final _passwordController = TextEditingController(); - Future _signIn() async { + void _signIn() async { final email = _emailController.text; final password = _passwordController.text; try { await _authService.signIn(email, password); - log('message'); + // QuickAlert.show( + // context: context, + // type: QuickAlertType.success, + // text: 'Login Successful', + // autoCloseDuration: const Duration(seconds: 1), + // showConfirmBtn: false, + // ); + context.push('/main'); } catch (e) { if (mounted) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Error: $e'))); + QuickAlert.show( + context: context, + type: QuickAlertType.error, + text: 'Error: $e', + autoCloseDuration: const Duration(seconds: 2), + showConfirmBtn: false, + ); + // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Error: $e'))); } } @@ -87,76 +103,28 @@ class _LoginPageState extends State { children: [ TextFormField( controller: _emailController, - decoration: InputDecoration( + decoration: const InputDecoration( labelText: 'Email', border: OutlineInputBorder(), ), - style: TextStyle(color: Colors.white), + style: const TextStyle(color: Colors.white), ), const Gap(8), TextFormField( + obscureText: true, controller: _passwordController, - decoration: InputDecoration( + decoration: const InputDecoration( labelText: 'Password', border: OutlineInputBorder(), ), - style: TextStyle(color: Colors.white), + style: const TextStyle(color: Colors.white), ), const Gap(16), - TextButton(onPressed: () => {_signIn()}, child: Text('Login')) + TextButton(onPressed: () => {_signIn()}, child: const Text('Login')) ], )), ), ), - - // Form( - - // child: Column( - // children: [ - // TextFormField( - // decoration: InputDecoration( - // labelText: 'Email', - // border: OutlineInputBorder(), - // ), - // validator: (value) { - // if (value.isEmpty) { - // return 'Please enter an email'; - // } - // return null; - // }, - // onSaved: (value) => _email = value, - // ), - // SizedBox(height: 20), - // TextFormField( - // decoration: InputDecoration( - // labelText: 'Password', - // border: OutlineInputBorder(), - // ), - // obscureText: true, - // validator: (value) { - // if (value.isEmpty) { - // return 'Please enter a password'; - // } - // return null; - // }, - // onSaved: (value) => _password = value, - // ), - // SizedBox(height: 20), - // ElevatedButton( - // onPressed: () { - // if (_formKey.currentState.validate()) { - // _formKey.currentState.save(); - // // Login logic here - // print('Email: $_email, Password: $_password'); - // } - // }, - // child: Text('Login'), - // ), - // ], - // ), - // ), - // ) - // ) ], ), ), diff --git a/lib/pages/main_page.dart b/lib/pages/main_page.dart new file mode 100644 index 0000000..67d01b1 --- /dev/null +++ b/lib/pages/main_page.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:gap/gap.dart'; +import 'package:go_router/go_router.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:pharmacy_mobile/auth/auth_service.dart'; +import 'package:pharmacy_mobile/widgets/menu_widget.dart'; + +class MainPage extends StatelessWidget { + const MainPage({super.key}); + + @override + Widget build(BuildContext context) { + final authService = AuthService(); + + void signOut() async { + await authService.signOut(); + context.push('/'); + } + + return Scaffold( + body: Container( + alignment: Alignment.center, + height: MediaQuery.of(context).size.height, + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [ + Color.fromRGBO(34, 51, 69, 1), + Color.fromRGBO(22, 32, 44, 1), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: Center( + child: Column( + children: [ + const Gap(120), + Text('Ofelia Franco-Alcala', + style: GoogleFonts.outfit( + textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 16))), + Text('Pharmacy', + style: GoogleFonts.outfit( + textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 32))), + const Gap(32), + Text('Menu', + style: GoogleFonts.outfit( + textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 32))), + const Gap(16), + MenuWidget( + icon: FontAwesomeIcons.squarePlus, + text: 'Add Medicine', + ), + const Gap(16), + MenuWidget( + icon: FontAwesomeIcons.squarePlus, + text: 'Add Medicine', + ), + TextButton(onPressed: () => {signOut()}, child: const Text('Logout')) + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/menu_widget.dart b/lib/widgets/menu_widget.dart new file mode 100644 index 0000000..46d21c6 --- /dev/null +++ b/lib/widgets/menu_widget.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; + +class MenuWidget extends StatelessWidget { + final String? text; + final IconData? icon; + + const MenuWidget({ + super.key, + this.text, + this.icon, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: MediaQuery.of(context).size.width - 32, + height: 100, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.grey[200], + ), + child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ + const Gap(32), + Icon(icon, size: 32, color: const Color.fromRGBO(34, 51, 69, 1)), + const Gap(120), + Text( + text ?? 'Data', + style: TextStyle(fontSize: 16), + ) + ])); + } +} diff --git a/pubspec.lock b/pubspec.lock index 530dc14..fbb4ea9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -136,6 +136,14 @@ packages: description: flutter source: sdk version: "0.0.0" + font_awesome_flutter: + dependency: "direct main" + description: + name: font_awesome_flutter + sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a + url: "https://pub.dev" + source: hosted + version: "10.8.0" functions_client: dependency: transitive description: @@ -360,6 +368,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.1" + quickalert: + dependency: "direct main" + description: + name: quickalert + sha256: b5d62b1e20b08cc0ff5f40b6da519bdc7a5de6082f13d90572cf4e72eea56c5e + url: "https://pub.dev" + source: hosted + version: "1.1.0" realtime_client: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 1b32b67..38a6882 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,6 +16,8 @@ dependencies: gap: ^3.0.1 go_router: ^14.6.3 supabase_flutter: ^2.8.3 + quickalert: ^1.1.0 + font_awesome_flutter: ^10.8.0 dev_dependencies: flutter_test: