Skip to content

Commit 999bf02

Browse files
authored
Merge pull request #252 from Salakar/master
Misc authentication
2 parents d797b55 + 6a5c878 commit 999bf02

File tree

11 files changed

+262
-56
lines changed

11 files changed

+262
-56
lines changed

android/src/main/java/io/fullstack/firestack/auth/FirestackAuth.java

+68-9
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@
2525
import com.google.firebase.auth.UserProfileChangeRequest;
2626
import com.google.firebase.auth.FacebookAuthProvider;
2727
import com.google.firebase.auth.FirebaseAuth;
28+
import com.google.firebase.auth.FirebaseAuthException;
2829
import com.google.firebase.auth.FirebaseUser;
2930
import com.google.firebase.auth.GetTokenResult;
3031
import com.google.firebase.auth.GoogleAuthProvider;
32+
import com.google.firebase.auth.EmailAuthProvider;
33+
3134

3235
import io.fullstack.firestack.Utils;
3336

@@ -50,7 +53,7 @@ public FirestackAuth(ReactApplicationContext reactContext) {
5053
mReactContext = reactContext;
5154
mAuth = FirebaseAuth.getInstance();
5255

53-
Log.d(TAG, "New FirestackAuth instance");
56+
Log.d(TAG, "New FirestackAuth instance");
5457
}
5558

5659
@Override
@@ -165,6 +168,43 @@ public void signInWithProvider(final String provider, final String authToken, fi
165168
Utils.todoNote(TAG, "signInWithProvider", callback);
166169
}
167170

