From b2aeb642cc5178014a24d7f71677ecddeca527d7 Mon Sep 17 00:00:00 2001 From: Patrick Alvin Alcala Date: Wed, 22 Jan 2025 13:14:06 +0800 Subject: [PATCH] update --- .env | 2 - {lib/assets => assets}/ph_logo.webp | Bin lib/auth/auth_gate.dart | 31 +++++++++++++ lib/auth/auth_service.dart | 23 ++++++++++ lib/commands/signup.dart | 52 +++++++++++----------- lib/main.dart | 18 ++++++-- lib/pages/login_page.dart | 65 +++++++++++++++++++++++----- lib/pages/register_page.dart | 58 +++++++++++++++++++++++++ lib/supabase/supabase_client.dart | 9 ---- pubspec.lock | 8 ---- pubspec.yaml | 3 +- 11 files changed, 209 insertions(+), 60 deletions(-) delete mode 100644 .env rename {lib/assets => assets}/ph_logo.webp (100%) create mode 100644 lib/auth/auth_gate.dart create mode 100644 lib/auth/auth_service.dart create mode 100644 lib/pages/register_page.dart delete mode 100644 lib/supabase/supabase_client.dart diff --git a/.env b/.env deleted file mode 100644 index a859f5a..0000000 --- a/.env +++ /dev/null @@ -1,2 +0,0 @@ -SUPABASE_URL="https://lijihnvjlucyvxfhghqd.supabase.co" -SUPABASE_ANONKEY="'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImxpamlobnZqbHVjeXZ4ZmhnaHFkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MjQ1NjEyODYsImV4cCI6MjA0MDEzNzI4Nn0.N3_FLKm02OdprL9m3P0CzuV8kdbCrrJKaVdtgVR3PSk" diff --git a/lib/assets/ph_logo.webp b/assets/ph_logo.webp similarity index 100% rename from lib/assets/ph_logo.webp rename to assets/ph_logo.webp diff --git a/lib/auth/auth_gate.dart b/lib/auth/auth_gate.dart new file mode 100644 index 0000000..e0ca52e --- /dev/null +++ b/lib/auth/auth_gate.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:pharmacy_mobile/pages/index_page.dart'; +import 'package:pharmacy_mobile/pages/login_page.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; + +class AuthGate extends StatelessWidget { + const AuthGate({super.key}); + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: Supabase.instance.client.auth.onAuthStateChange, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Scaffold( + body: Center( + child: CircularProgressIndicator(), + ), + ); + } + + final session = snapshot.hasData ? snapshot.data!.session : null; + + if (session != null) { + return IndexPage(); + } else { + return LoginPage(); + } + }); + } +} diff --git a/lib/auth/auth_service.dart b/lib/auth/auth_service.dart new file mode 100644 index 0000000..0f0254b --- /dev/null +++ b/lib/auth/auth_service.dart @@ -0,0 +1,23 @@ +import 'package:supabase_flutter/supabase_flutter.dart'; + +class AuthService { + final SupabaseClient _supabase = Supabase.instance.client; + + Future signIn(String email, String password) async { + return await _supabase.auth.signInWithPassword(email: email, password: password); + } + + Future signUp(String email, String password) async { + return await _supabase.auth.signUp(email: email, password: password); + } + + Future signOut() async { + await _supabase.auth.signOut(); + } + + String? getCurrentUser() { + final session = _supabase.auth.currentSession; + final user = session?.user; + return user?.email; + } +} diff --git a/lib/commands/signup.dart b/lib/commands/signup.dart index 2504091..27e0a61 100644 --- a/lib/commands/signup.dart +++ b/lib/commands/signup.dart @@ -1,28 +1,28 @@ -import 'package:supabase_flutter/supabase_flutter.dart'; -import 'package:pharmacy_mobile/main.dart'; +// import 'package:supabase_flutter/supabase_flutter.dart'; +// import 'package:pharmacy_mobile/main.dart'; -Future signUp() async { - try { - await supabase.auth.signUp( - email: email, - password: password, - ); - // if (mounted) { - // context.showSnackBar('Check your email for a login link!'); +// Future signUp() async { +// try { +// await supabase.auth.signUp( +// email: email, +// password: password, +// ); +// // if (mounted) { +// // context.showSnackBar('Check your email for a login link!'); - // _emailController.clear(); - // } - } on AuthException catch (error) { - if (mounted) context.showSnackBar(error.message, isError: true); - } catch (error) { - if (mounted) { - context.showSnackBar('Unexpected error occurred', isError: true); - } - } finally { - if (mounted) { - setState(() { - _isLoading = false; - }); - } - } -} +// // _emailController.clear(); +// // } +// } on AuthException catch (error) { +// if (mounted) context.showSnackBar(error.message, isError: true); +// } catch (error) { +// if (mounted) { +// context.showSnackBar('Unexpected error occurred', isError: true); +// } +// } finally { +// if (mounted) { +// setState(() { +// _isLoading = false; +// }); +// } +// } +// } diff --git a/lib/main.dart b/lib/main.dart index 977677d..9236ebc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.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/register_page.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; // void main() { @@ -9,11 +10,17 @@ import 'package:supabase_flutter/supabase_flutter.dart'; // } Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + + final supUrl = "https://lijihnvjlucyvxfhghqd.supabase.co"; + final supAnonkey = + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImxpamlobnZqbHVjeXZ4ZmhnaHFkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MjQ1NjEyODYsImV4cCI6MjA0MDEzNzI4Nn0.N3_FLKm02OdprL9m3P0CzuV8kdbCrrJKaVdtgVR3PSk"; + await Supabase.initialize( - url: 'https://lijihnvjlucyvxfhghqd.supabase.co', - anonKey: - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImxpamlobnZqbHVjeXZ4ZmhnaHFkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MjQ1NjEyODYsImV4cCI6MjA0MDEzNzI4Nn0.N3_FLKm02OdprL9m3P0CzuV8kdbCrrJKaVdtgVR3PSk', + url: supUrl, + anonKey: supAnonkey, ); + runApp(MyApp()); } @@ -32,6 +39,11 @@ final _router = GoRouter( path: '/login', builder: (context, state) => LoginPage(), ), + GoRoute( + name: 'register', + path: '/register', + builder: (context, state) => RegisterPage(), + ), ], ); diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index dd04196..2ce4ac1 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,10 +1,49 @@ import 'package:flutter/material.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'; -class LoginPage extends StatelessWidget { +class LoginPage extends StatefulWidget { const LoginPage({super.key}); + @override + State createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + final _authService = AuthService(); + final _emailController = TextEditingController(); + final _passwordController = TextEditingController(); + + Future _signIn() async { + final email = _emailController.text; + final password = _passwordController.text; + + try { + await _authService.signIn(email, password); + log('message'); + } catch (e) { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Error: $e'))); + } + } + + // if (mounted) { + // context.showSnackBar('Check your email for a login link!'); + + // _emailController.clear(); + // } + } + + @override + void dispose() { + _emailController.dispose(); + _passwordController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -47,18 +86,24 @@ class LoginPage extends StatelessWidget { child: Column( children: [ TextFormField( - decoration: InputDecoration( - labelText: 'Email', - border: OutlineInputBorder(), - )), + controller: _emailController, + decoration: InputDecoration( + labelText: 'Email', + border: OutlineInputBorder(), + ), + style: TextStyle(color: Colors.white), + ), const Gap(8), TextFormField( - decoration: InputDecoration( - labelText: 'Password', - border: OutlineInputBorder(), - )), + controller: _passwordController, + decoration: InputDecoration( + labelText: 'Password', + border: OutlineInputBorder(), + ), + style: TextStyle(color: Colors.white), + ), const Gap(16), - TextButton(onPressed: () => {}, child: Text('Login')) + TextButton(onPressed: () => {_signIn()}, child: Text('Login')) ], )), ), diff --git a/lib/pages/register_page.dart b/lib/pages/register_page.dart new file mode 100644 index 0000000..5bcb150 --- /dev/null +++ b/lib/pages/register_page.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.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'; + +class RegisterPage extends StatefulWidget { + const RegisterPage({super.key}); + + @override + _RegisterPageState createState() => _RegisterPageState(); +} + +class _RegisterPageState extends State { + final _authService = AuthService(); + final _emailController = TextEditingController(); + final _passwordController = TextEditingController(); + final _confirmPasswordController = TextEditingController(); + + Future _signUp() async { + final email = _emailController.text; + final password = _passwordController.text; + final confirmPassword = _confirmPasswordController.text; + + try { + await _authService.signUp(email, password); + } catch (e) { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Error: $e'))); + } + } + + if (password != confirmPassword) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Password does not match!'))); + } + + // if (mounted) { + // context.showSnackBar('Check your email for a login link!'); + + // _emailController.clear(); + // } + } + + @override + void dispose() { + _emailController.dispose(); + _passwordController.dispose(); + _confirmPasswordController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + child: null, + ); + } +} diff --git a/lib/supabase/supabase_client.dart b/lib/supabase/supabase_client.dart deleted file mode 100644 index e136ca7..0000000 --- a/lib/supabase/supabase_client.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:supabase_flutter/supabase_flutter.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; - -Future supabase() async { - await Supabase.initialize( - url: dotenv.env['SUPABASE_URL'], - anonKey: dotenv.env['SUPABASE_ANONKEY'], - ); -} diff --git a/pubspec.lock b/pubspec.lock index c00a1e2..530dc14 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -118,14 +118,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_dotenv: - dependency: "direct main" - description: - name: flutter_dotenv - sha256: b7c7be5cd9f6ef7a78429cabd2774d3c4af50e79cb2b7593e3d5d763ef95c61b - url: "https://pub.dev" - source: hosted - version: "5.2.1" flutter_lints: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 50003af..1b32b67 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,6 @@ dependencies: gap: ^3.0.1 go_router: ^14.6.3 supabase_flutter: ^2.8.3 - flutter_dotenv: ^5.2.1 dev_dependencies: flutter_test: @@ -28,4 +27,4 @@ flutter: uses-material-design: true assets: - - lib/assets + - assets/ph_logo.webp