Files
ToneGuessr/client/src/components/YouTubePlayer/YouTubePlayer.jsx
Mathias Wagner 388ce3d04a
All checks were successful
Publish Docker image / Push Docker image to Docker Hub (push) Successful in 1m32s
Translate UI parts to german
2025-03-01 20:01:10 +01:00

118 lines
3.1 KiB
JavaScript

import React, { useEffect, useRef, useState } from 'react';
import './styles.sass';
const YouTubePlayer = ({
videoId,
autoplay = false,
startTime = 45,
onReady = () => {},
className = ''
}) => {
const iframeRef = useRef(null);
const playerRef = useRef(null);
const [isLoaded, setIsLoaded] = useState(false);
const [customStartTime] = useState(startTime);
console.log("YouTubePlayer rendering with videoId:", videoId, "startTime:", startTime);
useEffect(() => {
if (!window.YT) {
const tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
window.onYouTubeIframeAPIReady = () => {
console.log("YouTube API ready");
};
const firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
}
}, []);
useEffect(() => {
if (!videoId) return;
const createPlayer = () => {
if (!window.YT || !window.YT.Player) {
console.log("YouTube API not ready, waiting...");
setTimeout(createPlayer, 100);
return;
}
if (playerRef.current) {
playerRef.current.destroy();
playerRef.current = null;
}
console.log("Creating YouTube player for video:", videoId);
try {
playerRef.current = new window.YT.Player(iframeRef.current, {
height: '200',
width: '300',
videoId: videoId,
playerVars: {
'playsinline': 1,
'controls': 1,
'showinfo': 0,
'rel': 0,
'autoplay': autoplay ? 1 : 0,
'start': startTime,
'modestbranding': 1,
'fs': 0,
},
events: {
'onReady': (event) => {
console.log("YouTube player ready");
if (autoplay) {
event.target.seekTo(startTime || 0);
event.target.playVideo();
}
setIsLoaded(true);
onReady();
},
'onError': (event) => {
console.error("YouTube player error:", event);
}
}
});
} catch (error) {
console.error("Error creating YouTube player:", error);
}
};
createPlayer();
return () => {
if (playerRef.current) {
try {
playerRef.current.destroy();
playerRef.current = null;
} catch (e) {
console.error("Error destroying player:", e);
}
}
};
}, [videoId, autoplay, onReady, startTime, customStartTime]);
useEffect(() => {
if (playerRef.current && isLoaded && customStartTime !== startTime) {
try {
playerRef.current.seekTo(customStartTime);
} catch (error) {
console.error("Error seeking to time:", error);
}
}
}, [customStartTime, isLoaded]);
return (
<div className={`youtube-player-container visible-player ${className}`}>
<div ref={iframeRef} className="youtube-embed" />
</div>
);
};
export default YouTubePlayer;