xref: /expo/packages/expo-dev-menu/src/DevMenu.ts (revision bb5069cd)
1import { DeviceEventEmitter } from 'react-native';
2
3import ExpoDevMenu from './ExpoDevMenu';
4import { ExpoDevMenuItem } from './ExpoDevMenu.types';
5
6export function openMenu(): void {
7  ExpoDevMenu.openMenu();
8}
9
10let hasRegisteredCallbackListener = false;
11
12function registerCallbackListener() {
13  if (!hasRegisteredCallbackListener) {
14    DeviceEventEmitter.addListener('registeredCallbackFired', (name: string) => {
15      hasRegisteredCallbackListener = true;
16      const handler = handlers.get(name);
17
18      if (handler != null) {
19        handler();
20      }
21    });
22  }
23}
24
25registerCallbackListener();
26
27let handlers = new Map<string, () => void>();
28
29export async function registerDevMenuItems(items: ExpoDevMenuItem[]) {
30  if (!__DEV__) {
31    // resolve undefined
32    return;
33  }
34
35  handlers = new Map();
36  const callbackNames: string[] = [];
37
38  items.forEach((item) => {
39    handlers.set(item.name, item.callback);
40    callbackNames.push(item.name);
41  });
42
43  return await ExpoDevMenu.addDevMenuCallbacks(callbackNames);
44}
45