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