Skip to content

Commit aa681cb

Browse files
authored
Merge pull request #683 from JoL0712/master
Multiple event listener support
2 parents 70059bd + 0eb8f36 commit aa681cb

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

index.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ declare module 'react-native-callkeep' {
102102
}
103103
};
104104

105+
export class EventListener {
106+
remove(): void
107+
}
108+
105109
export default class RNCallKeep {
106110
static getInitialEvents(): Promise<InitialEvents>
107111

@@ -110,7 +114,7 @@ declare module 'react-native-callkeep' {
110114
static addEventListener<Event extends Events>(
111115
type: Event,
112116
handler: (args: EventsPayload[Event]) => void,
113-
): void
117+
): EventListener
114118

115119
static removeEventListener(type: Events): void
116120

index.js

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ const CONSTANTS = {
1919

2020
export { emit, CONSTANTS };
2121

22+
class EventListener {
23+
constructor(type, listener, callkeep) {
24+
this._type = type;
25+
this._listener = listener;
26+
this._callkeep = callkeep;
27+
}
28+
29+
remove = () => {
30+
this._callkeep.removeEventListener(this._type, this._listener);
31+
};
32+
}
33+
2234
class RNCallKeep {
2335
constructor() {
2436
this._callkeepEventHandlers = new Map();
@@ -27,17 +39,32 @@ class RNCallKeep {
2739
addEventListener = (type, handler) => {
2840
const listener = listeners[type](handler);
2941

30-
this._callkeepEventHandlers.set(type, listener);
42+
const listenerSet = this._callkeepEventHandlers.get(type) ?? new Set();
43+
listenerSet.add(listener);
44+
45+
this._callkeepEventHandlers.set(type, listenerSet);
46+
47+
return new EventListener(type, listener, this);
3148
};
3249

33-
removeEventListener = (type) => {
34-
const listener = this._callkeepEventHandlers.get(type);
35-
if (!listener) {
50+
removeEventListener = (type, listener = undefined) => {
51+
const listenerSet = this._callkeepEventHandlers.get(type);
52+
if (!listenerSet) {
3653
return;
3754
}
3855

39-
listener.remove();
40-
this._callkeepEventHandlers.delete(type);
56+
if (listener) {
57+
listenerSet.delete(listener);
58+
listener.remove();
59+
if (listenerSet.size <= 0) {
60+
this._callkeepEventHandlers.delete(type);
61+
}
62+
} else {
63+
listenerSet.forEach((listener) => {
64+
listener.remove();
65+
});
66+
this._callkeepEventHandlers.delete(type);
67+
}
4168
};
4269

4370
setup = async (options) => {

0 commit comments

Comments
 (0)