xref: /expo/home/kernel/Kernel.ts (revision cb0e1ce3)
1import { Linking, NativeModules } from 'react-native';
2
3import MockKernel from './MockKernel';
4
5const NativeKernel = NativeModules.ExponentKernel || MockKernel;
6
7export enum ExpoClientReleaseType {
8  UNKNOWN = 'UNKNOWN',
9  SIMULATOR = 'SIMULATOR',
10  ENTERPRISE = 'ENTERPRISE',
11  DEVELOPMENT = 'DEVELOPMENT',
12  AD_HOC = 'ADHOC',
13  APPLE_APP_STORE = 'APPLE_APP_STORE',
14}
15
16export const sdkVersions: string[] = NativeKernel.sdkVersions;
17
18export const iosClientReleaseType: ExpoClientReleaseType =
19  NativeKernel.IOSClientReleaseType || ExpoClientReleaseType.UNKNOWN;
20
21export async function openURLAsync(url: string): Promise<void> {
22  // ExponentKernel.openURL exists on iOS, and it's the same as Linking.openURL except it will never
23  // validate whether Expo can open this URL. This addresses cases where, e.g., someone types in a
24  // http://localhost URL directly into the URL bar. We know they implicitly expect Expo to open
25  // this, even though it won't validate as an Expo URL. By contrast, Linking.openURL would pass
26  // such a URL on to the system URL handler.
27  if (NativeKernel.openURL) {
28    await NativeKernel.openURL(url);
29  } else {
30    await Linking.openURL(url);
31  }
32}
33
34export type KernelDevMenuItem = {
35  label: string;
36  isEnabled: boolean;
37  detail?: string;
38};
39
40export async function doesCurrentTaskEnableDevtoolsAsync(): Promise<boolean> {
41  return await NativeKernel.doesCurrentTaskEnableDevtools();
42}
43
44export function addDevMenu(): void {
45  NativeKernel.addDevMenu();
46}
47
48export async function getDevMenuItemsToShowAsync(): Promise<{ [key: string]: KernelDevMenuItem }> {
49  return await NativeKernel.getDevMenuItemsToShow();
50}
51
52export function selectDevMenuItemWithKey(key: string): void {
53  NativeKernel.selectDevMenuItemWithKey(key);
54}
55
56export function selectRefresh(): void {
57  NativeKernel.selectRefresh();
58}
59
60export function selectCloseMenu(): void {
61  NativeKernel.selectCloseMenu();
62}
63
64export function selectGoToHome(): void {
65  NativeKernel.selectGoToHome();
66}
67
68export function selectQRReader(): void {
69  NativeKernel.selectQRReader();
70}
71
72export async function setLegacyMenuBehaviorEnabledAsync(enabled: boolean): Promise<void> {
73  await NativeKernel.setIsLegacyMenuBehaviorEnabledAsync(enabled);
74}
75
76export async function isNuxFinishedAsync(): Promise<boolean> {
77  return await NativeKernel.getIsNuxFinishedAsync();
78}
79
80export async function setNuxFinishedAsync(finished: boolean): Promise<void> {
81  await NativeKernel.setIsNuxFinishedAsync(finished);
82}
83
84export type KernelSession = {
85  sessionSecret: string;
86};
87
88export async function getSessionAsync(): Promise<KernelSession | null> {
89  return await NativeKernel.getSessionAsync();
90}
91
92export async function setSessionAsync(session: KernelSession): Promise<void> {
93  await NativeKernel.setSessionAsync(session);
94}
95
96export async function removeSessionAsync(): Promise<void> {
97  await NativeKernel.removeSessionAsync();
98}
99
100export function onEventSuccess(eventId: string, result: object): void {
101  NativeKernel.onEventSuccess(eventId, result);
102}
103
104export function onEventFailure(eventId: string, message: string): void {
105  NativeKernel.onEventFailure(eventId, message);
106}
107