Untitled
unknown
plain_text
a year ago
4.1 kB
4
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();
}
}
}
Editor is loading...
Leave a Comment