Untitled

 avatar
user_2803349
plain_text
5 months ago
21 kB
1
Indexable
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:mighty_delivery/extensions/extension_util/int_extensions.dart';
import 'package:mighty_delivery/extensions/extension_util/string_extensions.dart';
import 'package:mighty_delivery/extensions/extension_util/widget_extensions.dart';
import 'package:mighty_delivery/main/screens/VerificationListScreen.dart';
import 'package:store_checker/store_checker.dart' as src;
import 'package:store_checker/store_checker.dart';
import 'package:the_apple_sign_in/the_apple_sign_in.dart';

import '../../delivery/fragment/DHomeFragment.dart';
import '../../extensions/common.dart';
import '../../extensions/extension_util/device_extensions.dart';
import '../../extensions/shared_pref.dart';
import '../../extensions/system_utils.dart';
import '../../main.dart';
import '../../user/screens/DashboardScreen.dart';
import '../models/CityListModel.dart';
import '../models/LoginResponse.dart';
import '../network/RestApis.dart';
import '../screens/EditProfileScreen.dart';
import '../screens/UserCitySelectScreen.dart';
import '../utils/Common.dart';
import '../utils/Constants.dart';

final FirebaseAuth _auth = FirebaseAuth.instance;

class AuthServices {
  Future<void> updateUserData(UserData user) async {
    userService.updateDocument({
      'player_id': getStringAsync(PLAYER_ID),
      'updatedAt': Timestamp.now(),
    }, user.uid);
  }

  Future<User?> createAuthUser(String? email, String? password) async {
    User? userCredential;
    try {
      await _auth.createUserWithEmailAndPassword(email: email!, password: password!).then((value) {
        userCredential = value.user!;
      });
    } on FirebaseException catch (error) {
      if (error.code == "ERROR_EMAIL_ALREADY_IN_USE" ||
          error.code == "account-exists-with-different-credential" ||
          error.code == "email-already-in-use") {
        try {
          await _auth.signInWithEmailAndPassword(email: email!, password: password!).then((value) {
            userCredential = value.user!;
          });
        } on FirebaseException catch (error) {
          print("on FirebaseException catch (error)");
          toast(getMessageFromErrorCode(error));
        }
      } else {
        toast(getMessageFromErrorCode(error));
      }
    }
    return userCredential;
  }

  Future<void> signUpWithEmailPassword(context,
      {String? name,
      String? email,
      String? password,
      LoginResponse? userData,
      String? mobileNumber,
      String? lName,
      String? userName,
      bool? isOTP,
      String? userType,
      bool isAddUser = false}) async {
    try {
      createAuthUser(email, password).then((user) async {
        if (user != null) {
          UserData userModel = UserData();

          /// Create user
          userModel.uid = user.uid;
          userModel.email = user.email;
          userModel.contactNumber = userData!.data!.contactNumber;
          userModel.name = userData.data!.name;
          userModel.username = userData.data!.username;
          userModel.userType = userData.data!.userType;
          userModel.longitude = userData.data!.longitude;
          userModel.latitude = userData.data!.longitude;
          userModel.countryName = userData.data!.countryName;
          userModel.cityName = userData.data!.cityName;
          userModel.status = userData.data!.status;
          userModel.playerId = userData.data!.playerId;
          userModel.profileImage = userData.data!.profileImage;
          userModel.createdAt = Timestamp.now().toDate().toString();
          userModel.updatedAt = Timestamp.now().toDate().toString();
          userModel.playerId = getStringAsync(PLAYER_ID);

          await userService.addDocumentWithCustomId(user.uid, userModel.toJson()).then((value) async {
            Map request = {"email": userModel.email, "password": password};
            await logInApi(request).then((res) async {
              await setValue(USER_TOKEN, res.data!.apiToken.validate());
              await signInWithEmailPassword(context, email: email.validate(), password: password.validate())
                  .then((value) {
                updateUserStatus({
                  "id": getIntAsync(USER_ID),
                  "uid": getStringAsync(UID),
                }).then((value) {
                  log("value...." + value.toString());
                });
                appStore.setLoading(false);
                updateStoreCheckerData().then((source) async {
                  await getUserDetail(getIntAsync(USER_ID)).then((value) async {
                    if (value.app_source.isEmptyOrNull || value.app_source != source) {
                      await updateUserStatus({"id": getIntAsync(USER_ID), "app_source": source}).then((data) {});
                    }
                  }).catchError((e) {
                    log(e);
                  });
                });
                if (res.data!.emailVerifiedAt.isEmptyOrNull ||
                    res.data!.otpVerifyAt.isEmptyOrNull ||
                    (res.data!.documentVerifiedAt.isEmptyOrNull && getStringAsync(USER_TYPE) == DELIVERY_MAN)) {
                  VerificationListScreen().launch(context);
                } else {
                  UserCitySelectScreen().launch(context, isNewTask: true, pageRouteAnimation: PageRouteAnimation.Slide);
                }
              });
            }).catchError((e) {
              appStore.setLoading(false);
              log(e.toString());
              toast(e.toString());
            });
            // }
          }).catchError((e) {
            appStore.setLoading(false);
            toast(e.toString());
          });
        } else {
          appStore.setLoading(false);
          throw language.errorSomethingWentWrong;
        }
      }).catchError((e) {
        appStore.setLoading(false);
      });
    } on FirebaseException catch (error) {
      appStore.setLoading(false);
      toast(getMessageFromErrorCode(error));
    }
  }

