import { useCallback, useEffect, useState } from "react"; import { useVirtualRoot } from "../../../hooks/virtual-drive/virtualRootContext.js"; import styles from "./FileExplorer.module.css"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faArrowUp, faCaretLeft, faCaretRight, faCircleInfo, faCog, faDesktop, faFileLines, faHouse, faImage, faPlus, faSearch, faTrash } from "@fortawesome/free-solid-svg-icons"; import { useWindowsManager } from "../../../hooks/windows/windowsManagerContext.js"; import { useContextMenu } from "../../../hooks/modals/contextMenu.js"; import { QuickAccessButton } from "./QuickAccessButton.jsx"; import { useWindowedModal } from "../../../hooks/modals/windowedModal.js"; import Vector2 from "../../../features/math/vector2.js"; import { DIALOG_CONTENT_TYPES } from "../../../constants/modals.js"; import { DirectoryList } from "./directory-list/DirectoryList.jsx"; import { Actions } from "../../actions/Actions.jsx"; import { ClickAction } from "../../actions/actions/ClickAction.jsx"; import utilStyles from "../../../styles/utils.module.css"; import { DialogBox } from "../../modals/dialog-box/DialogBox.jsx"; import AppsManager from "../../../features/applications/applications.js"; import { APPS } from "../../../constants/applications.js"; import { TITLE_SEPARATOR } from "../../../constants/windows.js"; import { FileProperties } from "../../modals/file-properties/FileProperties.jsx"; import { useHistory } from "../../../hooks/utils/history.js"; /** * @param {import("../../windows/WindowView.jsx").windowProps} props */ export function FileExplorer({ startPath, app, modalsManager }) { const virtualRoot = useVirtualRoot(); const [currentDirectory, setCurrentDirectory] = useState(virtualRoot.navigate(startPath ?? "~")); const [path, setPath] = useState(currentDirectory?.path ?? ""); const windowsManager = useWindowsManager(); const [showHidden] = useState(true); const { history, stateIndex, pushState, undo, redo, undoAvailable, redoAvailable } = useHistory(currentDirectory.path); const { openWindowedModal } = useWindowedModal({ modalsManager }); const { onContextMenu: onContextMenuFile } = useContextMenu({ modalsManager, Actions: (props) => { file.open(windowsManager); }}/> { file.delete(); }}/> { openWindowedModal({ title: `${file.id} ${TITLE_SEPARATOR} Properties`, iconUrl: file.getIconUrl(), size: new Vector2(400, 500), Modal: (props) => }); }}/> }); const { onContextMenu: onContextMenuFolder } = useContextMenu({ modalsManager, Actions: (props) => { changeDirectory(folder.name); }}/> { folder.delete(); }}/> }); // const { onContextMenu: onNew } = useContextMenu({ // modalsManager, // options: { // "File": () => { currentDirectory.createFile("New File"); }, // "Folder": () => { currentDirectory.createFolder("New Folder"); } // } // }); const changeDirectory = useCallback((path, absolute = false) => { if (path == null) return; if (currentDirectory == null) absolute = true; const directory = absolute ? virtualRoot.navigate(path) : currentDirectory.navigate(path); console.debug(directory); if (directory != null) { setCurrentDirectory(directory); setPath(directory.root ? "/" : directory.path); pushState(directory.path); } }, [currentDirectory, pushState, virtualRoot]); useEffect(() => { if (history.length === 0) return; const path = history[stateIndex]; const directory = virtualRoot.navigate(path); if (directory != null) { setCurrentDirectory(directory); setPath(directory.root ? "/" : directory.path); } }, [history, stateIndex, virtualRoot]); const onPathChange = (event) => { setPath(event.target.value); }; const onKeyDown = (event) => { let value = event.target.value; if (event.key === "Enter") { if (value === "") value = "~"; const directory = virtualRoot.navigate(value); if (directory == null) { openWindowedModal({ title: "Error", iconUrl: AppsManager.getAppIconUrl(APPS.FILE_EXPLORER), size: new Vector2(300, 150), Modal: (props) =>

Invalid path: "{value}"

}); return; } setCurrentDirectory(directory); setPath(directory.root ? "/" : directory.path); } }; const itemCount = currentDirectory.getItemCount(showHidden); return (
}); // if (currentDirectory.canBeEdited) { // onNew(event); // } else { // } }} >
{ changeDirectory("~"); }} icon={faHouse}/> { changeDirectory("~/Desktop"); }} icon={faDesktop}/> { changeDirectory("~/Pictures"); }} icon={faImage}/> { changeDirectory("~/Documents"); }} icon={faFileLines}/>
{ event.preventDefault(); windowsManager.openFile(file, { mode: "view" }); }} onClickFolder={(event, folder) => { changeDirectory(folder.linkedPath ?? folder.name); }} onContextMenuFile={onContextMenuFile} onContextMenuFolder={onContextMenuFolder} />

{itemCount === 1 ? itemCount + " item" : itemCount + " items" }

); }