Spaces:
Running
Running
import classNames from "classnames"; | |
import { useRef } from "react"; | |
import { TbReload } from "react-icons/tb"; | |
import { toast } from "react-toastify"; | |
import { FaLaptopCode } from "react-icons/fa6"; | |
import { defaultHTML } from "../../../utils/consts"; | |
function Preview({ | |
html, | |
isResizing, | |
isAiWorking, | |
setView, | |
ref, | |
}: { | |
html: string; | |
isResizing: boolean; | |
isAiWorking: boolean; | |
setView: React.Dispatch<React.SetStateAction<"editor" | "preview">>; | |
ref: React.RefObject<HTMLDivElement | null>; | |
}) { | |
const iframeRef = useRef<HTMLIFrameElement | null>(null); | |
const handleRefreshIframe = () => { | |
if (iframeRef.current) { | |
const iframe = iframeRef.current; | |
const content = iframe.srcdoc; | |
iframe.srcdoc = ""; | |
setTimeout(() => { | |
iframe.srcdoc = content; | |
}, 10); | |
} | |
}; | |
return ( | |
<div | |
ref={ref} | |
className="w-full border-l border-gray-900 bg-white h-[calc(100dvh-49px)] lg:h-[calc(100dvh-53px)] relative" | |
onClick={(e) => { | |
if (isAiWorking) { | |
e.preventDefault(); | |
e.stopPropagation(); | |
toast.warn("Please wait for the AI to finish working."); | |
} | |
}} | |
> | |
<iframe | |
ref={iframeRef} | |
title="output" | |
className={classNames("w-full h-full select-none", { | |
"pointer-events-none": isResizing || isAiWorking, | |
})} | |
srcDoc={html} | |
/> | |
<div className="flex items-center justify-start gap-3 absolute bottom-3 lg:bottom-5 max-lg:left-3 lg:right-5"> | |
<button | |
className="lg:hidden bg-gray-950 shadow-md text-white text-xs lg:text-sm font-medium py-2 px-3 lg:px-4 rounded-lg flex items-center gap-2 border border-gray-900 hover:brightness-150 transition-all duration-100 cursor-pointer" | |
onClick={() => setView("editor")} | |
> | |
<FaLaptopCode className="text-sm" /> | |
Hide preview | |
</button> | |
{html === defaultHTML && ( | |
<a | |
href="https://huggingface.co/spaces/victor/deepsite-gallery" | |
target="_blank" | |
className="bg-gray-200 text-gray-950 text-xs lg:text-sm font-medium py-2 px-3 lg:px-4 rounded-lg flex items-center gap-2 border border-gray-200 hover:bg-gray-300 transition-all duration-100 cursor-pointer" | |
> | |
🖼️ <span>DeepSite Gallery</span> | |
</a> | |
)} | |
{!isAiWorking && ( | |
<button | |
className="bg-white lg:bg-gray-950 shadow-md text-gray-950 lg:text-white text-xs lg:text-sm font-medium py-2 px-3 lg:px-4 rounded-lg flex items-center gap-2 border border-gray-100 lg:border-gray-900 hover:brightness-150 transition-all duration-100 cursor-pointer" | |
onClick={handleRefreshIframe} | |
> | |
<TbReload className="text-sm" /> | |
Refresh Preview | |
</button> | |
)} | |
</div> | |
</div> | |
); | |
} | |
export default Preview; | |