'use client'; import { cn } from '@/utils/cn'; import { bind } from 'bind-event-listener'; import { ChevronLeftIcon, FullscreenIcon } from 'lucide-react'; import { parseAsBoolean, useQueryState } from 'nuqs'; import { useEffect, useRef, useState } from 'react'; import { useDebounce } from 'usehooks-ts'; import { Button } from './ui/button'; import { Tooltiper } from './ui/tooltip'; type Props = { children: React.ReactNode; className?: string; }; export const useFullscreen = () => useQueryState( 'fullscreen', parseAsBoolean.withDefault(false).withOptions({ history: 'push', }), ); export const Fullscreen = (props: Props) => { const [isFullscreen] = useFullscreen(); return (
{props.children}
); }; export const FullscreenOpen = () => { const [fullscreen, setIsFullscreen] = useFullscreen(); if (fullscreen) { return null; } return ( ); }; export const FullscreenClose = () => { const [fullscreen, setIsFullscreen] = useFullscreen(); const isFullscreenDebounced = useDebounce(fullscreen, 1000); const [visible, setVisible] = useState(false); const ref = useRef(null); useEffect(() => { let timer: any; const unsub = bind(window, { type: 'mousemove', listener(ev) { if (fullscreen) { setVisible(true); clearTimeout(timer); timer = setTimeout(() => { if (!ref.current?.contains(ev.target as Node)) { setVisible(false); } }, 500); } }, }); return () => { unsub(); clearTimeout(timer); }; }, [fullscreen]); if (!fullscreen) { return null; } return (
); };