3
0
mirror of https://github.com/Qortal/q-tube.git synced 2025-02-12 02:05:52 +00:00

Merge pull request #38 from QortalSeth/main

Videoplayer volume now persists across videos and app reloads. Default value is 50%.
This commit is contained in:
Qortal Dev 2024-10-03 14:11:59 -06:00 committed by GitHub
commit 0ede1b5590
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 30 additions and 11 deletions

View File

@ -37,6 +37,7 @@ import CSS from "csstype";
import { import {
setReduxPlaybackRate, setReduxPlaybackRate,
setStretchVideoSetting, setStretchVideoSetting,
setVolumeSetting,
StretchVideoType, StretchVideoType,
} from "../../../state/features/persistSlice.ts"; } from "../../../state/features/persistSlice.ts";
@ -87,12 +88,13 @@ export const VideoPlayer = React.forwardRef<refType, VideoPlayerProps>(
) => { ) => {
const videoSelector = useSelector((state: RootState) => state.video); const videoSelector = useSelector((state: RootState) => state.video);
const persistSelector = useSelector((state: RootState) => state.persist); const persistSelector = useSelector((state: RootState) => state.persist);
const dispatch = useDispatch(); const dispatch = useDispatch();
const videoRef = useRef<HTMLVideoElement>(null); const videoRef = useRef<HTMLVideoElement>(null);
const containerRef = useRef<HTMLDivElement>(null); const containerRef = useRef<HTMLDivElement>(null);
const [playing, setPlaying] = useState(false); const [playing, setPlaying] = useState(false);
const [volume, setVolume] = useState(1); const [volume, setVolume] = useState(persistSelector.volume);
const [mutedVolume, setMutedVolume] = useState(1); const [mutedVolume, setMutedVolume] = useState(persistSelector.volume);
const [isMuted, setIsMuted] = useState(false); const [isMuted, setIsMuted] = useState(false);
const [progress, setProgress] = useState(0); const [progress, setProgress] = useState(0);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
@ -240,9 +242,11 @@ export const VideoPlayer = React.forwardRef<refType, VideoPlayerProps>(
const onVolumeChange = (_: any, value: number | number[]) => { const onVolumeChange = (_: any, value: number | number[]) => {
if (!videoRef.current) return; if (!videoRef.current) return;
videoRef.current.volume = value as number; const newVolume = value as number;
setVolume(value as number); videoRef.current.volume = newVolume;
setVolume(newVolume);
setIsMuted(false); setIsMuted(false);
dispatch(setVolumeSetting(newVolume));
}; };
const onProgressChange = async (_: any, value: number | number[]) => { const onProgressChange = async (_: any, value: number | number[]) => {
@ -309,6 +313,7 @@ export const VideoPlayer = React.forwardRef<refType, VideoPlayerProps>(
}, []); }, []);
useEffect(() => { useEffect(() => {
videoRef.current.volume = volume;
if ( if (
videoPlaying && videoPlaying &&
videoPlaying.id === identifier && videoPlaying.id === identifier &&
@ -316,7 +321,7 @@ export const VideoPlayer = React.forwardRef<refType, VideoPlayerProps>(
videoRef?.current videoRef?.current
) { ) {
handleCanPlay(); handleCanPlay();
videoRef.current.volume = videoPlaying.volume;
videoRef.current.currentTime = videoPlaying.currentTime; videoRef.current.currentTime = videoPlaying.currentTime;
videoRef.current.play().then(() => { videoRef.current.play().then(() => {
setPlaying(true); setPlaying(true);
@ -571,6 +576,7 @@ export const VideoPlayer = React.forwardRef<refType, VideoPlayerProps>(
setMutedVolume(newVolume); setMutedVolume(newVolume);
videoRef.current.volume = newVolume; videoRef.current.volume = newVolume;
setVolume(newVolume); setVolume(newVolume);
dispatch(setVolumeSetting(newVolume));
} }
}; };
const setProgressRelative = (secondsChange: number) => { const setProgressRelative = (secondsChange: number) => {

View File

@ -7,7 +7,8 @@ import {
upsertVideos, upsertVideos,
upsertVideosBeginning, upsertVideosBeginning,
Video, Video,
upsertFilteredVideos, removeFromHashMap, upsertFilteredVideos,
removeFromHashMap,
} from "../state/features/videoSlice"; } from "../state/features/videoSlice";
import { import {
setIsLoadingGlobal, setIsLoadingGlobal,
@ -85,7 +86,9 @@ export const useFetchVideos = () => {
url, url,
}) })
); );
} catch (error) {console.log(error)} } catch (error) {
console.log(error);
}
}, []); }, []);
const getVideo = async ( const getVideo = async (
@ -186,7 +189,8 @@ export const useFetchVideos = () => {
} }
} }
} }
} catch (error) {console.log(error) } catch (error) {
console.log(error);
} finally { } finally {
dispatch(setIsLoadingGlobal(false)); dispatch(setIsLoadingGlobal(false));
} }
@ -372,7 +376,8 @@ export const useFetchVideos = () => {
} }
} }
} }
} catch (error) {console.log(error) } catch (error) {
console.log(error);
} }
}, },
[filteredVideos, hashMapVideos] [filteredVideos, hashMapVideos]
@ -412,7 +417,9 @@ export const useFetchVideos = () => {
const newArray = responseData.slice(0, findVideo); const newArray = responseData.slice(0, findVideo);
dispatch(setCountNewVideos(newArray.length)); dispatch(setCountNewVideos(newArray.length));
return; return;
} catch (error) {console.log(error)} } catch (error) {
console.log(error);
}
}, [videos]); }, [videos]);
const getVideosCount = React.useCallback(async () => { const getVideosCount = React.useCallback(async () => {

View File

@ -18,6 +18,7 @@ interface settingsState {
playbackRate: number; playbackRate: number;
subscriptionListFilter: SubscriptionListFilterType; subscriptionListFilter: SubscriptionListFilterType;
showStats: boolean; showStats: boolean;
volume: number;
} }
const initialState: settingsState = { const initialState: settingsState = {
@ -28,6 +29,7 @@ const initialState: settingsState = {
playbackRate: 1, playbackRate: 1,
subscriptionListFilter: "currentNameOnly", subscriptionListFilter: "currentNameOnly",
showStats: true, showStats: true,
volume: 0.5,
}; };
export const persistSlice = createSlice({ export const persistSlice = createSlice({
@ -72,6 +74,9 @@ export const persistSlice = createSlice({
changeFilterType: (state, action) => { changeFilterType: (state, action) => {
state.filterType = action.payload; state.filterType = action.payload;
}, },
setVolumeSetting: (state, action: PayloadAction<number>) => {
state.volume = action.payload;
},
}, },
}); });
@ -83,6 +88,7 @@ export const {
setReduxPlaybackRate, setReduxPlaybackRate,
changeFilterType, changeFilterType,
resetSubscriptions, resetSubscriptions,
setVolumeSetting,
} = persistSlice.actions; } = persistSlice.actions;
export default persistSlice.reducer; export default persistSlice.reducer;