import * as React from "react"; import classnames from "classnames"; import { Add, Cloud, Unlock, Info } from "../Icons"; import classNames from "classnames"; import path from "path-browserify"; import { useDropzone } from "react-dropzone"; import { nanoid } from "nanoid"; import useAccounts from "../../services/useAccounts"; import Link from "../Link"; import UploaderElement from "./UploaderElement"; const MAX_PARALLEL_UPLOADS = 1; const getFilePath = (file) => file.webkitRelativePath || file.path || file.name; const getRootDirectory = (file) => { const filePath = getFilePath(file); const { root, dir } = path.parse(filePath); return path.normalize(dir).slice(root.length).split(path.sep)[0]; }; const RegistrationLink = () => ( Sign up ); const LogInLink = () => ( Log in ); const Uploader = () => { const [mode, setMode] = React.useState("file"); const [uploads, setUploads] = React.useState([]); const { data: accounts } = useAccounts(); const showAccountFeatures = accounts?.enabled && !accounts?.auth_required && !accounts?.authenticated; const disabledComponent = accounts?.enabled && accounts?.auth_required && !accounts?.authenticated; const onUploadStateChange = React.useCallback((id, state) => { setUploads((uploads) => { const index = uploads.findIndex((upload) => upload.id === id); return [...uploads.slice(0, index), { ...uploads[index], ...state }, ...uploads.slice(index + 1)]; }); }, []); const handleDrop = async (files) => { if (mode === "directory" && files.length) { const name = getRootDirectory(files[0]); // get the file path from the first file const size = files.reduce((acc, file) => acc + file.size, 0); files = [{ name, size, files }]; } setUploads((uploads) => [...files.map((file) => ({ id: nanoid(), file, mode, status: "enqueued" })), ...uploads]); }; React.useEffect(() => { const enqueued = uploads.filter(({ status }) => status === "enqueued"); const uploading = uploads.filter(({ status }) => ["uploading", "processing", "retrying"].includes(status)); const queue = enqueued.slice(0, MAX_PARALLEL_UPLOADS - uploading.length).map(({ id }) => id); if (queue.length && uploading.length < MAX_PARALLEL_UPLOADS) { setUploads((uploads) => { return uploads.map((upload) => { if (queue.includes(upload.id)) return { ...upload, status: "uploading" }; return upload; }); }); } }, [uploads]); const { getRootProps, getInputProps, isDragActive, inputRef } = useDropzone({ onDrop: handleDrop }); const inputElement = inputRef.current; React.useEffect(() => { if (!inputElement) return; if (mode === "directory") inputElement.setAttribute("webkitdirectory", "true"); if (mode === "file") inputElement.removeAttribute("webkitdirectory"); }, [inputElement, mode]); return (
{uploads.length === 0 && }

{mode === "file" && Add or drop your files here to pin to Skynet} {mode === "directory" && Drop any folder with an index.html file to deploy to Skynet}

{!disabledComponent && (
)}
{uploads.length > 0 && (
{uploads.map((upload) => ( ))} {showAccountFeatures && (
{/* mobile - 2 lines */}

Your files are available for 90 days

to keep them forever

{/* desktop - 1 line */}

Your files are available for 90 days, to keep them forever

)}
)}
{uploads.length === 0 && showAccountFeatures && (

for free and unlock features

)} {disabledComponent && (

or for free

)}
); }; Uploader.propTypes = {}; Uploader.defaultProps = {}; export default Uploader;