171+
@ReactMethod
172+
public void linkPassword(final String email, final String password, final Callback callback) {
173+
FirebaseUser user = mAuth.getCurrentUser();
174+
175+
if (user != null) {
176+
AuthCredential credential = EmailAuthProvider.getCredential(email, password);
177+
user
178+
.linkWithCredential(credential)
179+
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
180+
@Override
181+
public void onComplete(@NonNull Task<AuthResult> task) {
182+
try {
183+
if (task.isSuccessful()) {
184+
Log.d(TAG, "user linked with password credential");
185+
userCallback(mAuth.getCurrentUser(), callback);
186+
} else {
187+
userErrorCallback(task, callback);
188+
}
189+
} catch (Exception ex) {
190+
userExceptionCallback(ex, callback);
191+
}
192+
}
193+
});
194+
} else {
195+
callbackNoUser(callback, true);
196+
}
197+
}
198+
199+
@ReactMethod
200+
public void link(final String provider, final String authToken, final String authSecret, final Callback callback) {
201+
if (provider.equals("password")) {
202+
linkPassword(authToken, authSecret, callback);
203+
} else
204+
// TODO other providers
205+
Utils.todoNote(TAG, "linkWithProvider", callback);
206+
}
207+
168208
@ReactMethod
169209
public void signInAnonymously(final Callback callback) {
170210
Log.d(TAG, "signInAnonymously:called:");
@@ -435,9 +475,32 @@ public void signOut(final Callback callback) {
435475
callback.invoke(null, resp);
436476
}
437477

478+
@ReactMethod
479+
public void reloadUser(final Callback callback) {
480+
FirebaseUser user = mAuth.getCurrentUser();
481+
482+
if (user == null) {
483+
callbackNoUser(callback, false);
484+
} else {
485+
user.reload()
486+
.addOnCompleteListener(new OnCompleteListener<Void>() {
487+
@Override
488+
public void onComplete(@NonNull Task<Void> task) {
489+
if (task.isSuccessful()) {
490+
Log.d(TAG, "user reloaded");
491+
userCallback(mAuth.getCurrentUser(), callback);
492+
} else {
493+
userErrorCallback(task, callback);
494+
}
495+
}
496+
});
497+
}
498+
}
499+
438500
@ReactMethod
439501
public void getCurrentUser(final Callback callback) {
440502
FirebaseUser user = mAuth.getCurrentUser();
503+
441504
if (user == null) {
442505
callbackNoUser(callback, false);
443506
} else {
@@ -513,19 +576,15 @@ public void onComplete(@NonNull Task<GetTokenResult> task) {
513576

514577
private void userErrorCallback(Task task, final Callback onFail) {
515578
WritableMap error = Arguments.createMap();
516-
error.putInt("errorCode", task.getException().hashCode());
517-
error.putString("errorMessage", task.getException().getMessage());
518-
error.putString("allErrorMessage", task.getException().toString());
519-
579+
error.putString("code", ((FirebaseAuthException) task.getException()).getErrorCode());
580+
error.putString("message", task.getException().getMessage());
520581
onFail.invoke(error);
521582
}
522583

523584
private void userExceptionCallback(Exception ex, final Callback onFail) {
524585
WritableMap error = Arguments.createMap();
525-
error.putInt("errorCode", ex.hashCode());
526-
error.putString("errorMessage", ex.getMessage());
527-
error.putString("allErrorMessage", ex.toString());
528-
586+
error.putInt("code", ex.hashCode());
587+
error.putString("message", ex.getMessage());
529588
onFail.invoke(error);
530589
}
531590

android/src/main/java/io/fullstack/firestack/messaging/FirestackMessaging.java

+21-10
Original file line numberDiff line numberDiff line change
@@ -165,31 +165,42 @@ public void unsubscribeFromTopic(String topic, final Callback callback) {
165165
}
166166
}
167167

168+
// String senderId, String messageId, String messageType,
168169
@ReactMethod
169-
public void send(String senderId, String messageId, String messageType, ReadableMap params, final Callback callback) {
170+
public void send(ReadableMap params, final Callback callback) {
171+
ReadableMap data = params.getMap("data");
170172
FirebaseMessaging fm = FirebaseMessaging.getInstance();
171-
RemoteMessage.Builder remoteMessage = new RemoteMessage.Builder(senderId);
172-
remoteMessage.setMessageId(messageId);
173-
remoteMessage.setMessageType(messageType);
174-
ReadableMapKeySetIterator iterator = params.keySetIterator();
173+
RemoteMessage.Builder remoteMessage = new RemoteMessage.Builder(params.getString("sender"));
174+
175+
remoteMessage.setMessageId(params.getString("id"));
176+
remoteMessage.setMessageType(params.getString("type"));
177+
178+
if (params.hasKey("ttl")) {
179+
remoteMessage.setTtl(params.getInt("ttl"));
180+
}
181+
182+
if (params.hasKey("collapseKey")) {
183+
remoteMessage.setCollapseKey(params.getString("collapseKey"));
184+
}
185+
186+
ReadableMapKeySetIterator iterator = data.keySetIterator();
175187

176188
while (iterator.hasNextKey()) {
177189
String key = iterator.nextKey();
178-
ReadableType type = params.getType(key);
190+
ReadableType type = data.getType(key);
179191
if (type == ReadableType.String) {
180-
remoteMessage.addData(key, params.getString(key));
181-
Log.d(TAG, "Firebase send: " + key);
182-
Log.d(TAG, "Firebase send: " + params.getString(key));
192+
remoteMessage.addData(key, data.getString(key));
183193
}
184194
}
185195

186196
try {
187197
fm.send(remoteMessage.build());
188198
WritableMap res = Arguments.createMap();
189199
res.putString("status", "success");
200+
Log.d(TAG, "send: Message sent");
190201
callback.invoke(null, res);
191202
} catch (Exception e) {
192-
Log.e(TAG, "Error sending message", e);
203+
Log.e(TAG, "send: error sending message", e);
193204
WritableMap error = Arguments.createMap();
194205
error.putString("code", e.toString());
195206
error.putString("message", e.toString());

docs/api/authentication.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ Refreshes the current user.
227227

228228
```javascript
229229
firestack.auth().currentUser
230-
.getToken()
230+
.reload()
231231
.then((user) => {})
232232
.catch();
233233
```

docs/api/storage

-1
This file was deleted.

docs/api/storage.md

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
2+
# Storage
3+
4+
Firestack mimics the [Web Firebase SDK Storage](https://firebase.google.com/docs/storage/web/start), whilst
5+
providing some iOS and Android specific functionality.
6+
7+
All Storage operations are accessed via `storage()`.
8+
9+
## Uploading files
10+
11+
### Simple
12+
13+
```javascript
14+
firestack.storage()
15+
.ref('/files/1234')
16+
.putFile('/path/to/file/1234')
17+
.then(uploadedFile => {
18+
//success
19+
})
20+
.catch(err => {
21+
//Error
22+
});
23+
```
24+
25+
### Listen to upload state
26+
27+
```javascript
28+
const unsubscribe = firestack.storage()
29+
.ref('/files/1234')
30+
.putFile('/path/to/file/1234')
31+
.on('state_changed', snapshot => {
32+
//Current upload state
33+
}, err => {
34+
//Error
35+
unsubscribe();
36+
}, uploadedFile => {
37+
//Success
38+
unsubscribe();
39+
});
40+
```
41+
42+
## Downloading files
43+
44+
### Simple
45+
46+
```javascript
47+
firestack.storage()
48+
.ref('/files/1234')
49+
.downloadFile('/path/to/save/file')
50+
.then(downloadedFile => {
51+
//success
52+
})
53+
.catch(err => {
54+
//Error
55+
});
56+
```
57+
58+
### Listen to download state
59+
60+
```javascript
61+
const unsubscribe = firestack.storage()
62+
.ref('/files/1234')
63+
.downloadFile('/path/to/save/file')
64+
.on('state_changed', snapshot => {
65+
//Current download state
66+
}, err => {
67+
//Error
68+
unsubscribe();
69+
}, downloadedFile => {
70+
//Success
71+
unsubscribe();
72+
});
73+
```
74+
75+
## TODO
76+
77+
There are a few methods which have not yet been implemented for Storage:
78+
79+
### Reference
80+
- put()
81+
- putString()
82+
83+
### UploadTask
84+
- cancel()
85+
- pause()
86+
- resume()
87+
88+
### DownloadTask
89+
- cancel()
90+
- pause()
91+
- resume()

lib/modules/auth/Email.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export default {
2+
credential(email, password) {
3+
return {
4+
token: email,
5+
secret: password,
6+
provider: 'password',
7+
};
8+
},
9+
};

0 commit comments

Comments
 (0)