import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:prosappco/src/authentication/exceptions/register_failed.dart'; import 'package:prosappco/src/screens/login.dart'; import 'package:prosappco/src/screens/welcome.dart'; class AuthenticationRepository extends GetxController { static AuthenticationRepository get instance => Get.find(); //Variables final _auth = FirebaseAuth.instance; late final Rx firebaseUser; final firebase = FirebaseFirestore.instance; final GoogleSignIn googleSignIn = GoogleSignIn(); // final _userRef = firebase var verificationId = ''.obs; @override void onReady() { // Future.delayed(const Duration(seconds: 6)); firebaseUser = Rx(_auth.currentUser); firebaseUser.bindStream(_auth.userChanges()); ever(firebaseUser, _setInitialScreen); } _setInitialScreen(User? user) { user == null ? Get.offAll(LoginScreen()) : Get.offAll(WelcomeScreen()); } Future phoneAuthentication(String phoneNo) async { await _auth.verifyPhoneNumber( phoneNumber: phoneNo, verificationCompleted: (credential) async { await _auth.signInWithCredential(credential); }, codeSent: (verificationId, resendToken) { this.verificationId.value = verificationId; }, codeAutoRetrievalTimeout: (verificationId) { this.verificationId.value = verificationId; }, verificationFailed: (e) { if (e.code == 'invalid-phone-number') { Get.snackbar('Error', 'El numero no es valido.'); } else { Get.snackbar('Error', 'Algo ha ido mal. Inténtalo de nuevo. $e'); } }, ); } Future updatePhoneNumber(String verificationId, String smsCode) async { try { PhoneAuthCredential credential = PhoneAuthProvider.credential( verificationId: verificationId, smsCode: smsCode); await FirebaseAuth.instance.currentUser!.updatePhoneNumber(credential); print("Phone number updated successfully"); } catch (e) { print("Error updating phone number: $e"); } } Future verifyOTP(String otp) async { var credentials = await _auth.signInWithCredential( PhoneAuthProvider.credential( verificationId: verificationId.value, smsCode: otp)); return credentials.user != null ? true : false; } Future createUserWithEmailAndPassword( String email, String password) async { try { // try { // await firebase.collection('Users').doc().set({ // "Email": email, // "Password": password, // }); // } catch (e) { // print('Error $e'); // } await _auth.createUserWithEmailAndPassword( email: email, password: password); firebaseUser.value != null ? Get.offAll(WelcomeScreen()) : Get.to(LoginScreen()); } on FirebaseAuthException catch (e) { final ex = SignUpWithEmailAndPasswordFailure.code(e.code); print('FIREBASE AUTH EXCEPTION - ${ex.message}'); } catch (_) { const ex = SignUpWithEmailAndPasswordFailure(); print('EXCEPTION - ${ex.message}'); throw ex; } } Future loginWithEmailAndPassword(String email, String password) async { try { await _auth.signInWithEmailAndPassword(email: email, password: password); } on FirebaseAuthException catch (e) { } catch (_) {} } Future signInWithGoogle() async { try { final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn(); final GoogleSignInAuthentication googleAuth = await googleUser!.authentication; final credential = GoogleAuthProvider.credential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); await FirebaseAuth.instance.signInWithCredential(credential); } catch (e) { print('Error - ${e}'); } } Future logout() async => _auth.signOut(); String? getCurrentUserPhone() { final User? user = _auth.currentUser; return user?.phoneNumber; } String? getCurrentUserUid() { final User? user = _auth.currentUser; return user?.uid; } Future getCity(String uid) async { String city = ''; try { final snapshot = await FirebaseFirestore.instance.collection('users').doc(uid).get(); final Map? data = snapshot.data(); city = data?['city'] ?? ''; } catch (e) { print('Error getting city: $e'); } return city; } }