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: ['email', 'profile'], ); static Future 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 logout(BuildContext context) async { await _googleSignIn.signOut(); _currentUser = null; Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (_) => const LoginPage()), (route) => false); accessToken = null; } static Future 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; } }