Untitled

 avatar
unknown
plain_text
6 days ago
2.7 kB
1
Indexable
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:logger/logger.dart';
import 'package:tamworth/core/util/get_storage.dart';
import 'package:tamworth/feature/login/data/model/social_login_post_model.dart';
import 'package:tamworth/feature/login/presentation/cubit/social_login_cubit.dart';

final GoogleSignIn _googleSignIn = GoogleSignIn(
  scopes: ['email'],
);

class GoogleSignInService {
  GoogleSignInAccount? _currentUser;

  GoogleSignInAccount? get currentUser => _currentUser;

  // Method to initialize Google Sign-In
  Future<void> initializeGoogleSignIn(
      {required Function(GoogleSignInAccount?) onUserChanged,
      required BuildContext context}) async {
    _googleSignIn.onCurrentUserChanged
        .listen((GoogleSignInAccount? account) async {
      if (!kIsWeb && account != null) {
        bool isAuthorized = await _googleSignIn.canAccessScopes(['email']);
        if (!isAuthorized) {
          await _googleSignIn.disconnect();
        }
      }
      _currentUser = account;
      onUserChanged(account);
    });
  }

  Future<bool> signInWithGoogle(BuildContext context) async {
    try {
      await signOutFromGoogle();
      final account = await _googleSignIn.signIn();
      if (account != null && context.mounted) {
        await loginWithGoogleAccount(account, context);
        return true;
      }
      return false;
    } catch (error) {
      debugPrint("Error signing in with Google: $error");
      return false;
    }
  }

  Future<void> signOutFromGoogle() async {
    if (_currentUser != null) {
      await _googleSignIn.disconnect();
    }
  }

  Future<void> loginWithGoogleAccount(
      GoogleSignInAccount account, BuildContext context) async {
    GetSetStorage().setEmail(account.email);
    GetSetStorage().setUsername(account.displayName ?? '');

    final String? idToken = (await account.authentication).accessToken;
    if (idToken != null) {
      final SocialLoginPostModel socialLoginPostModel = SocialLoginPostModel(
        provider: "google",
        token: idToken, // Use idToken instead of serverAuthCode
        deviceToken: GetSetStorage().getFcmToken(),
        deviceType: Platform.isAndroid
            ? "Android"
            : Platform.isIOS
                ? "IOS"
                : "",
      );

      Logger().d(socialLoginPostModel.toMap());
      if (context.mounted) {
        context.read<SocialLoginCubit>().socialLogin(socialLoginPostModel);
        _googleSignIn.signOut();
      }
    } else {
      debugPrint('Error: idToken is null');
    }
  }
}
Leave a Comment