Skip to content

Commit 4aba2bd

Browse files
lockonostratosnecolas
authored andcommitted
[fix] Dimensions addEventListener returns subscription object
Fix necolas#2130 Close necolas#2131
1 parent 68e878b commit 4aba2bd

File tree

4 files changed

+15
-5
lines changed

4 files changed

+15
-5
lines changed

packages/docs/src/pages/docs/apis/dimensions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Get a dimension (e.g., window or screen).
3333
This should only be called server-side with an estimate for initial dimensions to be used when pre-rendering pages on the server.
3434
{% endcall %}
3535

36-
{% call macro.prop('addEventListener', '(type: ?string, listener: (dimensions) => void) => void') %}
36+
{% call macro.prop('addEventListener', '(type: ?string, listener: (dimensions) => void) => ?EmitterSubscription') %}
3737
Add a listener to `Dimensions` changes. Listen to the `"change"` event type. The handler is called with the dimensions state.
3838
{% endcall %}
3939

packages/examples/pages/dimensions/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ export default function DimensionsPage() {
1212
setWindow(win);
1313
};
1414

15-
Dimensions.addEventListener('change', handleChange);
15+
const subscription = Dimensions.addEventListener('change', handleChange);
1616
return () => {
17-
Dimensions.removeEventListener('change', handleChange);
17+
subscription.remove();
1818
};
1919
}, [setScreen, setWindow]);
2020

packages/react-native-web/src/exports/Dimensions/__tests__/index-test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ describe('apis/Dimensions', () => {
1414

1515
test('addEventListener', () => {
1616
const handler = jest.fn();
17-
Dimensions.addEventListener('change', handler);
17+
const subscription = Dimensions.addEventListener('change', handler);
1818
Dimensions._update();
1919
expect(handler).toHaveBeenCalledTimes(1);
2020
expect(handler).toHaveBeenLastCalledWith({
2121
window: Dimensions.get('window'),
2222
screen: Dimensions.get('screen')
2323
});
24+
subscription.remove();
25+
Dimensions._update();
26+
expect(handler).toHaveBeenCalledTimes(1);
2427
});
2528

2629
test('removeEventListener', () => {

packages/react-native-web/src/exports/Dimensions/index.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* @flow
99
*/
1010

11+
import type { EventSubscription } from '../../vendor/react-native/emitter/EventEmitter';
1112
import { canUseDOM } from 'fbjs/lib/ExecutionEnvironment';
1213
import invariant from 'fbjs/lib/invariant';
1314

@@ -94,9 +95,15 @@ export default class Dimensions {
9495
static addEventListener(
9596
type: DimensionEventListenerType,
9697
handler: (DimensionsValue) => void
97-
): void {
98+
): EventSubscription {
9899
listeners[type] = listeners[type] || [];
99100
listeners[type].push(handler);
101+
102+
return {
103+
remove: () => {
104+
this.removeEventListener(type, handler);
105+
}
106+
};
100107
}
101108

102109
static removeEventListener(

0 commit comments

Comments
 (0)