Add hover controls

This commit is contained in:
Zoe Roux 2022-10-05 13:51:28 +09:00
parent 251b80b152
commit 9b62cb8a93

View File

@ -447,6 +447,9 @@ const query = (slug: string): QueryIdentifier<WatchItem> => ({
parser: WatchItemP, parser: WatchItemP,
}); });
//
let mouseCallback: NodeJS.Timeout;
const Player: QueryPage<{ slug: string }> = ({ slug }) => { const Player: QueryPage<{ slug: string }> = ({ slug }) => {
const { data, error } = useFetch(query(slug)); const { data, error } = useFetch(query(slug));
const { const {
@ -458,18 +461,36 @@ const Player: QueryPage<{ slug: string }> = ({ slug }) => {
setProgress, setProgress,
setVolume, setVolume,
} = useVideoController(); } = useVideoController();
const [showHover, setHover] = useState(true); const [showHover, setHover] = useState(false);
const [mouseMoved, setMouseMoved] = useState(false);
useEffect(() => {
const handler = () => {
setMouseMoved(true);
if (mouseCallback) clearTimeout(mouseCallback);
mouseCallback = setTimeout(() => {
setMouseMoved(false);
}, 2500);
};
document.addEventListener("mousemove", handler);
return () => document.removeEventListener("mousemove", handler);
});
const name = data const name = data
? data.isMovie ? data.isMovie
? data.name ? data.name
: `${episodeDisplayNumber(data, "")} ${data.name}` : `${episodeDisplayNumber(data, "")} ${data.name}`
: undefined; : undefined;
const displayControls = showHover || !isPlaying || mouseMoved;
if (error) return <ErrorPage {...error} />; if (error) return <ErrorPage {...error} />;
return ( return (
<> <Box
onMouseLeave={() => setMouseMoved(false)}
sx={{ cursor: displayControls ? "unset" : "none" }}
>
<Box <Box
component="video" component="video"
src={data?.link.direct} src={data?.link.direct}
@ -487,8 +508,19 @@ const Player: QueryPage<{ slug: string }> = ({ slug }) => {
}} }}
/> />
{isLoading && <LoadingIndicator />} {isLoading && <LoadingIndicator />}
{showHover && ( <Box
<> onMouseEnter={() => setHover(true)}
onMouseLeave={() => setHover(false)}
sx={ displayControls ? {
visibility: "visible",
opacity: 1,
transition: "opacity .2s ease-in",
} : {
visibility: "hidden",
opacity: 0,
transition: "opacity .4s ease-out, visibility 0s .4s",
}}
>
<Back <Back
name={data?.name} name={data?.name}
href={data ? (data.isMovie ? `/movie/${data.slug}` : `/show/${data.showSlug}`) : "#"} href={data ? (data.isMovie ? `/movie/${data.slug}` : `/show/${data.showSlug}`) : "#"}
@ -538,9 +570,8 @@ const Player: QueryPage<{ slug: string }> = ({ slug }) => {
</Box> </Box>
</Box> </Box>
</Box> </Box>
</> </Box>
)} </Box>
</>
); );
}; };