UNPKG

@azzapp/react-native-skia-video

Version:
90 lines (89 loc) 2.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useVideoPlayer = void 0; var _reactNativeReanimated = require("react-native-reanimated"); var _react = require("react"); var _useEventListener = _interopRequireDefault(require("./utils/useEventListener")); var _RNSkiaVideoModule = _interopRequireDefault(require("./RNSkiaVideoModule")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** * Hook that creates a video player and manages its state. * @param options The options for the video player. * @returns */ const useVideoPlayer = ({ uri, resolution, autoPlay = false, isLooping = false, volume = 1, onReadyToPlay, onBufferingStart, onBufferingEnd, onBufferingUpdate, onComplete, onError, onPlayingStatusChange, onSeekComplete }) => { const [isErrored, setIsErrored] = (0, _react.useState)(false); const player = (0, _react.useMemo)(() => { if (uri && !isErrored) { return _RNSkiaVideoModule.default.createVideoPlayer(uri, resolution); } return null; // eslint-disable-next-line react-hooks/exhaustive-deps }, [isErrored, resolution?.width, resolution?.height, uri]); const currentFrame = (0, _reactNativeReanimated.useSharedValue)(null); (0, _react.useEffect)(() => () => { currentFrame.value = null; player?.dispose(); }, [player, currentFrame]); const retry = (0, _react.useCallback)(() => { setIsErrored(false); }, []); const errorHandler = (0, _react.useCallback)(error => { onError?.(error, retry); setIsErrored(true); }, [onError, retry]); (0, _react.useEffect)(() => { if (player) { player.isLooping = isLooping; } }, [player, isLooping]); (0, _react.useEffect)(() => { if (player) { player.volume = volume; } }, [player, volume]); (0, _useEventListener.default)(player, 'ready', onReadyToPlay); (0, _useEventListener.default)(player, 'bufferingStart', onBufferingStart); (0, _useEventListener.default)(player, 'bufferingEnd', onBufferingEnd); (0, _useEventListener.default)(player, 'bufferingUpdate', onBufferingUpdate); (0, _useEventListener.default)(player, 'complete', onComplete); (0, _useEventListener.default)(player, 'error', errorHandler); (0, _useEventListener.default)(player, 'playingStatusChange', onPlayingStatusChange); (0, _useEventListener.default)(player, 'seekComplete', onSeekComplete); (0, _react.useEffect)(() => { if (autoPlay) { player?.play(); } }, [player, autoPlay]); (0, _reactNativeReanimated.useFrameCallback)(() => { if (!player || !player.isPlaying && currentFrame.value) { return; } const nextFrame = player.decodeNextFrame(); if (nextFrame) { currentFrame.value = nextFrame; } }, true); return { currentFrame, player }; }; exports.useVideoPlayer = useVideoPlayer; //# sourceMappingURL=videoPlayer.js.map