@azzapp/react-native-skia-video
Version:
video support for react-native-skia
90 lines (89 loc) • 2.94 kB
JavaScript
;
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