Untitled

 avatar
unknown
plain_text
14 days ago
12 kB
5
Indexable
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart';
import 'package:hazard_monitor/screens/auth_screens/sign_in_screen.dart';
import 'package:hazard_monitor/screens/home_screen/home_screen.dart';
import 'package:hazard_monitor/utils/pushy_notification_service/pushy_notification_service.dart';
import 'package:hazard_monitor/utils/sharedprf_service/sharedpref_keys.dart';
import 'package:hazard_monitor/utils/translation/language_keys.dart';
import 'package:http/http.dart' as http;
import 'package:image_picker/image_picker.dart';

import '../components/dialogs/r_snakbar.dart';
import '../models/user_model.dart';
import '../utils/api/api_endpoints.dart';
import '../utils/app_reg_exp.dart';
import '../utils/sharedprf_service/shared_preference.dart';

class AuthController extends GetxController {
  var user = Rxn<UserModel>();
  var token = "".obs;
  var language = "".obs;

  var isObsecure = true.obs,
      isLoading = false.obs,
      isEmailError = false.obs,
      isPasswordError = false.obs;
  var emailError = "".obs, passwordError = "".obs;
  TextEditingController emailController = TextEditingController();
  TextEditingController passController = TextEditingController();
  var emailFocusNode = FocusNode().obs;
  var passwordFocusNode = FocusNode().obs;

  var selectedImage = Rxn<File>();
  var uploadedImage = "".obs;
  final picker = ImagePicker();
  var isUploadingProfilePicture = false.obs;
  var showUploadButton = false.obs;

// ----------- Forgot and Change Pass Vaiables
  TextEditingController forgotEmailController = TextEditingController();
  TextEditingController forgotPassController = TextEditingController();
  TextEditingController forgotConPassController = TextEditingController();
  var forgotEmailErrorMsg = "".obs,
      forgotPasswordErrorMsg = "".obs,
      forgotConPassErrorMsg = "".obs;
  var isForgotEmailError = false.obs,
      isForgotPasswordError = false.obs,
      isForgotConPassError = false.obs,
      isForgotPassObscure = true.obs,
      isForgotConPassObscure = true.obs,
      isForgotLoading = false.obs;
  var forgotEmailFocusNode = FocusNode().obs,
      forgotPasswordFocusNode = FocusNode().obs,
      forgotConPasswordFocusNode = FocusNode().obs;
// ----------- Forgot and Change Pass Vaiables

  @override
  void onInit() {
    loggedinUserCheck();
    super.onInit();
  }

  loggedinUserCheck() async {
    token.value = await AppSharedPrefs.getValue(
            key: AppSharedprefKey.token, defaultValue: "")
        .toString();
    var userData = await AppSharedPrefs.getValue(
        key: AppSharedprefKey.userData, defaultValue: "");
    await checkAppLanguage();
    print("token: ${token.value}");
    print("userData: $userData");
    if (userData != "") {
      final extractedUserData = json.decode(userData.toString());
      // print(extractedUserData);
      user.value = UserModel.fromJson(extractedUserData);

      print("Logged In");
      PushyNotificationService().pushyRegister();
      Get.offAll(HomeScreen());
    } else {
      print("Not Logged In");
      Get.offAll(SignInScreen());
    }
  }

  logOutUser() {
    AppSharedPrefs.preferences!.clear();
    Get.offAll(SignInScreen());
  }

  checkAppLanguage() async {
    language.value = await AppSharedPrefs.getValue(
            key: AppSharedprefKey.applLanguage, defaultValue: "")
        .toString();
    print("language: ${language.value}");
    if (language.value != "") {
      setAppLanguage(languageCode: language.value);
    } else {
      setAppLanguage(languageCode: "en");
    }
  }

  setAppLanguage({required String languageCode}) {
    Get.updateLocale(Locale(languageCode));
    language.value = languageCode;
    AppSharedPrefs.setValue(
        key: AppSharedprefKey.applLanguage, value: languageCode);
  }

