import Navigation from "components/apps/FileExplorer/Navigation"; import StyledFileExplorer from "components/apps/FileExplorer/StyledFileExplorer"; import type { ComponentProcessProps } from "components/system/Apps/RenderComponent"; import { getIconFromIni } from "components/system/Files/FileEntry/functions"; import FileManager from "components/system/Files/FileManager"; import { useFileSystem } from "contexts/fileSystem"; import { useProcesses } from "contexts/process"; import { basename } from "path"; import { useCallback, useEffect, useRef, useState } from "react"; import { COMPRESSED_FOLDER_ICON, MOUNTED_FOLDER_ICON, PREVENT_SCROLL, ROOT_NAME, } from "utils/constants"; import { haltEvent } from "utils/functions"; const FileExplorer: FC = ({ id }) => { const { icon: setProcessIcon, title, processes: { [id]: process }, url: setProcessUrl, } = useProcesses(); const { componentWindow, closing, icon = "", url = "" } = process || {}; const { fs, rootFs } = useFileSystem(); const [currentUrl, setCurrentUrl] = useState(url); const inputRef = useRef(null); const directoryName = basename(url); const isMounted = Boolean(rootFs?.mntMap[url] && directoryName); const onKeyDown = useCallback((event: KeyboardEvent): void => { if (event.altKey && event.key.toUpperCase() === "D") { haltEvent(event); inputRef?.current?.focus(PREVENT_SCROLL); } }, []); useEffect(() => { if (url) { title(id, directoryName || ROOT_NAME); if ( !icon || url !== currentUrl || (isMounted && icon !== MOUNTED_FOLDER_ICON) ) { if (isMounted) { setProcessIcon( id, rootFs?.mntMap[url].getName() === "FileSystemAccess" ? MOUNTED_FOLDER_ICON : COMPRESSED_FOLDER_ICON ); } else if (fs) { setProcessIcon( id, `/System/Icons/${directoryName ? "folder" : "pc"}.webp` ); getIconFromIni(fs, url).then((iconFile) => { if (iconFile) setProcessIcon(id, iconFile); }); } setCurrentUrl(url); } } }, [ currentUrl, directoryName, fs, icon, id, isMounted, rootFs?.mntMap, setProcessIcon, setProcessUrl, title, url, ]); useEffect(() => { if (componentWindow && !closing && !url) { setProcessUrl(id, "/"); setProcessIcon(id, "/System/Icons/pc.webp"); } }, [closing, id, componentWindow, setProcessIcon, setProcessUrl, url]); useEffect(() => { componentWindow?.addEventListener("keydown", onKeyDown); return () => componentWindow?.removeEventListener("keydown", onKeyDown); }, [componentWindow, onKeyDown]); return url ? ( ) : // eslint-disable-next-line unicorn/no-null null; }; export default FileExplorer;