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