From 70cd569e7e4cceac81023eae4ea5089cff2f9b59 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Mon, 1 Feb 2021 17:47:09 -0800 Subject: [PATCH] RN: Simplify `DevSettings` Implementation Summary: Simplifies the implementation of `DevSettings`. The fact that it uses `NativeEventEmitter` is an implementation detail and does not need to be exposed via inheritance. This also enables more code to be removed from production builds (because the development implementation is now statically enclosed by `__DEV__`). Changelog: [General][Changed] - `DevSettings` no longer inherits from `NativeEventEmitter` Reviewed By: RSNara Differential Revision: D26140148 fbshipit-source-id: 99fa9d0c6ce8e365f89936aa12a4720f7a04b984 --- Libraries/Utilities/DevSettings.js | 103 +++++++++++++---------------- 1 file changed, 45 insertions(+), 58 deletions(-) diff --git a/Libraries/Utilities/DevSettings.js b/Libraries/Utilities/DevSettings.js index 0a95bed8f70..8cadc8ef141 100644 --- a/Libraries/Utilities/DevSettings.js +++ b/Libraries/Utilities/DevSettings.js @@ -4,77 +4,64 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @format * @flow strict-local + * @format */ import NativeDevSettings from '../NativeModules/specs/NativeDevSettings'; import NativeEventEmitter from '../EventEmitter/NativeEventEmitter'; -interface IDevSettings { - addMenuItem(title: string, handler: () => mixed): void; - reload(reason?: string): void; - onFastRefresh(): void; -} +let DevSettings: { + addMenuItem(title: string, handler: () => mixed): void, + reload(reason?: string): void, + onFastRefresh(): void, +} = { + addMenuItem(title: string, handler: () => mixed): void {}, + reload(reason?: string): void {}, + onFastRefresh(): void {}, +}; type DevSettingsEventDefinitions = { didPressMenuItem: [{title: string}], }; -class DevSettings extends NativeEventEmitter - implements IDevSettings { - _menuItems: Map mixed>; +if (__DEV__) { + const emitter = new NativeEventEmitter( + NativeDevSettings, + ); + const menuItems = new Map(); - constructor() { - super(NativeDevSettings); - - this._menuItems = new Map(); - } - - addMenuItem(title: string, handler: () => mixed) { - // Make sure items are not added multiple times. This can - // happen when hot reloading the module that registers the - // menu items. The title is used as the id which means we - // don't support multiple items with the same name. - const oldHandler = this._menuItems.get(title); - if (oldHandler != null) { - this.removeListener('didPressMenuItem', oldHandler); - } else { - NativeDevSettings.addMenuItem(title); - } - - this._menuItems.set(title, handler); - this.addListener('didPressMenuItem', event => { - if (event.title === title) { - handler(); + DevSettings = { + addMenuItem(title: string, handler: () => mixed): void { + // Make sure items are not added multiple times. This can + // happen when hot reloading the module that registers the + // menu items. The title is used as the id which means we + // don't support multiple items with the same name. + const oldHandler = menuItems.get(title); + if (oldHandler != null) { + emitter.removeListener('didPressMenuItem', oldHandler); + } else { + NativeDevSettings.addMenuItem(title); } - }); - } - reload(reason?: string) { - if (typeof NativeDevSettings.reloadWithReason === 'function') { - NativeDevSettings.reloadWithReason(reason ?? 'Uncategorized from JS'); - } else { - NativeDevSettings.reload(); - } - } - - onFastRefresh() { - if (typeof NativeDevSettings.onFastRefresh === 'function') { - NativeDevSettings.onFastRefresh(); - } - } - - // TODO: Add other dev setting methods exposed by the native module. + menuItems.set(title, handler); + emitter.addListener('didPressMenuItem', event => { + if (event.title === title) { + handler(); + } + }); + }, + reload(reason?: string): void { + if (NativeDevSettings.reloadWithReason != null) { + NativeDevSettings.reloadWithReason(reason ?? 'Uncategorized from JS'); + } else { + NativeDevSettings.reload(); + } + }, + onFastRefresh(): void { + NativeDevSettings.onFastRefresh?.(); + }, + }; } -// Avoid including the full `NativeDevSettings` class in prod. -class NoopDevSettings implements IDevSettings { - addMenuItem(title: string, handler: () => mixed) {} - reload(reason?: string) {} - onFastRefresh() {} -} - -module.exports = ((__DEV__ - ? new DevSettings() - : new NoopDevSettings()): IDevSettings); +module.exports = DevSettings;