xref: /expo/packages/expo-dev-menu/src/DevMenu.ts (revision 169f3220)
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
10export function hideMenu(): void {
11  ExpoDevMenu.hideMenu();
12}
13
14export function closeMenu(): void {
15  ExpoDevMenu.closeMenu();
16}
17
18let hasRegisteredCallbackListener = false;
19
20function registerCallbackListener() {
21  if (!hasRegisteredCallbackListener) {
22    DeviceEventEmitter.addListener('registeredCallbackFired', (name: string) => {
23      hasRegisteredCallbackListener = true;
24      const handler = handlers.get(name);
25
26      if (handler != null) {
27        handler();
28      }
29    });
30  }
31}
32
33registerCallbackListener();
34
35let handlers = new Map<string, () => void>();
36
37export async function registerDevMenuItems(items: ExpoDevMenuItem[]) {
38  if (!__DEV__) {
39    // resolve undefined
40    return;
41  }
42
43  handlers = new Map();
44  const callbackNames: { name: string; shouldCollapse?: boolean }[] = [];
45
46  items.forEach((item) => {
47    handlers.set(item.name, item.callback);
48    callbackNames.push({ name: item.name, shouldCollapse: item.shouldCollapse });
49  });
50
51  return await ExpoDevMenu.addDevMenuCallbacks(callbackNames);
52}
53