add auth skeleton

This commit is contained in:
tk 2025-08-16 22:28:51 +02:00
parent cbc788b33e
commit 9219a04614
3 changed files with 103 additions and 5 deletions

View file

@ -0,0 +1,30 @@
import 'package:google_sign_in/google_sign_in.dart';
class AuthService {
static final _google = GoogleSignIn.instance;
static AuthService? _instance;
AuthService._() {
_google.initialize();
}
factory AuthService() {
if (_instance != null) return _instance!;
_instance = AuthService._();
return _instance!;
}
static Stream<GoogleSignInAuthenticationEvent?> get onUserChanged =>
_google.authenticationEvents;
static Future<GoogleSignInAccount?> signIn() async {
try {
return await _google.authenticate();
} catch (_) {
return null;
}
}
static Future<void> signOut() => _google.disconnect();
}

View file

@ -1,13 +1,31 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:wien_talks_flutter/create_event_screen.dart';
import 'package:wien_talks_flutter/home_screen.dart';
import 'package:wien_talks_flutter/helper/auth_service.dart';
import 'package:wien_talks_flutter/login_page.dart';
import 'package:wien_talks_flutter/news_screen.dart';
final router = GoRouter(
redirect: (context, state) {
final loggedIn = AuthService.user != null;
final atLogin = state.matchedLocation == '/login';
if (!loggedIn && !atLogin) return '/login';
if (loggedIn && atLogin) return '/';
return null;
},
refreshListenable: AuthChangeNotifier(),
routes: [
GoRoute(path: '/login', builder: (c, s) => const LoginScreen()),
GoRoute(path: '/', builder: (c, s) => NewsScreen()),
GoRoute(
path: '/',
builder: (context, state) => HomeScreen(),
),
GoRoute(path: '/create_event', name: 'create_event', builder: (context, state) => CreateEventScreen()),
path: '/create_event',
name: 'create_event',
builder: (c, s) => CreateEventScreen()),
],
);
class AuthChangeNotifier extends ChangeNotifier {
AuthChangeNotifier() {
AuthService.onUserChanged.listen((_) => notifyListeners());
}
}

View file

@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:wien_talks_flutter/helper/auth_service.dart';
class LoginScreen extends StatelessWidget {
const LoginScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xff2193b0), Color(0xff6dd5ed)],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
alignment: Alignment.center,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('Wien Talks',
style: GoogleFonts.poppins(
fontSize: 42,
fontWeight: FontWeight.bold,
color: Colors.white)),
const SizedBox(height: 60),
FilledButton.icon(
onPressed: () async => await AuthService.signIn(),
style: FilledButton.styleFrom(
backgroundColor: Colors.white,
foregroundColor: Colors.black87,
padding:
const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30)),
elevation: 6,
),
icon: Icon(
Icons.lock,
),
label: const Text('Sign in with Google'),
),
],
),
),
);
}
}