diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index ce608750..34f0c79a 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -1,5 +1,5 @@ import classNames from "classnames"; -import React, { useCallback, useEffect, useState } from "react"; +import React, { useState, useEffect, useCallback } from "react"; import { useTranslation } from "react-i18next"; import { Icon, Icons } from "@/components/Icon"; @@ -54,30 +54,12 @@ export function NextEpisodeButton(props: { const setShouldStartFromBeginning = usePlayerStore( (s) => s.setShouldStartFromBeginning, ); - const [countdown, setCountdown] = useState(15); let show = false; if (showingState === "always") show = true; else if (showingState === "hover" && props.controlsShowing) show = true; if (isHidden || status !== "playing" || duration === 0) show = false; - useEffect(() => { - // Initialize intervalId with 0, which is a safe value to clear if not reassigned. - let intervalId: number = 0; - if (show && countdown > 0) { - intervalId = window.setInterval(() => { - setCountdown((currentCountdown) => currentCountdown - 1); - }, 1000); - } else { - window.clearInterval(intervalId); // No need for casting here. - if (!show) { - setCountdown(15); // Reset countdown when not showing. - } - } - // Cleanup function to clear the interval when the component unmounts or the dependencies change. - return () => window.clearInterval(intervalId); - }, [show, countdown]); - const animation = showingState === "hover" ? "slide-up" : "fade"; let bottom = "bottom-[calc(6rem+env(safe-area-inset-bottom))]"; if (showingState === "always") @@ -109,6 +91,23 @@ export function NextEpisodeButton(props: { if (!meta?.episode || !nextEp) return null; if (metaType !== "show") return null; + const [seconds, setSeconds] = useState(15); + + useEffect(() => { + const interval = setInterval(() => { + setSeconds((prevSeconds) => prevSeconds - 1); + }, 1000); + + return () => clearInterval(interval); + }, []); + + useEffect(() => { + if (seconds === 0) { + loadNextEpisode(); + setSeconds(15); + } + }, [seconds, loadNextEpisode]); + return (
- {countdown > 0 && show && ( -
- {t("player.nextEpisode.nextIn", { seconds: countdown })} -
- )} -
- - -
+ +
);