Insparkspokalen-ui/lib/services/googleAuthService.dart
2025-05-29 15:44:23 +02:00

111 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:http/http.dart' as http;
import 'package:insparkspokalen_ui/login/loginPage.dart';
import 'package:insparkspokalen_ui/services/backend/teamService.dart';
import 'package:insparkspokalen_ui/teams/teamPage.dart';
import 'package:provider/provider.dart';
import '../homeFeed/admin/adminHomePage.dart';
import '../homeFeed/usersHomeScreen/userHomePage.dart';
import 'backend/userService.dart';
import 'package:insparkspokalen_ui/models/userModel.dart';
/// För att kräva login gör såhär:
/// Lägg till detta paket i klassen ->
/// import 'package:insparkspokalen_ui/services/googleAuthService.dart';
///
/// Sedan lägg till följande för alla knappar som kräver att användaren är inloggad ->
/// onPressed:() async {
/// final isAuthenticated = await GoogleAuthService.ensureLoggedIn(context);
/// if (!isAuthenticated) return;
/// },
/// Kör appen med detta kommando då vår konsol endast släpper in redirects från port 8080 via webben för tillfället
/// ----> flutter run -d chrome --web-port=8080 <----
class GoogleAuthService {
static final GoogleAuthService _instance = GoogleAuthService._internal();
factory GoogleAuthService() => _instance;
GoogleAuthService._internal();
static UserModel? _currentUser;
static UserModel? get currentUser => _currentUser;
// static final TeamUserSyncService _syncService = TeamUserSyncService();
static String? accessToken;
static final GoogleSignIn _googleSignIn = GoogleSignIn(
clientId: '278095802777-40qt28sou07o3qb58pcoccl0eolas3k0.apps.googleusercontent.com',
scopes: <String>['email', 'profile'],
);
static Future<void> signInWithGoogle(BuildContext context) async {
try {
final account = await _googleSignIn.signIn();
if (account == null) return;
final auth = await account.authentication;
accessToken = auth.accessToken;
if (accessToken == null) {
print("Missing access token.");
return;
}
final userService = UserService(); // Initialize user service
await userService.createOrFetchUser(account); // Create new user or fetch existing user from backend
final email = account.email;
final user = UserService().getUserByEmail(email);
setCurrentUser(await user);
final userRole = await UserService.getUserRole(email);
//Tar dig till admin eller user sidan baserat på roll, om lag saknas tas du till Jointeam page
if (userRole == 'ADMIN') { // Role = ADMIN
Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => const AdminHomePage()));
}else{ // Role = USER
bool userInTeam = await userService.userInTeam(email);
if (userInTeam) { // user has a team -> push userhomepage
Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => const UserHomePage()));
} else { // user is not in a team -> push jointeam page
Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => const TeamPage()));
}
}
} catch (e) {
print("Google Sign-In failed: $e");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Sign in failed. Please try again.')),
);
}
}
static Future<void> logout(BuildContext context) async {
await _googleSignIn.signOut();
_currentUser = null;
Navigator.pushAndRemoveUntil(context,
MaterialPageRoute(builder: (_) => const LoginPage()), (route) => false);
accessToken = null;
}
static Future<bool> ensureLoggedIn(BuildContext context) async {
if (!isLoggedIn()) {
await signInWithGoogle(context);
}
return isLoggedIn();
}
static bool isLoggedIn() => accessToken != null;
// static GoogleSignInAccount? getCurrentGoogleAccount() {
// return _googleSignIn.currentUser;
// }
//
static UserModel? getCurrentUser() {
return _currentUser;
}
// Set current user and sync with TeamUserSyncService
static void setCurrentUser(UserModel user) {
_currentUser = user;
}
}