UNPKG

expo-video

Version:

A cross-platform, performant video component for React Native and Expo with Web support

52 lines 2.58 kB
import { useReleasingSharedObject } from 'expo-modules-core'; import NativeVideoModule from './NativeVideoModule'; import resolveAssetSource from './resolveAssetSource'; // TODO: Temporary solution until we develop a way of overriding prototypes that won't break the lazy loading of the module. const replace = NativeVideoModule.VideoPlayer.prototype.replace; NativeVideoModule.VideoPlayer.prototype.replace = function (source, disableWarning = false) { if (!disableWarning) { console.warn('On iOS `VideoPlayer.replace` loads the asset data synchronously on the main thread, which can lead to UI freezes and will be deprecated in a future release. Switch to `replaceAsync` for better user experience.'); } return replace.call(this, parseSource(source)); }; const replaceAsync = NativeVideoModule.VideoPlayer.prototype.replaceAsync; NativeVideoModule.VideoPlayer.prototype.replaceAsync = function (source) { return replaceAsync.call(this, parseSource(source)); }; /** * Creates a direct instance of `VideoPlayer` that doesn't release automatically. * * > **info** For most use cases you should use the [`useVideoPlayer`](#usevideoplayer) hook instead. See the [Using the VideoPlayer Directly](#using-the-videoplayer-directly) section for more details. * @param source */ export function createVideoPlayer(source) { return new NativeVideoModule.VideoPlayer(parseSource(source)); } /** * Creates a `VideoPlayer`, which will be automatically cleaned up when the component is unmounted. * @param source - A video source that is used to initialize the player. * @param setup - A function that allows setting up the player. It will run after the player is created. */ export function useVideoPlayer(source, setup) { const parsedSource = parseSource(source); return useReleasingSharedObject(() => { const player = new NativeVideoModule.VideoPlayer(parsedSource); setup?.(player); return player; }, [JSON.stringify(parsedSource)]); } function parseSource(source) { if (typeof source === 'number') { // TODO(@kitten): This seems to not handle the `null` case. Is this correct? return { uri: resolveAssetSource(source).uri }; } else if (typeof source === 'string') { return { uri: source }; } if (typeof source?.assetId === 'number' && !source.uri) { // TODO(@kitten): This seems to not handle the `null` case. Is this correct? return { ...source, uri: resolveAssetSource(source.assetId).uri }; } return source; } //# sourceMappingURL=VideoPlayer.js.map