UNPKG

expo-updates

Version:

Fetches and manages remotely-hosted assets and updates to your app's JS bundle.

95 lines (88 loc) 3.15 kB
import * as Updates from './Updates'; import type { Manifest, UpdatesNativeStateMachineContext, UpdatesNativeStateRollback, } from './Updates.types'; import { UpdateInfoType, type CurrentlyRunningInfo, type UpdateInfo } from './UseUpdates.types'; // The currently running info, constructed from Updates constants export const currentlyRunning: CurrentlyRunningInfo = { updateId: Updates.updateId ?? undefined, channel: Updates.channel ?? undefined, createdAt: Updates.createdAt ?? undefined, isEmbeddedLaunch: Updates.isEmbeddedLaunch, isEmergencyLaunch: Updates.isEmergencyLaunch, manifest: Updates.manifest ?? undefined, runtimeVersion: Updates.runtimeVersion ?? undefined, }; // Type for the state managed by useUpdates(). // Used internally by this module and not exported publicly. export type UseUpdatesStateType = { availableUpdate?: UpdateInfo; downloadedUpdate?: UpdateInfo; checkError?: Error; downloadError?: Error; initializationError?: Error; isUpdateAvailable: boolean; isUpdatePending: boolean; isChecking: boolean; isDownloading: boolean; lastCheckForUpdateTimeSinceRestart?: Date; }; // Constructs an UpdateInfo from a manifest export const updateFromManifest: (manifest: NonNullable<Manifest>) => UpdateInfo = (manifest) => { return { type: UpdateInfoType.NEW, updateId: manifest.id ?? '', createdAt: manifest && 'createdAt' in manifest && manifest.createdAt ? new Date(manifest.createdAt) : // We should never reach this if the manifest is valid and has a commit time, // but leave this in so that createdAt is always defined new Date(0), manifest, }; }; export const updateFromRollback: (rollback: UpdatesNativeStateRollback) => UpdateInfo = ( rollback ) => ({ type: UpdateInfoType.ROLLBACK, createdAt: new Date(rollback.commitTime), manifest: undefined, updateId: undefined, }); // Default useUpdates() state export const defaultUseUpdatesState: UseUpdatesStateType = { isChecking: false, isDownloading: false, isUpdateAvailable: false, isUpdatePending: false, }; // Transform the useUpdates() state based on native state machine context export const reduceUpdatesStateFromContext: ( updatesState: UseUpdatesStateType, context: UpdatesNativeStateMachineContext ) => UseUpdatesStateType = (updatesState, context) => { const availableUpdate = context?.latestManifest ? updateFromManifest(context?.latestManifest) : context.rollback ? updateFromRollback(context.rollback) : undefined; const downloadedUpdate = context?.downloadedManifest ? updateFromManifest(context?.downloadedManifest) : context.rollback ? updateFromRollback(context.rollback) : undefined; return { ...updatesState, isUpdateAvailable: context.isUpdateAvailable, isUpdatePending: context.isUpdatePending, isChecking: context.isChecking, isDownloading: context.isDownloading, availableUpdate, downloadedUpdate, checkError: context.checkError, downloadError: context.downloadError, lastCheckForUpdateTimeSinceRestart: context.lastCheckForUpdateTime, }; };