mirror of
https://github.com/infinilabs/coco-app.git
synced 2025-12-16 11:37:47 +01:00
38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
|
|
import { useEffect, useState, useCallback, useRef } from "react";
|
||
|
|
import { Button } from "@headlessui/react";
|
||
|
|
import { Minimize2, Maximize2 } from "lucide-react";
|
||
|
|
|
||
|
|
export function FullScreen(props: any) {
|
||
|
|
const { children, right = 10, top = 10, ...rest } = props;
|
||
|
|
const ref = useRef<HTMLDivElement>();
|
||
|
|
const [fullScreen, setFullScreen] = useState(false);
|
||
|
|
const toggleFullscreen = useCallback(() => {
|
||
|
|
if (!document.fullscreenElement) {
|
||
|
|
ref.current?.requestFullscreen();
|
||
|
|
} else {
|
||
|
|
document.exitFullscreen();
|
||
|
|
}
|
||
|
|
}, []);
|
||
|
|
useEffect(() => {
|
||
|
|
const handleScreenChange = (e: any) => {
|
||
|
|
if (e.target === ref.current) {
|
||
|
|
setFullScreen(!!document.fullscreenElement);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
document.addEventListener("fullscreenchange", handleScreenChange);
|
||
|
|
return () => {
|
||
|
|
document.removeEventListener("fullscreenchange", handleScreenChange);
|
||
|
|
};
|
||
|
|
}, []);
|
||
|
|
return (
|
||
|
|
<div ref={ref} style={{ position: "relative" }} {...rest}>
|
||
|
|
<div style={{ position: "absolute", right, top }}>
|
||
|
|
<Button onClick={toggleFullscreen}>
|
||
|
|
{fullScreen ? <Minimize2 /> : <Maximize2 />}
|
||
|
|
</Button>
|
||
|
|
</div>
|
||
|
|
{children}
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|