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

Commit c3095be

Browse files
#34 Support The New Firebase.
1 parent 86433e9 commit c3095be

File tree

10 files changed

+219
-110
lines changed

10 files changed

+219
-110
lines changed

README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ If you can spare 41 seconds, please check this video of the [demo app](https://g
1515
* you want to update clients at the moment the data changes (think chat and multiplayer games).
1616

1717
## Prerequisites
18-
NativeScript 1.3.0 (`tns --version`) is required for smooth installation, so please upgrade if you need to.
18+
Head on over to [https://console.firebase.google.com/](https://console.firebase.google.com/) and sign up for a free account.
19+
Your first 'Firebase' will be automatically created and made available via a URL like `https://n-plugin-test.firebaseio.com`.
1920

20-
Head on over to firebase.com and sign up for a free account.
21-
Your first 'Firebase' will be automatically created and made available via a URL
22-
like `https://resplendent-fire-4211.firebaseio.com/`.
21+
Open your Firebase project at the Google console and click 'Add app' to add an iOS and / or Android app.
22+
Follow the steps (make sure the bundle id is the same as your nativescript.id in `package.json` and you'll be able to download:
23+
* `GoogleService-Info.plist` which you'll add to your NativeScript project at `app/App_Resources/iOS/GoogleService-Info.plist`
24+
* `google-services.json` which you'll add to your NativeScript project at `platforms/android/google-services.json`
2325

2426
## Installation
2527
From the command prompt go to your app's root folder and execute:
@@ -37,7 +39,6 @@ And here's the comprehensive list of supported functions:
3739
var firebase = require("nativescript-plugin-firebase");
3840

3941
firebase.init({
40-
url: 'https://resplendent-fire-4211.firebaseio.com',
4142
persist: true // Allow disk persistence. Default false.
4243
}).then(
4344
function (instance) {
@@ -304,7 +305,7 @@ The Firebase Dashboard can be reached by simply loading your Firebase URL in a w
304305

305306
### Testing your app in the emulator
306307

307-
`tns emulate ios --device iPhone-6s`
308+
`tns emulate ios --device "iPhone 6s"`
308309

309310
`tns emulate android --geny "Nexus 6_23"`
310311

firebase-common.d.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,4 @@ declare module "nativescript-plugin-firebase" {
4040
FIRST,
4141
LAST
4242
}
43-
44-
/**
45-
* Logout of the Firebase instance you previously logged in to.
46-
*/
47-
function logout(): void;
4843
}

firebase-common.js

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,4 @@ firebase.QueryRangeType = {
2525

2626
firebase.instance = null;
2727

28-
// this implementation is actually the same for both platforms, woohoo :)
29-
firebase.logout = function (arg) {
30-
return new Promise(function (resolve, reject) {
31-
try {
32-
instance.unauth();
33-
resolve();
34-
} catch (ex) {
35-
console.log("Error in firebase.logout: " + ex);
36-
reject(ex);
37-
}
38-
});
39-
};
40-
4128
module.exports = firebase;

firebase.android.js

Lines changed: 148 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,16 @@ firebase.getCallbackData = function(type, snapshot) {
8585
firebase.init = function (arg) {
8686
return new Promise(function (resolve, reject) {
8787
try {
88-
var Firebase = com.firebase.client.Firebase;
89-
Firebase.setAndroidContext(appModule.android.context);
90-
if (arg.persist && !Firebase.getDefaultConfig().isPersistenceEnabled()) {
91-
Firebase.getDefaultConfig().setPersistenceEnabled(true);
88+
var fDatabase = com.google.firebase.database.FirebaseDatabase;
89+
// console.log("fDatabase: " + fDatabase);
90+
if (arg.persist) {
91+
fDatabase.getInstance().setPersistenceEnabled(true);
9292
}
93-
instance = new Firebase(arg.url);
93+
// the URL is picked up from google-services.json, so you can use it like this:
94+
instance = fDatabase.getInstance().getReference();
95+
// it is however still possible to pass the URL programmatically (which we'll do for now):
96+
// instance = fDatabase.getInstance().getReferenceFromUrl(arg.url);
97+
9498
resolve(instance);
9599
} catch (ex) {
96100
console.log("Error in firebase.init: " + ex);
@@ -99,10 +103,25 @@ firebase.init = function (arg) {
99103
});
100104
};
101105

106+
firebase.logout = function (arg) {
107+
return new Promise(function (resolve, reject) {
108+
try {
109+
com.google.firebase.auth.FirebaseAuth.getInstance().signOut();
110+
resolve();
111+
} catch (ex) {
112+
console.log("Error in firebase.logout: " + ex);
113+
reject(ex);
114+
}
115+
});
116+
};
117+
118+
firebase.authStateListener = null;
119+
102120
firebase.login = function (arg) {
103121
return new Promise(function (resolve, reject) {
104122
try {
105-
var authorizer = new com.firebase.client.Firebase.AuthResultHandler({
123+
/*
124+
var authorizer = new com.google.firebase.database.DatabaseReference.AuthResultHandler({
106125
onAuthenticated: function (authData) {
107126
resolve({
108127
uid: authData.getUid(),
@@ -112,23 +131,67 @@ firebase.login = function (arg) {
112131
token: authData.getToken()
113132
});
114133
},
115-
onAuthenticationError: function (firebaseError) {
116-
reject(firebaseError.getMessage());
134+
onAuthenticationError: function (databaseError) {
135+
reject(databaseError.getMessage());
117136
}
118137
});
138+
*/
119139

120-
var type = arg.type;
140+
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
121141

122-
if (type === firebase.LoginType.ANONYMOUS) {
123-
instance.authAnonymously(authorizer);
124-
} else if (type === firebase.LoginType.PASSWORD) {
142+
if (firebase.authStateListener !== null) {
143+
firebaseAuth.removeAuthStateListener(firebase.authStateListener);
144+
}
145+
146+
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({
147+
onAuthStateChanged: function (fbAuth) {
148+
console.log("--- auth state changed: " + fbAuth);
149+
var user = fbAuth.getCurrentUser();
150+
console.log("--- user: " + user);
151+
if (user !== null) {
152+
// signed in
153+
resolve({
154+
uid: user.getUid(),
155+
name: user.getDisplayName(),
156+
email: user.getEmail(),
157+
// TODO add these properties, see https://firebase.google.com/docs/auth/android/manage-users#get_a_users_profile
158+
// provider: authData.getProvider(),
159+
// expiresAtUnixEpochSeconds: authData.getExpires(),
160+
profileImageURL: user.getPhotoUrl()
161+
// token: user.getToken() // can be used to auth with a backend server
162+
});
163+
} else {
164+
// reject("Logging in the user failed");
165+
}
166+
}
167+
});
168+
169+
firebaseAuth.addAuthStateListener(firebase.authStateListener);
170+
171+
if (arg.type === firebase.LoginType.ANONYMOUS) {
172+
var onFailureListener = new com.google.android.gms.tasks.OnFailureListener({
173+
onFailure: function (throwable) {
174+
reject("Anonymous login failed with message: " + throwable.getMessage());
175+
}
176+
});
177+
firebaseAuth.signInAnonymously().addOnFailureListener(onFailureListener);
178+
} else if (arg.type === firebase.LoginType.PASSWORD) {
125179
if (!arg.email || !arg.password) {
126180
reject("Auth type emailandpassword requires an email and password argument");
127181
} else {
128-
instance.authWithPassword(arg.email, arg.password, authorizer);
182+
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
183+
onComplete: function (task) {
184+
if (!task.isSuccessful()) {
185+
reject("Logging in the user failed");
186+
} else {
187+
// the AuthStateListener.onAuthStateChanged callback will resolve the promise
188+
}
189+
}
190+
});
191+
firebaseAuth.signInWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener);
129192
}
130193
} else {
131-
reject ("Unsupported auth type: " + type);
194+
reject ("Unsupported auth type: " + arg.type);
132195
}
133196
} catch (ex) {
134197
console.log("Error in firebase.login: " + ex);
@@ -140,19 +203,23 @@ firebase.login = function (arg) {
140203
firebase.resetPassword = function (arg) {
141204
return new Promise(function (resolve, reject) {
142205
try {
143-
var resultHandler = new com.firebase.client.Firebase.ResultHandler({
144-
onSuccess: function () {
145-
resolve();
146-
},
147-
onError: function (firebaseError) {
148-
reject(firebaseError.getMessage());
149-
}
150-
});
151-
152206
if (!arg.email) {
153207
reject("Resetting a password requires an email argument");
154208
} else {
155-
instance.resetPassword(arg.email, resultHandler);
209+
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
210+
onComplete: function (task) {
211+
console.log("--- reset pwd: " + task);
212+
if (task.isSuccessful()) {
213+
resolve();
214+
} else {
215+
// TODO extract error
216+
reject("Sending password reset email failed");
217+
}
218+
}
219+
});
220+
221+
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
222+
firebaseAuth.sendPasswordResetEmail(arg.email).addOnCompleteListener(onCompleteListener);
156223
}
157224
} catch (ex) {
158225
console.log("Error in firebase.resetPassword: " + ex);
@@ -164,19 +231,28 @@ firebase.resetPassword = function (arg) {
164231
firebase.changePassword = function (arg) {
165232
return new Promise(function (resolve, reject) {
166233
try {
167-
var resultHandler = new com.firebase.client.Firebase.ResultHandler({
168-
onSuccess: function () {
169-
resolve();
170-
},
171-
onError: function (firebaseError) {
172-
reject(firebaseError.getMessage());
173-
}
174-
});
175-
176234
if (!arg.email || !arg.oldPassword || !arg.newPassword) {
177235
reject("Changing a password requires an email and an oldPassword and a newPassword arguments");
178236
} else {
179-
instance.changePassword(arg.email, arg.oldPassword, arg.newPassword, resultHandler);
237+
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
238+
onComplete: function (task) {
239+
console.log("--- changed pwd: " + task);
240+
if (task.isSuccessful()) {
241+
resolve();
242+
} else {
243+
// TODO extract error
244+
reject("Updating password failed");
245+
}
246+
}
247+
});
248+
249+
var user = com.google.firebase.auth.FirebaseAuth.getInstance().getCurrentUser();
250+
251+
if (user === null) {
252+
reject("Please log the user in first");
253+
} else {
254+
user.updatePassword(arg.newPassword).addOnCompleteListener(onCompleteListener);
255+
}
180256
}
181257
} catch (ex) {
182258
console.log("Error in firebase.changePassword: " + ex);
@@ -188,22 +264,40 @@ firebase.changePassword = function (arg) {
188264
firebase.createUser = function (arg) {
189265
return new Promise(function (resolve, reject) {
190266
try {
191-
var valueResultHandler = new com.firebase.client.Firebase.ValueResultHandler({
192-
onSuccess: function (authData) {
193-
console.log("--- created: " + authData);
194-
resolve({
195-
key: firebase.toJsObject(authData).uid
196-
});
197-
},
198-
onError: function (firebaseError) {
199-
reject(firebaseError.getMessage());
200-
}
201-
});
202-
203267
if (!arg.email || !arg.password) {
204268
reject("Creating a user requires an email and password argument");
205269
} else {
206-
instance.createUser(arg.email, arg.password, valueResultHandler);
270+
var firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
271+
272+
var onCompleteListener = new com.google.android.gms.tasks.OnCompleteListener({
273+
onComplete: function (task) {
274+
if (!task.isSuccessful()) {
275+
reject("Creating a user failed");
276+
} else {
277+
// the AuthStateListener.onAuthStateChanged callback will resolve the promise
278+
}
279+
}
280+
});
281+
282+
if (firebase.authStateListener !== null) {
283+
firebaseAuth.removeAuthStateListener(firebase.authStateListener);
284+
}
285+
286+
firebase.authStateListener = new com.google.firebase.auth.FirebaseAuth.AuthStateListener({
287+
onAuthStateChanged: function (fbAuth) {
288+
console.log("--- auth state changed: " + fbAuth);
289+
var user = fbAuth.getCurrentUser();
290+
if (user !== null) {
291+
// signed in
292+
resolve({
293+
key: user.getUid()
294+
});
295+
}
296+
}
297+
});
298+
299+
firebaseAuth.addAuthStateListener(firebase.authStateListener);
300+
firebaseAuth.createUserWithEmailAndPassword(arg.email, arg.password).addOnCompleteListener(onCompleteListener);
207301
}
208302
} catch (ex) {
209303
console.log("Error in firebase.createUser: " + ex);
@@ -213,7 +307,7 @@ firebase.createUser = function (arg) {
213307
};
214308

215309
firebase._addObservers = function(to, updateCallback) {
216-
var listener = new com.firebase.client.ChildEventListener({
310+
var listener = new com.google.firebase.database.ChildEventListener({
217311
onChildAdded: function (snapshot, previousChildKey) {
218312
updateCallback(firebase.getCallbackData('ChildAdded', snapshot));
219313
},
@@ -245,13 +339,13 @@ firebase.addChildEventListener = function (updateCallback, path) {
245339
firebase.addValueEventListener = function (updateCallback, path) {
246340
return new Promise(function (resolve, reject) {
247341
try {
248-
var listener = new com.firebase.client.ValueEventListener({
342+
var listener = new com.google.firebase.database.ValueEventListener({
249343
onDataChange: function (snapshot) {
250344
updateCallback(firebase.getCallbackData('ValueChanged', snapshot));
251345
},
252-
onCancelled: function (firebaseError) {
346+
onCancelled: function (databaseError) {
253347
updateCallback({
254-
error: firebaseError.getMessage()
348+
error: databaseError.getMessage()
255349
});
256350
}
257351
});
@@ -374,13 +468,13 @@ firebase.query = function (updateCallback, path, options) {
374468
}
375469

376470
if (options.singleEvent) {
377-
var listener = new com.firebase.client.ValueEventListener({
471+
var listener = new com.google.firebase.database.ValueEventListener({
378472
onDataChange: function (snapshot) {
379473
updateCallback(firebase.getCallbackData('ValueChanged', snapshot));
380474
},
381-
onCancelled: function (firebaseError) {
475+
onCancelled: function (databaseError) {
382476
updateCallback({
383-
error: firebaseError.getMessage()
477+
error: databaseError.getMessage()
384478
});
385479
}
386480
});

firebase.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ declare module "nativescript-plugin-firebase" {
125125

126126
export function init(options: InitOptions): Promise<any>;
127127
export function login(options: LoginOptions): Promise<LoginResult>;
128+
export function logout(): Promise<any>;
128129
export function createUser(options: CreateUserOptions): Promise<CreateUserResult>;
129130
export function resetPassword(options: ResetPasswordOptions): Promise<any>;
130131
export function changePassword(options: ChangePasswordOptions): Promise<any>;

0 commit comments

Comments
 (0)