"use client"; import React, { useCallback, useEffect, useMemo, useRef, useState, } from "react"; import { ResizableHandle, ResizablePanel, ResizablePanelGroup, } from "@/components/ui/resizable"; import { useScreen } from "usehooks-ts"; import Panel from "@/components/ui/panel"; import { cn } from "@/lib/utils"; import Tabs, { Tab } from "@/components/ui/tabs"; import FilePreview from "./_components/file-preview"; import trpc from "@/lib/trpc"; import FileListing from "./_components/file-listing"; import ProjectViewContext from "./context"; import WebPreview from "./_components/web-preview"; import type { FileSchema } from "@/server/db/schema/file"; const HomePage = () => { const webPreviewRef = useRef(null); const consoleLoggerRef = useRef(null); const [isMounted, setMounted] = useState(false); const screen = useScreen(); const isPortrait = screen?.width < screen?.height; const trpcUtils = trpc.useUtils(); const [curTabIdx, setCurTabIdx] = useState(0); const [curOpenFiles, setOpenFiles] = useState([]); const openedFilesData = trpc.file.getAll.useQuery( { id: curOpenFiles }, { enabled: curOpenFiles.length > 0 } ); const [openedFiles, setOpenedFiles] = useState([]); const deleteFile = trpc.file.delete.useMutation({ onSuccess: (file) => { trpcUtils.file.getAll.invalidate(); onFileChanged(file); const openFileIdx = curOpenFiles.indexOf(file.id); if (openFileIdx >= 0) { onCloseFile(openFileIdx); } }, }); useEffect(() => { setMounted(true); }, []); useEffect(() => { if (openedFilesData.data) { setOpenedFiles(openedFilesData.data); } }, [openedFilesData.data]); const refreshPreview = useCallback(() => { webPreviewRef.current?.refresh(); consoleLoggerRef.current?.clear(); }, []); useEffect(() => { if (isMounted) { refreshPreview(); } }, [isMounted, refreshPreview]); const onOpenFile = useCallback( (fileId: number) => { const idx = curOpenFiles.indexOf(fileId); if (idx >= 0) { return setCurTabIdx(idx); } setOpenFiles((state) => { setCurTabIdx(state.length); return [...state, fileId]; }); }, [curOpenFiles] ); const onDeleteFile = useCallback( (fileId: number) => { if ( window.confirm("Are you sure want to delete this files?") && !deleteFile.isPending ) { deleteFile.mutate(fileId); } }, [deleteFile] ); const onCloseFile = useCallback( (idx: number) => { const _f = [...curOpenFiles]; _f.splice(idx, 1); setOpenFiles(_f); if (curTabIdx === idx) { setCurTabIdx(Math.max(0, idx - 1)); } }, [curOpenFiles, curTabIdx] ); const onFileChanged = useCallback( (_file: Omit) => { openedFilesData.refetch(); }, [openedFilesData] ); const openFileList = useMemo(() => { return curOpenFiles.map((fileId) => { const fileData = openedFiles?.find((i) => i.id === fileId); return { title: fileData?.filename || "...", render: () => ( ), }; }) satisfies Tab[]; }, [curOpenFiles, openedFiles, refreshPreview]); if (!isMounted) { return null; } return (
{/* {!isPortrait ? ( <> ) : null} */}
); }; export default HomePage;