Greff3's picture
Update src/components/preview/preview.tsx
1969d66 verified
raw
history blame
3 kB
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("Пожалуйста, подождите, пока ИИ закончит работу");
}
}}
>
<iframe
ref={iframeRef}
title="output"
className={classNames("w-full h-full select-none", {
"pointer-events-none": isResizing || isAiWorking,
})}
srcDoc={html}
/>
{!isAiWorking && (
<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 />
Назад к Редактору
</button>
{html === defaultHTML && (
<a
href="https://greff3-deepsite-gallery.static.hf.space"
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>Галерея готовых проектов</span>
</a>
)}
<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 />
Обновить Preview
</button>
</div>
)}
</div>
);
}
export default Preview;