@draftbit/core 54.0.4-6c949a.2 → 54.0.4-8202b6.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 +3 -1
- package/lib/typescript/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.js +69 -54
- package/lib/typescript/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.js.map +1 -1
- package/lib/typescript/src/components/MediaPlayer/MediaPlaybackWrapper.d.ts +3 -2
- package/lib/typescript/src/components/MediaPlayer/MediaPlaybackWrapper.js +19 -21
- package/lib/typescript/src/components/MediaPlayer/MediaPlaybackWrapper.js.map +1 -1
- package/lib/typescript/src/components/MediaPlayer/MediaPlayerCommon.d.ts +5 -4
- package/lib/typescript/src/components/MediaPlayer/MediaPlayerCommon.js +3 -26
- package/lib/typescript/src/components/MediaPlayer/MediaPlayerCommon.js.map +1 -1
- package/lib/typescript/src/components/MediaPlayer/VideoPlayer/VideoPlayer.d.ts +14 -4
- package/lib/typescript/src/components/MediaPlayer/VideoPlayer/VideoPlayer.js +125 -62
- package/lib/typescript/src/components/MediaPlayer/VideoPlayer/VideoPlayer.js.map +1 -1
- package/lib/typescript/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
- package/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.tsx +84 -72
- package/src/components/MediaPlayer/MediaPlaybackWrapper.tsx +21 -24
- package/src/components/MediaPlayer/MediaPlayerCommon.ts +8 -34
- package/src/components/MediaPlayer/VideoPlayer/VideoPlayer.tsx +213 -86
|
@@ -1,83 +1,131 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Image, StyleSheet, View, } from "react-native";
|
|
3
|
+
import { VideoView as VideoPlayerComponent, useVideoPlayer, } from "expo-video";
|
|
4
|
+
import { setAudioModeAsync } from "expo-audio";
|
|
4
5
|
import { extractSizeStyles } from "../../../utilities";
|
|
5
6
|
import MediaPlaybackWrapper from "../MediaPlaybackWrapper";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
const VideoPlayer = React.forwardRef(({ style, resizeMode = "contain", posterResizeMode = "cover", onPlaybackStatusUpdate: onPlaybackStatusUpdateProp, onPlaybackFinish, source, playsInSilentModeIOS = false, ...rest }, ref) => {
|
|
19
|
-
const [videoMediaObject, setVideoMediaObject] = React.useState();
|
|
7
|
+
import { normalizeBase64Source, useSourceDeepCompareEffect, useSourceDeepCompareMemoize, } from "../MediaPlayerCommon";
|
|
8
|
+
const VideoPlayer = React.forwardRef(({ style, resizeMode = "contain", posterResizeMode = "cover", posterSource, usePoster = false, onPlaybackStatusUpdate: onPlaybackStatusUpdateProp, onPlaybackFinish, source, playsInSilentModeIOS = false, isMuted = false, useNativeControls = true, shouldPlay = false, isLooping = false, positionMillis, allowsFullscreen = true, rate = 1, volume = 1, ...rest }, ref) => {
|
|
9
|
+
const stableSource = useSourceDeepCompareMemoize(normalizeBase64Source(source, "video"));
|
|
10
|
+
const player = useVideoPlayer(stableSource, (p) => {
|
|
11
|
+
p.loop = isLooping;
|
|
12
|
+
p.muted = isMuted;
|
|
13
|
+
p.volume = volume;
|
|
14
|
+
p.playbackRate = rate;
|
|
15
|
+
});
|
|
16
|
+
const videoPlayerRef = React.useRef(null);
|
|
20
17
|
const [isPlaying, setIsPlaying] = React.useState(false);
|
|
21
18
|
const [isFullscreen, setIsFullscreen] = React.useState(false);
|
|
22
|
-
const [
|
|
19
|
+
const [showPoster, setShowPoster] = React.useState(usePoster && !!posterSource);
|
|
23
20
|
const mediaPlaybackWrapperRef = React.useRef(null);
|
|
24
21
|
const sizeStyles = extractSizeStyles(style);
|
|
25
|
-
|
|
22
|
+
React.useEffect(() => {
|
|
23
|
+
player.muted = isMuted;
|
|
24
|
+
}, [player, isMuted]);
|
|
25
|
+
React.useEffect(() => {
|
|
26
|
+
player.loop = isLooping;
|
|
27
|
+
}, [player, isLooping]);
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
player.volume = volume;
|
|
30
|
+
}, [player, volume]);
|
|
31
|
+
React.useEffect(() => {
|
|
32
|
+
player.playbackRate = rate;
|
|
33
|
+
}, [player, rate]);
|
|
34
|
+
// Refs so statusChange can read latest shouldPlay/positionMillis
|
|
35
|
+
const shouldPlayRef = React.useRef(shouldPlay);
|
|
36
|
+
const positionMillisRef = React.useRef(positionMillis);
|
|
37
|
+
shouldPlayRef.current = shouldPlay;
|
|
38
|
+
positionMillisRef.current = positionMillis;
|
|
39
|
+
const hasAppliedInitialState = React.useRef(false);
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
const timeUpdateSub = player.addListener("timeUpdate", (status) => {
|
|
42
|
+
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp(mapToMediaPlayerStatus(status, player));
|
|
43
|
+
});
|
|
44
|
+
const playingChangeSub = player.addListener("playingChange", ({ isPlaying: playing }) => {
|
|
45
|
+
setIsPlaying(playing);
|
|
46
|
+
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp(mapPlayerToMediaPlayerStatus(player));
|
|
47
|
+
});
|
|
48
|
+
const playToEndSub = player.addListener("playToEnd", () => {
|
|
49
|
+
onPlaybackFinish === null || onPlaybackFinish === void 0 ? void 0 : onPlaybackFinish();
|
|
50
|
+
});
|
|
51
|
+
const statusChangeSub = player.addListener("statusChange", ({ status, error }) => {
|
|
52
|
+
if (status === "readyToPlay") {
|
|
53
|
+
setShowPoster(false);
|
|
54
|
+
if (!hasAppliedInitialState.current) {
|
|
55
|
+
hasAppliedInitialState.current = true;
|
|
56
|
+
if (positionMillisRef.current) {
|
|
57
|
+
player.currentTime = positionMillisRef.current / 1000;
|
|
58
|
+
}
|
|
59
|
+
if (shouldPlayRef.current) {
|
|
60
|
+
player.play();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const mappedStatus = mapPlayerToMediaPlayerStatus(player);
|
|
65
|
+
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp(status === "error" && error
|
|
66
|
+
? { ...mappedStatus, isError: true, error: error.message }
|
|
67
|
+
: mappedStatus);
|
|
68
|
+
});
|
|
69
|
+
return () => {
|
|
70
|
+
timeUpdateSub.remove();
|
|
71
|
+
playingChangeSub.remove();
|
|
72
|
+
playToEndSub.remove();
|
|
73
|
+
statusChangeSub.remove();
|
|
74
|
+
};
|
|
75
|
+
}, []);
|
|
76
|
+
// Replace video source when it changes (deep comparison on URI to avoid unnecessary reloads)
|
|
77
|
+
const isFirstSourceRender = React.useRef(true);
|
|
78
|
+
useSourceDeepCompareEffect(() => {
|
|
79
|
+
if (isFirstSourceRender.current) {
|
|
80
|
+
isFirstSourceRender.current = false;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
hasAppliedInitialState.current = false;
|
|
84
|
+
player.replace(normalizeBase64Source(source, "video"));
|
|
85
|
+
}, [source]);
|
|
86
|
+
let mappedVideoContentFit;
|
|
26
87
|
switch (resizeMode) {
|
|
27
88
|
case "contain":
|
|
28
|
-
|
|
89
|
+
mappedVideoContentFit = "contain";
|
|
29
90
|
break;
|
|
30
91
|
case "cover":
|
|
31
|
-
|
|
92
|
+
mappedVideoContentFit = "cover";
|
|
32
93
|
break;
|
|
33
94
|
case "stretch":
|
|
34
|
-
|
|
95
|
+
mappedVideoContentFit = "fill";
|
|
35
96
|
break;
|
|
36
97
|
}
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (status.isLoaded) {
|
|
41
|
-
if (status.didJustFinish) {
|
|
42
|
-
onPlaybackFinish === null || onPlaybackFinish === void 0 ? void 0 : onPlaybackFinish();
|
|
43
|
-
}
|
|
44
|
-
setIsPlaying(status.isPlaying);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
const onFullscreenUpdate = (fullscreenUpdate) => {
|
|
48
|
-
switch (fullscreenUpdate) {
|
|
49
|
-
case VideoFullscreenUpdate.PLAYER_DID_PRESENT:
|
|
50
|
-
case VideoFullscreenUpdate.PLAYER_WILL_PRESENT:
|
|
98
|
+
const onFullscreenUpdate = (type) => {
|
|
99
|
+
switch (type) {
|
|
100
|
+
case "entered":
|
|
51
101
|
setIsFullscreen(true);
|
|
52
102
|
break;
|
|
53
|
-
case
|
|
54
|
-
case VideoFullscreenUpdate.PLAYER_WILL_DISMISS:
|
|
103
|
+
case "exited":
|
|
55
104
|
setIsFullscreen(false);
|
|
56
105
|
break;
|
|
57
106
|
}
|
|
58
107
|
};
|
|
59
108
|
const toggleFullscreen = React.useCallback(async () => {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
109
|
+
var _a, _b;
|
|
110
|
+
if (videoPlayerRef) {
|
|
111
|
+
if (isFullscreen) {
|
|
112
|
+
await ((_a = videoPlayerRef.current) === null || _a === void 0 ? void 0 : _a.exitFullscreen());
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
await ((_b = videoPlayerRef.current) === null || _b === void 0 ? void 0 : _b.enterFullscreen());
|
|
116
|
+
}
|
|
65
117
|
}
|
|
66
|
-
}, [isFullscreen
|
|
118
|
+
}, [isFullscreen]);
|
|
67
119
|
const updateAudioMode = React.useCallback(async () => {
|
|
68
120
|
try {
|
|
69
|
-
await
|
|
70
|
-
playsInSilentModeIOS,
|
|
121
|
+
await setAudioModeAsync({
|
|
122
|
+
playsInSilentMode: playsInSilentModeIOS,
|
|
71
123
|
});
|
|
72
124
|
}
|
|
73
125
|
catch (e) {
|
|
74
126
|
console.error("Failed to set audio mode. Error details:", e);
|
|
75
127
|
}
|
|
76
128
|
}, [playsInSilentModeIOS]);
|
|
77
|
-
React.useEffect(() => {
|
|
78
|
-
if (isPlaying)
|
|
79
|
-
triggerAudio(mediaPlaybackWrapperRef);
|
|
80
|
-
}, [mediaPlaybackWrapperRef, isPlaying]);
|
|
81
129
|
React.useImperativeHandle(ref, () => {
|
|
82
130
|
var _a, _b, _c, _d;
|
|
83
131
|
return ({
|
|
@@ -91,19 +139,34 @@ const VideoPlayer = React.forwardRef(({ style, resizeMode = "contain", posterRes
|
|
|
91
139
|
// Include 'isPlaying' as dependency because 'togglePlayback' changes when it changes
|
|
92
140
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
93
141
|
[toggleFullscreen, isPlaying]);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
updateSource();
|
|
100
|
-
}, [source]);
|
|
101
|
-
return (React.createElement(MediaPlaybackWrapper, { media: videoMediaObject, isPlaying: isPlaying, ref: mediaPlaybackWrapperRef, onTogglePlayback: updateAudioMode },
|
|
102
|
-
React.createElement(VideoPlayerComponent
|
|
103
|
-
// https://docs.expo.dev/versions/latest/sdk/av/#example-video to see why ref is handled this way
|
|
104
|
-
, {
|
|
105
|
-
// https://docs.expo.dev/versions/latest/sdk/av/#example-video to see why ref is handled this way
|
|
106
|
-
ref: (component) => setVideoMediaObject(component), style: style, videoStyle: sizeStyles, resizeMode: mappedResizeMode, posterStyle: [sizeStyles, { resizeMode: posterResizeMode }], onPlaybackStatusUpdate: onPlaybackStatusUpdate, onFullscreenUpdate: (e) => onFullscreenUpdate(e.fullscreenUpdate), source: currentSource, ...rest })));
|
|
142
|
+
return (React.createElement(MediaPlaybackWrapper, { player: player, isPlaying: isPlaying, ref: mediaPlaybackWrapperRef, onTogglePlayback: updateAudioMode },
|
|
143
|
+
React.createElement(View, { style: [style, styles.container] },
|
|
144
|
+
React.createElement(VideoPlayerComponent, { ref: videoPlayerRef, player: player, nativeControls: useNativeControls, style: sizeStyles, contentFit: mappedVideoContentFit, onFullscreenEnter: () => onFullscreenUpdate("entered"), onFullscreenExit: () => onFullscreenUpdate("exited"), allowsFullscreen: allowsFullscreen, ...rest }),
|
|
145
|
+
showPoster && posterSource && (React.createElement(View, { style: StyleSheet.absoluteFill, pointerEvents: "none" },
|
|
146
|
+
React.createElement(Image, { source: posterSource, resizeMode: posterResizeMode, style: [StyleSheet.absoluteFill, sizeStyles] }))))));
|
|
107
147
|
});
|
|
148
|
+
const styles = StyleSheet.create({
|
|
149
|
+
container: {
|
|
150
|
+
overflow: "hidden",
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
function mapPlayerToMediaPlayerStatus(player) {
|
|
154
|
+
return {
|
|
155
|
+
isPlaying: player.playing,
|
|
156
|
+
isLoading: player.status === "loading",
|
|
157
|
+
isBuffering: player.status === "loading",
|
|
158
|
+
currentPositionMillis: player.currentTime * 1000,
|
|
159
|
+
durationMillis: player.duration * 1000,
|
|
160
|
+
bufferedDurationMillis: player.bufferedPosition * 1000,
|
|
161
|
+
isError: player.status === "error",
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
export function mapToMediaPlayerStatus(status, player) {
|
|
165
|
+
return {
|
|
166
|
+
...mapPlayerToMediaPlayerStatus(player),
|
|
167
|
+
currentPositionMillis: status.currentTime * 1000,
|
|
168
|
+
bufferedDurationMillis: status.bufferedPosition * 1000,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
108
171
|
export default VideoPlayer;
|
|
109
172
|
//# sourceMappingURL=VideoPlayer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoPlayer.js","sourceRoot":"","sources":["../../../../../../src/components/MediaPlayer/VideoPlayer/VideoPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"VideoPlayer.js","sourceRoot":"","sources":["../../../../../../src/components/MediaPlayer/VideoPlayer/VideoPlayer.tsx"],"names":[],"mappings":"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"}
|