diff --git a/ui/src/Room.tsx b/ui/src/Room.tsx index 033dc4c..f756ec1 100644 --- a/ui/src/Room.tsx +++ b/ui/src/Room.tsx @@ -44,10 +44,12 @@ export const Room = ({ const {enqueueSnackbar} = useSnackbar(); const [nameInput, setNameInput] = React.useState(''); const [permanent, setPermanent] = React.useState(false); - const [showControl] = React.useState(true); + const [showControl, setShowControl] = React.useState(true); + const [hoverControl, setHoverControl] = React.useState(); const [showMore, setShowMore] = React.useState(); const [selectedStream, setSelectedStream] = React.useState(); const [videoElement, setVideoElement] = React.useState(null); + useShowOnMouseMovement(setShowControl); React.useEffect(() => { if (selectedStream === HostStream && state.hostStream) { @@ -90,10 +92,20 @@ export const Room = ({ ); }; + const setHoverState = React.useMemo( + () => ({ + onMouseLeave: () => setHoverControl(false), + onMouseEnter: () => setHoverControl(true), + }), + [setHoverControl] + ); + + const controlVisible = showControl || open || showMore || hoverControl; + return (
- {showControl && ( - + {controlVisible && ( + )} - {showControl && ( - + {controlVisible && ( + {state.hostStream ? ( @@ -246,6 +258,40 @@ export const Room = ({
); }; + +const useShowOnMouseMovement = (doShow: (s: boolean) => void) => { + const lastMoved = React.useRef(0); + const timeoutHandle = React.useRef(0); + + React.useEffect(() => { + const update = () => { + if (timeoutHandle.current === 0) { + doShow(true); + } + + if (lastMoved.current < Date.now() - 100) { + clearInterval(timeoutHandle.current); + timeoutHandle.current = window.setTimeout(() => { + timeoutHandle.current = 0; + doShow(false); + }, 1000); + } + }; + window.addEventListener('mousemove', update); + return () => window.removeEventListener('mousemove', update); + }, [doShow]); + + React.useEffect( + () => + void (timeoutHandle.current = window.setTimeout(() => { + timeoutHandle.current = 0; + doShow(false); + }, 1000)), + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); +}; + const useStyles = makeStyles((theme: Theme) => ({ title: { padding: 15,