22
33import android .content .Context ;
44import android .util .Log ;
5+ import java .util .Map ;
6+ import android .net .Uri ;
57import android .support .annotation .NonNull ;
68import android .support .annotation .Nullable ;
79
1214import com .facebook .react .bridge .Callback ;
1315import com .facebook .react .bridge .WritableMap ;
1416import com .facebook .react .bridge .ReadableMap ;
17+ import com .facebook .react .bridge .ReadableNativeMap ;
1518import com .facebook .react .modules .core .DeviceEventManagerModule ;
1619import com .facebook .react .bridge .ReactContext ;
1720
2326
2427import com .google .firebase .auth .AuthCredential ;
2528import com .google .firebase .auth .AuthResult ;
29+ import com .google .firebase .auth .UserProfileChangeRequest ;
2630import com .google .firebase .auth .FacebookAuthProvider ;
2731import com .google .firebase .auth .FirebaseAuth ;
2832import com .google .firebase .auth .FirebaseUser ;
2933import com .google .firebase .auth .GetTokenResult ;
3034import com .google .firebase .auth .GoogleAuthProvider ;
3135
3236class FirestackAuthModule extends ReactContextBaseJavaModule {
37+ private final int NO_CURRENT_USER = 100 ;
3338 private static final String TAG = "FirestackAuth" ;
3439
3540 private Context context ;
@@ -121,26 +126,85 @@ public void signInWithProvider(final String provider, final String authToken, fi
121126
122127 @ ReactMethod
123128 public void signInWithCustomToken (final String customToken , final Callback callback ) {
124- // TODO
125- FirestackUtils .todoNote (TAG , "signInWithCustomToken" , callback );
129+ mAuth = FirebaseAuth .getInstance ();
130+
131+ mAuth .signInWithCustomToken (customToken )
132+ .addOnCompleteListener (new OnCompleteListener <AuthResult >() {
133+ @ Override
134+ public void onComplete (@ NonNull Task <AuthResult > task ) {
135+ Log .d (TAG , "signInWithCustomToken:onComplete:" + task .isSuccessful ());
136+ if (task .isSuccessful ()) {
137+ user = task .getResult ().getUser ();
138+ userCallback (user , callback );
139+ } else {
140+ userErrorCallback (task , callback );
141+ }
142+ }
143+ });
126144 }
127145
128146 @ ReactMethod
129147 public void reauthenticateWithCredentialForProvider (final String provider , final String authToken , final String authSecret , final Callback callback ) {
130148 // TODO:
131- FirestackUtils .todoNote (TAG , "reauthenticateWithCredentialForProvider" , callback );
149+ // FirestackUtils.todoNote(TAG, "reauthenticateWithCredentialForProvider", callback);
150+ AuthCredential credential ;
151+ Log .d (TAG , "reauthenticateWithCredentialForProvider called with: " + provider );
132152 }
133153
134154 @ ReactMethod
135155 public void updateUserEmail (final String email , final Callback callback ) {
136- // TODO
137- FirestackUtils .todoNote (TAG , "updateUserEmail" , callback );
156+ // FirestackUtils.todoNote(TAG, "updateUserEmail", callback);
157+ FirebaseUser user = FirebaseAuth .getInstance ().getCurrentUser ();
158+
159+ if (user != null ) {
160+ user .updateEmail (email )
161+ .addOnCompleteListener (new OnCompleteListener <Void >() {
162+ @ Override
163+ public void onComplete (@ NonNull Task <Void > task ) {
164+ if (task .isSuccessful ()) {
165+ Log .d (TAG , "User email address updated" );
166+ FirebaseUser u = FirebaseAuth .getInstance ().getCurrentUser ();
167+ userCallback (u , callback );
168+ } else {
169+ userErrorCallback (task , callback );
170+ }
171+ }
172+ });
173+ } else {
174+ WritableMap err = Arguments .createMap ();
175+ err .putInt ("errorCode" , NO_CURRENT_USER );
176+ err .putString ("errorMessage" , "No current user" );
177+ callback .invoke (err );
178+ }
138179 }
139180
140181 @ ReactMethod
141182 public void updateUserPassword (final String newPassword , final Callback callback ) {
142183 // TODO
143- FirestackUtils .todoNote (TAG , "updateUserPassword" , callback );
184+ // FirestackUtils.todoNote(TAG, "updateUserPassword", callback);
185+ FirebaseUser user = FirebaseAuth .getInstance ().getCurrentUser ();
186+
187+ if (user != null ) {
188+ user .updatePassword (newPassword )
189+ .addOnCompleteListener (new OnCompleteListener <Void >() {
190+ @ Override
191+ public void onComplete (@ NonNull Task <Void > task ) {
192+ if (task .isSuccessful ()) {
193+ Log .d (TAG , "User password updated" );
194+
195+ FirebaseUser u = FirebaseAuth .getInstance ().getCurrentUser ();
196+ userCallback (u , callback );
197+ } else {
198+ userErrorCallback (task , callback );
199+ }
200+ }
201+ });
202+ } else {
203+ WritableMap err = Arguments .createMap ();
204+ err .putInt ("errorCode" , NO_CURRENT_USER );
205+ err .putString ("errorMessage" , "No current user" );
206+ callback .invoke (err );
207+ }
144208 }
145209
146210 @ ReactMethod
@@ -165,7 +229,31 @@ public void onComplete(@NonNull Task<Void> task) {
165229 @ ReactMethod
166230 public void deleteUser (final Callback callback ) {
167231 // TODO
168- FirestackUtils .todoNote (TAG , "deleteUser" , callback );
232+ // FirestackUtils.todoNote(TAG, "deleteUser", callback);
233+ FirebaseUser user = FirebaseAuth .getInstance ().getCurrentUser ();
234+
235+ if (user != null ) {
236+ user .delete ()
237+ .addOnCompleteListener (new OnCompleteListener <Void >() {
238+ @ Override
239+ public void onComplete (@ NonNull Task <Void > task ) {
240+ if (task .isSuccessful ()) {
241+ Log .d (TAG , "User account deleted" );
242+ WritableMap resp = Arguments .createMap ();
243+ resp .putString ("status" , "complete" );
244+ resp .putString ("msg" , "User account deleted" );
245+ callback .invoke (null , resp );
246+ } else {
247+ userErrorCallback (task , callback );
248+ }
249+ }
250+ });
251+ } else {
252+ WritableMap err = Arguments .createMap ();
253+ err .putInt ("errorCode" , NO_CURRENT_USER );
254+ err .putString ("errorMessage" , "No current user" );
255+ callback .invoke (err );
256+ }
169257 }
170258
171259 @ ReactMethod
@@ -175,15 +263,53 @@ public void getToken(final Callback callback) {
175263 }
176264
177265 @ ReactMethod
178- public void updateUserProfile (final ReadableMap props , final Callback callback ) {
266+ public void updateUserProfile (ReadableMap props , final Callback callback ) {
179267 // TODO
180- FirestackUtils .todoNote (TAG , "updateUserProfile" , callback );
268+ // FirestackUtils.todoNote(TAG, "updateUserProfile", callback);
269+ FirebaseUser user = FirebaseAuth .getInstance ().getCurrentUser ();
270+
271+ UserProfileChangeRequest .Builder profileBuilder = new UserProfileChangeRequest .Builder ();
272+
273+ Map <String , Object > m = FirestackUtils .recursivelyDeconstructReadableMap (props );
274+
275+ if (m .containsKey ("displayName" )) {
276+ String displayName = (String ) m .get ("displayName" );
277+ profileBuilder .setDisplayName (displayName );
278+ }
279+
280+ if (m .containsKey ("photoUri" )) {
281+ String photoUriStr = (String ) m .get ("photoUri" );
282+ Uri uri = Uri .parse (photoUriStr );
283+ profileBuilder .setPhotoUri (uri );
284+ }
285+
286+ UserProfileChangeRequest profileUpdates = profileBuilder .build ();
287+
288+ user .updateProfile (profileUpdates )
289+ .addOnCompleteListener (new OnCompleteListener <Void >() {
290+ @ Override
291+ public void onComplete (@ NonNull Task <Void > task ) {
292+ if (task .isSuccessful ()) {
293+ Log .d (TAG , "User profile updated" );
294+ FirebaseUser u = FirebaseAuth .getInstance ().getCurrentUser ();
295+ userCallback (u , callback );
296+ } else {
297+ userErrorCallback (task , callback );
298+ }
299+ }
300+ });
181301 }
182302
183303 @ ReactMethod
184304 public void signOut (final Callback callback ) {
185305 // TODO
186306 FirestackUtils .todoNote (TAG , "signOut" , callback );
307+ FirebaseAuth .getInstance ().signOut ();
308+
309+ WritableMap resp = Arguments .createMap ();
310+ resp .putString ("status" , "complete" );
311+ resp .putString ("msg" , "User signed out" );
312+ callback .invoke (null , resp );
187313 }
188314
189315 @ ReactMethod
@@ -198,13 +324,6 @@ public void getCurrentUser(final Callback callback) {
198324 }
199325 }
200326
201- @ ReactMethod
202- public void logEventWithName (final String name , final String props , final Callback callback ) {
203- // TODO
204- FirestackUtils .todoNote (TAG , "logEventWithName" , callback );
205- }
206-
207-
208327 // TODO: Check these things
209328 @ ReactMethod
210329 public void googleLogin (String IdToken , final Callback callback ) {
@@ -285,7 +404,7 @@ public void noUserCallback(final Callback callback) {
285404 callback .invoke (null , message );
286405 }
287406
288- public void userErrorCallback (Task < AuthResult > task , final Callback onFail ) {
407+ public void userErrorCallback (Task task , final Callback onFail ) {
289408 WritableMap error = Arguments .createMap ();
290409 error .putInt ("errorCode" , task .getException ().hashCode ());
291410 error .putString ("errorMessage" , task .getException ().getMessage ());
0 commit comments