  makeValidatorFalse() {
    Get.focusScope!.unfocus();
    emailError = "".obs;
    isEmailError = false.obs;
    passwordError = "".obs;
    isPasswordError = false.obs;
  }

  emailPasswordCheck() {
    makeValidatorFalse();
    String pattern = AppRegExp.emailPattern;
    RegExp regExp = RegExp(pattern);

    if (emailController.text.isEmpty) {
      isEmailError = true.obs;
      emailError = AppConstants.emailFieldIsEmpty.tr.obs;
      Get.focusScope!.requestFocus(emailFocusNode.value);
    } else if (!regExp.hasMatch(emailController.text)) {
      isEmailError = true.obs;
      emailError = AppConstants.invalidEmail.tr.obs;
      Get.focusScope!.requestFocus(emailFocusNode.value);
    } else if (passController.text.isEmpty) {
      isPasswordError = true.obs;
      passwordError = AppConstants.passwordFieldIsEmpty.tr.obs;
      Get.focusScope!.requestFocus(passwordFocusNode.value);
    } else {
      /// Navigate

      Get.focusScope!.requestFocus(FocusNode());
      isLoading(true);
      loginWithEmail();
      // Navigator.push( context, SlideLeftRoute(page: const OtpVerificationScreen()));
    }
  }

  Future<void> loginWithEmail() async {
    var headers = {'Content-Type': 'application/json'};
    try {
      var url = Uri.parse(AppUrls.baseUrl + AppUrls.signin);

      var body = {
        'email': emailController.text.trim(),
        'password': passController.text
      };

      print("login: $url,  $body");
      http.Response response =
          await http.post(url, body: jsonEncode(body), headers: headers);

      print(response.statusCode.toString());
      print(response.body.toString());

      isLoading(false);
      if (response.statusCode == 200 || response.statusCode == 201) {
        final json = jsonDecode(response.body);

        print(json['user']);

        user.value = UserModel.fromJson(json['user']);
        token.value = json['access_token'];
        AppSharedPrefs.setValue(
            key: AppSharedprefKey.token, value: json['access_token']);
        AppSharedPrefs.setValue(
            key: AppSharedprefKey.userData, value: jsonEncode(json['user']));
        emailController.clear();
        passController.clear();

        PushyNotificationService().pushyRegister();

        // Get.offAll(HomeScreen());
        checkLocationPermission(onPermissionGranted: (){
          Get.offAll(HomeScreen());
        });
      } else if (response.statusCode == 401) {
        rSnackbar(
            title: AppConstants.error.tr,
            msg: AppConstants.invaliEmailOrPassword.tr);
        logOutUser();
      } else if (response.statusCode == 422) {
        rSnackbar(
            title: AppConstants.error.tr,
            msg: AppConstants.emailOrPasswordIsNotvalid.tr);
      } else {
        // throw jsonDecode(response.body)["Message"] ?? "Unknown Error Occured";
        rSnackbar(
            title: AppConstants.error.tr,
            msg: AppConstants.somethinWentWrong.tr);
      }
    } catch (error) {
      isLoading(false);
      rSnackbar(
          title: AppConstants.error.tr, msg: AppConstants.somethinWentWrong.tr);
      throw error.toString();
      // Get.back();
      // showDialog(
      //     context: Get.context!,
      //     builder: (context) {
      //       return SimpleDialog(
      //         title: Text('Error'),
      //         contentPadding: EdgeInsets.all(20),
      //         children: [Text(error.toString())],
      //       );
      //     });
    }
  }

  //----------------- image
  Future selectProfileImages() async {
    final pickedFile = await picker.pickImage(
        source: ImageSource.gallery,
        imageQuality: 100,
        maxHeight: 1000,
        maxWidth: 1000);
    XFile? xfilePick = pickedFile;

    if (xfilePick != null) {
      selectedImage.value = File(xfilePick.path);
      showUploadButton(true);
    } else {
      rSnackbar(
          title: AppConstants.alert.tr, msg: AppConstants.nothingSelected.tr);
    }
  }