  Future<void> registerUserWithDB(String email, String password, LoginResponse value) async {
    try {
      createAuthUser(email, password).then((user) async {
        if (user != null) {
          UserData userModel = UserData();
          userModel.email = value.data!.email;
          userModel.contactNumber = value.data!.contactNumber;
          userModel.name = value.data!.name;
          userModel.username = value.data!.username;
          userModel.userType = value.data!.userType;
          userModel.longitude = value.data!.longitude;
          userModel.latitude = value.data!.longitude;
          userModel.countryName = value.data!.countryName;
          userModel.cityName = value.data!.cityName;
          userModel.status = value.data!.status;
          userModel.playerId = value.data!.playerId;
          userModel.profileImage = value.data!.profileImage;
          userModel.createdAt = Timestamp.now().toDate().toString();
          userModel.updatedAt = Timestamp.now().toDate().toString();
          userModel.playerId = getStringAsync(PLAYER_ID);
          await userService.addDocumentWithCustomId(user.uid, userModel.toJson()).then((val) async {
            await setValue(UID, user.uid.validate());
            await updateUid(user.uid.validate()).catchError((error) {});
          }).catchError((e) {
            appStore.setLoading(false);
            toast(e.toString());
          });
        } else {
          appStore.setLoading(false);
          throw language.errorSomethingWentWrong;
        }
      }).catchError((e) {
        appStore.setLoading(false);
      });
    } on FirebaseException catch (error) {
      appStore.setLoading(false);
      toast(getMessageFromErrorCode(error));
    }
  }

  Future<void> signInWithEmailPassword(context, {required String email, required String password}) async {
    await _auth.signInWithEmailAndPassword(email: email, password: password).then((value) async {
      appStore.setLoading(true);
      final User user = value.user!;
      UserData userModel = await userService.getUser(email: user.email);
      await updateUserData(userModel);

      appStore.setLoading(true);
      //Login Details to SharedPreferences
      setValue(UID, userModel.uid.validate());

      setValue(USER_EMAIL, userModel.email.validate());
      setValue(IS_LOGGED_IN, true);
    }).catchError((e) {
      log(e.toString());
    });
  }

