"use client"; import { formatDistanceToNow } from "date-fns"; import React, { useEffect, useState, useCallback, useMemo } from "react"; import DocumentIcon from "@/components/Icons/Document"; import FolderIcon from "@/components/Icons/Folder"; import ServerIcon from "@/components/Icons/Server"; import MenuIcon from "@/components/Icons/Menu"; import ContextMenuContainer from "./ContextMenu/container"; import RenamePopup from "./ContextMenu/rename"; import Pterodactyl from "@/components/Pterodactyl"; import BreadCrumbs from "@/components/BreadCrumbs"; import { useSearchParams } from "next/navigation"; interface FileAttributes { name: string; modified_at: string; size: number; is_file: boolean; } interface FileProps { attributes: FileAttributes; } interface ContextMenuState { show: boolean; x: number; y: number; file: FileProps | null; } interface RenamePopupState { show: boolean; } const initialContextMenuState: ContextMenuState = { show: false, x: 0, y: 0, file: null, }; const initialRenamePopupState: RenamePopupState = { show: false, }; const Index = () => { const [apiKey, setApiKey] = useState( `${process.env.NEXT_PUBLIC_API_KEY}` ); const [fileList, setFileList] = useState([]); const [contextMenu, setContextMenu] = useState( initialContextMenuState ); const [renamePopup, setRenamePopup] = useState( initialRenamePopupState ); const [selectedFile, setSelectedFile] = useState(null); const [ptero, setPtero] = useState(null); const urlParams = useSearchParams(); const serverId = urlParams.get("serverid"); const pathParam = urlParams.get("path") || "/"; const showRenamePopup = useCallback(() => { setContextMenu(initialContextMenuState); setRenamePopup({ show: true }); }, []); const closeRenamePopup = useCallback(() => { setRenamePopup(initialRenamePopupState); }, []); const fetchFiles = useCallback(async (ptero: Pterodactyl) => { console.log("chwytam pliki"); const files = await ptero.files.fetchFiles(); setFileList(files); }, []); const handleRenameFile = useCallback( async (file: FileProps, newName: string) => { if (ptero) { await ptero.files.rename(file, newName); await fetchFiles(ptero); setRenamePopup(initialRenamePopupState); } }, [ptero, fetchFiles] ); const handleClickContextMenu = useCallback( (e: React.MouseEvent, file: FileProps) => { e.preventDefault(); setContextMenu({ show: true, x: e.pageX - 100, y: e.pageY, file }); }, [] ); const handleContextMenuClose = useCallback(() => { setContextMenu(initialContextMenuState); }, []); const changeDirectory = useCallback( (newPath: string) => { if (ptero) { ptero.helpers.setWorkingDirectory(newPath); fetchFiles(ptero); // setPath(newPath); } }, [ptero, fetchFiles] ); useEffect(() => { const setupApplication = () => { if (!apiKey || !serverId) return; // Upewniamy się, że mamy apiKey i serverId if (!ptero) { const pteroInstance = new Pterodactyl(serverId, apiKey); setPtero(pteroInstance); pteroInstance.helpers.setWorkingDirectory(pathParam); fetchFiles(pteroInstance); // Wywołanie fetchFiles raz po ustawieniu instancji } }; setupApplication(); }, [apiKey, serverId, ptero, pathParam, fetchFiles]); return ( <> {renamePopup.show && ( )} {contextMenu.show && ( )} {serverId && (
  • {serverId}
  • /
  • {pathParam .split("/") .filter((p) => p !== "") .map((element, index) => { const tmp_path = pathParam .split("/") .slice(0, index + 2) .join("/"); return (
  • {element}
  • ); })}
  • Add Document
  • )} {serverId && fileList && fileList.map((file: FileProps) => (
    {file.attributes.is_file ? : }
    {file.attributes.is_file ? ( {file.attributes.name} ) : ( {file.attributes.name} )}
    {file.attributes.is_file ? `${file.attributes.size} bytes` : ""}
    {formatDistanceToNow(new Date(file.attributes.modified_at), { addSuffix: true, })}
    handleClickContextMenu(e, file)}>
    ))} ); }; export default Index;