  uploadImage() async {
    // Future<Future<bool?>?> uploadImage() async {
    isUploadingProfilePicture(true);
    var headers = {
      'Content-Type': 'application/json',
      'Authorization': "Bearer ${token.value}",
    };
    // create multipart request
    try {
      var url = Uri.parse(AppUrls.baseUrl + AppUrls.uploadProfilePic);
      print("image Upload: $url");
      var request = http.MultipartRequest('POST', url);
      request.headers.addAll(headers);

      if (selectedImage.value != null) {
        request.files.add(http.MultipartFile(
            'file',
            File(selectedImage.value!.path).readAsBytes().asStream(),
            File(selectedImage.value!.path).lengthSync(),
            filename: selectedImage.value!.path.split("/").last));
        // send
        var response = await request.send();
        print(response.statusCode.toString());
        // print(response.body.toString());

        // listen for response
        response.stream.transform(utf8.decoder).listen((value) {
          print("picture: $value");

          var responseImage = jsonDecode(value);

          uploadedImage.value = responseImage["file"][0]["path"];

          print("picture: ${uploadedImage.value}");

          updateUserPic(); // updateUserPic
        });
      } else {
        isUploadingProfilePicture(false);
        rSnackbar(
            title: AppConstants.alert.tr, msg: AppConstants.nothingSelected.tr);
      }
    } catch (e) {
      isUploadingProfilePicture(false);
      rSnackbar(
          title: AppConstants.error.tr,
          msg: AppConstants.uploadFailedSomethingWentWrong.tr);
    }
  }

  Future<void> updateUserPic() async {
    var headers = {
      'Content-Type': 'application/json',
      'Authorization': "Bearer ${token.value}",
    };
    try {
      var url = Uri.parse(AppUrls.baseUrl + AppUrls.updateUser);

      var body = {
        'avatar': uploadedImage.value,
      };

      print("UpdateUserPic: $url,  $body");
      http.Response response =
          await http.put(url, body: jsonEncode(body), headers: headers);

      print(response.statusCode.toString());
      print(response.body.toString());

      if (response.statusCode == 200 || response.statusCode == 201) {
        final json = jsonDecode(response.body);

        print(json['user']);

        user.value = UserModel.fromJson(json['user']);
        AppSharedPrefs.setValue(
            key: AppSharedprefKey.userData, value: jsonEncode(json['user']));

        clearImageSetup();
      } else if (response.statusCode == 401) {
        isUploadingProfilePicture(false);
        rSnackbar(
            title: AppConstants.error.tr,
            msg: AppConstants.authorizationError.tr);
        logOutUser();
      } else {
        isUploadingProfilePicture(false);
        rSnackbar(
            title: AppConstants.error.tr,
            msg: jsonDecode(response.body)["message"] ??
                AppConstants.unknownErrorOccured.tr);
      }
    } catch (error) {
      isUploadingProfilePicture(false);
      rSnackbar(
          title: AppConstants.error.tr, msg: AppConstants.somethinWentWrong.tr);
      throw error.toString();
    }
  }

  clearImageSetup() {
    isUploadingProfilePicture(false);
    showUploadButton(false);
    selectedImage.value = null;
  }


  Future<void> checkLocationPermission({Function? onPermissionGranted}) async {
    while (true) {
      LocationPermission permission = await Geolocator.checkPermission();
      if (permission == LocationPermission.always ||
          permission == LocationPermission.whileInUse) {
        if (onPermissionGranted != null) {
          onPermissionGranted(); // Call the passed function if provided
        }
        break;
      } else {
        permission = await Geolocator.requestPermission();
        if (permission == LocationPermission.denied || permission == LocationPermission.deniedForever) {
          rSnackbar(
            title: AppConstants.error.tr,
            msg: "Location permission is required to proceed.");
        }
      }
    }
  }
}
Leave a Comment