  Future<void> loginFromFirebaseUser(User currentUser,
      {LoginResponse? loginDetail, String? fullName, String? fName, String? lName}) async {
    UserData userModel = UserData();

    if (await userService.isUserExist(loginDetail!.data!.email)) {
      ///Return user data
      await userService.userByEmail(loginDetail.data!.email).then((user) async {
        userModel = user;
        appStore.setUserEmail(userModel.email.validate());
        appStore.setUId(userModel.uid.validate());

        await updateUserData(user);
      }).catchError((e) {
        log(e);
        throw e;
      });
    } else {
      /// Create user
      userModel.uid = currentUser.uid.validate();
      userModel.id = loginDetail.data!.id.validate();
      userModel.email = loginDetail.data!.email.validate();
      userModel.name = loginDetail.data!.name.validate();
      userModel.contactNumber = loginDetail.data!.contactNumber.validate();
      userModel.username = loginDetail.data!.username.validate();
      userModel.email = loginDetail.data!.email.validate();
      userModel.userType = CLIENT;

      if (isIOS) {
        userModel.username = fullName;
      } else {
        userModel.username = loginDetail.data!.username.validate();
      }

      userModel.contactNumber = loginDetail.data!.contactNumber.validate();
      userModel.profileImage = loginDetail.data!.profileImage.validate();
      userModel.playerId = getStringAsync(PLAYER_ID);

      setValue(UID, currentUser.uid.validate());
      log(getStringAsync(UID));
      setValue(USER_EMAIL, userModel.email.validate());
      setValue(IS_LOGGED_IN, true);

      log(userModel.toJson());

      await userService.addDocumentWithCustomId(currentUser.uid, userModel.toJson()).then((value) {
        //
      }).catchError((e) {
        throw e;
      });
    }
  }

  Future<void> loginFromFirebase(User currentUser, String loginType, String? accessToken,
      {String userType = CLIENT}) async {
    String firstName = '';
    String lastName = '';
    if (loginType == LoginTypeGoogle) {
      if (currentUser.displayName.validate().split(' ').length >= 1)
        firstName = currentUser.displayName.splitBefore(' ');
      if (currentUser.displayName.validate().split(' ').length >= 2) lastName = currentUser.displayName.splitAfter(' ');
    } else {
      firstName = getStringAsync('appleGivenName').validate();
      lastName = getStringAsync('appleFamilyName').validate();
    }

    Map req = {
      "email": currentUser.email,
      "username": currentUser.email,
      "name": firstName,
      "login_type": loginType,
      "user_type": userType,
      "accessToken": accessToken,
      if (!currentUser.phoneNumber.isEmptyOrNull) 'contact_number': currentUser.phoneNumber.validate(),
    };

    await logInApi(req, isSocialLogin: true).then((value) async {
      //  Navigator.pop(getContext);

      UserData userModel = UserData();

      /// Create user
      userModel.uid = currentUser.uid;
      userModel.email = value.data!.email;
      userModel.contactNumber = value.data!.contactNumber;
      userModel.name = value.data!.name;
      userModel.username = value.data!.username;
      userModel.userType = value.data!.userType;
      userModel.longitude = value.data!.longitude;
      userModel.latitude = value.data!.longitude;
      userModel.countryName = value.data!.countryName;
      userModel.cityName = value.data!.cityName;
      userModel.status = value.data!.status;
      userModel.playerId = value.data!.playerId;
      userModel.profileImage = value.data!.profileImage;
      userModel.createdAt = Timestamp.now().toDate().toString();
      userModel.updatedAt = Timestamp.now().toDate().toString();
      userModel.playerId = getStringAsync(PLAYER_ID);
      await userService.addDocumentWithCustomId(currentUser.uid, userModel.toJson()).then((v) async {
        await setValue(USER_PROFILE_PHOTO, currentUser.photoURL.toString());
        if (value.data!.contactNumber.isEmptyOrNull) {
          EditProfileScreen(isGoogle: true).launch(getContext, isNewTask: true);
        } else {
          if (value.data!.countryId != null && value.data!.cityId != null) {
            await getCountryDetailApiCall(value.data!.countryId.validate());
            getCityDetailApiCall(value.data!.cityId.validate());
          } else {
            UserCitySelectScreen().launch(getContext, isNewTask: true, pageRouteAnimation: PageRouteAnimation.Slide);
          }
          if (value.data!.uid.isEmptyOrNull) await updateUid(getStringAsync(UID)).catchError((error) {});
          if (value.data!.playerId.isEmptyOrNull) await updatePlayerId().catchError((error) {});
        }
        updateStoreCheckerData().then((source) async {
          await getUserDetail(getIntAsync(USER_ID)).then((value) async {
            if (value.app_source.isEmptyOrNull || value.app_source != source) {
              await updateUserStatus({"id": getIntAsync(USER_ID), "app_source": source}).then((data) {});
            }
          }).catchError((e) {
            log(e);
          });
        });
      }).catchError((e) {
        appStore.setLoading(false);
        toast(e.toString());
      });
    }).catchError((e) {
      log(e.toString());
      throw e;
    });
  }

