Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit c343398

Browse files
Adding additionalUserInfo and metadata to sign in response #763 #764
1 parent 323e24c commit c343398

File tree

7 files changed

+125
-108
lines changed

7 files changed

+125
-108
lines changed

demo/app/main-page.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@
121121
<Button row="12" col="1" text="send email conf" tap="{{ doSendEmailVerification }}" class="button"/>
122122

123123
<Button row="13" col="0" text="get current user" tap="{{ doGetCurrentUser }}" class="button"/>
124-
<Button row="13" col="1" text="logout" tap="{{ doLogout }}" class="button"/>
124+
<Button row="13" col="1" text="logout" tap="{{ doLogout }}" class="button button-user"/>
125125

126126
<Label row="14" colSpan="2" text="Methods on path /users" class="subtitle"/>
127127

demo/app/main-view-model.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,7 @@ export class HelloWorldModel extends Observable {
733733
type: firebase.LoginType.ANONYMOUS
734734
}).then(
735735
result => {
736+
console.log("Anonymous login OK: " + JSON.stringify(result));
736737
alert({
737738
title: "Login OK",
738739
message: JSON.stringify(result),
@@ -862,6 +863,7 @@ export class HelloWorldModel extends Observable {
862863
}
863864
}).then(
864865
result => {
866+
console.log("Password login OK: " + JSON.stringify(result));
865867
alert({
866868
title: "Login OK",
867869
message: JSON.stringify(result),
@@ -881,6 +883,8 @@ export class HelloWorldModel extends Observable {
881883
);
882884
},
883885
errorMessage => {
886+
console.log("Login error: " + errorMessage);
887+
this.set("userEmailOrPhone", errorMessage);
884888
alert({
885889
title: "Login error",
886890
message: errorMessage,
@@ -909,6 +913,7 @@ export class HelloWorldModel extends Observable {
909913
}
910914
}).then(
911915
result => {
916+
console.log("Phone login OK: " + JSON.stringify(result));
912917
alert({
913918
title: "Phone login OK",
914919
message: JSON.stringify(result),
@@ -945,6 +950,7 @@ export class HelloWorldModel extends Observable {
945950
}
946951
}).then(
947952
result => {
953+
console.log("Email link sent");
948954
alert({
949955
title: "Email link sent",
950956
message: "Check your email :)",
@@ -968,6 +974,7 @@ export class HelloWorldModel extends Observable {
968974
type: firebase.LoginType.FACEBOOK
969975
}).then(
970976
result => {
977+
console.log("Facebook login OK: " + JSON.stringify(result));
971978
alert({
972979
title: "Login OK",
973980
message: JSON.stringify(result),
@@ -990,6 +997,7 @@ export class HelloWorldModel extends Observable {
990997
type: firebase.LoginType.GOOGLE
991998
}).then(
992999
result => {
1000+
console.log("Google login OK: " + JSON.stringify(result));
9931001
alert({
9941002
title: "Login OK",
9951003
message: JSON.stringify(result),
@@ -1010,13 +1018,16 @@ export class HelloWorldModel extends Observable {
10101018
firebase.resetPassword({
10111019
10121020
}).then(
1013-
result => {
1021+
() => {
1022+
console.log("Password reset. Check your email.");
1023+
this.set("userEmailOrPhone", "Password reset mail sent to [email protected].");
10141024
alert({
10151025
title: "Password reset. Check your email.",
10161026
okButtonText: "OK, nice!"
10171027
});
10181028
},
10191029
error => {
1030+
console.log("Password reset error: " + error);
10201031
alert({
10211032
title: "Password reset error",
10221033
message: error,
@@ -1048,12 +1059,14 @@ export class HelloWorldModel extends Observable {
10481059
firebase.logout().then(
10491060
() => {
10501061
this.set("userEmailOrPhone", null);
1062+
console.log("Logout OK");
10511063
alert({
10521064
title: "Logout OK",
10531065
okButtonText: "OK, bye!"
10541066
});
10551067
},
10561068
error => {
1069+
console.log("Logout error: " + error);
10571070
alert({
10581071
title: "Logout error",
10591072
message: error,

docs/AUTHENTICATION.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,24 @@ All login functions below, as well as `getCurrentUser` return a 'User' object wi
2727
|`profileImageURL`|yes|A string containing a link to a user image on the web
2828
|`phoneNumber`|yes|The user's phone number
2929
|`refreshToken`|yes|iOS only
30+
|`additionalUserInfo`|no|See `AdditionalUserInfo` below
31+
|`metadata`|no|See `UserMetadata` below
3032

33+
### `AdditionalUserInfo`
34+
35+
|param|optional|description
36+
|---|---|---
37+
|`profile`|yes|Any profile data the auth provider may supply. Type is `Map<string, any>`.
38+
|`providerId`|no|The provider that was used to login this time. Example: `password` or `google.com`.
39+
|`username`|yes|The username, usually `null`.
40+
|`isNewUser`|no|Whether or not the user was just created.
41+
42+
### `UserMetadata`
43+
44+
|param|optional|description
45+
|---|---|---
46+
|`creationTimestamp`|no|Type is `Date`.
47+
|`lastSignInTimestamp`|no|Type is `Date`.
3148

3249
## Functions
3350
You can either use the Native API, or the Web API. It's just a matter of personal background or preference. Under the hood the implementations are identical.

src/firebase.android.ts

Lines changed: 33 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { ad as AndroidUtils, layout } from "tns-core-modules/utils/utils";
55
import lazy from "tns-core-modules/utils/lazy";
66
import { topmost } from "tns-core-modules/ui/frame";
77
import { File } from "tns-core-modules/file-system";
8-
import {firestore, User} from "./firebase";
8+
import { firestore, User } from "./firebase";
99

1010
declare const android, com, org: any;
1111

@@ -20,7 +20,6 @@ let fbCallbackManager = null;
2020
const GOOGLE_SIGNIN_INTENT_ID = 123;
2121
const REQUEST_INVITE_INTENT_ID = 48;
2222

23-
// const gson = lazy(() => typeof(com.google.gson) === "undefined" ? null : new com.google.gson.Gson());
2423
const messagingEnabled = lazy(() => typeof(com.google.firebase.messaging) !== "undefined");
2524
const dynamicLinksEnabled = lazy(() => typeof(com.google.android.gms.appinvite) !== "undefined");
2625

@@ -199,21 +198,7 @@ firebase.toValue = val => {
199198
return returnVal;
200199
};
201200

202-
// no longer using Gson as fi Firestore's DocumentReference isn't serialized (also removed it from the dependencies)
203201
firebase.toJsObject = javaObj => {
204-
// if (gson() !== null) {
205-
// try {
206-
// return JSON.parse(gson().toJson(javaObj)); // this may fail if fi a DocumentReference is encountered
207-
// } catch (ignore) {
208-
// return firebase.toJsObjectLegacy(javaObj);
209-
// }
210-
// } else {
211-
// fallback for folks not having fetched gson yet in their build for some reason
212-
return firebase.toJsObjectLegacy(javaObj);
213-
// }
214-
};
215-
216-
firebase.toJsObjectLegacy = javaObj => {
217202
if (javaObj === null || typeof javaObj !== "object") {
218203
return javaObj;
219204
}
@@ -242,7 +227,7 @@ firebase.toJsObjectLegacy = javaObj => {
242227
case 'java.util.ArrayList':
243228
node = [];
244229
for (let i = 0; i < javaObj.size(); i++) {
245-
node[i] = firebase.toJsObjectLegacy(javaObj.get(i));
230+
node[i] = firebase.toJsObject(javaObj.get(i));
246231
}
247232
break;
248233
default:
@@ -251,7 +236,7 @@ firebase.toJsObjectLegacy = javaObj => {
251236
const iterator = javaObj.entrySet().iterator();
252237
while (iterator.hasNext()) {
253238
const item = iterator.next();
254-
node[item.getKey()] = firebase.toJsObjectLegacy(item.getValue());
239+
node[item.getKey()] = firebase.toJsObject(item.getValue());
255240
}
256241
} catch (e) {
257242
console.log("PLEASE REPORT THIS AT https://github.com/NativeScript/NativeScript/issues: Tried to serialize an unsupported type: javaObj.getClass().getName(), error: " + e);
@@ -316,7 +301,7 @@ firebase.init = arg => {
316301
const user = fbAuth.getCurrentUser();
317302
arg.onAuthStateChanged({
318303
loggedIn: user !== null,
319-
user: toLoginResult(user, null)
304+
user: toLoginResult(user)
320305
});
321306
}
322307
});
@@ -330,7 +315,7 @@ firebase.init = arg => {
330315
const user = fbAuth.getCurrentUser();
331316
firebase.notifyAuthStateListeners({
332317
loggedIn: user !== null,
333-
user: toLoginResult(user, null)
318+
user: toLoginResult(user)
334319
});
335320
}
336321
});
@@ -882,7 +867,7 @@ firebase.getCurrentUser = arg => {
882867
const firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
883868
const user = firebaseAuth.getCurrentUser();
884869
if (user !== null) {
885-
resolve(toLoginResult(user, null));
870+
resolve(toLoginResult(user));
886871
} else {
887872
reject();
888873
}
@@ -974,7 +959,7 @@ firebase.getAuthToken = arg => {
974959
});
975960
};
976961

977-
function toLoginResult(user, additionalUserInfo): User {
962+
function toLoginResult(user, additionalUserInfo?): User {
978963
if (user === null) {
979964
return null;
980965
}
@@ -992,33 +977,33 @@ function toLoginResult(user, additionalUserInfo): User {
992977
}
993978
}
994979

995-
const loginResult: User = {
996-
uid: user.getUid(),
997-
name: user.getDisplayName(),
998-
email: user.getEmail(),
999-
emailVerified: user.isEmailVerified(),
1000-
// provider: user.getProviderId(), // always 'firebase'
1001-
providers: providers,
1002-
anonymous: user.isAnonymous(),
1003-
isAnonymous: user.isAnonymous(),
1004-
phoneNumber: user.getPhoneNumber(),
1005-
profileImageURL: user.getPhotoUrl() ? user.getPhotoUrl().toString() : null,
1006-
metadata: {
1007-
creationTimestamp: new Date(user.getMetadata().getCreationTimestamp() as number),
1008-
lastSignInTimestamp: new Date(user.getMetadata().getLastSignInTimestamp() as number)
1009-
}
1010-
};
980+
const loginResult: User = {
981+
uid: user.getUid(),
982+
name: user.getDisplayName(),
983+
email: user.getEmail(),
984+
emailVerified: user.isEmailVerified(),
985+
// provider: user.getProviderId(), // always 'firebase'
986+
providers: providers,
987+
anonymous: user.isAnonymous(),
988+
isAnonymous: user.isAnonymous(),
989+
phoneNumber: user.getPhoneNumber(),
990+
profileImageURL: user.getPhotoUrl() ? user.getPhotoUrl().toString() : null,
991+
metadata: {
992+
creationTimestamp: new Date(user.getMetadata().getCreationTimestamp() as number),
993+
lastSignInTimestamp: new Date(user.getMetadata().getLastSignInTimestamp() as number)
994+
}
995+
};
1011996

1012-
if (additionalUserInfo !== null) {
1013-
loginResult.additionalUserInfo = {
1014-
profile: additionalUserInfo.getProfile(),
1015-
providerId: additionalUserInfo.getProviderId(),
1016-
username: additionalUserInfo.getUsername(),
1017-
isNewUser: additionalUserInfo.isNewUser()
1018-
};
997+
if (additionalUserInfo) {
998+
loginResult.additionalUserInfo = {
999+
providerId: additionalUserInfo.getProviderId(),
1000+
username: additionalUserInfo.getUsername(),
1001+
isNewUser: additionalUserInfo.isNewUser(),
1002+
profile: firebase.toJsObject(additionalUserInfo.getProfile())
10191003
}
1004+
}
10201005

1021-
return loginResult;
1006+
return loginResult;
10221007
}
10231008

10241009
firebase.login = arg => {
@@ -1086,7 +1071,7 @@ firebase.login = arg => {
10861071
}
10871072

10881073
const actionCodeSettings = com.google.firebase.auth.ActionCodeSettings.newBuilder()
1089-
// URL you want to redirect back to. The domain must be whitelisted in the Firebase Console.
1074+
// URL you want to redirect back to. The domain must be whitelisted in the Firebase Console.
10901075
.setUrl(arg.emailLinkOptions.url)
10911076
.setHandleCodeInApp(true)
10921077
.setIOSBundleId(arg.emailLinkOptions.iOS ? arg.emailLinkOptions.iOS.bundleId : appModule.android.context.getPackageName())
@@ -1122,7 +1107,7 @@ firebase.login = arg => {
11221107

11231108
if (user && firebase._alreadyLinkedToAuthProvider(user, "phone")) {
11241109
// skip sending an SMS if user is already linked to the phone-provider
1125-
resolve(toLoginResult(user, null));
1110+
resolve(toLoginResult(user));
11261111
return;
11271112
}
11281113

src/firebase.d.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ export interface User {
300300
providers: Array<Provider>;
301301
profileImageURL?: string;
302302
metadata: UserMetadata;
303-
additionalUserInfo?: AdditionalUserInfo
303+
additionalUserInfo?: AdditionalUserInfo;
304304
/** iOS only */
305305
refreshToken?: string;
306306
}
@@ -309,18 +309,18 @@ export interface User {
309309
* The metadata of the user
310310
*/
311311
export interface UserMetadata {
312-
creationTimestamp: Date,
313-
lastSignInTimestamp: Date
312+
creationTimestamp: Date;
313+
lastSignInTimestamp: Date;
314314
}
315315

316316
/**
317317
* Contains additional user information
318318
*/
319319
export interface AdditionalUserInfo {
320-
profile: Map<string, any>;
321-
providerId: string;
322-
username: string;
323-
isNewUser: boolean
320+
profile: Map<string, any>;
321+
providerId: string;
322+
username: string;
323+
isNewUser: boolean;
324324
}
325325

326326
/**
@@ -416,9 +416,9 @@ export interface GetRemoteConfigOptions {
416416
/**
417417
* The configuration properties to retrieve for your app. Specify as:
418418
* properties: [{
419-
* key: "holiday_promo_enabled",
420-
* default: false
421-
* }, ..]
419+
* key: "holiday_promo_enabled",
420+
* default: false
421+
* }, ..]
422422
*/
423423
properties: Array<RemoteConfigProperty>;
424424
}
@@ -441,9 +441,9 @@ export interface GetRemoteConfigResult {
441441
* A JS Object with properties and values.
442442
* If you previously requested keys ["foo", "is_enabled"] then this will be like:
443443
* properties: {
444-
* foo: "bar",
445-
* is_enabled: true
446-
* }
444+
* foo: "bar",
445+
* is_enabled: true
446+
* }
447447
*/
448448
properties: Object;
449449
}
@@ -726,7 +726,9 @@ export namespace firestore {
726726
get: () => Promise<DocumentSnapshot>;
727727
update: (document: any) => Promise<void>;
728728
delete: () => Promise<void>;
729+
729730
onSnapshot(callback: (doc: DocumentSnapshot) => void): () => void;
731+
730732
android?: any;
731733
ios?: any;
732734
}

0 commit comments

Comments
 (0)