25-10-2/1
This commit is contained in:
@@ -1,204 +1,149 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:Intaleq/constant/box_name.dart';
|
||||
import 'package:Intaleq/controller/auth/login_controller.dart';
|
||||
import 'package:Intaleq/controller/functions/encrypt_decrypt.dart';
|
||||
import 'package:Intaleq/main.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:google_sign_in/google_sign_in.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
import '../../constant/box_name.dart';
|
||||
import '../../constant/links.dart';
|
||||
import '../../onbording_page.dart';
|
||||
import '../../print.dart';
|
||||
import '../../main.dart';
|
||||
import '../functions/crud.dart';
|
||||
import '../../onbording_page.dart';
|
||||
import 'login_controller.dart';
|
||||
|
||||
class GoogleSignInHelper {
|
||||
static final GoogleSignIn _googleSignIn = GoogleSignIn(
|
||||
scopes: [
|
||||
'email',
|
||||
'profile',
|
||||
],
|
||||
);
|
||||
// ✅ GoogleSignIn singleton
|
||||
static final GoogleSignIn _signIn = GoogleSignIn.instance;
|
||||
|
||||
// Method to handle Google Sign-In
|
||||
static GoogleSignInAccount? _lastUser;
|
||||
|
||||
/// 👇 استدعها في main() مرة واحدة
|
||||
static Future<void> init() async {
|
||||
await _signIn.initialize(
|
||||
serverClientId:
|
||||
'594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com',
|
||||
);
|
||||
|
||||
// Events listener
|
||||
_signIn.authenticationEvents.listen((event) async {
|
||||
if (event is GoogleSignInAuthenticationEventSignIn) {
|
||||
_lastUser = event.user;
|
||||
await _handleSignUp(event.user);
|
||||
} else if (event is GoogleSignInAuthenticationEventSignOut) {
|
||||
_lastUser = null;
|
||||
}
|
||||
});
|
||||
|
||||
// silent login if possible
|
||||
try {
|
||||
await _signIn.attemptLightweightAuthentication();
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
/// ✅ تسجيل دخول عادي
|
||||
static Future<GoogleSignInAccount?> signIn() async {
|
||||
try {
|
||||
final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
|
||||
if (googleUser != null) {
|
||||
await _handleSignUp(googleUser);
|
||||
// if (box.read(BoxName.countryCode) == 'Egypt') {
|
||||
// Get.to(() => EgyptCardAI());
|
||||
// } else if (box.read(BoxName.countryCode) == 'Jordan') {
|
||||
// Get.to(() => AiPage());
|
||||
// }
|
||||
final user =
|
||||
await _signIn.authenticate(scopeHint: const ['email', 'profile']);
|
||||
if (user != null) {
|
||||
_lastUser = user;
|
||||
await _handleSignUp(user);
|
||||
|
||||
// اطبع القيم (للتأكد)
|
||||
print("Google ID: ${user.id}");
|
||||
print("Email: ${user.email}");
|
||||
print("Name: ${user.displayName}");
|
||||
print("Photo: ${user.photoUrl}");
|
||||
}
|
||||
return googleUser;
|
||||
} catch (error) {
|
||||
return user;
|
||||
} on PlatformException catch (e) {
|
||||
if (e.code == 'sign_in_required') {
|
||||
await showGooglePlayServicesError();
|
||||
}
|
||||
return null;
|
||||
} catch (e) {
|
||||
await addError("Google Sign-In error: $e", "signIn()");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Future<GoogleSignInAccount?> signInFromLogin() async {
|
||||
try {
|
||||
final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
|
||||
if (googleUser != null) {
|
||||
await _handleSignUp(googleUser);
|
||||
await Get.put(LoginController()).loginUsingCredentials(
|
||||
box.read(BoxName.passengerID).toString(),
|
||||
box.read(BoxName.email).toString(),
|
||||
);
|
||||
}
|
||||
return googleUser;
|
||||
} catch (error) {
|
||||
// if (error is GoogleSignInAuthenticationException) {
|
||||
// // Handle authentication errors from Google Sign-In
|
||||
// addError("Google sign-in authentication error: ${error.message}",
|
||||
// '<GoogleSignInAccount?> signInFromLogin()');
|
||||
// } else if (error is GoogleSignInAccountNotFoundException) {
|
||||
// // Handle the case where the user is not found (if applicable)
|
||||
// addError("Google sign-in account not found error: ${error.message}",
|
||||
// '<GoogleSignInAccount?> signInFromLogin()');
|
||||
// }
|
||||
// else
|
||||
if (error is SocketException) {
|
||||
// Handle network issues, like SSL certificate issues
|
||||
addError("Network error (SSL certificate issue): ${error.message}",
|
||||
'<GoogleSignInAccount?> signInFromLogin()');
|
||||
} else if (error is PlatformException) {
|
||||
// Handle platform-specific errors, like Google Play Services issues
|
||||
if (error.code == 'sign_in_required') {
|
||||
// Google Play Services are required but not installed or outdated
|
||||
showGooglePlayServicesError();
|
||||
} else {
|
||||
addError("Platform error: ${error.message}",
|
||||
'<GoogleSignInAccount?> signInFromLogin()');
|
||||
}
|
||||
} else {
|
||||
// Catch all other unknown errors
|
||||
addError("Unknown error: ${error.toString()}",
|
||||
'<GoogleSignInAccount?> signInFromLogin()');
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
void showGooglePlayServicesError() async {
|
||||
const playStoreUrl =
|
||||
'https://play.google.com/store/apps/details?id=com.google.android.gms&hl=en_US';
|
||||
|
||||
if (await canLaunchUrl(Uri.parse(playStoreUrl))) {
|
||||
await launchUrl(Uri.parse(playStoreUrl));
|
||||
} else {
|
||||
// Fallback if the URL can't be opened
|
||||
showDialog(
|
||||
context: Get.context!,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text('Error'.tr),
|
||||
content: Text(
|
||||
'Could not open the Google Play Store. Please update Google Play Services manually.'
|
||||
.tr),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: Text('Close'.tr),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
/// ✅ تسجيل دخول مخصص لشاشة Login (مع استدعاء الكنترولر)
|
||||
static Future<GoogleSignInAccount?> signInFromLogin() async {
|
||||
await init();
|
||||
final user = await signIn();
|
||||
if (user != null) {
|
||||
await Get.put(LoginController()).loginUsingCredentials(
|
||||
box.read(BoxName.passengerID).toString(),
|
||||
box.read(BoxName.email).toString(),
|
||||
);
|
||||
}
|
||||
return user;
|
||||
}
|
||||
|
||||
// Future<GoogleSignInAccount?> signInFromLogin() async {
|
||||
// try {
|
||||
// final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
|
||||
// if (googleUser != null) {
|
||||
// await _handleSignUp(googleUser);
|
||||
// // if (box.read(BoxName.countryCode) == 'Egypt') {
|
||||
// await Get.put(LoginController()).loginUsingCredentials(
|
||||
// box.read(BoxName.passengerID).toString(),
|
||||
// box.read(BoxName.email).toString(),
|
||||
// );
|
||||
// // } else if (box.read(BoxName.countryCode) == 'Jordan') {
|
||||
// // // Get.to(() => AiPage());
|
||||
// // }
|
||||
// }
|
||||
// return googleUser;
|
||||
// } catch (error) {
|
||||
// addError(error.toString(), '<GoogleSignInAccount?> signInFromLogin()');
|
||||
// return null;
|
||||
// }
|
||||
// }
|
||||
/// ✅ طلب سكوبات إضافية (بديل withScopes القديم)
|
||||
static Future<void> requestExtraScopes(List<String> scopes) async {
|
||||
final user = _lastUser;
|
||||
if (user == null) return;
|
||||
await user.authorizationClient.authorizeScopes(scopes);
|
||||
}
|
||||
|
||||
addError(String error, where) async {
|
||||
CRUD().post(link: AppLink.addError, payload: {
|
||||
'error': error.toString(), // Example error description
|
||||
'userId': box.read(BoxName.driverID) ??
|
||||
box.read(BoxName.passengerID), // Example user ID
|
||||
'userType': box.read(BoxName.driverID) != null
|
||||
? 'Driver'
|
||||
: 'passenger', // Example user type
|
||||
'phone': box.read(BoxName.phone) ??
|
||||
box.read(BoxName.phoneDriver), // Example phone number
|
||||
/// ✅ تسجيل خروج
|
||||
static Future<void> signOut() async {
|
||||
await _signIn.signOut();
|
||||
await _handleSignOut();
|
||||
}
|
||||
|
||||
'device': where
|
||||
static GoogleSignInAccount? getCurrentUser() => _lastUser;
|
||||
|
||||
// ================= Helpers ==================
|
||||
|
||||
static Future<void> _handleSignUp(GoogleSignInAccount user) async {
|
||||
box.write(BoxName.passengerID, user.id);
|
||||
box.write(BoxName.email, user.email);
|
||||
box.write(BoxName.name, user.displayName ?? '');
|
||||
box.write(BoxName.passengerPhotoUrl, user.photoUrl ?? '');
|
||||
}
|
||||
|
||||
static Future<void> _handleSignOut() async {
|
||||
box.erase();
|
||||
|
||||
Get.offAll(OnBoardingPage());
|
||||
}
|
||||
|
||||
static Future<void> addError(String error, String where) async {
|
||||
await CRUD().post(link: AppLink.addError, payload: {
|
||||
'error': error,
|
||||
'userId': box.read(BoxName.driverID) ?? box.read(BoxName.passengerID),
|
||||
'userType': box.read(BoxName.driverID) != null ? 'Driver' : 'Passenger',
|
||||
'phone': box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver),
|
||||
'device': where,
|
||||
});
|
||||
}
|
||||
|
||||
// Method to handle Google Sign-Out
|
||||
static Future<void> signOut() async {
|
||||
try {
|
||||
await _googleSignIn.signOut();
|
||||
await _handleSignOut();
|
||||
} catch (error) {}
|
||||
}
|
||||
|
||||
// Method to get the current signed-in user
|
||||
static GoogleSignInAccount? getCurrentUser() {
|
||||
return _googleSignIn.currentUser;
|
||||
}
|
||||
|
||||
// Method to handle sign-up process
|
||||
static Future<void> _handleSignUp(GoogleSignInAccount user) async {
|
||||
// Store driver information
|
||||
|
||||
box.write(BoxName.passengerID, user.id);
|
||||
box.write(BoxName.email, (user.email));
|
||||
box.write(BoxName.name, (user.displayName.toString()));
|
||||
box.write(BoxName.passengerPhotoUrl, (user.photoUrl.toString()));
|
||||
|
||||
// Perform any additional sign-up tasks or API calls here
|
||||
// For example, you can send the user data to your server for registration
|
||||
}
|
||||
|
||||
// Method to handle sign-out process
|
||||
static Future<void> _handleSignOut() async {
|
||||
// Clear stored driver information
|
||||
box.erase();
|
||||
// box.remove(BoxName.passengerPhotoUrl);
|
||||
// box.remove(BoxName.driverID);
|
||||
// box.remove(BoxName.email);
|
||||
// box.remove(BoxName.lang);
|
||||
// box.remove(BoxName.name);
|
||||
// box.remove(BoxName.passengerID);
|
||||
// box.remove(BoxName.phone);
|
||||
// box.remove(BoxName.tokenFCM);
|
||||
// box.remove(BoxName.tokens);
|
||||
// box.remove(BoxName.addHome);
|
||||
// box.remove(BoxName.addWork);
|
||||
// box.remove(BoxName.agreeTerms);
|
||||
// box.remove(BoxName.apiKeyRun);
|
||||
// box.remove(BoxName.countryCode);
|
||||
// box.remove(BoxName.accountIdStripeConnect);
|
||||
// box.remove(BoxName.passengerWalletTotal);
|
||||
// box.remove(BoxName.isVerified);
|
||||
// box.remove(BoxName.firstTimeLoadKey);
|
||||
Get.offAll(() => OnBoardingPage());
|
||||
// Perform any additional sign-out tasks or API calls here
|
||||
// For example, you can notify your server about the user sign-out
|
||||
static Future<void> showGooglePlayServicesError() async {
|
||||
const playStoreUrl =
|
||||
'https://play.google.com/store/apps/details?id=com.google.android.gms&hl=en_US';
|
||||
final uri = Uri.parse(playStoreUrl);
|
||||
if (await canLaunchUrl(uri)) {
|
||||
await launchUrl(uri);
|
||||
} else {
|
||||
showDialog(
|
||||
context: Get.context!,
|
||||
builder: (context) => AlertDialog(
|
||||
title: Text('Error'.tr),
|
||||
content: Text(
|
||||
'Could not open the Google Play Store. Please update Google Play Services manually.'
|
||||
.tr,
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: Text('Close'.tr),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user