This commit is contained in:
Patrick Alvin Alcala 2025-01-22 13:14:06 +08:00
parent f1db550ee7
commit b2aeb642cc
11 changed files with 209 additions and 60 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

31
lib/auth/auth_gate.dart Normal file
View file

@ -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();
}
});
}
}

View file

@ -0,0 +1,23 @@
import 'package:supabase_flutter/supabase_flutter.dart';
class AuthService {
final SupabaseClient _supabase = Supabase.instance.client;
Future<AuthResponse> signIn(String email, String password) async {
return await _supabase.auth.signInWithPassword(email: email, password: password);
}
Future<AuthResponse> signUp(String email, String password) async {
return await _supabase.auth.signUp(email: email, password: password);
}
Future<void> signOut() async {
await _supabase.auth.signOut();
}
String? getCurrentUser() {
final session = _supabase.auth.currentSession;
final user = session?.user;
return user?.email;
}
}

View file

@ -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<void> signUp() async {
try {
await supabase.auth.signUp(
email: email,
password: password,
);
// if (mounted) {
// context.showSnackBar('Check your email for a login link!');
// Future<void> 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;
// });
// }
// }
// }

View file

@ -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<void> 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(),
),
],
);

View file

@ -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<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final _authService = AuthService();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
Future<void> _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'))
],
)),
),

View file

@ -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<RegisterPage> {
final _authService = AuthService();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
final _confirmPasswordController = TextEditingController();
Future<void> _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,
);
}
}

View file

@ -1,9 +0,0 @@
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
Future<void> supabase() async {
await Supabase.initialize(
url: dotenv.env['SUPABASE_URL'],
anonKey: dotenv.env['SUPABASE_ANONKEY'],
);
}