11import 'package:azt/features/auth/domain/entities/app_user.dart' ;
22import 'package:azt/features/auth/domain/repos/auth_repo.dart' ;
3+ import 'package:azt/features/auth/domain/repos/user_repo.dart' ;
34import 'package:firebase_auth/firebase_auth.dart' ;
45import 'package:google_sign_in/google_sign_in.dart' ;
56import 'package:flutter/foundation.dart' show kIsWeb;
6- import 'package:cloud_firestore/cloud_firestore.dart' ;
77
8- class FirebaseAuthRepo implements AuthRepo {
8+ class FirebaseAuthRepo implements AuthRepo {
99 //firebase access
1010 final FirebaseAuth firebaseAuth = FirebaseAuth .instance;
11+ final UserRepo userRepo;
1112
1213
14+ FirebaseAuthRepo ({required this .userRepo});
15+
1316 //LOGIN with email,pass
1417 @override
1518 Future <AppUser ?> loginWithEmailPassword (String email, String password) async {
16- try {
19+ try {
1720 //try to sign in
1821 UserCredential userCredential = await firebaseAuth
19- .signInWithEmailAndPassword (email: email, password: password);
22+ .signInWithEmailAndPassword (email: email, password: password);
23+
24+ // Fetch username from UserRepo
25+ final username = await userRepo.getUserUsername (userCredential.user! .uid);
2026
2127 //create user
22- AppUser user = AppUser (uid: userCredential.user! .uid, email: email,emailVerified: userCredential.user! .emailVerified);
28+ AppUser user = AppUser (
29+ uid: userCredential.user! .uid,
30+ email: email,
31+ emailVerified: userCredential.user! .emailVerified,
32+ name: username,
33+ );
2334
2435 //return user
2536 return user;
2637
27- } on FirebaseAuthException catch (e){
28- switch (e.code) {
29- case 'invalid-email' :
30- throw Exception ('The email address is not valid.' );
31- case 'user-disabled' :
32- throw Exception ('This user has been disabled.' );
33- case 'user-not-found' :
34- throw Exception ('No user found for that email.' );
35- case 'wrong-password' :
36- throw Exception ('Wrong password provided for that user.' );
37- case 'too-many-requests' :
38- throw Exception ('Too many attempts. Try again later.' );
39- case 'network-request-failed' :
40- throw Exception ('Please connect to internet and try again later' );
41- default :
42- throw Exception ('Login failed. ${e .message ?? 'Please try again.' }' );
43- }
38+ } on FirebaseAuthException catch (e) {
39+ switch (e.code) {
40+ case 'invalid-email' :
41+ throw Exception ('The email address is not valid.' );
42+ case 'user-disabled' :
43+ throw Exception ('This user has been disabled.' );
44+ case 'user-not-found' :
45+ throw Exception ('No user found for that email.' );
46+ case 'wrong-password' :
47+ throw Exception ('Wrong password provided for that user.' );
48+ case 'too-many-requests' :
49+ throw Exception ('Too many attempts. Try again later.' );
50+ case 'network-request-failed' :
51+ throw Exception ('Please connect to internet and try again later' );
52+ default :
53+ throw Exception ('Login failed. ${e .message ?? 'Please try again.' }' );
54+ }
4455 }
4556 //catch errors
46- catch (e){
57+ catch (e) {
4758 throw Exception ('Login failed: $e ' );
4859 }
4960 }
5061
5162 //REGISTER
5263 @override
5364 Future <AppUser ?> registerWithEmailPassword (String name, String email, String password) async {
54- try {
55-
65+ try {
5666 //attempt signup
5767 UserCredential userCredential = await firebaseAuth
58- .createUserWithEmailAndPassword (email: email, password: password);
68+ .createUserWithEmailAndPassword (email: email, password: password);
69+
5970
6071 //create user
61- AppUser user = AppUser (uid: userCredential.user! .uid, email: email,emailVerified: userCredential.user! .emailVerified);
72+ AppUser user = AppUser (
73+ uid: userCredential.user! .uid,
74+ email: email,
75+ emailVerified: userCredential.user! .emailVerified,
76+ name: name,
77+ );
6278
6379 //return user
6480 return user;
65- } on FirebaseAuthException catch (e){
81+ } on FirebaseAuthException catch (e) {
6682 switch (e.code) {
67- case 'invalid-email' :
68- throw Exception ('The email address is not valid.' );
69- case 'email-already-in-use' :
70- throw Exception ('Email address is already in use' );
71- case 'too-many-requests' :
72- throw Exception ('Too many attempts. Try again later.' );
73- case 'network-request-failed' :
74- throw Exception ('Please connect to internet and try again later' );
75- default :
76- throw Exception ('Registration failed. ${e .message ?? 'Please try again.' }' );
77- }
78- }
79- catch (e){
83+ case 'invalid-email' :
84+ throw Exception ('The email address is not valid.' );
85+ case 'email-already-in-use' :
86+ throw Exception ('Email address is already in use' );
87+ case 'too-many-requests' :
88+ throw Exception ('Too many attempts. Try again later.' );
89+ case 'network-request-failed' :
90+ throw Exception ('Please connect to internet and try again later' );
91+ default :
92+ throw Exception ('Registration failed. ${e .message ?? 'Please try again.' }' );
93+ }
94+ } catch (e) {
8095 throw Exception ('Registration failed: $e ' );
8196 }
8297 }
83-
98+
8499 //DELETE ACC
85100 @override
86101 Future <void > deleteAccount () async {
87- try {
88-
102+ try {
89103 //get current user
90104 final user = firebaseAuth.currentUser;
91105
92106 //check for null
93- if (user== null ) throw Exception ('No user found..' );
107+ if (user == null ) throw Exception ('No user found..' );
108+
109+ //delete from firestore
110+ await userRepo.deleteUserData (user.uid);
94111
95112 //try to delete acc
96113 await user.delete ();
97114
98115 //logout
99116 await logout ();
100- }
101- catch (e){
117+ } catch (e) {
102118 throw Exception ("Failed to delete user.. : $e " );
103119 }
104120 }
105-
106121
107122 // GET CURRENT USER
108123 @override
109- Future <AppUser ?> getCurrentUser () async {
124+ Future <AppUser ?> getCurrentUser () async {
110125 //get current logged in user from db
111126 final firebaseUser = firebaseAuth.currentUser;
112127 //no logged in user
113128 if (firebaseUser == null ) return null ;
114129
115- //logged in user
116- return AppUser (uid: firebaseUser.uid, email: firebaseUser.email! ,emailVerified: firebaseUser.emailVerified);
130+ //get username from userrepo
131+ try {
132+ final username = await userRepo.getUserUsername (firebaseUser.uid) ;
133+
134+ return AppUser (
135+ uid: firebaseUser.uid,
136+ email: firebaseUser.email! ,
137+ emailVerified: firebaseUser.emailVerified,
138+ name: username,
139+ );
140+ } catch (e) {
141+ // If fetch fails, return without username
142+ return AppUser (
143+ uid: firebaseUser.uid,
144+ email: firebaseUser.email! ,
145+ emailVerified: firebaseUser.emailVerified,
146+ );
147+ }
117148 }
118-
119149
120150 //LOGOUT
121151 @override
122152 Future <void > logout () async {
123153 await firebaseAuth.signOut ();
124-
125154 }
126-
127155
128156 //RESET PASSWORD
129157 @override
130158 Future <String > sendPasswordResetEmail (String email) async {
131- try {
159+ try {
132160 await firebaseAuth.sendPasswordResetEmail (email: email);
133161 return "Password reset email sent!" ;
134- }
135- catch (e){
162+ } catch (e) {
136163 return "An error occured: $e " ;
137164 }
138165 }
139-
166+
140167 @override
141168 Future <AppUser ?> signInWithGoogle () async {
142- try {
143- final GoogleAuthProvider googleProvider = GoogleAuthProvider ();
144- googleProvider.addScope ('email' );
145- googleProvider.addScope ('profile' );
146-
147- UserCredential userCredential;
148-
149- if (! kIsWeb) {
150- // Mobile platforms
151- userCredential = await FirebaseAuth .instance.signInWithProvider (googleProvider);
152- } else {
153- // Web platform - use signInWithPopup instead
154- userCredential = await FirebaseAuth .instance.signInWithPopup (googleProvider);
169+ try {
170+ final GoogleAuthProvider googleProvider = GoogleAuthProvider ();
171+ googleProvider.addScope ('email' );
172+ googleProvider.addScope ('profile' );
173+
174+ UserCredential userCredential;
175+
176+ if (! kIsWeb) {
177+ // Mobile platforms
178+ userCredential = await FirebaseAuth .instance.signInWithProvider (googleProvider);
179+ } else {
180+ // Web platform - use signInWithPopup instead
181+ userCredential = await FirebaseAuth .instance.signInWithPopup (googleProvider);
182+ }
183+
184+ // user cancelled sign-in
185+ if (userCredential.user == null ) return null ;
186+
187+ // firebase user
188+ final firebaseUser = userCredential.user! ;
189+
190+ //check if user already exists
191+ final userData = await userRepo.getUserData (firebaseUser.uid);
192+
193+ String username = '' ;
194+ if (userData == null ) {
195+ //extract username from email
196+ username = firebaseUser.email? .split ('@' )[0 ] ?? '' ;
197+ await userRepo.saveUserData (
198+ firebaseUser.uid,
199+ firebaseUser.email ?? '' ,
200+ username,
201+ );
202+ } else {
203+ //if already existing user
204+ username = userData['username' ] ?? '' ;
205+ }
206+
207+ AppUser appUser = AppUser (
208+ uid: firebaseUser.uid,
209+ email: firebaseUser.email ?? '' ,
210+ emailVerified: firebaseUser.emailVerified,
211+ name: username,
212+ );
213+ return appUser;
214+ } catch (e) {
215+ print (e);
216+ return null ;
155217 }
156-
157- // user cancelled sign-in
158- if (userCredential.user == null ) return null ;
159-
160- // firebase user
161- final firebaseUser = userCredential.user! ;
162-
163- AppUser appUser = AppUser (
164- uid: firebaseUser.uid,
165- email: firebaseUser.email ?? '' ,
166- emailVerified: firebaseUser.emailVerified, //Should be set to true by default after gsignin
167- );
168- return appUser;
169- }
170- catch (e) {
171- print (e);
172- return null ;
173218 }
174- }
219+
175220 Future <void > sendEmailVerification () async {
176221 try {
177222 final user = firebaseAuth.currentUser;
@@ -182,25 +227,35 @@ class FirebaseAuthRepo implements AuthRepo{
182227 throw Exception ('Failed to send verification email: $e ' );
183228 }
184229 }
230+
185231 Future <AppUser ?> reloadUser () async {
186- try {
187- final user = firebaseAuth.currentUser;
188- if (user == null ) return null ;
189-
190- // Reload user data from Firebase
191- await user.reload ();
192-
193- // Get the updated user
194- final updatedUser = firebaseAuth.currentUser;
195- if (updatedUser == null ) return null ;
196-
197- return AppUser (
198- uid: updatedUser.uid,
199- email: updatedUser.email! ,
200- emailVerified: updatedUser.emailVerified,
201- );
202- } catch (e) {
203- throw Exception ('Failed to reload user: $e ' );
232+ try {
233+ final user = firebaseAuth.currentUser;
234+ if (user == null ) return null ;
235+
236+ //reload from firestore
237+ await user.reload ();
238+
239+ //get updated user
240+ final updatedUser = firebaseAuth.currentUser;
241+ if (updatedUser == null ) return null ;
242+
243+ //get username from repo
244+ String username = '' ;
245+ try {
246+ username = await userRepo.getUserUsername (updatedUser.uid);
247+ } catch (e) {
248+ //fetch fail then continue without username
249+ }
250+
251+ return AppUser (
252+ uid: updatedUser.uid,
253+ email: updatedUser.email! ,
254+ emailVerified: updatedUser.emailVerified,
255+ name: username,
256+ );
257+ } catch (e) {
258+ throw Exception ('Failed to reload user: $e ' );
259+ }
204260 }
205- }
206- }
261+ }
0 commit comments