Untitled
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