1import { DeviceEventEmitter, NativeModules, EventSubscription } from 'react-native'; 2 3export type AppInfo = { 4 appIcon?: string; 5 appVersion?: string; 6 hostUrl?: string; 7 appName?: string; 8 sdkVersion?: string; 9 runtimeVersion?: string; 10}; 11 12export type DevSettings = { 13 isDebuggingRemotely?: boolean; 14 isElementInspectorShown?: boolean; 15 isHotLoadingEnabled?: boolean; 16 isPerfMonitorShown?: boolean; 17}; 18 19const DevMenu = NativeModules.ExpoDevMenuInternal; 20 21export async function dispatchCallableAsync( 22 callableId: string, 23 args: object | null = null 24): Promise<void> { 25 return await DevMenu.dispatchCallableAsync(callableId, args); 26} 27 28export function hideMenu(): void { 29 DevMenu.hideMenu(); 30} 31 32export function subscribeToCloseEvents(listener: () => void): EventSubscription { 33 return DeviceEventEmitter.addListener('closeDevMenu', listener); 34} 35 36export function subscribeToOpenEvents(listener: () => void): EventSubscription { 37 return DeviceEventEmitter.addListener('openDevMenu', listener); 38} 39 40export function openDevMenuFromReactNative() { 41 DevMenu.openDevMenuFromReactNative(); 42} 43 44export async function navigateToLauncherAsync(): Promise<void> { 45 return await dispatchCallableAsync('backToLauncher'); 46} 47 48export async function togglePerformanceMonitorAsync() { 49 return await dispatchCallableAsync('performance-monitor'); 50} 51 52export async function toggleElementInspectorAsync() { 53 return await dispatchCallableAsync('inspector'); 54} 55 56export async function reloadAsync() { 57 return await dispatchCallableAsync('reload'); 58} 59 60export async function toggleDebugRemoteJSAsync() { 61 return await dispatchCallableAsync('remote-debug'); 62} 63 64export async function toggleFastRefreshAsync() { 65 return await dispatchCallableAsync('fast-refresh'); 66} 67 68export async function copyToClipboardAsync(content: string) { 69 return await DevMenu.copyToClipboardAsync(content); 70} 71