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