/* eslint-disable react/display-name */ import Panel from "~/components/ui/panel"; import { ComponentProps, useCallback, useEffect, useRef } from "react"; import { useProjectContext } from "../context/project"; import { Button } from "~/components/ui/button"; import { FaExternalLinkAlt, FaRedo } from "react-icons/fa"; import { previewStore } from "../stores/web-preview"; import { ImperativePanelHandle } from "react-resizable-panels"; import useCommandKey from "~/hooks/useCommandKey"; import { ResizablePanel } from "~/components/ui/resizable"; import { useConsoleLogger } from "~/hooks/useConsoleLogger"; type WebPreviewProps = ComponentProps & { url?: string | null; }; const WebPreview = ({ url, ...props }: WebPreviewProps) => { const frameRef = useRef(null); const panelRef = useRef(null); const project = useProjectContext(); // hook into the console useConsoleLogger(); const refresh = useCallback(() => { if (frameRef.current) { frameRef.current.src = `${url}?t=${Date.now()}`; } }, [url]); const togglePanel = useCallback( (toggle?: boolean) => { const panel = panelRef.current; if (!panel) { return; } const expand = toggle != null ? toggle : !panel.isCollapsed(); if (expand) { panel.collapse(); } else { panel.expand(); panel.resize( typeof props.defaultSize === "number" ? props.defaultSize : 25 ); } }, [panelRef, props.defaultSize] ); useCommandKey("p", togglePanel); useEffect(() => { previewStore.setState({ refresh, toggle: togglePanel }); refresh(); }, [refresh, togglePanel]); const PanelComponent = !project.isCompact ? Panel : "div"; return ( previewStore.setState({ open: true })} onCollapse={() => previewStore.setState({ open: false })} {...props} >

Preview

{url != null ? (