Skip to content

Commit bda9f9c

Browse files
committed
fix(database): Unsubscribe to event doesn't work
fixes: #109
1 parent 9e129bc commit bda9f9c

File tree

2 files changed

+34
-43
lines changed

2 files changed

+34
-43
lines changed

packages/firebase-database/index.android.ts

+16-16
Original file line numberDiff line numberDiff line change
@@ -189,17 +189,20 @@ export class Query implements IQuery {
189189
return Query.fromNative(this.native.limitToLast(limit));
190190
}
191191
off(eventType?: EventType, callback?: (a: DataSnapshot, b: string) => void, context?: Record<string, any>): void {
192-
const handle = this.#handles.get({
193-
eventType,
194-
callback,
195-
context,
196-
});
197-
if (handle) {
198-
this.native.removeEventListener(handle as any);
192+
const handle = callback?.['__fbHandle'];
193+
const event = callback?.['__fbEventType'];
194+
if (typeof handle === 'number' && event === eventType) {
195+
if (this.#handles.has(callback)) {
196+
this.native.removeEventListener(handle as any);
197+
callback['__fbHandle'] = undefined;
198+
callback['__fbEventType'] = undefined;
199+
callback['__fbContext'] = undefined;
200+
this.#handles.delete(callback);
201+
}
199202
}
200203
}
201204

202-
#handles: Map<{ eventType: EventType; callback?: (a: DataSnapshot, b: string) => void; context?: any }, com.google.firebase.database.ValueEventListener | com.google.firebase.database.ChildEventListener> = new Map();
205+
#handles: Map<(a: DataSnapshot, b: string) => void, com.google.firebase.database.ValueEventListener | com.google.firebase.database.ChildEventListener> = new Map();
203206

204207
on(eventType: EventType, callback: (data: DataSnapshot, previousChildKey: string) => void, cancelCallbackOrContext?: (a: FirebaseError) => void | Record<string, any>, context?: Record<string, any>): (a: DataSnapshot, b: string) => void {
205208
let handle;
@@ -246,14 +249,11 @@ export class Query implements IQuery {
246249
);
247250
}
248251

249-
this.#handles.set(
250-
{
251-
eventType,
252-
callback,
253-
context,
254-
},
255-
handle
256-
);
252+
callback['__fbHandle'] = handle;
253+
callback['__fbEventType'] = eventType;
254+
callback['__fbContext'] = context;
255+
256+
this.#handles.set(callback, handle);
257257

258258
return callback;
259259
}

packages/firebase-database/index.ios.ts

+18-27
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,10 @@ export function serialize(data: any): any {
3232
}
3333
case 'number': {
3434
const hasDecimals = numberHasDecimals(data);
35-
if (numberIs64Bit(data)) {
36-
if (hasDecimals) {
37-
return NSNumber.alloc().initWithDouble(data);
38-
} else {
39-
return NSNumber.alloc().initWithLongLong(data);
40-
}
35+
if (hasDecimals) {
36+
return NSNumber.numberWithDouble(data);
4137
} else {
42-
if (hasDecimals) {
43-
return NSNumber.alloc().initWithFloat(data);
44-
} else {
45-
return data;
46-
}
38+
return NSNumber.numberWithLongLong(data);
4739
}
4840
}
4941

@@ -245,16 +237,19 @@ export class Query implements IQuery {
245237
return Query.fromNative(this.native.queryLimitedToLast(limit));
246238
}
247239

248-
#handles: Map<{ eventType: EventType; callback?: (a: DataSnapshot, b: string) => void; context?: any }, number> = new Map();
240+
#handles: Map<(a: DataSnapshot, b: string) => void, number> = new Map();
249241

250242
off(eventType?: EventType, callback?: (a: DataSnapshot, b: string) => void, context?: Record<string, any>): void {
251-
const handle = this.#handles.get({
252-
eventType,
253-
callback,
254-
context,
255-
});
256-
if (handle) {
257-
this.native.removeObserverWithHandle(handle);
243+
const handle = callback?.['__fbHandle'];
244+
const event = callback?.['__fbEventType'];
245+
if (typeof handle === 'number' && event === eventType) {
246+
if (this.#handles.has(callback)) {
247+
this.native.removeObserverWithHandle(handle);
248+
callback['__fbHandle'] = undefined;
249+
callback['__fbEventType'] = undefined;
250+
callback['__fbContext'] = undefined;
251+
this.#handles.delete(callback);
252+
}
258253
}
259254
}
260255

@@ -271,15 +266,11 @@ export class Query implements IQuery {
271266
});
272267
}
273268
);
269+
callback['__fbHandle'] = handle;
270+
callback['__fbEventType'] = eventType;
271+
callback['__fbContext'] = context;
274272

275-
this.#handles.set(
276-
{
277-
eventType,
278-
callback,
279-
context,
280-
},
281-
handle
282-
);
273+
this.#handles.set(callback, handle);
283274

284275
return callback;
285276
}

0 commit comments

Comments
 (0)