  Future<void> signInWithGoogle({String userType = CLIENT}) async {
    final GoogleSignIn googleSignIn = GoogleSignIn();
    GoogleSignInAccount? googleSignInAccount = await googleSignIn.signIn();

    if (googleSignInAccount != null) {
      //Authentication
      final GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication;

      final AuthCredential credential = GoogleAuthProvider.credential(
        accessToken: googleSignInAuthentication.accessToken,
        idToken: googleSignInAuthentication.idToken,
      );

      final UserCredential authResult = await _auth.signInWithCredential(credential);
      final User user = authResult.user!;

      assert(!user.isAnonymous);

      final User currentUser = _auth.currentUser!;
      print("data" + user.uid.toString());
      setValue(UID, currentUser.uid);
      assert(user.uid == currentUser.uid);

      googleSignIn.signOut();

      await loginFromFirebase(user, LoginTypeGoogle, googleSignInAuthentication.accessToken, userType: userType);
    } else {
      throw language.errorSomethingWentWrong;
    }
  }

  /// Sign-In with Apple.
  Future<void> appleLogIn(String? userType) async {
    if (await TheAppleSignIn.isAvailable()) {
      AuthorizationResult result = await TheAppleSignIn.performRequests(
        [
          AppleIdRequest(requestedScopes: [Scope.email, Scope.fullName])
        ],
      );
      switch (result.status) {
        case AuthorizationStatus.authorized:
          final appleIdCredential = result.credential!;
          final oAuthProvider = OAuthProvider('apple.com');
          final credential = oAuthProvider.credential(
            idToken: String.fromCharCodes(appleIdCredential.identityToken!),
            accessToken: String.fromCharCodes(appleIdCredential.authorizationCode!),
          );
          final authResult = await _auth.signInWithCredential(credential);
          final user = authResult.user!;

          if (result.credential!.email != null) {
            await saveAppleData(result);
          }

          await loginFromFirebase(user, LoginTypeApple, String.fromCharCodes(appleIdCredential.authorizationCode!),
              userType: userType.validate());
          break;
        case AuthorizationStatus.error:
          throw ("${language.signInFailed} ${result.error!.localizedDescription}");
        case AuthorizationStatus.cancelled:
          throw (language.cancelled);
      }
    } else {
      throw (language.appleSignInNotAvailableError);
    }
  }

  Future<void> saveAppleData(AuthorizationResult result) async {
    await setValue('appleEmail', result.credential!.email.validate());
    await setValue('appleGivenName', result.credential!.fullName!.givenName.validate());
    await setValue('appleFamilyName', result.credential!.fullName!.familyName.validate());
  }
}

getCountryDetailApiCall(int countryId) async {
  await getCountryDetail(countryId).then((value) {
    setValue(COUNTRY_DATA, value.data!.toJson());
  }).catchError((error) {});
}

getCityDetailApiCall(int cityId) async {
  await getCityDetail(cityId).then((value) async {
    await setValue(CITY_DATA, value.data!.toJson());
    if (CityModel.fromJson(getJSONAsync(CITY_DATA)).name.validate().isNotEmpty) {
      if (getBoolAsync(OTP_VERIFIED) &&
          getBoolAsync(EMAIL_VERIFIED) &&
          (getBoolAsync(IS_VERIFIED_DELIVERY_MAN) || getStringAsync(USER_TYPE) == CLIENT)) {
        if (getStringAsync(USER_TYPE) == CLIENT) {
          DashboardScreen().launch(getContext, isNewTask: true);
        } else {
          // DeliveryDashBoard().launch(getContext, isNewTask: true);
          DHomeFragment().launch(getContext, isNewTask: true);
        }
      } else {
        VerificationListScreen().launch(getContext, isNewTask: true);
        // VerificationScreen().launch(getContext, isNewTask: true);
      }
    } else {
      UserCitySelectScreen().launch(getContext, isNewTask: true);
    }
  }).catchError((error) {
    if (error.toString() == CITY_NOT_FOUND_EXCEPTION) {
      UserCitySelectScreen().launch(getContext, isNewTask: true, pageRouteAnimation: PageRouteAnimation.Slide);
    }
  });
}

