"use client"; import { formatDistanceToNow } from "date-fns"; import React, { useEffect, useState, useCallback } from "react"; import DocumentIcon from "@/components/Icons/Document"; import FolderIcon from "@/components/Icons/Folder"; import MenuIcon from "@/components/Icons/Menu"; import ContextMenuContainer from "./ContextMenu/container"; import RenamePopup from "./ContextMenu/rename"; import Pterodactyl from "@/components/Pterodactyl"; 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(""); 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 [serverId, setServerId] = useState(""); const setCredentials = useCallback(async () => { setApiKey("ptlc_N77A2hEczFmSwGXm4cEXh4Gw3ZP0Ygr5NaBkGlE7pjU"); setServerId("ec46691a"); }, []); const showRenamePopup = useCallback(() => { setContextMenu(initialContextMenuState); setRenamePopup({ show: true }); }, []); const closeRenamePopup = useCallback(() => { setRenamePopup(initialRenamePopupState); }, []); const formateDate = (isoDate: string) => { const date = new Date(isoDate); return formatDistanceToNow(date, { addSuffix: true }); }; const handleRenameFile = useCallback( (file: FileProps, newName: string) => { if (ptero) { ptero.files.rename(file, newName).then(() => { ptero.files.fetchFiles().then(setFileList); // Pobierz zaktualizowaną listę plików po zmianie nazwy }); } setRenamePopup(initialRenamePopupState); }, [ptero] ); const handleClickContextMenu = useCallback( (e: React.MouseEvent, file: FileProps) => { e.preventDefault(); setContextMenu({ show: true, x: e.pageX, y: e.pageY, file }); }, [] ); const handleContextMenuClose = useCallback(() => { setContextMenu(initialContextMenuState); }, []); const formatDate = useCallback((isoDate: string) => { return formatDistanceToNow(new Date(isoDate), { addSuffix: true }); }, []); useEffect(() => { const setupApplication = async () => { await setCredentials(); while (!apiKey) { await new Promise((r) => setTimeout(r, 200)); } const pterodactylInstance = new Pterodactyl(serverId, apiKey); setPtero(pterodactylInstance); const files = await pterodactylInstance.files.fetchFiles(); setFileList(files); }; setupApplication(); }, [apiKey, serverId, setCredentials]); return ( <> {renamePopup.show && ( )} {contextMenu.show && ( )} {fileList.map((file: FileProps) => (
{file.attributes.is_file ? : }
{file.attributes.name}
{file.attributes.is_file ? file.attributes.size + " bytes" : ""}
{formateDate(file.attributes.modified_at)}
handleClickContextMenu(e, file)}>
))} ); }; export default Index;