RCTDeviceEventEmitter.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. 'use strict';
  11. const EventEmitter = require('../vendor/emitter/EventEmitter');
  12. const EventSubscriptionVendor = require('../vendor/emitter/EventSubscriptionVendor');
  13. import type EmitterSubscription from '../vendor/emitter/EmitterSubscription';
  14. function checkNativeEventModule(eventType: ?string) {
  15. if (eventType) {
  16. if (eventType.lastIndexOf('statusBar', 0) === 0) {
  17. throw new Error(
  18. '`' +
  19. eventType +
  20. '` event should be registered via the StatusBarIOS module',
  21. );
  22. }
  23. if (eventType.lastIndexOf('keyboard', 0) === 0) {
  24. throw new Error(
  25. '`' +
  26. eventType +
  27. '` event should be registered via the Keyboard module',
  28. );
  29. }
  30. if (eventType === 'appStateDidChange' || eventType === 'memoryWarning') {
  31. throw new Error(
  32. '`' +
  33. eventType +
  34. '` event should be registered via the AppState module',
  35. );
  36. }
  37. }
  38. }
  39. /**
  40. * Deprecated - subclass NativeEventEmitter to create granular event modules instead of
  41. * adding all event listeners directly to RCTDeviceEventEmitter.
  42. */
  43. class RCTDeviceEventEmitter extends EventEmitter {
  44. sharedSubscriber: EventSubscriptionVendor;
  45. constructor() {
  46. const sharedSubscriber = new EventSubscriptionVendor();
  47. super(sharedSubscriber);
  48. this.sharedSubscriber = sharedSubscriber;
  49. }
  50. addListener(
  51. eventType: string,
  52. listener: Function,
  53. context: ?Object,
  54. ): EmitterSubscription {
  55. if (__DEV__) {
  56. checkNativeEventModule(eventType);
  57. }
  58. return super.addListener(eventType, listener, context);
  59. }
  60. removeAllListeners(eventType: ?string) {
  61. if (__DEV__) {
  62. checkNativeEventModule(eventType);
  63. }
  64. super.removeAllListeners(eventType);
  65. }
  66. removeSubscription(subscription: EmitterSubscription) {
  67. if (subscription.emitter !== this) {
  68. subscription.emitter.removeSubscription(subscription);
  69. } else {
  70. super.removeSubscription(subscription);
  71. }
  72. }
  73. }
  74. module.exports = (new RCTDeviceEventEmitter(): RCTDeviceEventEmitter);