Skip to content

Commit 5199f6f

Browse files
authored
Merge pull request #242 from FrankSalad/v3-once-child-added
[v3] Support for ref.once('child_added')
2 parents e7f268c + f1ae6f2 commit 5199f6f

File tree

3 files changed

+22
-11
lines changed

3 files changed

+22
-11
lines changed

ios/Firestack/FirestackDatabase.m

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ - (id) initWithPathAndModifiers:(RCTEventEmitter *) emitter
4242
return self;
4343
}
4444

45+
- (NSString *) absPath:(FIRDatabaseReference *) ref {
46+
NSString *url = ref.URL;
47+
NSString *rooturl = ref.root.URL;
48+
return [[url substringFromIndex:rooturl.length] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
49+
}
50+
4551
- (void) addEventHandler:(NSString *) eventName
4652
{
4753
if (![self isListeningTo:eventName]) {
@@ -51,9 +57,10 @@ - (void) addEventHandler:(NSString *) eventName
5157
title:eventName
5258
props: @{
5359
@"eventName": eventName,
54-
@"path": _path,
60+
@"path": [self absPath:[snapshot ref]],
5561
@"modifiersString": _modifiersString,
56-
@"snapshot": props
62+
@"snapshot": props,
63+
@"handlePath": _path
5764
}];
5865
};
5966
id errorBlock = ^(NSError * _Nonnull error) {
@@ -71,13 +78,15 @@ - (void) addEventHandler:(NSString *) eventName
7178
}
7279

7380
- (void) addSingleEventHandler:(RCTResponseSenderBlock) callback
81+
ofType:(NSString *) type
7482
{
75-
[_query observeSingleEventOfType:FIRDataEventTypeValue
83+
int eventType = [self eventTypeFromName:type];
84+
[_query observeSingleEventOfType:eventType
7685
withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
77-
NSDictionary *props = [self snapshotToDict:snapshot];
86+
NSDictionary *props = [FirestackDBReference snapshotToDict:snapshot];
7887
callback(@[[NSNull null], @{
79-
@"eventName": @"value",
80-
@"path": _path,
88+
@"eventName": type,
89+
@"path": [self absPath:[snapshot ref]],
8190
@"modifiersString": _modifiersString,
8291
@"snapshot": props
8392
}]);
@@ -489,7 +498,7 @@ - (id) init
489498
callback:(RCTResponseSenderBlock) callback)
490499
{
491500
FirestackDBReference *ref = [self getDBHandle:path modifiers:modifiers modifiersString:modifiersString];
492-
[ref addSingleEventHandler:callback];
501+
[ref addSingleEventHandler:callback ofType:name];
493502
}
494503

495504
RCT_EXPORT_METHOD(off:(NSString *)path

lib/modules/database/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,14 @@ export default class Database extends Base {
185185
*/
186186
_handleDatabaseEvent(event: Object) {
187187
const body = event.body || {};
188-
const { path, modifiersString, eventName, snapshot } = body;
189-
const handle = this._handle(path, modifiersString);
188+
const { path, modifiersString, eventName, snapshot, handlePath } = body;
189+
const handle = this._handle(handlePath, modifiersString);
190190

191191
this.log.debug('_handleDatabaseEvent: ', handle, eventName, snapshot && snapshot.key);
192192

193193
if (this.subscriptions[handle] && this.subscriptions[handle][eventName]) {
194194
this.subscriptions[handle][eventName].forEach((cb) => {
195-
cb(new Snapshot(new Reference(this, path.split('/'), modifiersString.split('|')), snapshot), body);
195+
cb(new Snapshot(new Reference(this, path, modifiersString.split('|')), snapshot), body);
196196
});
197197
} else {
198198
FirestackDatabase.off(path, modifiersString, eventName, () => {

lib/modules/database/reference.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ export default class Reference extends ReferenceBase {
120120
const modifiers = this.query.getModifiers();
121121
const modifiersString = this.query.getModifiersString();
122122
return promisify('onOnce', FirestackDatabase)(path, modifiersString, modifiers, eventName)
123-
.then(({ snapshot }) => new Snapshot(this, snapshot))
123+
.then(({ snapshot, path, modifiersString}) => new Snapshot(
124+
new Reference(this.db, path, modifiersString.split('|')),
125+
snapshot))
124126
.then((snapshot) => {
125127
if (isFunction(cb)) cb(snapshot);
126128
return snapshot;

0 commit comments

Comments
 (0)