FEAT: Add custom error UI when stream unavailable
This commit is contained in:
@@ -9,11 +9,7 @@ interface VideoPlayerProps {
|
||||
onStreamDetected?: (isStreamAvailable: boolean) => void;
|
||||
}
|
||||
|
||||
const VideoPlayer: React.FC<VideoPlayerProps> = ({
|
||||
streamer,
|
||||
extraClasses = "",
|
||||
onStreamDetected,
|
||||
}) => {
|
||||
const VideoPlayer: React.FC<VideoPlayerProps> = ({ streamer, extraClasses = "", onStreamDetected }) => {
|
||||
const { streamerName: urlStreamerName } = useParams<{
|
||||
streamerName: string;
|
||||
}>();
|
||||
@@ -34,12 +30,7 @@ const VideoPlayer: React.FC<VideoPlayerProps> = ({
|
||||
|
||||
if (!playerRef.current) {
|
||||
const videoElement = document.createElement("video");
|
||||
videoElement.classList.add(
|
||||
"video-js",
|
||||
"vjs-big-play-centered",
|
||||
"w-full",
|
||||
"h-full"
|
||||
);
|
||||
videoElement.classList.add("video-js", "vjs-big-play-centered", "w-full", "h-full");
|
||||
videoElement.setAttribute("playsinline", "true");
|
||||
if (videoRef.current) {
|
||||
videoRef.current.appendChild(videoElement);
|
||||
@@ -68,6 +59,23 @@ const VideoPlayer: React.FC<VideoPlayerProps> = ({
|
||||
playerRef.current.on("error", () => {
|
||||
console.error(`Stream failed to load: ${streamUrl}`);
|
||||
if (onStreamDetected) onStreamDetected(false);
|
||||
|
||||
if (videoRef.current) {
|
||||
const errorDisplay = videoRef.current.querySelector(".vjs-error-display") as HTMLElement;
|
||||
if (errorDisplay) {
|
||||
errorDisplay.style.display = "none";
|
||||
}
|
||||
|
||||
// Custom error UI
|
||||
const errorElement = document.createElement("div");
|
||||
errorElement.className = "absolute top-0 left-0 right-0 flex flex-col items-center justify-center h-full bg-gray-800 text-white p-4 rounded";
|
||||
errorElement.innerHTML = `
|
||||
<div class="text-xl mb-2">Stream Currently Unavailable</div>
|
||||
<div class="mb-4">The streamer may be offline</div>
|
||||
`;
|
||||
videoRef.current.appendChild(errorElement);
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
console.log("Retrying stream...");
|
||||
playerRef.current?.src({
|
||||
@@ -75,6 +83,14 @@ const VideoPlayer: React.FC<VideoPlayerProps> = ({
|
||||
type: "application/x-mpegURL",
|
||||
});
|
||||
playerRef.current?.play();
|
||||
|
||||
// Remove the custom error UI before retrying
|
||||
if (videoRef.current) {
|
||||
const errorElement = videoRef.current.querySelector(".flex.flex-col");
|
||||
if (errorElement) {
|
||||
videoRef.current.removeChild(errorElement);
|
||||
}
|
||||
}
|
||||
}, 5000);
|
||||
});
|
||||
} else {
|
||||
@@ -97,10 +113,7 @@ const VideoPlayer: React.FC<VideoPlayerProps> = ({
|
||||
}, [streamerName]);
|
||||
|
||||
return (
|
||||
<div
|
||||
id="video-player"
|
||||
className={`${extraClasses} w-full h-full mx-auto flex justify-center items-center bg-gray-900 rounded-lg`}
|
||||
>
|
||||
<div id="video-player" className={`${extraClasses} w-full h-full mx-auto flex justify-center items-center bg-gray-900 rounded-lg`}>
|
||||
<div ref={videoRef} className="w-full max-w-[160vh] self-center" />
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user