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}
+
- {matches.map((match, i) => {
+ {files.map((match, i) => {
return - {render(match)}
;
})}
+
+ );
+}
+
+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") && (
+
+
+
+ )}
+
+
+
+ | Status |
+ Filename |
+
+
+
+ {missing.map((file) => {
+ switch (file.status) {
+ case "MISSING":
+ return (
+
+ |
+
+ {file.file.name}
+ |
+
+ );
+ case "UPLOADING":
+ return (
+
+ | 🚀 Uploading... |
+
+ {file.file.name}
+ |
+
+ );
+ case "UPLOAD_FAILED":
+ return (
+ <>
+ ❌ Upload Failed |
+
+ {file.file.name}
+ |
+ >
+ );
+ case "ARCHIVED":
+ return (
+ <>
+ ✅ Added! |
+
+
+ {file.file.name}
+
+ |
+ >
+ );
+ default:
+ console.error(`Unexpected file status: ${file.status}`);
+ return null;
+ }
+ })}
+
+
+ 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 ? (
) : (
-
-
-
- {`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}
- />
-