mirror of
https://github.com/logos-storage/logos-storage-frontend.git
synced 2026-01-02 13:23:09 +00:00
173 lines
5.0 KiB
TypeScript
173 lines
5.0 KiB
TypeScript
import { useCallback, useEffect, useRef } from "react";
|
|
import { useDropzone } from "react-dropzone";
|
|
import styled from "styled-components";
|
|
import UploadedItemModel, {
|
|
UploadedItemStatus,
|
|
} from "../../../../data/models/UploadedItemModel";
|
|
import UploadedItemComponent from "../../../../components/uploadedItem/UploadedItemComponent";
|
|
import axios from "axios";
|
|
|
|
import { useDexyStore } from "../../../../store";
|
|
import constants from "../../../../util/Constants";
|
|
|
|
function UploadTab() {
|
|
const { uploads, setUploads, nodeInfo } = useDexyStore();
|
|
var filesCopy = useRef<UploadedItemModel[]>(uploads);
|
|
|
|
useEffect(() => {
|
|
console.log(uploads);
|
|
// setUploads([]);
|
|
}, [uploads]);
|
|
|
|
const onDrop = useCallback(
|
|
async (acceptedFiles: File[]) => {
|
|
console.log(acceptedFiles);
|
|
for (let i = 0; i < acceptedFiles.length; i++) {
|
|
new Promise(async (resolve, reject) => {
|
|
let cid: string = (Math.random() * 1000000).toString();
|
|
console.log(cid + acceptedFiles[i].name);
|
|
filesCopy.current.push({
|
|
cid: cid,
|
|
fileName: acceptedFiles[i].name,
|
|
fileSize: acceptedFiles[i].size,
|
|
lastModified: new Date(
|
|
acceptedFiles[i].lastModified
|
|
).toLocaleString(),
|
|
type: acceptedFiles[i].type,
|
|
status: UploadedItemStatus.UPLOADING,
|
|
});
|
|
setUploads(filesCopy.current);
|
|
|
|
var bytes = await acceptedFiles[i].arrayBuffer();
|
|
bytes = new Uint8Array(bytes);
|
|
|
|
var newCid = "";
|
|
try {
|
|
await axios
|
|
.post(`/api/codex/v1/data`, bytes, {
|
|
headers: (nodeInfo.auth !== null && {
|
|
"Base-Url": nodeInfo.nodeToConnectTo || nodeInfo.baseUrl,
|
|
"Content-Type": "application/octet-stream",
|
|
"Auth-String": nodeInfo.auth,
|
|
}) || {
|
|
"Base-Url": nodeInfo.nodeToConnectTo || nodeInfo.baseUrl,
|
|
"Content-Type": "application/octet-stream",
|
|
},
|
|
})
|
|
.then((response) => {
|
|
newCid = response.data;
|
|
});
|
|
|
|
filesCopy.current = filesCopy.current.filter(
|
|
(file) => file.cid !== cid
|
|
);
|
|
filesCopy.current.push({
|
|
cid: newCid,
|
|
fileName: acceptedFiles[i].name,
|
|
fileSize: acceptedFiles[i].size,
|
|
lastModified: new Date(
|
|
acceptedFiles[i].lastModified
|
|
).toLocaleString(),
|
|
type: acceptedFiles[i].type,
|
|
status: UploadedItemStatus.UPLOADED,
|
|
});
|
|
setUploads(filesCopy.current);
|
|
console.log("filesCopy");
|
|
console.log(filesCopy.current);
|
|
} catch (error) {
|
|
console.log(error);
|
|
filesCopy.current = filesCopy.current.filter(
|
|
(file) => file.cid !== cid
|
|
);
|
|
filesCopy.current.push({
|
|
cid: "Failed",
|
|
fileName: acceptedFiles[i].name,
|
|
fileSize: acceptedFiles[i].size,
|
|
lastModified: new Date(
|
|
acceptedFiles[i].lastModified
|
|
).toLocaleString(),
|
|
type: acceptedFiles[i].type,
|
|
status: UploadedItemStatus.FAILED,
|
|
});
|
|
console.log("filesCopy failed");
|
|
console.log(filesCopy.current);
|
|
setUploads(filesCopy.current);
|
|
}
|
|
console.log(cid + acceptedFiles[i].name);
|
|
resolve("done");
|
|
});
|
|
}
|
|
},
|
|
[setUploads, filesCopy, nodeInfo]
|
|
);
|
|
|
|
const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });
|
|
|
|
return (
|
|
<UploadTabWrapper>
|
|
<div
|
|
id="dropzone"
|
|
{...getRootProps()}
|
|
style={{
|
|
minHeight: uploads.length > 0 ? "33%" : "100%",
|
|
}}
|
|
>
|
|
<input {...getInputProps()} />
|
|
{isDragActive ? (
|
|
<p>Drop the files here ...</p>
|
|
) : (
|
|
<p>Drag 'n' drop some files here, or click to select files</p>
|
|
)}
|
|
</div>
|
|
<div
|
|
id="uploaded-items-wrap"
|
|
style={{
|
|
maxHeight: uploads.length > 0 ? "60vh" : "0%",
|
|
}}
|
|
>
|
|
{uploads.map((file) => (
|
|
<UploadedItemComponent item={file} key={file.cid} />
|
|
))}
|
|
</div>
|
|
</UploadTabWrapper>
|
|
);
|
|
}
|
|
|
|
export default UploadTab;
|
|
|
|
const UploadTabWrapper = styled.div`
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 100%;
|
|
width: 100%;
|
|
padding: 16px;
|
|
|
|
#dropzone {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 100%;
|
|
border: 2px dashed #9e9e9e;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
p {
|
|
font-size: 1rem;
|
|
text-align: center;
|
|
}
|
|
|
|
#uploaded-items-wrap {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: start;
|
|
width: 100%;
|
|
overflow-y: scroll;
|
|
margin-top: 16px;
|
|
}
|
|
`;
|