Compare commits

...

9 Commits

3 changed files with 138 additions and 59 deletions
@@ -1,8 +1,8 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import { useDispatch } from "react-redux";
import { useLocation, useNavigate } from 'react-router-dom'; import { useLocation, useNavigate } from 'react-router-dom';
import usersService from '../../../services/UsersService'; import usersService from '../../../services/UsersService';
import {updateUserDetails} from "../../../store/UserDetails"; import { updateUserDetails } from "../../../store/UserDetails";
import { useDispatch } from "react-redux";
import AuthLayout from "../AuthLayout"; import AuthLayout from "../AuthLayout";
function FbookRedirect() { function FbookRedirect() {
@@ -22,38 +22,50 @@ function FbookRedirect() {
console.log(codeResponse); console.log(codeResponse);
/* /*
POST /token HTTP/1.1 https://developers.facebook.com/docs/facebook-login/guides/advanced/manual-flow/#exchangecode
Host: oauth2.googleapis.com Step 1. Get access token by code
Content-Type: application/x-www-form-urlencoded
code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& GET https://graph.facebook.com/v17.0/oauth/access_token?
client_id=your_client_id& client_id={app-id}
client_secret=your_client_secret& &redirect_uri={redirect-uri}
redirect_uri=https%3A//oauth2.example.com/code& &client_secret={app-secret}
grant_type=authorization_code &code={code-parameter}
https://developers.facebook.com/docs/facebook-login/guides/access-tokens/get-long-lived
Step 2. Get long-lived token by access token
curl -i -X GET "https://graph.facebook.com/{graph-api-version}/oauth/access_token?
grant_type=fb_exchange_token&
client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={your-access-token}"
*/ */
// process.env.REACT_APP_FACEBOOK_CLIENT_ID
// process.env.REACT_APP_FACEBOOK_CLIENT_SCOPE
var reqData = { var reqData = {
auth_type: "FACEBOOK", auth_type: "FACEBOOK",
code: codeResponse, code: codeResponse,
redirect_uri: process.env.REACT_APP_GOOGLE_REDIRECT_URL, redirect_uri: process.env.REACT_APP_FACEBOOK_REDIRECT_URL,
}; };
// userApi userApi
// .authStart(reqData) .authStart(reqData)
// .then((res) => { .then((res) => {
// if (res.status == 200 && res.data.internal_return >= 0 && res.data.member_id && res.data.uid && res.data.session) { if (res.status == 200 && res.data.internal_return >= 0 && res.data.member_id && res.data.uid && res.data.session) {
// localStorage.setItem("member_id", `${res.data.member_id}`); localStorage.setItem("member_id", `${res.data.member_id}`);
// localStorage.setItem("uid", `${res.data.uid}`); localStorage.setItem("uid", `${res.data.uid}`);
// localStorage.setItem("session_token", `${res.data.session}`); localStorage.setItem("session_token", `${res.data.session}`);
// dispatch(updateUserDetails({...res.data})); dispatch(updateUserDetails({...res.data}));
// navigate('/', {replace: true}) navigate('/', {replace: true})
// return return
// } }
// navigate('/login', {state: {error: true}}) navigate('/login', {state: {error: true}})
// }) })
// .catch((error) => { .catch((error) => {
// navigate('/login', {state: {error: true}}) navigate('/login', {state: {error: true}})
// console.log(error); console.log(error);
// }); });
},[]) },[])
return ( return (
<AuthLayout> <AuthLayout>
+80 -29
View File
@@ -8,8 +8,10 @@ import ProductUploadField from "./ProductUploadField";
import LoadingSpinner from "../Spinners/LoadingSpinner"; import LoadingSpinner from "../Spinners/LoadingSpinner";
import usersService from "../../services/UsersService"; import usersService from "../../services/UsersService";
export default function UploadProduct() { export default function UploadProduct({uploadTypes}) {
const apiCall = new usersService() const apiCall = new usersService()
const [requestStatus, setRequestStatus] = useState({loading: false, status: null, message: ''}) // DETERMINES THE STATUS OF UPLOAD
// preview modal // preview modal
const [previewProductModal, setPreviewProductModal] = useState(false); const [previewProductModal, setPreviewProductModal] = useState(false);
// cancelUploadModal // cancelUploadModal
@@ -86,7 +88,7 @@ export default function UploadProduct() {
// most importend // most importend
imgRead.readAsDataURL(e.target.files[0]); imgRead.readAsDataURL(e.target.files[0]);
} }
if (file) { if (file?.length) {
if (file[0].name) { if (file[0].name) {
setSelectedFile(file?.[0].name); setSelectedFile(file?.[0].name);
setImgDetails(file?.[0]) setImgDetails(file?.[0])
@@ -100,7 +102,6 @@ export default function UploadProduct() {
} }
}; };
const [requestStatus, setRequestStatus] = useState({loading: false, status: null, message: ''})
//FUNCTION TO UPLOAD ITEM //FUNCTION TO UPLOAD ITEM
const uploadItem = () => { const uploadItem = () => {
let errorArr = [] let errorArr = []
@@ -119,13 +120,6 @@ export default function UploadProduct() {
// TEST TO SEE IF FIELDS ARE EMPTY // TEST TO SEE IF FIELDS ARE EMPTY
if(errorArr.length){ if(errorArr.length){
let message = '' let message = ''
// for(let i = 0; i<errorArr.length; i++){
// if(errorArr.includes('img')){
// message+='Please select file to upload'
// }else{
// message+='Item name or decription cannot be empty'
// }
// }
if(errorArr.length == 1 && errorArr.includes('img')){ if(errorArr.length == 1 && errorArr.includes('img')){
message='Please select file to upload' message='Please select file to upload'
}else if (errorArr.length == 1 && !errorArr.includes('img')){ }else if (errorArr.length == 1 && !errorArr.includes('img')){
@@ -140,16 +134,9 @@ export default function UploadProduct() {
setRequestStatus({loading: false, status: false, message: ''}) setRequestStatus({loading: false, status: false, message: ''})
},5000) },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 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_size: imgDetails.size,
file_type: imgDetails.type, file_type: imgDetails.type,
file_data: img, file_data: img,
@@ -159,16 +146,39 @@ export default function UploadProduct() {
// action: 'WRENCHBOARD_RESOURCE_MYFILES', // action: 'WRENCHBOARD_RESOURCE_MYFILES',
action: 11307 action: 11307
} }
console.log('TESTING', reqData)
setRequestStatus({loading: true, status: null, message: ''}) 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 //API CALL TO UPLOAD COMES HERE
setTimeout(()=>{ setRequestStatus({loading: true, status: null, message: ''}) // SETS REQUEST LOADING TRUE
setRequestStatus({loading: false, status: true, message: 'Bad'}) apiCall.sendFiles(reqData).then(res=>{
},3000) if(res.status != 200 || res.data.internal_return < 0){
setTimeout(()=>{ return setRequestStatus({loading: false, status: false, message: 'Something went wrong, try again'})
setRequestStatus({loading: false, status: false, message: ''}) }
},7000) setRequestStatus({loading: false, status: true, message: 'Uploaded successfully'})
setImg('')
setItemName('')
setDescription('')
}).catch(error=>{
setRequestStatus({loading: false, status: false, message: 'Network error, try again'})
}).finally(()=>{
setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
},5000)
})
} }
// drop event // drop event
@@ -260,8 +270,15 @@ export default function UploadProduct() {
Image,Video,Audio or Documents Image,Video,Audio or Documents
</h1> </h1>
<p className="text-thin-light-gray text-base tracking-wide font-medium"> <p className="text-thin-light-gray text-base tracking-wide font-medium">
File types supported: JPG, PNG, GIP, SVG, MP4, MP3, WEBM, File types supported: {uploadTypes.loading && <span className="italic">loading...</span>}
OGG, GLB, GLTF {/* 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> </p>
</div> </div>
<div className="main-content w-full lg:flex justify-between lg:px-9 px-4"> <div className="main-content w-full lg:flex justify-between lg:px-9 px-4">
@@ -412,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="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"> <div className="w-full h-full flex flex-col justify-between">
{/* heading */} {/* 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"> <h1 className="text-dark-gray dark:text-white tracking-wide text-26 font-bold">
Item Privew Item Privew
</h1> </h1>
@@ -558,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 UploadProduct from "../components/UploadProduct";
import usersService from "../services/UsersService";
export default function UploadProductPage() { 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} />;
} }