Untitled

 avatar
unknown
plain_text
12 days ago
4.1 kB
0
Indexable
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_login_facebook/flutter_login_facebook.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/data/model/social_register_post_model.dart';
import 'package:tamworth/feature/login/presentation/cubit/social_login_cubit.dart';
import 'package:tamworth/feature/login/presentation/cubit/social_register_cubit.dart';

//Reminder : facebookm login only works in production mode
class FacebookSignInService {
  final FacebookLogin _fb = FacebookLogin(debug: true);

  Future<bool> signInWithFacebook(BuildContext context,
      {String page = "LoginPage"}) async {
    try {
      await signOutFromFacebook();
      debugPrint("Starting Facebook login...");

      final isLoggedIn = await _fb.isLoggedIn;
      debugPrint("Is already logged in: $isLoggedIn");

      if (isLoggedIn) {
        await _fb.logOut();
        debugPrint("Logged out existing session");
      }

      final result = await _fb.logIn(permissions: [
        FacebookPermission.publicProfile,
        FacebookPermission.email,
      ]);

      debugPrint("Login result status: ${result.status}");
      debugPrint("Login result error: ${result.error}");

      switch (result.status) {
        case FacebookLoginStatus.success:
          debugPrint("Facebook login succeeded");
          final accessToken = await _fb.accessToken;
          if (accessToken != null && context.mounted) {
            await loginWithFacebookAccount(accessToken, context, page: page);
            return true;
          }
          return false;

        case FacebookLoginStatus.cancel:
          debugPrint("Facebook login cancelled by user");
          return false;

        case FacebookLoginStatus.error:
          debugPrint("Facebook login failed with error: ${result.error}");
          return false;

        default:
          debugPrint("Unexpected login status: ${result.status}");
          return false;
      }
    } catch (error, stackTrace) {
      debugPrint("Error signing in with Facebook: $error");
      debugPrint("Stack trace: $stackTrace");
      return false;
    }
  }

  Future<void> loginWithFacebookAccount(
      FacebookAccessToken accessToken, BuildContext context,
      {String page = "LoginPage"}) async {
    final profile = await _fb.getUserProfile();
    final email = await _fb.getUserEmail();

    // Store user email and name
    if (email != null) {
      GetSetStorage().setEmail(email);
    }
    if (profile?.name != null) {
      GetSetStorage().setUsername(profile!.name!);
    }

    String token;
    String provider;

    if (accessToken.isLimitedLogin == true) {
      token = accessToken.authenticationToken ?? "";
      provider = "facebook_limited";
    } else {
      token = accessToken.token;
      provider = "facebook";
    }

    if (context.mounted) {
      if (page == "LoginPage") {
        final SocialLoginPostModel socialLoginPostModel = SocialLoginPostModel(
          provider: provider,
          token: token,
          deviceToken: GetSetStorage().getFcmToken(),
          deviceType: Platform.isAndroid ? "Android" : "IOS",
        );

        Logger().d(socialLoginPostModel.toMap());

        context.read<SocialLoginCubit>().socialLogin(socialLoginPostModel);
      } else {
        SocialRegisterPostModel socialRegisterPostModel =
            SocialRegisterPostModel(
          provider: provider,
          token: token,
          deviceToken: GetSetStorage().getFcmToken(),
          deviceType: Platform.isAndroid ? "Android" : "IOS",
        );

        Logger().d(socialRegisterPostModel.toMap());

        context
            .read<SocialRegisterCubit>()
            .socialRegister(socialRegisterPostModel);
      }
    }
  }

  Future<void> signOutFromFacebook() async {
    if (await _fb.isLoggedIn) {
      await _fb.logOut();
    }
  }
}
Leave a Comment