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