[fix] Dimensions addEventListener returns subscription object

Fix #2130
Close #2131
This commit is contained in:
Cloud Le
2021-09-19 01:23:02 +07:00
committed by Nicolas Gallagher
parent 68e878be8f
commit 4aba2bdcf4
4 changed files with 15 additions and 5 deletions
@@ -33,7 +33,7 @@ Get a dimension (e.g., window or screen).
This should only be called server-side with an estimate for initial dimensions to be used when pre-rendering pages on the server.
{% endcall %}
{% call macro.prop('addEventListener', '(type: ?string, listener: (dimensions) => void) => void') %}
{% call macro.prop('addEventListener', '(type: ?string, listener: (dimensions) => void) => ?EmitterSubscription') %}
Add a listener to `Dimensions` changes. Listen to the `"change"` event type. The handler is called with the dimensions state.
{% endcall %}
+2 -2
View File
@@ -12,9 +12,9 @@ export default function DimensionsPage() {
setWindow(win);
};
Dimensions.addEventListener('change', handleChange);
const subscription = Dimensions.addEventListener('change', handleChange);
return () => {
Dimensions.removeEventListener('change', handleChange);
subscription.remove();
};
}, [setScreen, setWindow]);
@@ -14,13 +14,16 @@ describe('apis/Dimensions', () => {
test('addEventListener', () => {
const handler = jest.fn();
Dimensions.addEventListener('change', handler);
const subscription = Dimensions.addEventListener('change', handler);
Dimensions._update();
expect(handler).toHaveBeenCalledTimes(1);
expect(handler).toHaveBeenLastCalledWith({
window: Dimensions.get('window'),
screen: Dimensions.get('screen')
});
subscription.remove();
Dimensions._update();
expect(handler).toHaveBeenCalledTimes(1);
});
test('removeEventListener', () => {
+8 -1
View File
@@ -8,6 +8,7 @@
* @flow
*/
import type { EventSubscription } from '../../vendor/react-native/emitter/EventEmitter';
import { canUseDOM } from 'fbjs/lib/ExecutionEnvironment';
import invariant from 'fbjs/lib/invariant';
@@ -94,9 +95,15 @@ export default class Dimensions {
static addEventListener(
type: DimensionEventListenerType,
handler: (DimensionsValue) => void
): void {
): EventSubscription {
listeners[type] = listeners[type] || [];
listeners[type].push(handler);
return {
remove: () => {
this.removeEventListener(type, handler);
}
};
}
static removeEventListener(