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

Commit 6022664

Browse files
#129 return a listener+path from firebase._addObservers
1 parent 73fce2e commit 6022664

File tree

3 files changed

+105
-24
lines changed

3 files changed

+105
-24
lines changed

firebase.android.js

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,8 @@ firebase.getRemoteConfig = function (arg) {
356356

357357
// Enable developer mode to allow for frequent refreshes of the cache
358358
var remoteConfigSettings = new com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings.Builder()
359-
.setDeveloperModeEnabled(arg.developerMode || false)
360-
.build();
359+
.setDeveloperModeEnabled(arg.developerMode || false)
360+
.build();
361361
firebaseRemoteConfig.setConfigSettings(remoteConfigSettings);
362362

363363
var defaults = firebase.getRemoteConfigDefaults(arg.properties);
@@ -812,13 +812,16 @@ firebase._addObservers = function(to, updateCallback) {
812812
}
813813
});
814814
to.addChildEventListener(listener);
815+
return listener;
815816
};
816817

817818
firebase.addChildEventListener = function (updateCallback, path) {
818819
return new Promise(function (resolve, reject) {
819820
try {
820-
firebase._addObservers(firebase.instance.child(path), updateCallback);
821-
resolve();
821+
resolve({
822+
path: path,
823+
listeners: [firebase._addObservers(firebase.instance.child(path), updateCallback)]
824+
});
822825
} catch (ex) {
823826
console.log("Error in firebase.addChildEventListener: " + ex);
824827
reject(ex);
@@ -840,7 +843,10 @@ firebase.addValueEventListener = function (updateCallback, path) {
840843
}
841844
});
842845
firebase.instance.child(path).addValueEventListener(listener);
843-
resolve();
846+
resolve({
847+
path: path,
848+
listeners: [listener]
849+
});
844850
} catch (ex) {
845851
console.log("Error in firebase.addValueEventListener: " + ex);
846852
reject(ex);
@@ -851,7 +857,7 @@ firebase.addValueEventListener = function (updateCallback, path) {
851857
firebase.removeEventListener = function (listener, path) {
852858
return new Promise(function (resolve, reject) {
853859
try {
854-
console.log("Removing at path " + path + ": " + listener);
860+
console.log("Removing listener at path " + path + ": " + listener);
855861
firebase.instance.child(path).removeEventListener(listener);
856862
resolve();
857863
} catch (ex) {
@@ -861,6 +867,23 @@ firebase.removeEventListener = function (listener, path) {
861867
});
862868
};
863869

870+
firebase.removeEventListeners = function (listeners, path) {
871+
return new Promise(function (resolve, reject) {
872+
try {
873+
var ref = firebase.instance.child(path);
874+
for (var i=0; i < listeners.length; i++) {
875+
var listener = listeners[i];
876+
console.log("Removing listener at path " + path + ": " + listener);
877+
ref.removeEventListener(listener);
878+
}
879+
resolve();
880+
} catch (ex) {
881+
console.log("Error in firebase.removeEventListeners: " + ex);
882+
reject(ex);
883+
}
884+
});
885+
};
886+
864887
firebase.push = function (path, val) {
865888
return new Promise(function (resolve, reject) {
866889
try {
@@ -997,8 +1020,10 @@ firebase.query = function (updateCallback, path, options) {
9971020
});
9981021
query.addListenerForSingleValueEvent(listener);
9991022
} else {
1000-
firebase._addObservers(query, updateCallback);
1001-
resolve();
1023+
resolve({
1024+
path: path,
1025+
listeners: [firebase._addObservers(query, updateCallback)]
1026+
});
10021027
}
10031028
} catch (ex) {
10041029
console.log("Error in firebase.query: " + ex);

firebase.d.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ declare module "nativescript-plugin-firebase" {
122122
key: string;
123123
}
124124

125+
/**
126+
* The returned object from the addEventListener functions.
127+
*/
128+
export interface AddEventListenerResult {
129+
path: string;
130+
listeners: Array<any>
131+
}
132+
125133
/**
126134
* The returned object from the createUser function.
127135
*/
@@ -358,8 +366,10 @@ declare module "nativescript-plugin-firebase" {
358366
export function update(path: string, value: any): Promise<any>;
359367
export function remove(path: string): Promise<any>;
360368
export function query(onValueEvent: (data: FBData) => void, path: string, options: QueryOptions): Promise<any>;
361-
export function addChildEventListener(onChildEvent: (data: FBData) => void, path: string): Promise<any>;
362-
export function addValueEventListener(onValueEvent: (data: FBData) => void, path: string): Promise<any>;
369+
export function addChildEventListener(onChildEvent: (data: FBData) => void, path: string): Promise<AddEventListenerResult>;
370+
export function addValueEventListener(onValueEvent: (data: FBData) => void, path: string): Promise<AddEventListenerResult>;
371+
export function removeEventListener(listener: any, path: string): Promise<any>;
372+
export function removeEventListeners(listeners: Array<any>, path: string): Promise<any>;
363373
/**
364374
* Tells the client to keep its local cache in sync with the server automatically.
365375
*/

firebase.ios.js

Lines changed: 60 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -830,18 +830,20 @@ firebase.deleteUser = function (arg) {
830830
};
831831

832832
firebase._addObservers = function(to, updateCallback) {
833-
to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildAdded, function (snapshot) {
833+
var listeners = [];
834+
listeners.push(to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildAdded, function (snapshot) {
834835
updateCallback(firebase.getCallbackData('ChildAdded', snapshot));
835-
});
836-
to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildRemoved, function (snapshot) {
836+
}));
837+
listeners.push(to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildRemoved, function (snapshot) {
837838
updateCallback(firebase.getCallbackData('ChildRemoved', snapshot));
838-
});
839-
to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildChanged, function (snapshot) {
839+
}));
840+
listeners.push(to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildChanged, function (snapshot) {
840841
updateCallback(firebase.getCallbackData('ChildChanged', snapshot));
841-
});
842-
to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildMoved, function (snapshot) {
842+
}));
843+
listeners.push(to.observeEventTypeWithBlock(FIRDataEventType.FIRDataEventTypeChildMoved, function (snapshot) {
843844
updateCallback(firebase.getCallbackData('ChildMoved', snapshot));
844-
});
845+
}));
846+
return listeners;
845847
};
846848

847849
firebase.keepInSync = function (path, switchOn) {
@@ -864,8 +866,10 @@ firebase.addChildEventListener = function (updateCallback, path) {
864866
if (path !== undefined) {
865867
where = firebase.instance.childByAppendingPath(path);
866868
}
867-
firebase._addObservers(where, updateCallback);
868-
resolve();
869+
resolve({
870+
path: path,
871+
listeners: firebase._addObservers(where, updateCallback)
872+
});
869873
} catch (ex) {
870874
console.log("Error in firebase.addChildEventListener: " + ex);
871875
reject(ex);
@@ -880,7 +884,7 @@ firebase.addValueEventListener = function (updateCallback, path) {
880884
if (path !== undefined) {
881885
where = firebase.instance.childByAppendingPath(path);
882886
}
883-
where.observeEventTypeWithBlockWithCancelBlock(
887+
var listener = where.observeEventTypeWithBlockWithCancelBlock(
884888
FIRDataEventType.FIRDataEventTypeValue,
885889
function (snapshot) {
886890
updateCallback(firebase.getCallbackData('ValueChanged', snapshot));
@@ -890,14 +894,54 @@ firebase.addValueEventListener = function (updateCallback, path) {
890894
error: firebaseError.localizedDescription
891895
});
892896
});
893-
resolve();
897+
resolve({
898+
path: path,
899+
listeners: [listener]
900+
});
894901
} catch (ex) {
895902
console.log("Error in firebase.addChildEventListener: " + ex);
896903
reject(ex);
897904
}
898905
});
899906
};
900907