Future deleteUserFirebase() async {
  if (FirebaseAuth.instance.currentUser != null) {
    FirebaseAuth.instance.currentUser!.delete();
    await FirebaseAuth.instance.signOut();
  }
}

sendOtp(BuildContext context, {required String phoneNumber, required Function(String) onUpdate}) async {
  appStore.setLoading(true);
  try {
    await FirebaseAuth.instance.verifyPhoneNumber(
      timeout: const Duration(seconds: 60),
      phoneNumber: phoneNumber,
      verificationCompleted: (PhoneAuthCredential credential) async {
        appStore.setLoading(false);
        toast(language.verificationCompleted);
      },
      verificationFailed: (FirebaseAuthException e) {
        appStore.setLoading(false);
        if (e.code == 'invalid-phone-number') {
          toast(language.phoneNumberInvalid);
          throw language.phoneNumberInvalid;
        } else {
          toast(e.message.toString());
          throw e.message.toString();
        }
      },
      codeSent: (String verificationId, int? resendToken) async {
        appStore.setLoading(false);
        toast(language.codeSent);
        onUpdate.call(verificationId);
      },
      codeAutoRetrievalTimeout: (String verificationId) {
        appStore.setLoading(false);
      },
    );
  } on FirebaseException catch (error) {
    appStore.setLoading(false);
    toast(error.message);
  }
}

Future<String> updateStoreCheckerData() async {
  src.Source installationSource;
  try {
    installationSource = await StoreChecker.getSource;
  } on PlatformException {
    installationSource = src.Source.UNKNOWN;
  }

  // Set source text state
  switch (installationSource) {
    case src.Source.IS_INSTALLED_FROM_PLAY_STORE:
      return PLAY_STORE;
    case src.Source.IS_INSTALLED_FROM_PLAY_PACKAGE_INSTALLER:
      return GOOGLE_PACKAGE_INSTALLER;
    case src.Source.IS_INSTALLED_FROM_RU_STORE:
      return RUSTORE;
    case src.Source.IS_INSTALLED_FROM_LOCAL_SOURCE:
      return LOCAL_SOURCE;
    case src.Source.IS_INSTALLED_FROM_AMAZON_APP_STORE:
      return AMAZON_STORE;
    case src.Source.IS_INSTALLED_FROM_HUAWEI_APP_GALLERY:
      return HUAWEI_APP_GALLERY;
    case src.Source.IS_INSTALLED_FROM_SAMSUNG_GALAXY_STORE:
      return SAMSUNG_GALAXY_STORE;
    case src.Source.IS_INSTALLED_FROM_SAMSUNG_SMART_SWITCH_MOBILE:
      return SAMSUNG_SMART_SWITCH_MOBILE;
    case src.Source.IS_INSTALLED_FROM_XIAOMI_GET_APPS:
      return XIAOMI_GET_APPS;
    case src.Source.IS_INSTALLED_FROM_OPPO_APP_MARKET:
      return OPPO_APP_MARKET;
    case src.Source.IS_INSTALLED_FROM_VIVO_APP_STORE:
      return VIVO_APP_STORE;
    case src.Source.IS_INSTALLED_FROM_OTHER_SOURCE:
      return OTHER_SOURCE;
    case src.Source.IS_INSTALLED_FROM_APP_STORE:
      return APP_STORE;
    case src.Source.IS_INSTALLED_FROM_TEST_FLIGHT:
      return TEST_FLIGHT;
    case src.Source.UNKNOWN:
      return UNKNOWN_SOURCE;
  }
}
Editor is loading...
Leave a Comment