Autologin implemented

This commit is contained in:
SomnusVeritas
2023-10-20 19:17:08 +02:00
parent c55c96c8b8
commit cf87614005
3 changed files with 69 additions and 12 deletions

View File

@@ -1,10 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:maggs_victory_voyage/services/db_helper.dart'; import 'package:maggs_victory_voyage/services/db_helper.dart';
import 'pages/login_page.dart';
import 'pages/splash_page.dart'; import 'pages/splash_page.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized();
await DbHelper.init(); await DbHelper.init();
runApp(const Application()); runApp(const Application());
} }

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:maggs_victory_voyage/services/db_helper.dart';
import 'login_page.dart'; import 'login_page.dart';
@@ -10,8 +11,38 @@ class SplashPage extends StatefulWidget {
} }
class _SplashPageState extends State<SplashPage> { class _SplashPageState extends State<SplashPage> {
late final Future<bool> loginFuture;
@override
void initState() {
super.initState();
loginFuture = DbHelper.autoLogin();
DbHelper.authEventStream.listen((event) => setState(() {}));
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: loginFuture,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (DbHelper.currentUser == null) {
return const LoginPage(); return const LoginPage();
} }
return const Column(
children: [
Text('Logged in!'),
TextButton(
onPressed: DbHelper.logout,
child: Text('Log out'),
),
],
);
}
return const Center(child: CircularProgressIndicator());
},
),
);
}
} }

View File

@@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:supabase_flutter/supabase_flutter.dart';
@@ -7,6 +8,11 @@ class DbHelper {
static final _supabase = Supabase.instance.client; static final _supabase = Supabase.instance.client;
static User? get currentUser => _supabase.auth.currentUser;
static Stream<AuthState> get authEventStream =>
_supabase.auth.onAuthStateChange;
static Future<void> init() async { static Future<void> init() async {
await Supabase.initialize( await Supabase.initialize(
url: 'https://vhmrtvhcmvylhrhblyjb.supabase.co', url: 'https://vhmrtvhcmvylhrhblyjb.supabase.co',
@@ -17,22 +23,43 @@ class DbHelper {
static void login(String username) async { static void login(String username) async {
final prefs = await _prefs; final prefs = await _prefs;
final String? savedUsername = prefs.getString('username');
if (savedUsername == null) { try {
await _supabase.auth.signInWithPassword(
email: '$username@skup.in',
password: 'password',
);
await prefs.setString('username', username);
} on AuthException catch (e) {
await _supabase.auth.signUp(
email: '$username@skup.in',
password: 'password',
data: {'username': username});
await prefs.setString('username', username); await prefs.setString('username', username);
// TODO create new account
} else if (savedUsername == username) {
// TODO log into database
} else {
// TODO wrong username
} }
} }
static Future<bool> autoLogin() async {
final prefs = await _prefs;
final String? username = prefs.getString('username');
if (username == null) return false;
try {
await _supabase.auth.signInWithPassword(
email: '$username@skup.in',
password: 'password',
);
return true;
} on AuthException catch (e) {
if (kDebugMode) {
print('Could\'t automaticall log in.\n${e.message}');
}
}
return false;
}
static void logout() async { static void logout() async {
final prefs = await _prefs; final prefs = await _prefs;
bool success = await prefs.remove('username'); bool success = await prefs.remove('username');
_supabase.auth.signOut();
//TODO log out on database
} }
} }