import trpc from "~/lib/trpc"; import { useData } from "~/renderer/hooks"; import { Data } from "../+data"; import Spinner from "~/components/ui/spinner"; import { previewStore } from "../stores/web-preview"; import { useProjectContext } from "../context/project"; import { Suspense, lazy } from "react"; import CodeEditor from "~/components/ui/code-editor"; // const CodeEditor = lazy(() => import("~/components/ui/code-editor")); type Props = { id: number; }; const FileViewer = ({ id }: Props) => { const { project } = useProjectContext(); const { initialFiles } = useData<Data>(); const initialData = initialFiles.find((i) => i.id === id) as any; const { data, isLoading } = trpc.file.getById.useQuery(id, { initialData, }); const onFileContentChange = () => { // refresh preview previewStore.getState().refresh(); }; const updateFileContent = trpc.file.update.useMutation({ onSuccess: () => { onFileContentChange(); }, }); if (isLoading) { return <LoadingLayout />; } if (!data || data.isDirectory) { return <p>File not found.</p>; } if (!data.isFile) { return ( <Suspense fallback={<LoadingLayout />}> <CodeEditor filename={data.filename} path={data.path} value={data.content || ""} isReadOnly={!project.isMutable} formatOnSave onChange={(val) => { if (!project.isMutable) { return; } updateFileContent.mutate({ projectId: project.id, id, content: val, }); }} /> </Suspense> ); } return null; }; const LoadingLayout = () => { return ( <div className="w-full h-full flex items-center justify-center"> <Spinner /> </div> ); }; export default FileViewer;