diff --git a/src/UploadGrid.js b/src/UploadGrid.js index 10dca643..654062ba 100644 --- a/src/UploadGrid.js +++ b/src/UploadGrid.js @@ -4,67 +4,223 @@ import { HEADING_HEIGHT } from "./constants"; import { useActionCreator } from "./hooks"; import * as Actions from "./redux/actionCreators"; import * as Utils from "./utils"; +import DropTarget from "./DropTarget"; -function DropTarget({ getInputProps }) { - return ( -
-
Drop Skins Here
-
- We'll analyze them in your browser to find any that are missing from the - museum -
- -
- ); -} - -function Section({ files, filter, title, render }) { - const matches = useMemo(() => files.filter(filter), [files, filter]); - if (matches.length === 0) { +function Section({ files, title, render, open = false }) { + if (files.length === 0) { return null; } return ( - <> -

- {matches.length.toLocaleString()} {title} -

+
+ +

{title}

+
+
+ ); +} + +function useBucketed(filesArr) { + return useMemo(() => { + const missing = []; + const notSkins = []; + const modernSkins = []; + const foundSkins = []; + filesArr.forEach((file) => { + switch (file.status) { + case "MISSING": + case "UPLOADING": + case "UPLOAD_FAILED": + case "ARCHIVED": + missing.push(file); + break; + case "INVALID_FILE_EXTENSION": + notSkins.push(file); + break; + case "NOT_CLASSIC_SKIN": + modernSkins.push(file); + break; + case "FOUND": + foundSkins.push(file); + break; + default: + } + }); + return { missing, notSkins, modernSkins, foundSkins }; + }, [filesArr]); +} + +function Plural({ count, single, plural }) { + return count === 1 ? single : plural; +} + +function Inner({ getInputProps, isDragActive, files }) { + const tryToUploadAllFiles = useActionCreator(Actions.tryToUploadAllFiles); + const filesArr = Object.values(files); + const { missing, notSkins, modernSkins, foundSkins } = useBucketed(filesArr); + + if (filesArr.some((file) => file.status === "NEW")) { + return ( +

+ Analyzing {filesArr.length.toLocaleString()}{" "} + + ... +

+ ); + } + + return ( + <> +

+ You have {missing.length.toLocaleString()}{" "} + that we + are missing! +

+ {filesArr.some((file) => file.status === "MISSING") && ( +
+ +
+ )} + + + + + + + + + {missing.map((file) => { + switch (file.status) { + case "MISSING": + return ( + + + + ); + case "UPLOADING": + return ( + + + + + ); + case "UPLOAD_FAILED": + return ( + <> + + + + ); + case "ARCHIVED": + return ( + <> + + + + ); + default: + console.error(`Unexpected file status: ${file.status}`); + return null; + } + })} + +
StatusFilename
+ + {file.file.name} +
🚀 Uploading... + {file.file.name} +
❌ Upload Failed + {file.file.name} + ✅ Added! + + {file.file.name} + +
+
New skins ({missing.length.toLocaleString()})} + render={(file) => { + switch (file.status) { + case "MISSING": + return {file.file.name}; + case "UPLOADING": + return ( + <> + {file.file.name} (🚀 Uploading...) + + ); + case "UPLOAD_FAILED": + return ( + <> + {file.file.name} (❌ Upload Failed) + + ); + case "ARCHIVED": + return ( + <> + + {file.file.name} + {" "} + (✅ Added!) + + ); + default: + console.error(`Unexpected file status: ${file.status}`); + return null; + } + }} + /> +
Files that are not skins ({notSkins.length.toLocaleString()}) + } + render={(file) => {file.file.name}} + /> +
+ Modern Skins (we're not accepting these yet) ( + {modernSkins.length.toLocaleString()}) + + } + render={(file) => {file.file.name}} + /> +
Already in the museum ({foundSkins.length.toLocaleString()}) + } + render={(file) => ( + + {file.file.name} + + )} + /> ); } -function UploadGrid({ getInputProps, isDragActive }) { +function UploadGrid({ getInputProps, isDragActive, ...props }) { const files = useSelector((state) => state.fileUploads); - const tryToUploadAllFiles = useActionCreator(Actions.tryToUploadAllFiles); - const filesArr = Object.values(files); - return (
{isDragActive || Object.keys(files).length === 0 ? ( ) : ( -
-
- This feature is still in beta. If you have any issues, please reach - out to{" "} - - jordan@jordaneldredge.com - - . -
-

- {`You've dragged in ${filesArr.length.toLocaleString()} files`} - {filesArr.some((file) => file.status === "NEW") && - " (Analyzing...)"} -

-
- are new skins! - {filesArr.some((file) => file.status === "MISSING") && ( -
- -
- )} - - } - filter={(file) => - file.status === "MISSING" || - file.status === "UPLOADING" || - file.status === "UPLOAD_FAILED" || - file.status === "ARCHIVED" - } - render={(file) => { - switch (file.status) { - case "MISSING": - return file.file.name; - case "UPLOADING": - return <>{file.file.name} (🚀 Uploading...); - case "UPLOAD_FAILED": - return <>{file.file.name} (❌ Upload Failed); - case "ARCHIVED": - return ( - <> - - {file.file.name} - {" "} - (✅ Added!) - - ); - default: - console.error(`Unexpected file status: ${file.status}`); - return null; - } - }} - /> -
file.status === "INVALID_FILE_EXTENSION"} - render={(file) => file.file.name} - /> -
file.status === "NOT_CLASSIC_SKIN"} - render={(file) => file.file.name} - /> -
file.status === "FOUND"} - render={(file) => ( - - {file.file.name} - - )} - /> +
+
)}