1import { DeviceEventEmitter, NativeModules, EventSubscription } from 'react-native'; 2 3export type JSEngine = 'Hermes' | 'JSC' | 'V8'; 4 5export type AppInfo = { 6 appIcon?: string; 7 appVersion?: string; 8 hostUrl?: string; 9 appName?: string; 10 sdkVersion?: string; 11 runtimeVersion?: string; 12 engine?: JSEngine; 13}; 14 15export type DevSettings = { 16 isDebuggingRemotely?: boolean; 17 isElementInspectorShown?: boolean; 18 isHotLoadingEnabled?: boolean; 19 isPerfMonitorShown?: boolean; 20 isRemoteDebuggingAvailable?: boolean; 21 isElementInspectorAvailable?: boolean; 22 isHotLoadingAvailable?: boolean; 23 isPerfMonitorAvailable?: boolean; 24 isJSInspectorAvailable?: boolean; 25}; 26 27export type MenuPreferences = { 28 isOnboardingFinished?: boolean; 29}; 30 31const DevMenu = NativeModules.ExpoDevMenuInternal; 32 33export async function dispatchCallableAsync( 34 callableId: string, 35 args: object | null = null 36): Promise<void> { 37 return await DevMenu.dispatchCallableAsync(callableId, args); 38} 39 40export function hideMenu(): void { 41 DevMenu.hideMenu(); 42} 43 44export function subscribeToCloseEvents(listener: () => void): EventSubscription { 45 return DeviceEventEmitter.addListener('closeDevMenu', listener); 46} 47 48export function subscribeToOpenEvents(listener: () => void): EventSubscription { 49 return DeviceEventEmitter.addListener('openDevMenu', listener); 50} 51 52export function openDevMenuFromReactNative() { 53 DevMenu.openDevMenuFromReactNative(); 54} 55 56export async function togglePerformanceMonitorAsync() { 57 return await dispatchCallableAsync('performance-monitor'); 58} 59 60export async function toggleElementInspectorAsync() { 61 return await dispatchCallableAsync('inspector'); 62} 63 64export async function reloadAsync() { 65 return await dispatchCallableAsync('reload'); 66} 67 68export async function toggleDebugRemoteJSAsync() { 69 return await dispatchCallableAsync('remote-debug'); 70} 71 72export async function toggleFastRefreshAsync() { 73 return await dispatchCallableAsync('fast-refresh'); 74} 75 76export async function openJSInspector() { 77 return await dispatchCallableAsync('js-inspector'); 78} 79 80export async function copyToClipboardAsync(content: string) { 81 return await DevMenu.copyToClipboardAsync(content); 82} 83 84export async function setOnboardingFinishedAsync(isFinished: boolean) { 85 return await DevMenu.setOnboardingFinished(isFinished); 86} 87 88export async function loadFontsAsync() { 89 return await DevMenu.loadFontsAsync(); 90} 91 92export async function fireCallbackAsync(name: string) { 93 return await DevMenu.fireCallback(name).catch((error) => console.warn(error.message)); 94} 95