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  isRemoteDebuggingAvailable?: boolean;
18  isElementInspectorAvailable?: boolean;
19  isHotLoadingAvailable?: boolean;
20  isPerfMonitorAvailable?: boolean;
21};
22
23export type MenuPreferences = {
24  isOnboardingFinished?: boolean;
25};
26
27const DevMenu = NativeModules.ExpoDevMenuInternal;
28
29export async function dispatchCallableAsync(
30  callableId: string,
31  args: object | null = null
32): Promise<void> {
33  return await DevMenu.dispatchCallableAsync(callableId, args);
34}
35
36export function hideMenu(): void {
37  DevMenu.hideMenu();
38}
39
40export function subscribeToCloseEvents(listener: () => void): EventSubscription {
41  return DeviceEventEmitter.addListener('closeDevMenu', listener);
42}
43
44export function subscribeToOpenEvents(listener: () => void): EventSubscription {
45  return DeviceEventEmitter.addListener('openDevMenu', listener);
46}
47
48export function openDevMenuFromReactNative() {
49  DevMenu.openDevMenuFromReactNative();
50}
51
52export async function navigateToLauncherAsync(): Promise<void> {
53  return await dispatchCallableAsync('backToLauncher');
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 copyToClipboardAsync(content: string) {
77  return await DevMenu.copyToClipboardAsync(content);
78}
79
80export async function setOnboardingFinishedAsync(isFinished: boolean) {
81  return await DevMenu.setOnboardingFinished(isFinished);
82}
83