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