111 lines
4.1 KiB
Dart
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;
|
|
}
|
|
|
|
} |