Skip to content

Commit

Permalink
RN: Simplify DevSettings Implementation
Browse files Browse the repository at this point in the history
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
  • Loading branch information
yungsters authored and facebook-github-bot committed Feb 2, 2021
1 parent f5f4787 commit 70cd569
Showing 1 changed file with 45 additions and 58 deletions.
103 changes: 45 additions & 58 deletions Libraries/Utilities/DevSettings.js
Original file line number Diff line number Diff line change
Expand Up @@ -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<DevSettingsEventDefinitions>
implements IDevSettings {
_menuItems: Map<string, () => mixed>;

constructor() {
super(NativeDevSettings);

this._menuItems = new Map();
}
if (__DEV__) {
const emitter = new NativeEventEmitter<DevSettingsEventDefinitions>(
NativeDevSettings,
);
const 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.
}

// Avoid including the full `NativeDevSettings` class in prod.
class NoopDevSettings implements IDevSettings {
addMenuItem(title: string, handler: () => mixed) {}
reload(reason?: string) {}
onFastRefresh() {}
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?.();
},
};
}

module.exports = ((__DEV__
? new DevSettings()
: new NoopDevSettings()): IDevSettings);
module.exports = DevSettings;

0 comments on commit 70cd569

Please sign in to comment.