@draftbit/core 54.0.4-11e01d.2 → 54.0.4-6c949a.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.js +1 -1
- package/lib/commonjs/components/MediaPlayer/MediaPlaybackWrapper.js +1 -1
- package/lib/commonjs/components/MediaPlayer/MediaPlayerCommon.js +1 -1
- package/lib/commonjs/components/MediaPlayer/VideoPlayer/VideoPlayer.js +1 -1
- package/lib/typescript/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.d.ts +1 -3
- package/lib/typescript/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.js +54 -69
- package/lib/typescript/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.js.map +1 -1
- package/lib/typescript/src/components/MediaPlayer/MediaPlaybackWrapper.d.ts +2 -3
- package/lib/typescript/src/components/MediaPlayer/MediaPlaybackWrapper.js +21 -19
- package/lib/typescript/src/components/MediaPlayer/MediaPlaybackWrapper.js.map +1 -1
- package/lib/typescript/src/components/MediaPlayer/MediaPlayerCommon.d.ts +4 -5
- package/lib/typescript/src/components/MediaPlayer/MediaPlayerCommon.js +26 -3
- package/lib/typescript/src/components/MediaPlayer/MediaPlayerCommon.js.map +1 -1
- package/lib/typescript/src/components/MediaPlayer/VideoPlayer/VideoPlayer.d.ts +4 -14
- package/lib/typescript/src/components/MediaPlayer/VideoPlayer/VideoPlayer.js +62 -125
- package/lib/typescript/src/components/MediaPlayer/VideoPlayer/VideoPlayer.js.map +1 -1
- package/lib/typescript/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -5
- package/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.tsx +72 -84
- package/src/components/MediaPlayer/MediaPlaybackWrapper.tsx +24 -21
- package/src/components/MediaPlayer/MediaPlayerCommon.ts +34 -8
- package/src/components/MediaPlayer/VideoPlayer/VideoPlayer.tsx +86 -213
|
@@ -1 +1 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var React=_interopRequireWildcard(require("react"));var _expoAv=require("expo-av");var _MediaPlayerCommon=require("../MediaPlayerCommon");var _MediaPlaybackWrapper=_interopRequireDefault(require("../MediaPlaybackWrapper"));var _jsxRuntime=require("react/jsx-runtime");var _this=this,_jsxFileName="/home/runner/work/react-native-jigsaw/react-native-jigsaw/packages/core/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.tsx";function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap(),t=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(e){return e?t:r;})(e);}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&{}.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u];}return n.default=e,t&&t.set(e,n),n;}var HeadlessAudioPlayer=React.forwardRef(function(_ref,ref){var source=_ref.source,_ref$interruptionMode=_ref.interruptionMode,interruptionMode=_ref$interruptionMode===void 0?"lower volume":_ref$interruptionMode,_ref$playsInBackgroun=_ref.playsInBackground,playsInBackground=_ref$playsInBackgroun===void 0?false:_ref$playsInBackgroun,_ref$playsInSilentMod=_ref.playsInSilentModeIOS,playsInSilentModeIOS=_ref$playsInSilentMod===void 0?false:_ref$playsInSilentMod,_ref$playThroughEarpi=_ref.playThroughEarpieceAndroid,playThroughEarpieceAndroid=_ref$playThroughEarpi===void 0?false:_ref$playThroughEarpi,onPlaybackStatusUpdateProp=_ref.onPlaybackStatusUpdate,onPlaybackFinish=_ref.onPlaybackFinish,_ref$isLooping=_ref.isLooping,isLooping=_ref$isLooping===void 0?false:_ref$isLooping,_ref$volume=_ref.volume,volume=_ref$volume===void 0?1.0:_ref$volume;var _React$useState=React.useState(),_React$useState2=(0,_slicedToArray2.default)(_React$useState,2),currentSound=_React$useState2[0],setCurrentSound=_React$useState2[1];var _React$useState3=React.useState(false),_React$useState4=(0,_slicedToArray2.default)(_React$useState3,2),isPlaying=_React$useState4[0],setIsPlaying=_React$useState4[1];React.useEffect(function(){if(currentSound&&typeof(currentSound==null?void 0:currentSound.setIsLoopingAsync)==="function"){currentSound.setIsLoopingAsync(isLooping);}},[currentSound,isLooping]);React.useEffect(function(){if(currentSound&&typeof(currentSound==null?void 0:currentSound.setVolumeAsync)==="function"){currentSound.setVolumeAsync(volume);}},[currentSound,volume]);var updateAudioMode=React.useCallback((0,_asyncToGenerator2.default)(function*(){try{yield _expoAv.Audio.setAudioModeAsync({staysActiveInBackground:playsInBackground,interruptionModeIOS:interruptionMode==="lower volume"?_expoAv.InterruptionModeIOS.DuckOthers:_expoAv.InterruptionModeIOS.DoNotMix,interruptionModeAndroid:interruptionMode==="lower volume"?_expoAv.InterruptionModeAndroid.DuckOthers:_expoAv.InterruptionModeAndroid.DoNotMix,playsInSilentModeIOS:playsInSilentModeIOS,playThroughEarpieceAndroid:playThroughEarpieceAndroid});}catch(e){if((e==null?void 0:e.code)==="E_AUDIO_AUDIOMODE"){console.warn("Background audio playback only works in published apps, not in preview mode. For iOS apps, add 'audio' under UI Background Modes in Project Settings > Apple App Store.");}else{console.error("Failed to set audio mode. interruptionMode, playsInBackground, playsInSilentModeIOS, playThroughEarpieceAndroid might not be set. Failed with",e);}}}),[interruptionMode,playsInBackground,playsInSilentModeIOS,playThroughEarpieceAndroid]);var onPlaybackStatusUpdate=function onPlaybackStatusUpdate(status){var mappedStatus=(0,_MediaPlayerCommon.mapToMediaPlayerStatus)(status);onPlaybackStatusUpdateProp==null||onPlaybackStatusUpdateProp(mappedStatus);if(status.isLoaded){if(status.didJustFinish){if(isLooping){return;}onPlaybackFinish==null||onPlaybackFinish();}setIsPlaying(status.isPlaying);}};var onTogglePlayback=function onTogglePlayback(){updateAudioMode();};var loadAudio=function(){var _ref3=(0,_asyncToGenerator2.default)(function*(){onPlaybackStatusUpdateProp==null||onPlaybackStatusUpdateProp({isPlaying:false,isLoading:true,isBuffering:false,currentPositionMillis:0,durationMillis:0,bufferedDurationMillis:0,isError:false});var finalSource=yield(0,_MediaPlayerCommon.normalizeBase64Source)(source,"audio");var _yield$Audio$Sound$cr=yield _expoAv.Audio.Sound.createAsync(finalSource),sound=_yield$Audio$Sound$cr.sound;setCurrentSound(sound);sound.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);});return function loadAudio(){return _ref3.apply(this,arguments);};}();(0,_MediaPlayerCommon.useSourceDeepCompareEffect)(function(){loadAudio();},[source]);return(0,_jsxRuntime.jsx)(_MediaPlaybackWrapper.default,{ref:ref,isPlaying:isPlaying,media:currentSound,onTogglePlayback:onTogglePlayback});});var _default=exports.default=HeadlessAudioPlayer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var React=_interopRequireWildcard(require("react"));var _jsxRuntime=require("react/jsx-runtime");function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap(),t=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(e){return e?t:r;})(e);}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&{}.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u];}return n.default=e,t&&t.set(e,n),n;}var MediaPlaybackWrapper=React.forwardRef(function(_ref,ref){var
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var React=_interopRequireWildcard(require("react"));var _jsxRuntime=require("react/jsx-runtime");function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap(),t=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(e){return e?t:r;})(e);}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&{}.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u];}return n.default=e,t&&t.set(e,n),n;}var MediaPlaybackWrapper=React.forwardRef(function(_ref,ref){var media=_ref.media,isPlaying=_ref.isPlaying,onTogglePlayback=_ref.onTogglePlayback,children=_ref.children;var togglePlayback=React.useCallback((0,_asyncToGenerator2.default)(function*(){onTogglePlayback==null||onTogglePlayback();if(isPlaying){yield media==null?void 0:media.pauseAsync();}else{yield media==null?void 0:media.playAsync();}}),[media,isPlaying,onTogglePlayback]);var pause=React.useCallback((0,_asyncToGenerator2.default)(function*(){onTogglePlayback==null||onTogglePlayback();yield media==null?void 0:media.pauseAsync();}),[media,onTogglePlayback]);var play=React.useCallback((0,_asyncToGenerator2.default)(function*(){onTogglePlayback==null||onTogglePlayback();yield media==null?void 0:media.playAsync();}),[media,onTogglePlayback]);var seekToPosition=React.useCallback(function(){var _ref5=(0,_asyncToGenerator2.default)(function*(positionMillis){yield media==null?void 0:media.setPositionAsync(positionMillis);});return function(_x){return _ref5.apply(this,arguments);};}(),[media]);React.useEffect(function(){return media?function(){media.unloadAsync();}:undefined;},[media]);React.useImperativeHandle(ref,function(){return{seekToPosition:seekToPosition,togglePlayback:togglePlayback,pause:pause,play:play};},[seekToPosition,togglePlayback,pause,play]);return(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:children});});var _default=exports.default=MediaPlaybackWrapper;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.normalizeBase64Source=normalizeBase64Source;exports.useSourceDeepCompareEffect=useSourceDeepCompareEffect;
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.mapToMediaPlayerStatus=mapToMediaPlayerStatus;exports.normalizeBase64Source=normalizeBase64Source;exports.useSourceDeepCompareEffect=useSourceDeepCompareEffect;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _uuid=require("uuid");var _reactNative=require("react-native");var _react=_interopRequireDefault(require("react"));function mapToMediaPlayerStatus(status){if(status.isLoaded){return{isPlaying:status.isPlaying,isLoading:false,isBuffering:status.isBuffering,currentPositionMillis:status.positionMillis||0,durationMillis:status.durationMillis||0,bufferedDurationMillis:status.playableDurationMillis||0,isError:false};}return{isPlaying:false,isLoading:false,isBuffering:false,currentPositionMillis:0,durationMillis:0,bufferedDurationMillis:0,isError:true,error:status.error};}var URL_REGEX=/[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/;function normalizeBase64Source(_x,_x2){return _normalizeBase64Source.apply(this,arguments);}function _normalizeBase64Source(){_normalizeBase64Source=(0,_asyncToGenerator2.default)(function*(source,type){var uri=source==null?void 0:source.uri;if(_reactNative.Platform.OS==="ios"&&uri&&!uri.match(URL_REGEX)){var _yield$import=yield import("expo-file-system"),File=_yield$import.File,Paths=_yield$import.Paths;var defaultMimeType=type==="audio"?"wav":"mp4";var mimeType=uri.startsWith(`data:${type}/`)?uri.substring(`data:${type}/`.length,uri.indexOf(";")):defaultMimeType;var file=new File(Paths.cache,`${(0,_uuid.v4)()}.${mimeType.toLowerCase()}`);var base64Content=uri.includes("base64,")?uri.substring(uri.indexOf("base64,")+"base64,".length):uri;file.write(base64Content,{encoding:"base64"});return{uri:file.uri};}return source;});return _normalizeBase64Source.apply(this,arguments);}function sourceDeepCompareEquals(a,b){if(a!=null&&a.uri&&b!=null&&b.uri){return a.uri===b.uri;}return a===b;}function useSourceDeepCompareMemoize(value){var ref=_react.default.useRef(undefined);if(!sourceDeepCompareEquals(value,ref.current)){ref.current=value;}return ref.current;}function useSourceDeepCompareEffect(callback,dependencies){_react.default.useEffect(callback,dependencies.map(useSourceDeepCompareMemoize));}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _react=_interopRequireDefault(require("react"));var _reactNative=require("react-native");var _expoAv=require("expo-av");var _utilities=require("../../../utilities");var _MediaPlaybackWrapper=_interopRequireDefault(require("../MediaPlaybackWrapper"));var _MediaPlayerCommon=require("../MediaPlayerCommon");var _jsxRuntime=require("react/jsx-runtime");var _excluded=["style","resizeMode","posterResizeMode","onPlaybackStatusUpdate","onPlaybackFinish","source","playsInSilentModeIOS"];var _this=this,_jsxFileName="/home/runner/work/react-native-jigsaw/react-native-jigsaw/packages/core/src/components/MediaPlayer/VideoPlayer/VideoPlayer.tsx";var triggerAudio=function(){var _ref=(0,_asyncToGenerator2.default)(function*(ref){if(ref&&ref!=null&&ref.current&&_reactNative.Platform.OS==="ios"){yield _expoAv.Audio.setAudioModeAsync({playsInSilentModeIOS:true});ref.current.play();}});return function triggerAudio(_x){return _ref.apply(this,arguments);};}();var VideoPlayer=_react.default.forwardRef(function(_ref2,ref){var style=_ref2.style,_ref2$resizeMode=_ref2.resizeMode,resizeMode=_ref2$resizeMode===void 0?"contain":_ref2$resizeMode,_ref2$posterResizeMod=_ref2.posterResizeMode,posterResizeMode=_ref2$posterResizeMod===void 0?"cover":_ref2$posterResizeMod,onPlaybackStatusUpdateProp=_ref2.onPlaybackStatusUpdate,onPlaybackFinish=_ref2.onPlaybackFinish,source=_ref2.source,_ref2$playsInSilentMo=_ref2.playsInSilentModeIOS,playsInSilentModeIOS=_ref2$playsInSilentMo===void 0?false:_ref2$playsInSilentMo,rest=(0,_objectWithoutProperties2.default)(_ref2,_excluded);var _React$useState=_react.default.useState(),_React$useState2=(0,_slicedToArray2.default)(_React$useState,2),videoMediaObject=_React$useState2[0],setVideoMediaObject=_React$useState2[1];var _React$useState3=_react.default.useState(false),_React$useState4=(0,_slicedToArray2.default)(_React$useState3,2),isPlaying=_React$useState4[0],setIsPlaying=_React$useState4[1];var _React$useState5=_react.default.useState(false),_React$useState6=(0,_slicedToArray2.default)(_React$useState5,2),isFullscreen=_React$useState6[0],setIsFullscreen=_React$useState6[1];var _React$useState7=_react.default.useState(),_React$useState8=(0,_slicedToArray2.default)(_React$useState7,2),currentSource=_React$useState8[0],setCurrentSource=_React$useState8[1];var mediaPlaybackWrapperRef=_react.default.useRef(null);var sizeStyles=(0,_utilities.extractSizeStyles)(style);var mappedResizeMode;switch(resizeMode){case"contain":mappedResizeMode=_expoAv.ResizeMode.CONTAIN;break;case"cover":mappedResizeMode=_expoAv.ResizeMode.COVER;break;case"stretch":mappedResizeMode=_expoAv.ResizeMode.STRETCH;break;}var onPlaybackStatusUpdate=function onPlaybackStatusUpdate(status){var mappedStatus=(0,_MediaPlayerCommon.mapToMediaPlayerStatus)(status);onPlaybackStatusUpdateProp==null||onPlaybackStatusUpdateProp(mappedStatus);if(status.isLoaded){if(status.didJustFinish){onPlaybackFinish==null||onPlaybackFinish();}setIsPlaying(status.isPlaying);}};var _onFullscreenUpdate=function onFullscreenUpdate(fullscreenUpdate){switch(fullscreenUpdate){case _expoAv.VideoFullscreenUpdate.PLAYER_DID_PRESENT:case _expoAv.VideoFullscreenUpdate.PLAYER_WILL_PRESENT:setIsFullscreen(true);break;case _expoAv.VideoFullscreenUpdate.PLAYER_DID_DISMISS:case _expoAv.VideoFullscreenUpdate.PLAYER_WILL_DISMISS:setIsFullscreen(false);break;}};var toggleFullscreen=_react.default.useCallback((0,_asyncToGenerator2.default)(function*(){if(isFullscreen){yield videoMediaObject==null?void 0:videoMediaObject.dismissFullscreenPlayer();}else{yield videoMediaObject==null?void 0:videoMediaObject.presentFullscreenPlayer();}}),[isFullscreen,videoMediaObject]);var updateAudioMode=_react.default.useCallback((0,_asyncToGenerator2.default)(function*(){try{yield _expoAv.Audio.setAudioModeAsync({playsInSilentModeIOS:playsInSilentModeIOS});}catch(e){console.error("Failed to set audio mode. Error details:",e);}}),[playsInSilentModeIOS]);_react.default.useEffect(function(){if(isPlaying)triggerAudio(mediaPlaybackWrapperRef);},[mediaPlaybackWrapperRef,isPlaying]);_react.default.useImperativeHandle(ref,function(){var _mediaPlaybackWrapper,_mediaPlaybackWrapper2,_mediaPlaybackWrapper3,_mediaPlaybackWrapper4;return{toggleFullscreen:toggleFullscreen,seekToPosition:((_mediaPlaybackWrapper=mediaPlaybackWrapperRef.current)==null?void 0:_mediaPlaybackWrapper.seekToPosition)||function(){},togglePlayback:((_mediaPlaybackWrapper2=mediaPlaybackWrapperRef.current)==null?void 0:_mediaPlaybackWrapper2.togglePlayback)||function(){},pause:((_mediaPlaybackWrapper3=mediaPlaybackWrapperRef.current)==null?void 0:_mediaPlaybackWrapper3.pause)||function(){},play:((_mediaPlaybackWrapper4=mediaPlaybackWrapperRef.current)==null?void 0:_mediaPlaybackWrapper4.play)||function(){}};},[toggleFullscreen,isPlaying]);(0,_MediaPlayerCommon.useSourceDeepCompareEffect)(function(){var updateSource=function(){var _ref5=(0,_asyncToGenerator2.default)(function*(){var finalSource=yield(0,_MediaPlayerCommon.normalizeBase64Source)(source,"video");setCurrentSource(finalSource);});return function updateSource(){return _ref5.apply(this,arguments);};}();updateSource();},[source]);return(0,_jsxRuntime.jsx)(_MediaPlaybackWrapper.default,{media:videoMediaObject,isPlaying:isPlaying,ref:mediaPlaybackWrapperRef,onTogglePlayback:updateAudioMode,children:(0,_jsxRuntime.jsx)(_expoAv.Video,Object.assign({ref:function ref(component){return setVideoMediaObject(component);},style:style,videoStyle:sizeStyles,resizeMode:mappedResizeMode,posterStyle:[sizeStyles,{resizeMode:posterResizeMode}],onPlaybackStatusUpdate:onPlaybackStatusUpdate,onFullscreenUpdate:function onFullscreenUpdate(e){return _onFullscreenUpdate(e.fullscreenUpdate);},source:currentSource},rest))});});var _default=exports.default=VideoPlayer;
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { AudioStatus } from "expo-audio";
|
|
3
2
|
import { HeadlessAudioPlayerProps } from "./AudioPlayerCommon";
|
|
4
|
-
import type { MediaPlayerRef
|
|
3
|
+
import type { MediaPlayerRef } from "../MediaPlayerCommon";
|
|
5
4
|
/**
|
|
6
5
|
* Audio Player component without an interface (UI).
|
|
7
6
|
* Only handles playing of the audio and provides callbacks and ref functions
|
|
8
7
|
*/
|
|
9
8
|
declare const HeadlessAudioPlayer: React.ForwardRefExoticComponent<HeadlessAudioPlayerProps & React.RefAttributes<MediaPlayerRef>>;
|
|
10
|
-
export declare function mapToMediaPlayerStatus(status: AudioStatus): MediaPlayerStatus;
|
|
11
9
|
export default HeadlessAudioPlayer;
|
|
@@ -1,62 +1,37 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Audio, InterruptionModeIOS, InterruptionModeAndroid, } from "expo-av";
|
|
3
|
+
import { mapToMediaPlayerStatus, normalizeBase64Source, useSourceDeepCompareEffect, } from "../MediaPlayerCommon";
|
|
4
4
|
import MediaPlaybackWrapper from "../MediaPlaybackWrapper";
|
|
5
5
|
/**
|
|
6
6
|
* Audio Player component without an interface (UI).
|
|
7
7
|
* Only handles playing of the audio and provides callbacks and ref functions
|
|
8
8
|
*/
|
|
9
9
|
const HeadlessAudioPlayer = React.forwardRef(({ source, interruptionMode = "lower volume", playsInBackground = false, playsInSilentModeIOS = false, playThroughEarpieceAndroid = false, onPlaybackStatusUpdate: onPlaybackStatusUpdateProp, onPlaybackFinish, isLooping = false, volume = 1.0, }, ref) => {
|
|
10
|
-
const
|
|
11
|
-
const player = useAudioPlayer(stableSource);
|
|
10
|
+
const [currentSound, setCurrentSound] = React.useState();
|
|
12
11
|
const [isPlaying, setIsPlaying] = React.useState(false);
|
|
13
12
|
React.useEffect(() => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}, [
|
|
19
|
-
// Emit loading state immediately
|
|
20
|
-
React.useEffect(() => {
|
|
21
|
-
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp({
|
|
22
|
-
isPlaying: false,
|
|
23
|
-
isLoading: true,
|
|
24
|
-
isBuffering: false,
|
|
25
|
-
currentPositionMillis: 0,
|
|
26
|
-
durationMillis: 0,
|
|
27
|
-
bufferedDurationMillis: 0,
|
|
28
|
-
isError: false,
|
|
29
|
-
});
|
|
30
|
-
}, []);
|
|
13
|
+
if (currentSound &&
|
|
14
|
+
typeof (currentSound === null || currentSound === void 0 ? void 0 : currentSound.setIsLoopingAsync) === "function") {
|
|
15
|
+
currentSound.setIsLoopingAsync(isLooping);
|
|
16
|
+
}
|
|
17
|
+
}, [currentSound, isLooping]);
|
|
31
18
|
React.useEffect(() => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp(mappedStatus);
|
|
35
|
-
if (status.isLoaded) {
|
|
36
|
-
if (status.didJustFinish && !isLooping) {
|
|
37
|
-
onPlaybackFinish === null || onPlaybackFinish === void 0 ? void 0 : onPlaybackFinish();
|
|
38
|
-
}
|
|
39
|
-
setIsPlaying(status.playing);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
return () => subscription.remove();
|
|
43
|
-
}, []);
|
|
44
|
-
// Replace source when it changes (deep comparison on URI to avoid unnecessary reloads)
|
|
45
|
-
const isFirstSourceRender = React.useRef(true);
|
|
46
|
-
useSourceDeepCompareEffect(() => {
|
|
47
|
-
if (isFirstSourceRender.current) {
|
|
48
|
-
isFirstSourceRender.current = false;
|
|
49
|
-
return;
|
|
19
|
+
if (currentSound && typeof (currentSound === null || currentSound === void 0 ? void 0 : currentSound.setVolumeAsync) === "function") {
|
|
20
|
+
currentSound.setVolumeAsync(volume);
|
|
50
21
|
}
|
|
51
|
-
|
|
52
|
-
}, [source]);
|
|
22
|
+
}, [currentSound, volume]);
|
|
53
23
|
const updateAudioMode = React.useCallback(async () => {
|
|
54
24
|
try {
|
|
55
|
-
await setAudioModeAsync({
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
25
|
+
await Audio.setAudioModeAsync({
|
|
26
|
+
staysActiveInBackground: playsInBackground,
|
|
27
|
+
interruptionModeIOS: interruptionMode === "lower volume"
|
|
28
|
+
? InterruptionModeIOS.DuckOthers
|
|
29
|
+
: InterruptionModeIOS.DoNotMix,
|
|
30
|
+
interruptionModeAndroid: interruptionMode === "lower volume"
|
|
31
|
+
? InterruptionModeAndroid.DuckOthers
|
|
32
|
+
: InterruptionModeAndroid.DoNotMix,
|
|
33
|
+
playsInSilentModeIOS,
|
|
34
|
+
playThroughEarpieceAndroid,
|
|
60
35
|
});
|
|
61
36
|
}
|
|
62
37
|
catch (e) {
|
|
@@ -73,33 +48,43 @@ const HeadlessAudioPlayer = React.forwardRef(({ source, interruptionMode = "lowe
|
|
|
73
48
|
playsInSilentModeIOS,
|
|
74
49
|
playThroughEarpieceAndroid,
|
|
75
50
|
]);
|
|
51
|
+
const onPlaybackStatusUpdate = (status) => {
|
|
52
|
+
const mappedStatus = mapToMediaPlayerStatus(status);
|
|
53
|
+
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp(mappedStatus);
|
|
54
|
+
if (status.isLoaded) {
|
|
55
|
+
if (status.didJustFinish) {
|
|
56
|
+
if (isLooping) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
onPlaybackFinish === null || onPlaybackFinish === void 0 ? void 0 : onPlaybackFinish();
|
|
60
|
+
}
|
|
61
|
+
setIsPlaying(status.isPlaying);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
76
64
|
const onTogglePlayback = () => {
|
|
77
|
-
//
|
|
65
|
+
//Has to be called everytime a player is played to reconfigure the global Audio config based on each player's configuration
|
|
78
66
|
updateAudioMode();
|
|
79
67
|
};
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
currentPositionMillis: status.currentTime * 1000,
|
|
89
|
-
durationMillis: status.duration * 1000,
|
|
90
|
-
bufferedDurationMillis: status.duration * 1000,
|
|
68
|
+
const loadAudio = async () => {
|
|
69
|
+
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp({
|
|
70
|
+
isPlaying: false,
|
|
71
|
+
isLoading: true,
|
|
72
|
+
isBuffering: false,
|
|
73
|
+
currentPositionMillis: 0,
|
|
74
|
+
durationMillis: 0,
|
|
75
|
+
bufferedDurationMillis: 0,
|
|
91
76
|
isError: false,
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
isBuffering: false,
|
|
98
|
-
currentPositionMillis: 0,
|
|
99
|
-
durationMillis: 0,
|
|
100
|
-
bufferedDurationMillis: 0,
|
|
101
|
-
isError: false,
|
|
77
|
+
});
|
|
78
|
+
const finalSource = await normalizeBase64Source(source, "audio");
|
|
79
|
+
const { sound } = await Audio.Sound.createAsync(finalSource);
|
|
80
|
+
setCurrentSound(sound);
|
|
81
|
+
sound.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);
|
|
102
82
|
};
|
|
103
|
-
|
|
83
|
+
useSourceDeepCompareEffect(() => {
|
|
84
|
+
loadAudio();
|
|
85
|
+
// Ignore dependency of loadAudio
|
|
86
|
+
}, [source]);
|
|
87
|
+
return (React.createElement(MediaPlaybackWrapper, { ref: ref, isPlaying: isPlaying, media: currentSound, onTogglePlayback: onTogglePlayback }));
|
|
88
|
+
});
|
|
104
89
|
export default HeadlessAudioPlayer;
|
|
105
90
|
//# sourceMappingURL=HeadlessAudioPlayer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadlessAudioPlayer.js","sourceRoot":"","sources":["../../../../../../src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,
|
|
1
|
+
{"version":3,"file":"HeadlessAudioPlayer.js","sourceRoot":"","sources":["../../../../../../src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,KAAK,EAEL,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAE3D;;;GAGG;AACH,MAAM,mBAAmB,GAAG,KAAK,CAAC,UAAU,CAI1C,CACE,EACE,MAAM,EACN,gBAAgB,GAAG,cAAc,EACjC,iBAAiB,GAAG,KAAK,EACzB,oBAAoB,GAAG,KAAK,EAC5B,0BAA0B,GAAG,KAAK,EAClC,sBAAsB,EAAE,0BAA0B,EAClD,gBAAgB,EAChB,SAAS,GAAG,KAAK,EACjB,MAAM,GAAG,GAAG,GACb,EACD,GAAG,EACH,EAAE;IACF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAe,CAAC;IACtE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IACE,YAAY;YACZ,OAAO,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,iBAAiB,CAAA,KAAK,UAAU,EACrD,CAAC;YACD,YAAY,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IAE9B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,YAAY,IAAI,OAAO,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,cAAc,CAAA,KAAK,UAAU,EAAE,CAAC;YACvE,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3B,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,iBAAiB,CAAC;gBAC5B,uBAAuB,EAAE,iBAAiB;gBAC1C,mBAAmB,EACjB,gBAAgB,KAAK,cAAc;oBACjC,CAAC,CAAC,mBAAmB,CAAC,UAAU;oBAChC,CAAC,CAAC,mBAAmB,CAAC,QAAQ;gBAClC,uBAAuB,EACrB,gBAAgB,KAAK,cAAc;oBACjC,CAAC,CAAC,uBAAuB,CAAC,UAAU;oBACpC,CAAC,CAAC,uBAAuB,CAAC,QAAQ;gBACtC,oBAAoB;gBACpB,0BAA0B;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,CAAuB,aAAvB,CAAC,uBAAD,CAAC,CAAwB,IAAI,MAAK,mBAAmB,EAAE,CAAC;gBAC3D,OAAO,CAAC,IAAI,CACV,yKAAyK,CAC1K,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,+IAA+I,EAC/I,CAAC,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,EAAE;QACD,gBAAgB;QAChB,iBAAiB;QACjB,oBAAoB;QACpB,0BAA0B;KAC3B,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAAG,CAAC,MAAwB,EAAE,EAAE;QAC1D,MAAM,YAAY,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACpD,0BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAG,YAAY,CAAC,CAAC;QAE3C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,EAAI,CAAC;YACvB,CAAC;YACD,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,2HAA2H;QAC3H,eAAe,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC3B,0BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAG;YAC3B,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,KAAK;YAClB,qBAAqB,EAAE,CAAC;YACxB,cAAc,EAAE,CAAC;YACjB,sBAAsB,EAAE,CAAC;YACzB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEjE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,KAAK,CAAC,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF,0BAA0B,CAAC,GAAG,EAAE;QAC9B,SAAS,EAAE,CAAC;QAEZ,iCAAiC;IACnC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,CACL,oBAAC,oBAAoB,IACnB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,gBAAgB,GAClC,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import type {
|
|
3
|
-
import type { VideoPlayer } from "expo-video";
|
|
2
|
+
import type { Playback } from "expo-av/src/AV";
|
|
4
3
|
import type { MediaPlayerRef } from "./MediaPlayerCommon";
|
|
5
4
|
interface MediaPlaybackWrapperProps {
|
|
6
|
-
|
|
5
|
+
media?: Playback;
|
|
7
6
|
isPlaying?: boolean;
|
|
8
7
|
onTogglePlayback?: () => void;
|
|
9
8
|
}
|
|
@@ -2,32 +2,34 @@ import * as React from "react";
|
|
|
2
2
|
/**
|
|
3
3
|
* Wrapper component that handles common media playback operations that is reusable with audio and video players
|
|
4
4
|
*/
|
|
5
|
-
const MediaPlaybackWrapper = React.forwardRef(({
|
|
6
|
-
const togglePlayback = React.useCallback(() => {
|
|
5
|
+
const MediaPlaybackWrapper = React.forwardRef(({ media, isPlaying, onTogglePlayback, children }, ref) => {
|
|
6
|
+
const togglePlayback = React.useCallback(async () => {
|
|
7
7
|
onTogglePlayback === null || onTogglePlayback === void 0 ? void 0 : onTogglePlayback();
|
|
8
8
|
if (isPlaying) {
|
|
9
|
-
|
|
9
|
+
await (media === null || media === void 0 ? void 0 : media.pauseAsync());
|
|
10
10
|
}
|
|
11
11
|
else {
|
|
12
|
-
|
|
12
|
+
await (media === null || media === void 0 ? void 0 : media.playAsync());
|
|
13
13
|
}
|
|
14
|
-
}, [isPlaying, onTogglePlayback]);
|
|
15
|
-
const pause = React.useCallback(() => {
|
|
14
|
+
}, [media, isPlaying, onTogglePlayback]);
|
|
15
|
+
const pause = React.useCallback(async () => {
|
|
16
16
|
onTogglePlayback === null || onTogglePlayback === void 0 ? void 0 : onTogglePlayback();
|
|
17
|
-
|
|
18
|
-
}, [
|
|
19
|
-
const play = React.useCallback(() => {
|
|
17
|
+
await (media === null || media === void 0 ? void 0 : media.pauseAsync());
|
|
18
|
+
}, [media, onTogglePlayback]);
|
|
19
|
+
const play = React.useCallback(async () => {
|
|
20
20
|
onTogglePlayback === null || onTogglePlayback === void 0 ? void 0 : onTogglePlayback();
|
|
21
|
-
|
|
22
|
-
}, [
|
|
23
|
-
const seekToPosition = React.useCallback((positionMillis) => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
21
|
+
await (media === null || media === void 0 ? void 0 : media.playAsync());
|
|
22
|
+
}, [media, onTogglePlayback]);
|
|
23
|
+
const seekToPosition = React.useCallback(async (positionMillis) => {
|
|
24
|
+
await (media === null || media === void 0 ? void 0 : media.setPositionAsync(positionMillis));
|
|
25
|
+
}, [media]);
|
|
26
|
+
React.useEffect(() => {
|
|
27
|
+
return media
|
|
28
|
+
? () => {
|
|
29
|
+
media.unloadAsync();
|
|
30
|
+
}
|
|
31
|
+
: undefined;
|
|
32
|
+
}, [media]);
|
|
31
33
|
React.useImperativeHandle(ref, () => ({
|
|
32
34
|
seekToPosition,
|
|
33
35
|
togglePlayback,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaPlaybackWrapper.js","sourceRoot":"","sources":["../../../../../src/components/MediaPlayer/MediaPlaybackWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MediaPlaybackWrapper.js","sourceRoot":"","sources":["../../../../../src/components/MediaPlayer/MediaPlaybackWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B;;GAEG;AACH,MAAM,oBAAoB,GAAG,KAAK,CAAC,UAAU,CAG3C,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE;IAC1D,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAClD,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,EAAI,CAAC;QAErB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,EAAE,CAAA,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,EAAE,CAAA,CAAC;QAC3B,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,EAAI,CAAC;QACrB,MAAM,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,EAAE,CAAA,CAAC;IAC5B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,EAAI,CAAC;QACrB,MAAM,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,EAAE,CAAA,CAAC;IAC3B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE9B,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CACtC,KAAK,EAAE,cAAsB,EAAE,EAAE;QAC/B,MAAM,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,gBAAgB,CAAC,cAAc,CAAC,CAAA,CAAC;IAChD,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,OAAO,KAAK;YACV,CAAC,CAAC,GAAG,EAAE;gBACH,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,CAAC;YACH,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,KAAK,CAAC,mBAAmB,CACvB,GAAG,EACH,GAAG,EAAE,CAAC,CAAC;QACL,cAAc;QACd,cAAc;QACd,KAAK;QACL,IAAI;KACL,CAAC,EACF,CAAC,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAC9C,CAAC;IAEF,OAAO,0CAAG,QAAQ,CAAI,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,eAAe,oBAAoB,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { VideoSource } from "expo-video";
|
|
1
|
+
import { AVPlaybackSource, AVPlaybackStatus } from "expo-av";
|
|
3
2
|
import React from "react";
|
|
4
3
|
export interface MediaPlayerStatus {
|
|
5
4
|
isPlaying: boolean;
|
|
@@ -20,11 +19,11 @@ export interface MediaPlayerRef {
|
|
|
20
19
|
export interface MediaPlayerProps {
|
|
21
20
|
onPlaybackStatusUpdate?: (status: MediaPlayerStatus) => void;
|
|
22
21
|
onPlaybackFinish?: () => void;
|
|
23
|
-
source:
|
|
22
|
+
source: AVPlaybackSource;
|
|
24
23
|
}
|
|
24
|
+
export declare function mapToMediaPlayerStatus(status: AVPlaybackStatus): MediaPlayerStatus;
|
|
25
25
|
/**
|
|
26
26
|
* Base64 strings are not playable on iOS and needs to be saved to a file before playing
|
|
27
27
|
*/
|
|
28
|
-
export declare function normalizeBase64Source(source:
|
|
29
|
-
export declare function useSourceDeepCompareMemoize(value: any): any;
|
|
28
|
+
export declare function normalizeBase64Source(source: AVPlaybackSource, type: "audio" | "video"): Promise<AVPlaybackSource>;
|
|
30
29
|
export declare function useSourceDeepCompareEffect(callback: React.EffectCallback, dependencies: React.DependencyList): void;
|
|
@@ -1,14 +1,37 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
import { Platform } from "react-native";
|
|
3
3
|
import React from "react";
|
|
4
|
+
export function mapToMediaPlayerStatus(status) {
|
|
5
|
+
if (status.isLoaded) {
|
|
6
|
+
return {
|
|
7
|
+
isPlaying: status.isPlaying,
|
|
8
|
+
isLoading: false,
|
|
9
|
+
isBuffering: status.isBuffering,
|
|
10
|
+
currentPositionMillis: status.positionMillis || 0,
|
|
11
|
+
durationMillis: status.durationMillis || 0,
|
|
12
|
+
bufferedDurationMillis: status.playableDurationMillis || 0,
|
|
13
|
+
isError: false,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
isPlaying: false,
|
|
18
|
+
isLoading: false,
|
|
19
|
+
isBuffering: false,
|
|
20
|
+
currentPositionMillis: 0,
|
|
21
|
+
durationMillis: 0,
|
|
22
|
+
bufferedDurationMillis: 0,
|
|
23
|
+
isError: true,
|
|
24
|
+
error: status.error,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
4
27
|
const URL_REGEX = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/;
|
|
5
28
|
/**
|
|
6
29
|
* Base64 strings are not playable on iOS and needs to be saved to a file before playing
|
|
7
30
|
*/
|
|
8
|
-
export function normalizeBase64Source(source, type) {
|
|
31
|
+
export async function normalizeBase64Source(source, type) {
|
|
9
32
|
const uri = source === null || source === void 0 ? void 0 : source.uri;
|
|
10
33
|
if (Platform.OS === "ios" && uri && !uri.match(URL_REGEX)) {
|
|
11
|
-
const { File, Paths } =
|
|
34
|
+
const { File, Paths } = await import("expo-file-system");
|
|
12
35
|
const defaultMimeType = type === "audio" ? "wav" : "mp4";
|
|
13
36
|
const mimeType = uri.startsWith(`data:${type}/`)
|
|
14
37
|
? uri.substring(`data:${type}/`.length, uri.indexOf(";")) //Ex: extract 'mp4' from 'data:video/mp4;base64,....'
|
|
@@ -34,7 +57,7 @@ function sourceDeepCompareEquals(a, b) {
|
|
|
34
57
|
}
|
|
35
58
|
return a === b;
|
|
36
59
|
}
|
|
37
|
-
|
|
60
|
+
function useSourceDeepCompareMemoize(value) {
|
|
38
61
|
const ref = React.useRef(undefined);
|
|
39
62
|
if (!sourceDeepCompareEquals(value, ref.current)) {
|
|
40
63
|
ref.current = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaPlayerCommon.js","sourceRoot":"","sources":["../../../../../src/components/MediaPlayer/MediaPlayerCommon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MediaPlayerCommon.js","sourceRoot":"","sources":["../../../../../src/components/MediaPlayer/MediaPlayerCommon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,16 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import type { MediaPlayerRef, MediaPlayerProps
|
|
2
|
+
import { ImageResizeMode } from "react-native";
|
|
3
|
+
import { VideoProps as ExpoVideoProps } from "expo-av";
|
|
4
|
+
import type { MediaPlayerRef, MediaPlayerProps } from "../MediaPlayerCommon";
|
|
5
5
|
type ResizeMode = "contain" | "cover" | "stretch";
|
|
6
|
-
type ExpoVideoPropsOmitted = Omit<ExpoVideoProps, "
|
|
6
|
+
type ExpoVideoPropsOmitted = Omit<ExpoVideoProps, "videoStyle" | "resizeMode" | "onPlaybackStatusUpdate" | "source">;
|
|
7
7
|
interface VideoPlayerProps extends ExpoVideoPropsOmitted, MediaPlayerProps {
|
|
8
8
|
resizeMode?: ResizeMode;
|
|
9
9
|
posterResizeMode?: ImageResizeMode;
|
|
10
|
-
posterSource?: ImageProps["source"];
|
|
11
|
-
usePoster?: boolean;
|
|
12
10
|
playsInSilentModeIOS?: boolean;
|
|
13
|
-
isMuted?: boolean;
|
|
14
|
-
useNativeControls?: boolean;
|
|
15
|
-
shouldPlay?: boolean;
|
|
16
|
-
isLooping?: boolean;
|
|
17
|
-
positionMillis?: number;
|
|
18
|
-
rate?: number;
|
|
19
|
-
volume?: number;
|
|
20
11
|
}
|
|
21
12
|
export interface VideoPlayerRef extends MediaPlayerRef {
|
|
22
13
|
toggleFullscreen: () => void;
|
|
23
14
|
}
|
|
24
15
|
declare const VideoPlayer: React.ForwardRefExoticComponent<VideoPlayerProps & React.RefAttributes<VideoPlayerRef>>;
|
|
25
|
-
export declare function mapToMediaPlayerStatus(status: TimeUpdateEventPayload, player: VideoPlayerType): MediaPlayerStatus;
|
|
26
16
|
export default VideoPlayer;
|