908+
firebase.removeEventListener = function (listener, path) {
909+
return new Promise(function (resolve, reject) {
910+
try {
911+
console.log("Removing listener at path " + path + ": " + listener);
912+
var where = firebase.instance;
913+
if (path !== undefined) {
914+
where = firebase.instance.childByAppendingPath(path);
915+
}
916+
where.removeObserverWithHandle(listener);
917+
resolve();
918+
} catch (ex) {
919+
console.log("Error in firebase.removeEventListener: " + ex);
920+
reject(ex);
921+
}
922+
});
923+
};
924+
925+
firebase.removeEventListeners = function (listeners, path) {
926+
return new Promise(function (resolve, reject) {
927+
try {
928+
var where = firebase.instance;
929+
if (path !== undefined) {
930+
where = firebase.instance.childByAppendingPath(path);
931+
}
932+
for (var i=0; i < listeners.length; i++) {
933+
var listener = listeners[i];
934+
console.log("Removing listener at path " + path + ": " + listener);
935+
where.removeObserverWithHandle(listener);
936+
}
937+
resolve();
938+
} catch (ex) {
939+
console.log("Error in firebase.removeEventListeners: " + ex);
940+
reject(ex);
941+
}
942+
});
943+
};
944+
901945
firebase.push = function (path, val) {
902946
return new Promise(function (resolve, reject) {
903947
try {
@@ -1028,8 +1072,10 @@ firebase.query = function (updateCallback, path, options) {
10281072
resolve(firebase.getCallbackData('ValueChanged', snapshot));
10291073
});
10301074
} else {
1031-
firebase._addObservers(query, updateCallback);
1032-
resolve();
1075+
resolve({
1076+
path: path,
1077+
listeners: firebase._addObservers(query, updateCallback)
1078+
});
10331079
}
10341080
} catch (ex) {
10351081
console.log("Error in firebase.query: " + ex);

0 commit comments

Comments
 (0)