import { useFileSystem } from "contexts/fileSystem"; import { useProcesses } from "contexts/process"; import processDirectory from "contexts/process/directory"; import { useSession } from "contexts/session"; import { useProcessesRef } from "hooks/useProcessesRef"; import { basename, join } from "path"; import { useCallback } from "react"; import { DESKTOP_PATH, FOLDER_BACK_ICON, PROCESS_DELIMITER, } from "utils/constants"; type UseFile = (pid: string, icon?: string) => Promise; const useFile = (url: string): UseFile => { const { setForegroundId } = useSession(); const { createPath, updateFolder } = useFileSystem(); const { minimize, open, url: setUrl } = useProcesses(); const processesRef = useProcessesRef(); return useCallback( async (pid: string, icon?: string) => { const { preferProcessIcon, singleton, icon: processIcon, } = processDirectory[pid] || {}; const activePid = Object.keys(processesRef.current).find((id) => id.startsWith(`${pid}${PROCESS_DELIMITER}`) ); let runUrl = url; if (url.startsWith("ipfs://")) { const { getIpfsFileName, getIpfsResource } = await import("utils/ipfs"); const ipfsData = await getIpfsResource(url); runUrl = join( DESKTOP_PATH, await createPath( await getIpfsFileName(url, ipfsData), DESKTOP_PATH, ipfsData ) ); updateFolder(DESKTOP_PATH, basename(runUrl)); } if (singleton && activePid) { setUrl(activePid, runUrl); if (processesRef.current[activePid].minimized) minimize(activePid); setForegroundId(activePid); } else { open( pid, { url: runUrl }, singleton || icon === FOLDER_BACK_ICON || preferProcessIcon ? processIcon : icon ); } }, [ createPath, minimize, open, processesRef, setForegroundId, setUrl, updateFolder, url, ] ); }; export default useFile;