UNPKG

2.19 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @format
8 * @flow
9 */
10
11'use strict';
12
13const EventEmitter = require('EventEmitter');
14const EventSubscriptionVendor = require('EventSubscriptionVendor');
15
16import type EmitterSubscription from 'EmitterSubscription';
17
18function checkNativeEventModule(eventType: ?string) {
19 if (eventType) {
20 if (eventType.lastIndexOf('statusBar', 0) === 0) {
21 throw new Error(
22 '`' +
23 eventType +
24 '` event should be registered via the StatusBarIOS module',
25 );
26 }
27 if (eventType.lastIndexOf('keyboard', 0) === 0) {
28 throw new Error(
29 '`' +
30 eventType +
31 '` event should be registered via the Keyboard module',
32 );
33 }
34 if (eventType === 'appStateDidChange' || eventType === 'memoryWarning') {
35 throw new Error(
36 '`' +
37 eventType +
38 '` event should be registered via the AppState module',
39 );
40 }
41 }
42}
43
44/**
45 * Deprecated - subclass NativeEventEmitter to create granular event modules instead of
46 * adding all event listeners directly to RCTDeviceEventEmitter.
47 */
48class RCTDeviceEventEmitter extends EventEmitter {
49 sharedSubscriber: EventSubscriptionVendor;
50
51 constructor() {
52 const sharedSubscriber = new EventSubscriptionVendor();
53 super(sharedSubscriber);
54 this.sharedSubscriber = sharedSubscriber;
55 }
56
57 addListener(
58 eventType: string,
59 listener: Function,
60 context: ?Object,
61 ): EmitterSubscription {
62 if (__DEV__) {
63 checkNativeEventModule(eventType);
64 }
65 return super.addListener(eventType, listener, context);
66 }
67
68 removeAllListeners(eventType: ?string) {
69 if (__DEV__) {
70 checkNativeEventModule(eventType);
71 }
72 super.removeAllListeners(eventType);
73 }
74
75 removeSubscription(subscription: EmitterSubscription) {
76 if (subscription.emitter !== this) {
77 subscription.emitter.removeSubscription(subscription);
78 } else {
79 super.removeSubscription(subscription);
80 }
81 }
82}
83
84module.exports = new RCTDeviceEventEmitter();