|
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"; |
|
|
|
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 /> |
|
Back to Editor |
|
</button> |
|
<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 /> |
|
Refresh Preview |
|
</button> |
|
</div> |
|
</div> |
|
); |
|
} |
|
|
|
export default Preview; |
|
|