Files
prosappweb/lib/src/authentication/authentication_repository.dart
T
2023-05-05 15:51:32 -05:00

269 lines
8.0 KiB
Dart

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.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/service.dart';
class AuthenticationRepository extends GetxController {
static AuthenticationRepository get instance => Get.find();
//Variables
final _auth = FirebaseAuth.instance;
late final Rx<User?> 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<User?>(_auth.currentUser);
firebaseUser.bindStream(_auth.userChanges());
ever(firebaseUser, _setInitialScreen);
}
_setInitialScreen(User? user) {
user == null
? Get.offAll(const LoginScreen())
: Get.offAll(const ServiceScreen());
}
Future<void> 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<void> 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<bool> verifyOTP(String otp) async {
var credentials = await _auth.signInWithCredential(
PhoneAuthProvider.credential(
verificationId: verificationId.value, smsCode: otp));
return credentials.user != null ? true : false;
}
Future<void> createUserWithEmailAndPassword(
String email, String password) async {
try {
await _auth.createUserWithEmailAndPassword(
email: email, password: password);
firebaseUser.value != null
? Get.offAll(ServiceScreen())
: Get.to(LoginScreen());
} on FirebaseAuthException catch (e) {
final ex = SignUpWithEmailAndPasswordFailure.code(e.code);
Get.snackbar(
'Correo Invalido',
'Por favor pruebe con otro.',
snackPosition: SnackPosition.BOTTOM,
);
} catch (_) {
const ex = SignUpWithEmailAndPasswordFailure();
print('EXCEPTION - ${ex.message}');
throw ex;
}
}
Future<void> loginWithEmailAndPassword(String email, String password) async {
try {
await _auth.signInWithEmailAndPassword(email: email, password: password);
} on FirebaseAuthException catch (e) {
if (e.code == 'wrong-password') {
Get.snackbar(
'Contraseña incorrecta',
'Por favor intentelo de nuevo.',
snackPosition: SnackPosition.BOTTOM,
);
}
if (e.code == 'invalid-email') {
Get.snackbar(
'Ingrese un email valido',
'Por favor pruebe con otro.',
snackPosition: SnackPosition.BOTTOM,
);
}
if (e.code == 'user-not-found') {
Get.snackbar(
'Email no encontrado',
'Este correo no se encuentra registrado.',
snackPosition: SnackPosition.BOTTOM,
);
}
} catch (_) {}
}
Future<void> 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<void> 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<String> getCity(String uid) async {
String city = '';
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
city = data?['city'] ?? '';
} catch (e) {
print('Error getting city: $e');
}
return city;
}
Future<String> getAddress(String uid) async {
String address = '';
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
address = data?['address'] ?? '';
} catch (e) {
print('Error getting address: $e');
}
return address;
}
Future<String> getUbicacion(String uid) async {
String location = '';
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
location = data?['ubicacion'] ?? '';
} catch (e) {
print('Error getting address: $e');
}
return location;
}
Future<String> getOpcionalAddress(String uid) async {
String opcional_location = '';
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
opcional_location = data?['opcional_address'] ?? '';
} catch (e) {
print('Error getting address: $e');
}
return opcional_location;
}
Future<int> getTarifa(String uid) async {
int tarifa = 0;
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
tarifa = data?['tarifa'] ?? 0;
} catch (e) {
print('Error getting tarifa: $e');
}
return tarifa;
}
Future<String> getPhoto(String uid) async {
String photo = '';
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
photo = data?['photo'] ?? '';
} catch (e) {
print('Error getting photo: $e');
}
return photo;
}
Future<String> getBanner(String uid) async {
String photo = '';
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
photo = data?['banner'] ?? '';
} catch (e) {
print('Error getting banner: $e');
}
return photo;
}
Future<String> getProfession(String uid) async {
String profession = '';
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
profession = data?['profesion'] ?? '';
} catch (e) {
print('Error getting profesion: $e');
}
return profession;
}
Future<String> getState(String uid) async {
String state = '';
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
state = data?['estado'] ?? '';
} catch (e) {
print('Error getting estado: $e');
}
return state;
}
}