diff options
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/moments/trimmer.tsx | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/components/moments/trimmer.tsx b/src/components/moments/trimmer.tsx new file mode 100644 index 00000000..f011d222 --- /dev/null +++ b/src/components/moments/trimmer.tsx @@ -0,0 +1,102 @@ +import React, {useEffect, useState} from 'react'; +import Video from 'react-native-video'; +import {Trimmer, ProcessingManager} from 'react-native-video-processing'; +import {useRef} from 'react'; + +export const TrimmerPlayer: React.FC<{ + source: string; + styles: Object; + hideTrimmer: boolean; +}> = ({source, styles, hideTrimmer}) => { + const playerRef = useRef<Video>(); + + const [seekTime, setSeekTime] = useState<number>(0); + const [paused, setPaused] = useState<boolean>(false); + useEffect(() => { + playerRef.current?.seek(seekTime); + }, [seekTime]); + + const [trackerTime, setTrackerTime] = useState<number>(0); + useEffect(() => { + if (!paused && (trackerTime >= end || trackerTime < start)) { + setTrackerTime(start); + playerRef.current?.seek(start); + } + }, [trackerTime]); + + const [end, setEnd] = useState<number>(60); + const [start, setStart] = useState<number>(0); + useEffect(() => { + setSeekTime(start); + setTrackerTime(start); + }, [start]); + useEffect(() => { + setSeekTime(end); + setTrackerTime(end - 0.1); + }, [end]); + + const trim = () => { + ProcessingManager.trim(source, { + startTime: start / 2, //need to divide by two for bug in module + endTime: end, + // saveToCameraRoll: true, // default is false // iOS only + saveWithCurrentDate: true, // default is false // iOS only + quality: 'highest', + }).then((data: any) => console.log('trim', data)); + }; + + return ( + <> + <Video + ref={(ref) => { + playerRef.current = ref || undefined; + }} + source={{uri: source}} // Looks for .mp4 file (background.mp4) in the given expansion version. + rate={1.0} // 0 is paused, 1 is normal. + volume={1.0} // 0 is muted, 1 is normal. + muted={false} // Mutes the audio entirely. + paused={paused} // Pauses playback entirely. + //resizeMode="cover" // Fill the whole screen at aspect ratio. + repeat={true} // Repeat forever. + onLoad={(payload) => { + console.log(payload, source); + setEnd(payload.duration); + }} + onProgress={(e) => { + if (!paused) { + setTrackerTime(e.currentTime); + } + }} // Callback every ~250ms with currentTime + //onEnd={() => console.log('end')} // Callback when playback finishes + //onError={this.videoError} // Callback when video cannot be loaded + style={styles} + onTouchEnd={() => { + setPaused((state) => !state); + }} + /> + {hideTrimmer ? ( + <> </> + ) : ( + <Trimmer + source={source} + height={100} + width={350} + onTrackerMove={(e) => { + setPaused(true); + setSeekTime(e.currentTime); + }} // iOS only + currentTime={trackerTime + 0.25} // added .25 bc tracker is inaccurate + themeColor={'white'} // iOS only + showTrackerHandle={true} + thumbWidth={10} // iOS only + trackerColor={'white'} // iOS only + onChange={(e) => { + setPaused(true); + setEnd(e.endTime); + setStart(e.startTime); + }} + /> + )} + </> + ); +}; |
