Compare commits

...

5 Commits

Author SHA1 Message Date
victorAnumudu 07a443d082 file upload size validation initiated 2023-08-09 20:28:19 +01:00
victorAnumudu 59a370d763 enforces user upload supported file before proceeding to upload 2023-08-09 19:34:35 +01:00
victorAnumudu 68e709f34b list of supported uploads add 2023-08-09 18:19:34 +01:00
victorAnumudu b1bb730c7d made file name in upload not to have spaces 2023-08-09 17:01:38 +01:00
ameye 20a86f4802 Merge branch 'upload-action' of WrenchBoard/Users-Wrench into master 2023-08-09 14:28:05 +00:00
2 changed files with 80 additions and 16 deletions
+62 -14
View File
@@ -8,7 +8,7 @@ import ProductUploadField from "./ProductUploadField";
import LoadingSpinner from "../Spinners/LoadingSpinner";
import usersService from "../../services/UsersService";
export default function UploadProduct() {
export default function UploadProduct({uploadTypes}) {
const apiCall = new usersService()
const [requestStatus, setRequestStatus] = useState({loading: false, status: null, message: ''}) // DETERMINES THE STATUS OF UPLOAD
@@ -88,7 +88,7 @@ export default function UploadProduct() {
// most importend
imgRead.readAsDataURL(e.target.files[0]);
}
if (file.length) {
if (file?.length) {
if (file[0].name) {
setSelectedFile(file?.[0].name);
setImgDetails(file?.[0])
@@ -134,16 +134,9 @@ export default function UploadProduct() {
setRequestStatus({loading: false, status: false, message: ''})
},5000)
}
if(imgDetails.size > 2097152){ // CHECKS IF IMAGE SIZE IS MORE THAN "MB"
setRequestStatus({loading: false, status: null, message: 'Image must be less than 2MB'})
return setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
},5000)
}
let reqData = { // PAYLOAD FOR API CALL
file_name: selectedFile,
file_name: selectedFile.substring(0,21).replace(/ /gi, ""),//selectedFile.replace(/[ -]/gi, ""),
file_size: imgDetails.size,
file_type: imgDetails.type,
file_data: img,
@@ -153,7 +146,21 @@ export default function UploadProduct() {
// action: 'WRENCHBOARD_RESOURCE_MYFILES',
action: 11307
}
// console.log('TESTING', reqData)
if(!isValidFile(imgDetails, uploadTypes?.data)){ // FUNCTION TO CHECK IF FILE TYPE IS VALID
setRequestStatus({loading: false, status: null, message: 'File type not supported'})
return setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
},5000)
}
// let validSize = isValidFileSize(imgDetails, uploadTypes?.data) // FUNCTION TO CHECK IF FILE SIZE IS VALID
// if(!validSize.status){
// setRequestStatus({loading: false, status: null, message: validSize.message})
// return setTimeout(()=>{
// setRequestStatus({loading: false, status: false, message: ''})
// },5000)
// }
//API CALL TO UPLOAD COMES HERE
setRequestStatus({loading: true, status: null, message: ''}) // SETS REQUEST LOADING TRUE
@@ -263,8 +270,15 @@ export default function UploadProduct() {
Image,Video,Audio or Documents
</h1>
<p className="text-thin-light-gray text-base tracking-wide font-medium">
File types supported: JPG, PNG, GIP, SVG, MP4, MP3, WEBM,
OGG, GLB, GLTF
File types supported: {uploadTypes.loading && <span className="italic">loading...</span>}
{/* JPG, PNG, GIP, SVG, MP4, MP3, WEBM, OGG, GLB, GLTF */}
{uploadTypes?.data?.length ?
uploadTypes?.data?.map((item, index) => {
return index != uploadTypes.data.length-1 ? `${item.name}, ` : `${item.name}`
})
:
null
}
</p>
</div>
<div className="main-content w-full lg:flex justify-between lg:px-9 px-4">
@@ -415,7 +429,7 @@ export default function UploadProduct() {
<div className="preview-upload-product lg:w-[580px] lg:h-[622px] w-full h-full bg-white dark:bg-[#11131F] lg:rounded-2xl">
<div className="w-full h-full flex flex-col justify-between">
{/* heading */}
<div className="lg:px-[40px] lg:py-[33px] px-[30px] py-[23px] flex justify-between border-b dark:border-[#5356fb29] border-light-purple dark:border-[#5356fb29] mb-4 lg:mb-0">
<div className="lg:px-[40px] lg:py-[33px] px-[30px] py-[23px] flex justify-between border-b border-light-purple dark:border-[#5356fb29] mb-4 lg:mb-0">
<h1 className="text-dark-gray dark:text-white tracking-wide text-26 font-bold">
Item Privew
</h1>
@@ -561,3 +575,37 @@ export default function UploadProduct() {
</>
);
}
//FUNCTIONS to check if file upload type is valid
const isValidFile = (file, supportedFile=[]) => {
let fileType = file.type.split("/")[1];
let valid = supportedFile.filter(item => (
item.name.toLowerCase() == fileType.toLowerCase()
))
if(valid.length){
return true
}else{
return false
}
}
//FUNCTIONS TO CHECK IF FILE SIZE IS VALID
const isValidFileSize = (file, supportedFile=[]) => {
let fileType = file.type.split("/")[1];
let fileSize = file.size;
let valid = supportedFile.filter(item => (
item.name.toLowerCase() == fileType.toLowerCase()
))
if(valid.length){
if((Number(valid[0].max_size_mb) * 1048576) >= fileSize){
return {status: true}
}else{
return {status: false, message: `File must not exceed ${valid[0].max_size_mb}MB`}
}
}else{
return false
}
}
+18 -2
View File
@@ -1,6 +1,22 @@
import React from "react";
import React, { useEffect, useState } from "react";
import UploadProduct from "../components/UploadProduct";
import usersService from "../services/UsersService";
export default function UploadProductPage() {
return <UploadProduct />;
const [uploadTypes, setUploadTypes] = useState({loading: true, data: []});
const api = new usersService();
const getUploadTypes = async () => {
try {
const res = await api.getResourceList();
setUploadTypes({loading: false, data: res?.data?.upload_types.data});
} catch (error) {
setUploadTypes({loading: false, data: []});
throw new Error("Error getting mode");
}
};
useEffect(() => {
getUploadTypes();
}, []);
return <UploadProduct uploadTypes={uploadTypes} />;
}