Compare commits

..

60 Commits

Author SHA1 Message Date
victorAnumudu a598aa3898 on cancel, takes user back to my item 2023-08-10 12:51:54 +01:00
ameye 9d190916a8 Merge branch 'wallet-styles' of WrenchBoard/Users-Wrench into master 2023-08-09 21:14:17 +00:00
Ebube eca9455f0f Merge branch 'master' of https://gitlab.chiefsoft.net/WrenchBoard/Users-Wrench into wallet-styles 2023-08-09 22:00:11 +01:00
Ebube a1bf0bad0f added uploaded files 2023-08-09 21:59:46 +01:00
ameye e236ad20f7 Merge branch 'upload-payload-fix' of WrenchBoard/Users-Wrench into master 2023-08-09 20:36:46 +00:00
victorAnumudu 330f47baa7 updated upload payloads 2023-08-09 21:23:51 +01:00
ameye 5088aa3ead Merge branch 'bug-fix' of WrenchBoard/Users-Wrench into master 2023-08-09 19:52:37 +00:00
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
victorAnumudu 2d918517f8 upload action implemented 2023-08-09 12:52:46 +01:00
tolik a0c0cbdc98 Merge branch 'master' of ssh://gitlab.chiefsoft.net:10222/WrenchBoard/Users-Wrench 2023-08-09 10:39:47 +08:00
tolik ed309007e5 Implemented Facebook login 2023-08-09 10:39:37 +08:00
ameye 594c072806 Merge branch 'add-item-btn-moved' of WrenchBoard/Users-Wrench into master 2023-08-09 01:13:02 +00:00
victorAnumudu 4b9289cb8e bug fix 2023-08-08 22:15:09 +01:00
victorAnumudu 5b39e75119 Add item button moved down 2023-08-08 22:06:44 +01:00
CHIEFSOFT\ameye e61b2c8f43 my files page 2023-08-08 08:55:12 -04:00
CHIEFSOFT\ameye 4c6952c4b3 Page format 2023-08-08 08:23:48 -04:00
CHIEFSOFT\ameye 6a5cebed5b Upload new item 2023-08-08 08:16:32 -04:00
CHIEFSOFT\ameye 663e3e8bb7 fix text 2023-08-08 08:15:26 -04:00
CHIEFSOFT\ameye aaa5b9e8ff Resource Upload My Files 2023-08-08 06:38:03 -04:00
ameye 90ec033b34 Merge branch 'wallet-styles' of WrenchBoard/Users-Wrench into master 2023-08-07 16:22:27 +00:00
Ebube c3c359cfc8 Merge branch 'master' of https://gitlab.chiefsoft.net/WrenchBoard/Users-Wrench into wallet-styles 2023-08-07 16:27:26 +01:00
Ebube 68b4031752 added online_name 2023-08-07 16:26:25 +01:00
ameye 8a2559571f Merge branch 'wallet-styles' of WrenchBoard/Users-Wrench into master 2023-08-07 08:50:16 +00:00
ameye ccae5000ee Merge branch 'reset-pwd-validation' of WrenchBoard/Users-Wrench into master 2023-08-07 08:50:12 +00:00
Ebube 5f01cb14f9 updated payload 2023-08-07 08:10:51 +01:00
Ebube 9f62345a2e Merge branch 'master' of https://gitlab.chiefsoft.net/WrenchBoard/Users-Wrench into wallet-styles 2023-08-06 23:46:26 +01:00
Ebube b9096117bc updateprofile payload updated 2023-08-06 23:46:03 +01:00
victorAnumudu f70659901c valid pwd text added 2023-08-06 21:15:18 +01:00
tolik 451e4624b1 Merge branch 'master' of ssh://gitlab.chiefsoft.net:10222/WrenchBoard/Users-Wrench 2023-08-06 10:14:17 +08:00
tolik 1557ba1040 Fix crash 2023-08-06 10:13:15 +08:00
ameye 7133ad8de3 Merge branch 'reset-pwd-icon' of WrenchBoard/Users-Wrench into master 2023-08-05 16:33:25 +00:00
victorAnumudu 9fd8944987 pwd validation msg changed 2023-08-05 16:52:20 +01:00
victorAnumudu 874276dcba reset pwd icons added 2023-08-05 16:35:23 +01:00
ameye be1454f1b8 Merge branch 'reset-pwd-second-phase' of WrenchBoard/Users-Wrench into master 2023-08-05 14:16:16 +00:00
victorAnumudu 6a34ca6c18 reser pwd second phase implemented 2023-08-05 15:12:46 +01:00
ameye fc09771b8d Merge branch 'password-reset-first-stage' of WrenchBoard/Users-Wrench into master 2023-08-05 07:16:30 +00:00
victorAnumudu cab5ed0ece password reset first phase done 2023-08-05 05:41:46 +01:00
ameye 8d3dca96b4 Merge branch 'logo-sizing-and-alignment' of WrenchBoard/Users-Wrench into master 2023-08-04 14:26:23 +00:00
ameye e71a25630d Merge branch 'wallet-styles' of WrenchBoard/Users-Wrench into master 2023-08-04 14:26:14 +00:00
Ebube cf79a15837 size in dollar acc 2023-08-04 13:53:49 +01:00
victorAnumudu 042e8c2c17 site logo size reduced and aligned 2023-08-04 13:50:59 +01:00
Ebube 46d286e8f3 size again 2023-08-04 13:49:11 +01:00
Ebube c2bfcc81ea adjusted size 2023-08-04 13:46:43 +01:00
Ebube 654ed3741c added cancel btn style in withdraw 2023-08-04 13:41:53 +01:00
Ebube 6cccd1c372 changed font-color of naira withdraw cancel btn 2023-08-04 13:39:09 +01:00
Ebube 1e6be76449 Merge branch 'master' of https://gitlab.chiefsoft.net/WrenchBoard/Users-Wrench into wallet-styles 2023-08-04 13:29:39 +01:00
Ebube 476ca04f5f Added profile img 2023-08-04 13:29:14 +01:00
ameye ce41db474d Merge branch 'wallet-styles' of WrenchBoard/Users-Wrench into master 2023-08-04 02:32:07 +00:00
Ebube 7ace7e5b5d Added btn styles the of the credit and withdraw popup 2023-08-04 03:18:51 +01:00
ameye 51e829f7b4 Merge branch 'wallet-styles' of WrenchBoard/Users-Wrench into master 2023-08-01 19:53:51 +00:00
Ebube 173b2adc66 css fixes for uniform btn 2023-08-01 19:50:52 +01:00
ameye 31cb7a521d Merge branch 'pending-job-refresh' of WrenchBoard/Users-Wrench into master 2023-08-01 18:40:10 +00:00
ameye ad4f68b252 Merge branch 'tx_ref-change' of WrenchBoard/Users-Wrench into master 2023-08-01 18:39:53 +00:00
victorAnumudu 10abf35d4f refreshes pending Job when expiry date is extended 2023-08-01 18:42:18 +01:00
Ebube ce767086fd BUG - Flutter wave key 2023-08-01 18:36:47 +01:00
ameye 0f44616767 Merge branch 'request-message-changed' of WrenchBoard/Users-Wrench into master 2023-08-01 15:18:07 +00:00
37 changed files with 1383 additions and 848 deletions
+2 -1
View File
@@ -121,7 +121,8 @@ export default function Routers() {
<Route exact path="/sell" element={<SellPage />} />
<Route exact path="/saved" element={<SavedPage />} />
<Route exact path="/history" element={<HistoryPage />} />
<Route exact path="/upload-product" element={<UploadProductPage />} />
{/*<Route exact path="/upload-product" element={<UploadProductPage />} />*/}
<Route exact path="/my-uploads" element={<UploadProductPage />} />
<Route exact path="/profile" element={<AuthProfilePage />} />
<Route exact path="/user-profile" element={<UserProfilePage />} />
<Route exact path="/settings" element={<SettingsPage />} />
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" id="error"><path fill="#ff1d25" d="M29.75,25.73,18.68,3.59a3,3,0,0,0-4-1.33,3.05,3.05,0,0,0-1.33,1.33L2.25,25.73a3,3,0,0,0,2.68,4.34H27.07a3,3,0,0,0,3-3A2.88,2.88,0,0,0,29.75,25.73ZM16,25.38a.94.94,0,1,1,.94-.94A.94.94,0,0,1,16,25.38Zm.94-4.69a.94.94,0,1,1-1.88,0V11.31a.94.94,0,1,1,1.88,0Z"></path></svg>

After

Width:  |  Height:  |  Size: 365 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" id="success"><path fill="#80af52" d="M256 26c127.03 0 230 102.97 230 230S383.03 486 256 486 26 383.03 26 256 128.97 26 256 26z"></path><path fill="#fff" d="M215.999 386a9.998 9.998 0 0 1-7.525-3.415l-70-80c-3.637-4.156-3.215-10.474.941-14.11s10.475-3.217 14.111.94l60.961 69.67 142.938-238.23c2.842-4.736 8.983-6.273 13.72-3.43 4.736 2.841 6.271 8.984 3.431 13.72l-150 250a9.998 9.998 0 0 1-8.577 4.855z"></path></svg>

After

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@@ -1,8 +1,8 @@
import React, { useEffect } from 'react';
import { useDispatch } from "react-redux";
import { useLocation, useNavigate } from 'react-router-dom';
import usersService from '../../../services/UsersService';
import {updateUserDetails} from "../../../store/UserDetails";
import { useDispatch } from "react-redux";
import { updateUserDetails } from "../../../store/UserDetails";
import AuthLayout from "../AuthLayout";
function FbookRedirect() {
@@ -22,38 +22,50 @@ function FbookRedirect() {
console.log(codeResponse);
/*
POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
https://developers.facebook.com/docs/facebook-login/guides/advanced/manual-flow/#exchangecode
Step 1. Get access token by code
code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https%3A//oauth2.example.com/code&
grant_type=authorization_code
GET https://graph.facebook.com/v17.0/oauth/access_token?
client_id={app-id}
&redirect_uri={redirect-uri}
&client_secret={app-secret}
&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 = {
auth_type: "FACEBOOK",
code: codeResponse,
redirect_uri: process.env.REACT_APP_GOOGLE_REDIRECT_URL,
redirect_uri: process.env.REACT_APP_FACEBOOK_REDIRECT_URL,
};
// userApi
// .authStart(reqData)
// .then((res) => {
// 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("uid", `${res.data.uid}`);
// localStorage.setItem("session_token", `${res.data.session}`);
// dispatch(updateUserDetails({...res.data}));
// navigate('/', {replace: true})
// return
// }
// navigate('/login', {state: {error: true}})
// })
// .catch((error) => {
// navigate('/login', {state: {error: true}})
// console.log(error);
// });
userApi
.authStart(reqData)
.then((res) => {
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("uid", `${res.data.uid}`);
localStorage.setItem("session_token", `${res.data.session}`);
dispatch(updateUserDetails({...res.data}));
navigate('/', {replace: true})
return
}
navigate('/login', {state: {error: true}})
})
.catch((error) => {
navigate('/login', {state: {error: true}})
console.log(error);
});
},[])
return (
<AuthLayout>
@@ -0,0 +1,37 @@
import React from 'react'
import { useNavigate } from 'react-router-dom'
import localImgLoad from '../../lib/localImgLoad'
const ForgetPwdResponse = ({title, message, type}) => {
const navigate = useNavigate()
return (
<>
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
<h1 className={`${type ? 'text-black' : 'text-red-500'}text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]`}>
{title}
</h1>
</div>
<div className="title-area w-[100px] h-[100px] mx-auto flex flex-col justify-center items-center relative text-center mb-7">
<img className='w-full h-full' src={`${type ? localImgLoad('images/icons/success.svg') : localImgLoad('images/icons/error.svg')}`} alt='alert-banner' />
</div>
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
<p className={`${type ? 'text-sky-blue' : 'text-red-500'} font-semibold dark:text-white mb-3 leading-[27.3px] text-[18px]`}>
{message}
</p>
</div>
<div className="signin-area mb-3.5">
<div className="flex justify-center items-center gap-2">
<button
type="button"
onClick={() => navigate("/login")}
className={`rounded-[0.475rem] mb-6 text-[15px] font-semibold text-white flex justify-center bg-[#4687ba] hover:bg-[#009ef7] transition-all duration-300 items-center py-[0.8875rem] px-[1.81rem]`}
>
<span>Home</span>
</button>
</div>
</div>
</>
)
}
export default ForgetPwdResponse
+108 -96
View File
@@ -4,6 +4,8 @@ import WrenchBoard from "../../../assets/images/wrenchboard-logo-text.png";
import usersService from "../../../services/UsersService";
import InputCom from "../../Helpers/Inputs/InputCom";
import AuthLayout from "../AuthLayout";
import EmailValidator from "../../../lib/EmailValidator";
import ForgetPwdResponse from "../ForgetPwdResponse";
export default function ForgotPassword() {
const [checked, setValue] = useState(false);
@@ -11,7 +13,7 @@ export default function ForgotPassword() {
// email
const [email, setMail] = useState("");
const [msgError, setMsgError] = useState("");
const [msgSuccess, setMsgSuccess] = useState(false);
const [msgSuccess, setMsgSuccess] = useState(null);
const navigate = useNavigate();
const userApi = new usersService();
@@ -27,12 +29,26 @@ export default function ForgotPassword() {
const resetHandler = async () => {
if (email == "") {
setMsgError("An email is required");
} else if (!checked) {
return setTimeout(() => {
setMsgError(null);
}, process.env.REACT_APP_RESET_START_ERROR_TIMEOUT);
}
if (!checked) {
setMsgError("Check if you are human");
return setTimeout(() => {
setMsgError(null);
}, process.env.REACT_APP_RESET_START_ERROR_TIMEOUT);
}
if(!EmailValidator(email)){ // CHECKS IF EMAIL IS VALID
setMsgError("Invalid Email");
return setTimeout(() => {
setMsgError(null);
}, process.env.REACT_APP_RESET_START_ERROR_TIMEOUT);
}
if (email !== "" && checked) {
const reqData = { email };
const reqData = { email, action:11013 };
setResetLoading(true);
try {
const res = await userApi.StartResetPassword(reqData);
@@ -41,8 +57,11 @@ export default function ForgotPassword() {
setMail("");
setValue(false);
setResetLoading(false);
}else{
setMsgSuccess(false);
}
} catch (error) {
setMsgSuccess(false);
setResetLoading(false);
setMail("");
setMsgError("An error occurred");
@@ -53,9 +72,6 @@ export default function ForgotPassword() {
}, process.env.REACT_APP_RESET_START_ERROR_TIMEOUT);
}
}
setTimeout(() => {
setMsgError(null);
}, process.env.REACT_APP_RESET_START_ERROR_TIMEOUT);
};
return (
@@ -73,106 +89,102 @@ export default function ForgotPassword() {
</div>
<div className="content-wrapper login shadow-md w-full lg:max-w-[500px] mx-auto flex justify-center items-center xl:bg-white dark:bg-dark-white 2xl:w-[828px] rounded-[0.475rem] sm:p-7 p-5">
<div className="flex flex-col justify-center w-full h-full px-5">
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
<h1 className="text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]">
Forget Password
</h1>
<span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]">
Enter your email to reset your password.
</span>
</div>
<div className="input-area">
<div className="input-item mb-10">
<InputCom
fieldClass="px-6"
placeholder="Your Username/Email"
label="Email"
name="email"
type="email"
value={email}
inputHandler={handleEmail}
iconName="message"
/>
{msgSuccess == null ?
<>
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
<h1 className="text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]">
Forget Password
</h1>
<span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]">
Enter your email to reset your password.
</span>
</div>
{/* hCaptha clone for the time being */}
<div className="mb-10">
<div className="w-[303px] h-[78px] mx-auto overflow-hidden">
<div className="w-[300px] h-[74px] bg-white bottom-[1px] rounded border-gray-100 overflow-hidden cursor-pointer">
{/* Checkbox */}
<div className="h-full relative inline-block">
<div className="relative table top-0 h-full">
<div className="table-cell align-middle">
<div className="relative w-[30px] h-[30px] mx-[15px]">
<input
type="checkbox"
name="human-checkbox"
id="human-checkbox"
className="w-[28px] h-[28px] border-[1px] rounded border-gray-400 checked:bg-white"
checked={checked}
onChange={humanChecker}
/>
<div className="input-area">
<div className="input-item mb-10">
<InputCom
fieldClass="px-6"
placeholder="Your Username/Email"
label="Email"
name="email"
type="email"
value={email}
inputHandler={handleEmail}
iconName="message"
/>
</div>
{/* hCaptha clone for the time being */}
<div className="mb-10">
<div className="w-[303px] h-[78px] mx-auto overflow-hidden">
<div className="w-[300px] h-[74px] bg-white bottom-[1px] rounded border-gray-100 overflow-hidden cursor-pointer">
{/* Checkbox */}
<div className="h-full relative inline-block">
<div className="relative table top-0 h-full">
<div className="table-cell align-middle">
<div className="relative w-[30px] h-[30px] mx-[15px]">
<input
type="checkbox"
name="human-checkbox"
id="human-checkbox"
className="w-[28px] h-[28px] border-[1px] rounded border-gray-400 checked:bg-white"
checked={checked}
onChange={humanChecker}
/>
</div>
</div>
</div>
</div>
</div>
<div className="h-full relative inline-block w-[170px]">
<label className="relative table top-0 h-full">
<label className="table-cell align-middle">
<label
className="text-800 text-sm"
htmlFor="human-checkbox"
>
I am human
<div className="h-full relative inline-block w-[170px]">
<label className="relative table top-0 h-full">
<label className="table-cell align-middle">
<label
className="text-800 text-sm"
htmlFor="human-checkbox"
>
I am human
</label>
</label>
</label>
</label>
</div>
<div className="h-full relative inline-block w-16"></div>
</div>
<div className="h-full relative inline-block w-16"></div>
</div>
</div>
{msgError && (
<div className="relative p-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]">
{msgError}
</div>
)}
<div className="signin-area mb-3.5">
<div className="flex justify-center items-center gap-2">
<button
type="button"
onClick={resetHandler}
className={`rounded-[0.475rem] mb-6 text-[15px] font-semibold text-white flex justify-center bg-[#4687ba] hover:bg-[#009ef7] transition-all duration-300 items-center py-[0.8875rem] px-[1.81rem]`}
>
{resetLoading ? (
<div className="signup btn-loader"></div>
) : (
<span>Send Code</span>
)}
</button>
<button
type="button"
onClick={() => navigate("/login")}
className={`rounded-[0.475rem] mb-6 text-[15px] font-semibold text-[#009ef7] hover:text-white flex justify-center bg-[#f1faff] hover:bg-[#009ef7] transition-all duration-300 items-center py-[0.8875rem] px-[1.8125rem] `}
>
Cancel
</button>
</div>
</div>
</div>
{msgError && (
<div className="relative p-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]">
{msgError}
</div>
)}
{msgSuccess && (
<div className="relative p-4 text-[#44228c] bg-[#e3d7fb] border-[#d5c4f9] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]">
If we find your email, you will receive a link to reset your
password. Please use or{" "}
<Link
to="/contact"
className="text-[#4687ba] hover:text-[#009ef7]"
>
contact form
</Link>{" "}
if you did not get our message after few minutes.
</div>
)}
<div className="signin-area mb-3.5">
<div className="flex justify-center items-center gap-2">
<button
type="button"
onClick={resetHandler}
className={`rounded-[0.475rem] mb-6 text-[15px] font-semibold text-white flex justify-center bg-[#4687ba] hover:bg-[#009ef7] transition-all duration-300 items-center py-[0.8875rem] px-[1.81rem]`}
>
{resetLoading ? (
<div className="signup btn-loader"></div>
) : (
<span>Send Code</span>
)}
</button>
<button
type="button"
onClick={() => navigate("/login")}
className={`rounded-[0.475rem] mb-6 text-[15px] font-semibold text-[#009ef7] hover:text-white flex justify-center bg-[#f1faff] hover:bg-[#009ef7] transition-all duration-300 items-center py-[0.8875rem] px-[1.8125rem] `}
>
Cancel
</button>
</div>
</div>
</div>
</>
:
<ForgetPwdResponse
title={'Forget Password'}
message={msgSuccess? `Check your email for the link to continue password reset. Note the reset link will expire short time` : 'We are unable to continue with your request. Please try another username or contact us for help'}
type={msgSuccess}
/>
}
</div>
</div>
</div>
+118 -82
View File
@@ -1,16 +1,20 @@
import { useState } from "react";
import { useEffect, useState } from "react";
import { Link, useLocation, useNavigate } from "react-router-dom";
import WrenchBoard from "../../../assets/images/wrenchboard-logo-text.png";
import usersService from "../../../services/UsersService";
import InputCom from "../../Helpers/Inputs/InputCom";
import AuthLayout from "../AuthLayout";
import ForgetPwdResponse from "../ForgetPwdResponse";
import PasswordValidator from "../../../lib/PasswordValidator";
import LoadingSpinner from "../../Spinners/LoadingSpinner";
const VerifyPassword = () => {
const [password, setPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState("");
const [requestStatus, setRequestStatus] = useState({loading: true, status:false, data: []})
const [msgError, setMsgError] = useState("");
const [linkLoader, setLinkLoader] = useState(false);
const [linkSuccess, setLinkSuccess] = useState(true);
const [linkSuccess, setLinkSuccess] = useState(null);
const [showPassword, setShowPassword] = useState(false);
const navigate = useNavigate();
const location = useLocation();
@@ -23,11 +27,6 @@ const VerifyPassword = () => {
setShowPassword(!showPassword);
};
// little checker for the validity of the token
if (token?.length != 64) {
setLinkSuccess(false);
}
// Password
const handlePassword = (e) => {
let { name, value } = e?.target;
@@ -36,46 +35,60 @@ const VerifyPassword = () => {
};
const completeReset = async () => {
if(!password || !confirmPassword){ // CHECKS IF PASSWORD IS EMPTY
setMsgError("Please fill in fields");
return setTimeout(() => {
setMsgError(null);
}, process.env.REACT_APP_RESET_START_ERROR_TIMEOUT);
}
if(password != confirmPassword){ // CHECKS IF PASSWORD EQUALS CONFIRM PASSWORD
setMsgError("Passwords does not match");
return setTimeout(() => {
setMsgError(null);
}, process.env.REACT_APP_RESET_START_ERROR_TIMEOUT);
}
if(password.length < 6){ // CHECKS IF PASSWORD LENGTH IS UPTO 6 CHARACTERS
setMsgError("Password must be upto six characters");
return setTimeout(() => {
setMsgError(null);
}, process.env.REACT_APP_RESET_START_ERROR_TIMEOUT);
}
if(!PasswordValidator(password)){ // CHECKS IF PASSWORD IS VALID
setMsgError("Password must contain alphanumeric, uppercase and special character: eg: Password1@");
return setTimeout(() => {
setMsgError(null);
}, process.env.REACT_APP_RESET_START_ERROR_TIMEOUT);
}
try {
if (password !== "" && confirmPassword !== "") {
if (password === confirmPassword) {
setLinkLoader(true);
var reqData = {
sessionid: "DUMMY-CANNOT_BE_EMPTY",
reset_link: token,
newpass: password,
m_uid: requestStatus.data?.m_uid || '',
reset_uid: requestStatus.data?.reset_uid || '',
step: 300,
action: 730,
};
const res = await userApi?.CompleteResetPassword(reqData);
if (res.status === 200) {
if (res.status == 200) {
const { data } = res;
if (data?.status > 0 && data?.email) {
setTimeout(() => {
navigate("/login", { replace: true });
setLinkLoader(false);
}, 2000);
} else if (data && data?.status == "Invalid Request") {
setLinkLoader(false);
setLinkSuccess(false);
if (data?.internal_return >= 0) {
// setTimeout(() => {
// navigate("/login", { replace: true });
// setLinkLoader(false);
// }, 2000);
setLinkSuccess(true);
} else {
setLinkLoader(false);
setMsgError("An error occurred");
setLinkSuccess(false);
}
} else {
setLinkLoader(false);
setLinkSuccess(false);
}
} else {
setLinkLoader(false);
setMsgError("Passwords does not match");
}
} else {
setMsgError("Please fill in fields");
}
} catch (error) {
setLinkLoader(false);
setLinkSuccess(false);
@@ -87,6 +100,31 @@ const VerifyPassword = () => {
}
};
const verifyResetPwd = () => { // FUNCTION TO VERIFY RESET PASSWORD LINK
setRequestStatus({loading: true, status:false, data: []})
var reqData = {
sessionid: "DUMMY-CANNOT_BE_EMPTY",
reset_link: token,
step: 200,
action: 730,
};
userApi.CompleteResetPassword(reqData).then(res => {
if(res.status != 200 || res.data.internal_return < 0){
return setRequestStatus({loading: false, status:false, data: []})
}
setRequestStatus({loading: false, status:true, data: res.data})
}).catch(error => {
setRequestStatus({loading: false, status:false, data: []})
})
}
useEffect(()=>{
// little checker for the validity of the token
if (token==null || token?.length != 64) {
return setRequestStatus({loading: false, status:false, data: []});
}
verifyResetPwd()
},[])
return (
<>
<AuthLayout slogan="Welcome to WrenchBoard">
@@ -101,39 +139,59 @@ const VerifyPassword = () => {
</Link>
</div>
<div className="content-wrapper login shadow-md w-full lg:max-w-[500px] mx-auto flex justify-center items-center dark:bg-dark-white 2xl:w-[828px] rounded-[0.475rem] sm:p-7 p-5">
{requestStatus.loading ?
<LoadingSpinner color='sky-blue' size='16' height='h-300px' />
:
!requestStatus.loading && requestStatus.status ?
<div className="w-full">
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
<h1 className="text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]">
{linkSuccess ? "Password Reset" : "Invalid verification link"}
</h1>
{linkSuccess && (
<span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]">
Enter a new password to reset
</span>
)}
{linkSuccess && (
<span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]">
We'll send an email to confirm reset
</span>
)}
</div>
{/* If the verification was a success */}
{linkSuccess ? (
<SuccessfulComponent
password={password}
confirmPassword={confirmPassword}
handlePassword={handlePassword}
onSubmit={completeReset}
msgErr={msgError}
loader={linkLoader}
showPassword={showPassword}
onClick={togglePasswordVisibility}
navigateHandler={() => navigate("/login")}
/>
) : (
<ErrorComponent onClick={() => navigate("/login")} />
)}
{linkSuccess == null ?
<>
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
<h1 className="text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]">
Password Reset
</h1>
<span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]">
Enter a new password to reset
</span>
<span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]">
We'll send an email to confirm reset
</span>
</div>
<div>
<p className="text-red-500 font-semibold mb-3 leading-[27.3px] text-[13px]">
Must include a special, numeric, uppercase and lowercase character
</p>
</div>
<SuccessfulComponent
password={password}
confirmPassword={confirmPassword}
handlePassword={handlePassword}
onSubmit={completeReset}
msgErr={msgError}
loader={linkLoader}
showPassword={showPassword}
onClick={togglePasswordVisibility}
navigateHandler={() => navigate("/login")}
/>
</>
:
<ForgetPwdResponse
title={linkSuccess? 'Password Reset Complete' : 'Password Reset Error'}
message={linkSuccess? 'Password Reset Complete. You can login now with your new credentials' : 'Password Reset Error. Please get in touch with support for further support'
}
type={linkSuccess}
/>
}
</div>
:
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
<ForgetPwdResponse
title={'Forget Password'}
message={'We are unable to continue to reset process. This error is usually due to expired links. Please start all over or contact us'}
type={requestStatus.status}
/>
</div>
}
</div>
</div>
</AuthLayout>
@@ -159,7 +217,7 @@ const SuccessfulComponent = ({
<div className="mb-5">
<InputCom
fieldClass="sm:px-6 px-2 tracking-[0.25em] text-2xl"
value={password?.replace(/./g, "●")}
value={password}
inputHandler={handlePassword}
placeholder="● ● ● ● ● ●"
label="Password"
@@ -172,7 +230,7 @@ const SuccessfulComponent = ({
<div className="mb-5">
<InputCom
fieldClass="sm:px-6 px-2 tracking-[0.25em] text-2xl"
value={confirmPassword?.replace(/./g, "●")}
value={confirmPassword}
inputHandler={handlePassword}
placeholder="● ● ● ● ● ●"
label="Confirm Password"
@@ -209,25 +267,3 @@ const SuccessfulComponent = ({
</div>
</div>
);
const ErrorComponent = ({ onClick }) => (
<div className="input-area">
<div className="my-5">
<p className="text-[14px] leading-[19px] text-center text-[#181c32]">
This error occurs because you have already used this link or the link
has broken/expired. Start with the reset process again. If it doesn't
work, try to create the account from the start.
</p>
</div>
<div className="signin-area flex justify-center mb-3.5">
<button
onClick={onClick}
type="button"
className={`rounded-[0.475rem] mb-6 text-[15px] font-semibold text-[#009ef7] hover:text-white flex justify-center bg-[#f1faff] hover:bg-[#009ef7] transition-all duration-300 items-center py-[0.8875rem] px-[1.81rem]`}
>
<span>Return Home</span>
</button>
</div>
</div>
);
+4 -3
View File
@@ -1,9 +1,9 @@
import React, { useEffect, useState } from "react";
import { Link, useNavigate } from "react-router-dom";
import Layout from "../Partials/Layout";
import CommonHead from "../UserHeader/CommonHead";
import { useNavigate } from "react-router-dom";
import usersService from "../../services/UsersService";
import Layout from "../Partials/Layout";
import LoadingSpinner from "../Spinners/LoadingSpinner";
import CommonHead from "../UserHeader/CommonHead";
export default function BlogItem(props) {
@@ -16,6 +16,7 @@ export default function BlogItem(props) {
const filterHandler = (value) => {
setValue(value);
};
// eslint-disable-next-line no-restricted-globals
const queryParams = new URLSearchParams(location?.search);
const blog_id = queryParams.get("blog_id");
+27 -20
View File
@@ -1,13 +1,13 @@
import React, { useEffect, useState, useRef } from "react";
import React, { useEffect, useRef, useState } from "react";
import { useSelector } from "react-redux";
import Layout from "../Partials/Layout";
import { useNavigate } from "react-router-dom";
import ActiveJobMessage from "./ActiveJobMessage";
import LoadingSpinner from "../Spinners/LoadingSpinner";
import CountDown from "../Helpers/CountDown";
import IndexJobActions from "./JobActions/IndexJobActions";
import ModalCom from "../Helpers/ModalCom";
import { useReactToPrint } from "react-to-print";
import CountDown from "../Helpers/CountDown";
import ModalCom from "../Helpers/ModalCom";
import Layout from "../Partials/Layout";
import LoadingSpinner from "../Spinners/LoadingSpinner";
import ActiveJobMessage from "./ActiveJobMessage";
import IndexJobActions from "./JobActions/IndexJobActions";
import usersService from "../../services/UsersService";
@@ -259,14 +259,17 @@ function ActiveJobs(props) {
<button
type="button"
className="min-w-[45px] h-auto text-[#374557] border border-sky-blue p-1 rounded-full"
onClick={() =>{
if(props.details.pathname == '/manage-family'){
navigate(props.details.pathname, {state: { ...props.details.accountDetails }}, { replace: true })
}else{
navigate(props.details.pathname, { replace: true })
}
onClick={() => {
if (props.details.pathname == "/manage-family") {
navigate(
props.details.pathname,
{ state: { ...props.details.accountDetails } },
{ replace: true }
);
} else {
navigate(props.details.pathname, { replace: true });
}
}
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
@@ -367,15 +370,17 @@ function ActiveJobs(props) {
{/* TEXTAREA SECTION */}
<div className="mt-5">
<div className="">
<div
<div
className="pl-7 my-2 flex items-center border-b border-slate-300 gap-3"
// className='ml-7 flex justify-start items-center gap-3'
>
>
<button
name="message"
onClick={(e) => setTab(e.target.name)}
className={`px-4 py-1 rounded-t-2xl ${
tab == "message" ? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white" : "bg-white text-[#000] border-t-[2px]"
tab == "message"
? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white"
: "bg-white text-[#000] border-t-[2px]"
}`}
>
Send Message
@@ -384,7 +389,9 @@ function ActiveJobs(props) {
name="files"
onClick={(e) => setTab(e.target.name)}
className={`px-4 py-1 rounded-t-2xl ${
tab == "files" ? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white" : "bg-white text-[#000] border-t-[2px]"
tab == "files"
? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white"
: "bg-white text-[#000] border-t-[2px]"
}`}
>
Send Files
@@ -471,7 +478,7 @@ function ActiveJobs(props) {
<button
onClick={sendFile}
type="button"
className='btn-gradient text-base tracking-wide px-4 py-2 rounded-full text-white cursor-pointer flex justify-center items-center'
className="btn-gradient text-base tracking-wide px-4 py-2 rounded-full text-white cursor-pointer flex justify-center items-center"
>
{requestStatus.loading ? (
<LoadingSpinner size="6" color="sky-blue" />
@@ -495,7 +502,7 @@ function ActiveJobs(props) {
<button
onClick={sendTaskMessage}
type="button"
className='btn-gradient text-base tracking-wide px-4 py-2 rounded-full text-white cursor-pointer'
className="btn-gradient text-base tracking-wide px-4 py-2 rounded-full text-white cursor-pointer"
>
{requestStatus.loading ? (
<LoadingSpinner size="6" color="sky-blue" />
@@ -261,7 +261,7 @@ function AddFundDollars(props) {
{/* previous tab */}
{tab === "previous" && (
<div className="p-4 previous-details w-full min-h-[16rem] flex flex-col">
<div className="p-4 previous-details w-full min-h-[16.5rem] flex flex-col">
{payListCards.loading ? (
<LoadingSpinner size="10" color="sky-blue" />
) : payListCards?.data?.length ? (
@@ -313,7 +313,7 @@ function AddFundDollars(props) {
)}
{tab === "new" && (
<div className="new-details w-full max-h-[23rem]">
<div className="new-details w-full max-h-[22rem]">
<div className="w-full flex flex-col justify-between">
<Formik
initialValues={initialValues}
@@ -527,9 +527,9 @@ function AddFundDollars(props) {
</div>
</div>
<div className="md:px-8 add-fund-btn flex justify-end items-center gap-3">
<div className="add-fund-btn flex justify-end items-center gap-2 mt-4">
<button
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center items-center border-gradient text-base rounded-full"
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center bg-[#f5a430] text-black items-center text-base rounded-full"
onClick={handleClose}
>
Cancel
@@ -558,9 +558,9 @@ function AddFundDollars(props) {
</div>
{tab == "previous" && (
<div className="md:py-8 px-[38px] add-fund-btn flex justify-end items-center gap-4 py-4">
<div className="md:py-8 add-fund-btn flex justify-end items-center gap-2 py-4">
<button
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center items-center border-gradient text-base rounded-full"
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center bg-[#f5a430] text-black items-center text-base rounded-full"
onClick={props.onClose}
>
Cancel
+2 -2
View File
@@ -138,12 +138,12 @@ function AddFundPop({
</div>
)}
{countryWallet == "NG" && <div className="h-[18rem]"></div>}
{countryWallet == "NG" && <div className="h-[19rem]"></div>}
{countryWallet == "NG" && (
<div className="md:p-8 p-4 add-fund-btn flex justify-end items-center py-4 gap-4">
<button
className="px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center items-center bg-[#f5a430] text-black text-base rounded-full"
onClick={onClose}
>
Cancel
@@ -63,7 +63,8 @@ function CompleteConfirmCredit({ onClose, confirmCredit }) {
</h1>
</div>
{data?.internal_return >= 0 ? (
{data?.internal_return >= 0 &&
data?.result !== "Charge failed" ? (
<>
<div className="flex items-center gap-8">
<h1 className="text-xl font-bold text-dark-gray dark:text-white tracking-tighter my-1">
@@ -111,7 +111,7 @@ function ConfirmAddFund({
});
const config = {
public_key: process.env.REACT_APP_FLUTTERWAVE_APIKEY,
public_key: __confirmData?.flutterwave_key,
tx_ref: __confirmData?.credit_reference,
currency: "NGN",
amount: Number(__confirmData.amount),
@@ -379,7 +379,7 @@ function ConfirmAddFund({
<hr />
<div className="md:p-8 p-4 add-fund-btn flex justify-end items-center py-4 gap-4">
<button
className="px-4 h-11 flex justify-center items-center border-gradient text-base rounded-full"
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center bg-[#f5a430] text-black items-center text-base rounded-full"
onClick={getBack}
>
Back
@@ -1,10 +1,10 @@
import { useState } from "react";
import { useDispatch } from "react-redux";
import usersService from "../../../services/UsersService";
import { tableReload } from "../../../store/TableReloads";
import InputCom from "../../Helpers/Inputs/InputCom";
import ModalCom from "../../Helpers/ModalCom";
import LoadingSpinner from "../../Spinners/LoadingSpinner";
import { useDispatch } from "react-redux";
import { tableReload } from "../../../store/TableReloads";
function ConfirmNairaWithdraw({
payment,
@@ -393,9 +393,9 @@ function ConfirmNairaWithdraw({
<button
type="button"
onClick={action}
className="border-gradient text-base tracking-wide px-4 py-2 rounded-full"
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center items-center bg-[#f5a430] text-black text-base rounded-full"
>
<span className="text-gradient">Cancel</span>
Cancel
</button>
)}
@@ -25,8 +25,10 @@ const CreditPopup = ({ details, onClose, situation, walletItem }) => {
<div className="logout-modal-header w-full flex items-center justify-between lg:p-6 px-[30px] py-[23px] border-b dark:border-[#5356fb29] border-light-purple">
<h1 className="text-26 font-bold text-dark-gray dark:text-white tracking-wide">
{confirmCredit?.show?.acceptConfirm?.state &&
(confirmCredit?.data?.internal_return < 0 ||
confirmCredit?.data?.status !== "successful") ? (
(confirmCredit?.data?.internal_return < 0
// ||
// confirmCredit?.data?.status !== "successful"
) ? (
"Credit Unsuccessful"
) : (
<>
@@ -171,7 +171,7 @@ function NairaWithdraw({
setErrorMsgs({ amount: "amount required" });
setTimeout(() => setErrorMsgs({ amount: "" }), 3000);
return;
}else if (Number(values.amount * 100) > Number(wallet?.transfer_limit)) {
} else if (Number(values.amount * 100) > Number(wallet?.transfer_limit)) {
setErrorMsgs({ amount: "Withdraw limit has been exceeded" });
setTimeout(() => setErrorMsgs({ amount: "" }), 3000);
return;
@@ -517,7 +517,7 @@ function NairaWithdraw({
</div>
</div>
</div>
<div className="h-[7.8rem]"></div>
<div className="h-[6.1rem]"></div>
</>
)}
@@ -796,9 +796,9 @@ function NairaWithdraw({
<button
type="button"
onClick={action}
className="border-gradient text-base tracking-wide px-4 py-2 rounded-full"
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center bg-[#f5a430] text-black items-center text-base rounded-full"
>
<span className="text-gradient">Cancel</span>
Cancel
</button>
<button
+47 -50
View File
@@ -4,7 +4,7 @@ import bank1 from "../../assets/images/bank-1.png";
import bank2 from "../../assets/images/bank-2.png";
import bank3 from "../../assets/images/bank-3.png";
import bank4 from "../../assets/images/bank-4.png";
import profileImg from "../../assets/images/profile-pic.jpg";
import profileImg from "../../assets/images/profile.jpg";
import useToggle from "../../hooks/useToggle";
import usersService from "../../services/UsersService";
import DarkModeContext from "../Contexts/DarkModeContext";
@@ -15,10 +15,10 @@ import WalletHeader from "../MyWallet/WalletHeader";
import { useDispatch, useSelector } from "react-redux";
import Flag from "../../assets/images/united-states.svg";
import siteLogo from "../../assets/images/wrenchboard-logo-text.png";
import formattedDate from "../../lib/fomattedDate";
import { updateNotifications } from "../../store/notifications";
import TimeDifference from "../Helpers/TimeDifference";
const DEFAULT_PROFILE_IMAGE = require("../../assets/images/profile.jpg");
export default function Header({ logoutModalHandler, sidebarHandler }) {
const [balanceDropdown, setbalanceValue] = useToggle(false);
const [notificationDropdown, setNotificationValue] = useToggle(false);
@@ -30,7 +30,7 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
const [myWalletList, setMyWalletList] = useState([]);
const api = useMemo(() => new usersService(), []);
const dispatch = useDispatch();
const navigate = useNavigate()
const navigate = useNavigate();
const { notifications } = useSelector((state) => state?.notifications); // NOTIFICATION STORE
@@ -100,10 +100,10 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
};
// User Profile
let { firstname, lastname, email, profile_pic } = userDetails;
let { firstname, lastname, email, profile_pic_url } = userDetails;
let userEmail = email?.split("@")[0];
const userProfileImage = profile_pic_url || DEFAULT_PROFILE_IMAGE;
// console.log("Notify: ", notifications?.data?.raw);
return (
<>
@@ -255,9 +255,7 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
>
<Icons name="notification" />
<span className="absolute right-2 top-2 z-10 text-xs lg:w-5 lg:h-5 w-4 h-4 flex justify-center items-center rounded-full primary-gradient text-white cursor-default">
{notifications?.loading
? "●"
: notifications?.data?.length}
{notifications?.loading ? "●" : notifications?.data?.length}
</span>
</div>
<div
@@ -273,46 +271,45 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
<div className="content px-7 pb-7">
<ul>
{notifications?.data?.length && notifications?.data?.map((item, idx) =>
{
if(idx < 5){
return (
<li
className={`content-item ${
idx == 4
? "py-5 "
: "py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple"
}`}
key={idx}
>
<div className="notifications flex space-x-4 items-center">
<div className="icon max-w-[52px] max-h-[52px] w-full h-full rounded-full object-cover">
<img
src={require(`../../assets/images/notifications/${item?.icon}`)}
alt="icon"
className="w-full h-full"
/>
</div>
<div className="name">
<p className="text-base text-dark-gray dark:text-white font-medium mb-2">
{item?.title}
{/* <span className="ml-1 font-bold">
{notifications?.data?.length &&
notifications?.data?.map((item, idx) => {
if (idx < 5) {
return (
<li
className={`content-item ${
idx == 4
? "py-5 "
: "py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple"
}`}
key={idx}
>
<div className="notifications flex space-x-4 items-center">
<div className="icon max-w-[52px] max-h-[52px] w-full h-full rounded-full object-cover">
<img
src={require(`../../assets/images/notifications/${item?.icon}`)}
alt="icon"
className="w-full h-full"
/>
</div>
<div className="name">
<p className="text-base text-dark-gray dark:text-white font-medium mb-2">
{item?.title}
{/* <span className="ml-1 font-bold">
successfully done
</span> */}
</p>
<p className="text-sm text-thin-light-gray font-medium">
<TimeDifference
time={item?.date}
key={item?.uid}
/>
</p>
</div>
</div>
</li>
)
}
})
}
</p>
<p className="text-sm text-thin-light-gray font-medium">
<TimeDifference
time={item?.date}
key={item?.uid}
/>
</p>
</div>
</div>
</li>
);
}
})}
</ul>
<div className="add-money-btn flex justify-center items-center">
@@ -351,9 +348,9 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
{/* profile-image */}
<div className="lg:w-[62px] lg:h-[62px] w-[50px] h-[50px] rounded-full overflow-hidden">
<img
src={profile_pic != "" ? profile_pic : profileImg}
src={userProfileImage}
alt="profile"
className="w-full h-full"
className="w-full h-full object-cover"
/>
</div>
<div className="lg:block hidden">
@@ -375,7 +372,7 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
<img
src={profileImg}
alt="profile"
className="w-full h-full"
className="w-full h-full object-cover object-center"
/>
</div>
</div>
+1 -1
View File
@@ -62,7 +62,7 @@ export default function Layout({ children }) {
drawer
? "2xl:w-[335px] w-[280px] 2xl:pl-20 pl-10 pr-6 "
: "w-[70px]"
} bg-white dark:bg-dark-white h-full overflow-y-scroll overflow-style-none fixed left-0 top-0 pt-8`}
} bg-white dark:bg-dark-white h-full overflow-y-scroll overflow-style-none fixed left-0 top-0 pt-[30px]`}
>
<Sidebar
logoutModalHandler={logoutModalHandler}
+1 -1
View File
@@ -39,7 +39,7 @@ export default function Sidebar({
{/* logo-area */}
<div
className={`w-full flex items-center transition-all duration-300 ease-in-out ${
sidebar ? "justify-between mb-14" : "justify-center"
sidebar ? "justify-start gap-3 mb-14" : "justify-center"
}`}
>
<div className={`sidebar-logo ${sidebar ? "enter" : ""}`}>
+86 -45
View File
@@ -1,37 +1,84 @@
import React, { useState } from "react";
import { Link } from "react-router-dom";
import React, { useEffect, useState } from "react";
// import authProfilePic from "../../assets/images/auth-profile-picture.png";
// import profileBanner from "../../assets/images/profile-cover.png";
// import collections from "../../data/collectionplan_data.json"; Should this be cleaned off?
// import marketPlace from "../../data/marketplace_data.json";
import { useSelector } from "react-redux";
import LoadingSpinner from "../../components/Spinners/LoadingSpinner";
import products from "../../data/product_data.json";
import usersService from "../../services/UsersService";
import Layout from "../Partials/Layout";
import {
ActivitiesTab, BlogTab,
QuestionsTab,
ActivitiesTab,
BlogTab,
CollectionTab,
CreatedTab,
HiddenProductsTab,
OnSaleTab,
MyUploadedFiles,
OwnTab,
QuestionsTab,
} from "./tabs";
//import MyUploadedFiles from "./tabs/MyUploadedFiles";
export default function Resources(props) {
// console.log("RESOURCES=>", props);
const ownProducts = products.datas;
// Resource Props
const __resources = props.MyResourceData;
//debugger;
//debugger;
// Collection Items
const CreatedSell = __resources?.marketdata?.data;
const tab_categories = __resources?.tab_categories?.data;
const collectionProducts = __resources?.collectiondata?.data;
const onSaleProducts = __resources?.marketdata?.data;
const CreatedBits = __resources?.productdata?.datas;
const blogItems = __resources?.blogdata?.payload;
const blogItems = __resources?.blogdata?.payload;
const [tab, setTab] = useState(tab_categories ? tab_categories[0]?.name : "");
// My Items Data
const [uploadedFiles, setUploadedFiles] = useState({
loading: false,
msg: "",
data: null,
});
const { uploadsTable } = useSelector((state) => state.tableReload);
const apiCall = new usersService();
const getUploadedFiles = async () => {
setUploadedFiles((prev) => ({ ...prev, loading: true }));
let res;
try {
res = await apiCall.getUploadedList();
res = res.data;
if (res?.internal_return < 0) {
setUploadedFiles((prev) => ({
...prev,
loading: false,
msg: "something went wrong",
}));
}
setUploadedFiles((prev) => ({
...prev,
loading: false,
msg: "success",
data: res?.result_list,
}));
} catch (error) {
setUploadedFiles((prev) => ({
...prev,
loading: false,
msg: "An error occurred",
}));
}
};
useEffect(() => {
getUploadedFiles();
}, [uploadsTable]);
// const [tab, setTab] = useState(tab_categories ? tab_categories[0]?.name : "");
const [tab, setTab] = useState(props.activeTab? props.activeTab : tab_categories ? tab_categories[0]?.name : "");
const tabHandler = (value) => {
setTab(value);
@@ -42,9 +89,7 @@ export default function Resources(props) {
blog: <BlogTab blogdata={blogItems} />,
onsale: <QuestionsTab products={onSaleProducts} />,
owned: <OwnTab products={ownProducts} />,
created: (
<CreatedTab marketProducts={CreatedSell} mainProducts={CreatedBits} />
),
created: <MyUploadedFiles uploadedFiles={uploadedFiles} />,
hidden: (
<HiddenProductsTab
marketProducts={CreatedSell}
@@ -55,26 +100,30 @@ export default function Resources(props) {
activity: <ActivitiesTab />,
};
const defaultTabComponent = <BlogTab blogdata={blogItems} />;
// const defaultTabComponent = <BlogTab blogdata={blogItems} />;
const selectedTabComponent = tabComponents[tab] || defaultTabComponent;
// const selectedTabComponent = tabComponents[tab] || defaultTabComponent;
const defaultTabComponent = props.activeTab ? tabComponents[props.activeTab] : <BlogTab blogdata={blogItems} />;
const selectedTabComponent = tabComponents[tab] || defaultTabComponent;
// Tab Item Component
const TabItem = ({ tabValue, isActive }) => {
let countNumber = (name) => { // FUNCTION TO DETERMINE THE COUNT NUMBER
if(name == 'blog'){
return blogItems?.blogdata?.length
}else if(name == 'onsale'){
return onSaleProducts?.length
let countNumber = (name) => {
// FUNCTION TO DETERMINE THE COUNT NUMBER
if (name == "blog") {
return blogItems?.blogdata?.length;
} else if (name == "onsale") {
return onSaleProducts?.length;
// return null
}else if(name == 'owned'){
return ownProducts?.length
}else if(name == 'created'){
return CreatedSell?.length + CreatedBits?.length
}else{
return 0
} else if (name == "owned") {
return ownProducts?.length;
} else if (name == "created") {
return uploadedFiles?.data?.length;
} else {
return 0;
}
}
};
return (
<li
className={`relative group inline`}
@@ -89,17 +138,17 @@ export default function Resources(props) {
>
{tabValue.content}
</span>
{tabValue.name != 'onsale' &&
<span
className={`w-5 h-5 group-hover:bg-pink group-hover:text-white text-[10px] rounded-full absolute -top-2 -right-5 flex justify-center items-center ${
isActive
? "text-white bg-pink"
: "text-thin-light-gray bg-[#F2B8FD]"
}`}
>
{countNumber(tabValue.name)}
</span>
}
{tabValue.name != "onsale" && (
<span
className={`w-5 h-5 group-hover:bg-pink group-hover:text-white text-[10px] rounded-full absolute -top-2 -right-5 flex justify-center items-center ${
isActive
? "text-white bg-pink"
: "text-thin-light-gray bg-[#F2B8FD]"
}`}
>
{countNumber(tabValue.name)}
</span>
)}
</li>
);
};
@@ -136,14 +185,6 @@ export default function Resources(props) {
<div className="tab-items">
<TabList tabCategories={tab_categories} />
</div>
<div style={{ transform: "translateY(-22px)" }}>
<Link
to="/upload-product"
className="btn-gradient lg:flex hidden w-[153px] h-[46px] rounded-full text-white justify-center items-center"
>
Add My Item
</Link>
</div>
</div>
<div className="hidden lg:block w-full h-[1px] bg-[#DCD5FE] dark:bg-[#5356fb29] absolute top-[42px] left-0"></div>
</div>
+27 -27
View File
@@ -18,36 +18,36 @@ export default function CreatedTab({
</div>
{/* filer-dropdown */}
<div className="flex-1 flex sm:justify-end">
<div className="flex space-x-1 items-center">
<span className="text-18 text-thin-light-gray">
Recently Received
</span>
<span>
<svg
width="20"
height="10"
viewBox="0 0 13 6"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
opacity="0.7"
d="M12.4124 0.247421C12.3327 0.169022 12.2379 0.106794 12.1335 0.0643287C12.0291 0.0218632 11.917 0 11.8039 0C11.6908 0 11.5787 0.0218632 11.4743 0.0643287C11.3699 0.106794 11.2751 0.169022 11.1954 0.247421L7.27012 4.07837C7.19045 4.15677 7.09566 4.219 6.99122 4.26146C6.88678 4.30393 6.77476 4.32579 6.66162 4.32579C6.54848 4.32579 6.43646 4.30393 6.33202 4.26146C6.22758 4.219 6.13279 4.15677 6.05312 4.07837L2.12785 0.247421C2.04818 0.169022 1.95338 0.106794 1.84895 0.0643287C1.74451 0.0218632 1.63249 0 1.51935 0C1.40621 0 1.29419 0.0218632 1.18975 0.0643287C1.08531 0.106794 0.990517 0.169022 0.910844 0.247421C0.751218 0.404141 0.661621 0.616141 0.661621 0.837119C0.661621 1.0581 0.751218 1.2701 0.910844 1.42682L4.84468 5.26613C5.32677 5.73605 5.98027 6 6.66162 6C7.34297 6 7.99647 5.73605 8.47856 5.26613L12.4124 1.42682C12.572 1.2701 12.6616 1.0581 12.6616 0.837119C12.6616 0.616141 12.572 0.404141 12.4124 0.247421Z"
fill="#374557"
fillOpacity="0.6"
/>
</svg>
</span>
</div>
{/*<div className="flex space-x-1 items-center">*/}
{/* <span className="text-18 text-thin-light-gray">*/}
{/* Recently Received*/}
{/* </span>*/}
{/* <span>*/}
{/* <svg*/}
{/* width="20"*/}
{/* height="10"*/}
{/* viewBox="0 0 13 6"*/}
{/* fill="none"*/}
{/* xmlns="http://www.w3.org/2000/svg"*/}
{/* >*/}
{/* <path*/}
{/* opacity="0.7"*/}
{/* d="M12.4124 0.247421C12.3327 0.169022 12.2379 0.106794 12.1335 0.0643287C12.0291 0.0218632 11.917 0 11.8039 0C11.6908 0 11.5787 0.0218632 11.4743 0.0643287C11.3699 0.106794 11.2751 0.169022 11.1954 0.247421L7.27012 4.07837C7.19045 4.15677 7.09566 4.219 6.99122 4.26146C6.88678 4.30393 6.77476 4.32579 6.66162 4.32579C6.54848 4.32579 6.43646 4.30393 6.33202 4.26146C6.22758 4.219 6.13279 4.15677 6.05312 4.07837L2.12785 0.247421C2.04818 0.169022 1.95338 0.106794 1.84895 0.0643287C1.74451 0.0218632 1.63249 0 1.51935 0C1.40621 0 1.29419 0.0218632 1.18975 0.0643287C1.08531 0.106794 0.990517 0.169022 0.910844 0.247421C0.751218 0.404141 0.661621 0.616141 0.661621 0.837119C0.661621 1.0581 0.751218 1.2701 0.910844 1.42682L4.84468 5.26613C5.32677 5.73605 5.98027 6 6.66162 6C7.34297 6 7.99647 5.73605 8.47856 5.26613L12.4124 1.42682C12.572 1.2701 12.6616 1.0581 12.6616 0.837119C12.6616 0.616141 12.572 0.404141 12.4124 0.247421Z"*/}
{/* fill="#374557"*/}
{/* fillOpacity="0.6"*/}
{/* />*/}
{/* </svg>*/}
{/* </span>*/}
{/*</div>*/}
</div>
</div>
<div className="content-section w-full">
<div className="marketplace-products-widgets mb-16">
<CreateSaleSlider products={marketProducts} />
</div>
<div className="main-products-widgets">
<CreatedBidsSlider products={mainProducts} />
</div>
{/*<div className="marketplace-products-widgets mb-16">*/}
{/* <CreateSaleSlider products={marketProducts} />*/}
{/*</div>*/}
{/*<div className="main-products-widgets">*/}
{/* <CreatedBidsSlider products={mainProducts} />*/}
{/*</div>*/}
</div>
</div>
</div>
@@ -0,0 +1,134 @@
import React, { useState } from "react";
import { Link } from "react-router-dom";
import { PaginatedList, handlePagingFunc } from "../../Pagination";
export default function MyUploadedFiles({ uploadedFiles }) {
const [currentPage, setCurrentPage] = useState(0);
const indexOfFirstItem = Number(currentPage);
const indexOfLastItem =
Number(indexOfFirstItem) + Number(process.env.REACT_APP_ITEM_PER_PAGE);
const currentFiles = uploadedFiles?.data?.slice(
indexOfFirstItem,
indexOfLastItem
);
const handlePagination = (e) => {
handlePagingFunc(e, setCurrentPage);
};
return (
<>
<div className="mb-4 w-full flex justify-end item-center">
<Link
to="/my-uploads"
className="btn-gradient lg:flex hidden w-[153px] h-[46px] rounded-full text-white justify-center items-center"
>
Add My Item
</Link>
</div>
<div
className={`update-table w-full p-8 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow relative min-h-[520px]`}
>
<div className="header w-full sm:flex justify-between items-center mb-5">
<div className="flex space-x-2 items-center mb-2 sm:mb-0">
<h1 className="text-xl font-bold text-dark-gray dark:text-white tracking-wide">
My Uploads
</h1>
</div>
</div>
<div className="relative w-full overflow-x-auto sm:rounded-lg">
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<tbody>
<>
{uploadedFiles?.data && uploadedFiles?.data.length ? (
currentFiles.map((value, idx) => {
let addedDate = value?.added?.split(" ")[0];
let formattedSize = formatFileSize(value?.file_size);
return (
<tr
key={value?.file_uid}
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
>
<td className=" py-4">
<div className="flex space-x-2 items-center w-full">
<div className="flex flex-col flex-[0.9]">
<h1 className="font-bold text-xl text-dark-gray dark:text-white">
{value.title || "Dummy Text"}
</h1>
<div>
{value.description || "Dummy Description"}
</div>
<span className="text-sm text-thin-light-gray flex flext-start gap-1">
Added:{" "}
<span className="text-purple">{addedDate}</span>
</span>
<div className="flex gap-4 items-center">
<span className="text-sm text-thin-light-gray">
File Name:{" "}
<span className="text-purple">
{" "}
{value.file_name}
</span>
</span>
<span className="text-sm text-thin-light-gray">
File Size:{" "}
<span className="text-purple">
{" "}
{formattedSize}
</span>
</span>
<span className="text-sm text-thin-light-gray">
File Type:{" "}
<span className="text-purple">
{" "}
{value?.file_type}
</span>
</span>
</div>
</div>
</div>
</td>
</tr>
);
})
) : (
<tr className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap">
<td className="p-2" colSpan={3}>
No Files Currently!
</td>
</tr>
)}
</>
</tbody>
</table>
{/* PAGINATION BUTTON */}
<PaginatedList
onClick={handlePagination}
prev={currentPage == 0 ? true : false}
next={
currentPage + Number(process.env.REACT_APP_ITEM_PER_PAGE) >=
uploadedFiles?.data.length
? true
: false
}
data={uploadedFiles?.data}
start={indexOfFirstItem}
stop={indexOfLastItem}
/>
{/* END OF PAGINATION BUTTON */}
</div>
</div>
</>
);
}
const formatFileSize = (sizeInBytes) => {
if (sizeInBytes < 1024) {
return `${sizeInBytes} bytes`;
} else if (sizeInBytes < 1024 * 1024) {
const sizeInKB = (sizeInBytes / 1024).toFixed(2);
return `${sizeInKB} KB`;
} else {
const sizeInMB = (sizeInBytes / (1024 * 1024)).toFixed(2);
return `${sizeInMB} MB`;
}
};
+2
View File
@@ -6,6 +6,7 @@ import OnSaleTab from "./OnSaleTab";
import OwnTab from "./OwnTab";
import BlogTab from "./BlogTab";
import QuestionsTab from "./QuestionsTab";
import MyUploadedFiles from "./MyUploadedFiles";
export {
BlogTab,
@@ -16,4 +17,5 @@ export {
HiddenProductsTab,
OnSaleTab,
OwnTab,
MyUploadedFiles,
};
@@ -1,13 +1,11 @@
import React, { useEffect, useState } from "react";
import { useSelector } from "react-redux";
import { Link, useNavigate } from "react-router-dom";
import { useNavigate } from "react-router-dom";
import usersService from "../../../services/UsersService";
import Icons from "../../Helpers/Icons";
import InputCom from "../../Helpers/Inputs/InputCom";
import LoadingSpinner from "../../Spinners/LoadingSpinner";
import { toast } from "react-toastify";
import { Form, Formik } from "formik";
import * as Yup from "yup";
@@ -60,14 +58,17 @@ export default function PersonalInfoTab({
let navigate = useNavigate();
let [togglePromotion, setTogglePromotion] = useState(false);
const initialValues = {
firstname: userDetails?.firstname,
lastname: userDetails?.lastname,
state: userDetails?.state,
city: userDetails?.city,
email: userDetails?.email,
profile: userDetails?.profile_pic,
pref_email: 0,
pref_phone: 0,
accept_promo: false,
online_name: "",
};
let [profile, setProfile] = useState({
@@ -86,8 +87,17 @@ export default function PersonalInfoTab({
const handleUpdateUser = (values, helpers) => {
setRequestState({ message: "", loading: true, status: false });
// there is no profile accommodation on the payload
delete values?.profile;
const reqData = {
...values,
pref_email: Number(values.pref_email?.toString()),
pref_phone: Number(values.pref_phone?.toString()),
};
apiCall
.updateProfile(values)
.updateProfile(reqData)
.then((res) => {
// API CALL TO UPDATE USER DETAILS
if (res.data.internal_return < 0) {
@@ -98,10 +108,14 @@ export default function PersonalInfoTab({
});
return;
}
// setRequestState({message: 'Profile update successfully', loading: false, status: true})
toast.success("Update Successful");
setRequestState({
message: "Profile update successfully",
loading: false,
status: true,
});
// toast.success("Update Successful");
setTimeout(() => {
// navigate("/", { replace: true });
navigate("/", { replace: true });
window.location.reload(true);
}, 1000);
})
@@ -144,9 +158,9 @@ export default function PersonalInfoTab({
fieldClass="px-6"
label="User Name"
type="text"
name="username"
placeholder=""
value={userDetails.username}
name="online_name"
placeholder="Username"
value={userDetails?.username}
disable={true}
/>
</div>
@@ -206,6 +220,25 @@ export default function PersonalInfoTab({
)}
</div>
</div>
{/* Online Name */}
<div className="field w-full mb-6">
<InputCom
fieldClass="px-6"
label="Online Name (optional)"
type="text"
name="online_name"
placeholder=""
value={props.values.online_name}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.online_name &&
props.touched.online_name && (
<p className="text-sm text-red-500">
{props.errors.online_name}
</p>
)}
</div>
{/* Country */}
<div className="field w-full mb-6">
@@ -263,13 +296,17 @@ export default function PersonalInfoTab({
Pref. Communication
</label>
<div className="check-box">
<div className="flex items-center justify-start">
<div
role="group"
className="flex items-center justify-start"
>
<div className="check-input flex items-center mr-1">
<input
className="w-4 h-4 cursor-pointer"
type="checkbox"
name="prefcomm1"
id=""
name="pref_email"
value={1}
onChange={props.handleChange}
/>
<span className="mx-2 text-base text-dark-gray dark:text-white">
Email
@@ -279,8 +316,9 @@ export default function PersonalInfoTab({
<input
className="w-4 h-4 cursor-pointer"
type="checkbox"
name="prefcomm2"
id=""
name="pref_phone"
value={1}
onChange={props.handleChange}
/>
<span className="mx-2 text-base text-dark-gray dark:text-white">
Phone
@@ -292,22 +330,32 @@ export default function PersonalInfoTab({
{/* Allow Promotions */}
<div className="field w-full mb-6 flex items-center space-x-4">
<label className="input-label text-[#181c32] dark:text-white text-base font-semibold">
<label
htmlFor="accept_promo"
className="input-label text-[#181c32] dark:text-white text-base font-semibold"
>
Allow Promotions
</label>
<div
className="cursor-pointer flex items-center"
onClick={() => setTogglePromotion((prev) => !prev)}
>
<div
className={`h-6 w-8 mr-1 p-1 ${
togglePromotion
<div>
<input
type="checkbox"
id="accept_promo"
name="accept_promo"
value={props.values.accept_promo}
checked={props.values.accept_promo}
onChange={props.handleChange}
className="hidden"
/>
<label
htmlFor="accept_promo"
className={`cursor-pointer flex items-center h-6 w-8 mr-1 p-1 ${
props.values.accept_promo
? "bg-sky-blue flex justify-end items-center"
: "bg-slate-200"
} rounded-full transition`}
} rounded-full transition duration-200`}
>
<div className="w-4 h-full bg-white rounded-full"></div>
</div>
</label>
</div>
</div>
{/* inputs ends here */}
@@ -336,8 +384,8 @@ export default function PersonalInfoTab({
<div className="w-full relative">
<img
src={profileImg}
alt=""
className="sm:w-[198px] sm:h-[198px] w-[120px] h-[120px] rounded-full overflow-hidden object-cover"
alt="profile"
className="sm:w-[198px] sm:h-[198px] w-[120px] h-[120px] rounded-full overflow-hidden object-contain object-center"
/>
<input
ref={profileImgInput}
@@ -384,7 +432,7 @@ export default function PersonalInfoTab({
)}
<div className="w-full h-[120px] border-t border-light-purple dark:border-[#5356fb29] flex justify-end items-center">
<div className="flex items-center space-x-4 mr-9">
<Link
{/* <Link
to="/"
className="text-18 text-light-red tracking-wide "
>
@@ -392,7 +440,7 @@ export default function PersonalInfoTab({
{" "}
Cancel
</span>
</Link>
</Link> */}
{requestStatus.loading ? (
<LoadingSpinner size="8" color="sky-blue" />
+9 -4
View File
@@ -5,8 +5,9 @@ import React, {
useRef,
useState,
} from "react";
import { useSelector } from "react-redux";
import cover from "../../assets/images/profile-info-cover.png";
import profile from "../../assets/images/profile-info-profile.png";
import profile from "../../assets/images/profile.jpg";
import usersService from "../../services/UsersService";
import Icons from "../Helpers/Icons";
import Layout from "../Partials/Layout";
@@ -23,15 +24,19 @@ import {
import RecipientAccountTab from "./Tabs/RecipientAccountTab";
export default function Settings({ faq }) {
const [profileImg, setProfileImg] = useState(profile);
const { userDetails } = useSelector((state) => state?.userDetails);
const [profileImg, setProfileImg] = useState(
userDetails?.profile_pic_url ? userDetails.profile_pic_url : profile
);
const [coverImg, setCoverImg] = useState(cover);
const [reloadCardList, setReloadCardList] = useState(false) // STATE TO DETERMINE WHEN CARD LIST RELOADS. EG: WHEN USER DELETES A CARD
const [reloadCardList, setReloadCardList] = useState(false); // STATE TO DETERMINE WHEN CARD LIST RELOADS. EG: WHEN USER DELETES A CARD
// profile img
const profileImgInput = useRef(null);
const browseProfileImg = () => {
profileImgInput.current.click();
};
const profileImgChangHandler = (e) => {
if (e.target.value !== "") {
const imgReader = new FileReader();
@@ -22,132 +22,134 @@ export default function ProductUploadField({
<div className="w-full lg:pl-[41px]">
<div className="fields w-full">
<form onSubmit={(e) => e.preventDefault()}>
<div className="field w-full mb-6">
<h1 className="field-title">Put on marketplace</h1>
<p className="text-thin-light-gray text-base tracking-wide font-medium mb-3">
Enter price to allow users instantly purchase your NFT
</p>
{/*<div className="field w-full mb-6">*/}
{/* <h1 className="field-title">Put on marketplace</h1>*/}
{/* <p className="text-thin-light-gray text-base tracking-wide font-medium mb-3">*/}
{/* Enter price to allow users instantly purchase your NFT*/}
{/* </p>*/}
{/* <div className="items sm:flex sm:space-x-5">*/}
{/* <div*/}
{/* className="item sm:w-[120px] w-full h-[130px] relative mb-5 sm:mb-0"*/}
{/* onClick={() => cpt("fixed")}*/}
{/* >*/}
{/* <div*/}
{/* className={`w-full h-full bg-white dark:bg-dark-white rounded-md z-20 relative flex justify-center items-center ${*/}
{/* datas.priceType === "fixed"*/}
{/* ? ""*/}
{/* : "border border-light-purple dark:border-[#5356fb29] "*/}
{/* }`}*/}
{/* >*/}
{/* <div className="flex flex-col justify-center items-center">*/}
{/* <div*/}
{/* className={`w-[68px] h-[68px] rounded-full flex justify-center items-center ${*/}
{/* datas.priceType === "fixed"*/}
{/* ? "primary-gradient"*/}
{/* : "bg-[#F2E8FA]"*/}
{/* }`}*/}
{/* >*/}
{/* <GradientIcons*/}
{/* name={`${*/}
{/* datas.priceType === "fixed"*/}
{/* ? "doller"*/}
{/* : "gradient-doller"*/}
{/* }`}*/}
{/* />*/}
{/* </div>*/}
{/* <p className="text-center text-base tracking-wide mt-1 text-dark-gray dark:text-white">*/}
{/* Fixed price*/}
{/* </p>*/}
{/* </div>*/}
{/* </div>*/}
{/* {datas.priceType === "fixed" && (*/}
{/* <div*/}
{/* className="sm:w-[122px] w-full h-[132px] primary-gradient rounded-md absolute z-10"*/}
{/* style={{ top: "-1px", left: "-1px" }}*/}
{/* ></div>*/}
{/* )}*/}
{/* </div>*/}
{/* <div*/}
{/* className="item sm:w-[120px] w-full h-[130px] relative mb-5 sm:mb-0"*/}
{/* onClick={() => cpt("bids")}*/}
{/* >*/}
{/* <div*/}
{/* className={`w-full h-full bg-white dark:bg-dark-white rounded-md z-20 relative flex justify-center items-center ${*/}
{/* datas.priceType === "bids"*/}
{/* ? ""*/}
{/* : "border border-light-purple dark:border-[#5356fb29] "*/}
{/* }`}*/}
{/* >*/}
{/* <div className="flex flex-col justify-center items-center">*/}
{/* <div*/}
{/* className={`w-[68px] h-[68px] rounded-full flex justify-center items-center ${*/}
{/* datas.priceType === "bids"*/}
{/* ? "primary-gradient"*/}
{/* : "bg-[#F2E8FA]"*/}
{/* }`}*/}
{/* >*/}
{/* <GradientIcons*/}
{/* name={`${*/}
{/* datas.priceType === "bids"*/}
{/* ? "hammer"*/}
{/* : "gradient-hammer"*/}
{/* }`}*/}
{/* />*/}
{/* </div>*/}
{/* <p className="text-center text-base tracking-wide mt-1 text-dark-gray dark:text-white">*/}
{/* Open for bids*/}
{/* </p>*/}
{/* </div>*/}
{/* </div>*/}
{/* {datas.priceType === "bids" && (*/}
{/* <div*/}
{/* className="sm:w-[122px] w-full h-[132px] primary-gradient rounded-md absolute z-10"*/}
{/* style={{ top: "-1px", left: "-1px" }}*/}
{/* ></div>*/}
{/* )}*/}
{/* </div>*/}
{/* <div*/}
{/* className="item sm:w-[120px] w-full h-[130px] relative mb-5 sm:mb-0"*/}
{/* onClick={() => cpt("auction")}*/}
{/* >*/}
{/* <div*/}
{/* className={`w-full h-full bg-white dark:bg-dark-white rounded-md z-20 relative flex justify-center items-center ${*/}
{/* datas.priceType === "auction"*/}
{/* ? ""*/}
{/* : "border border-light-purple dark:border-[#5356fb29] "*/}
{/* }`}*/}
{/* >*/}
{/* <div className="flex flex-col justify-center items-center">*/}
{/* <div*/}
{/* className={`w-[68px] h-[68px] rounded-full flex justify-center items-center ${*/}
{/* datas.priceType === "auction"*/}
{/* ? "primary-gradient"*/}
{/* : "bg-[#F2E8FA]"*/}
{/* }`}*/}
{/* >*/}
{/* <GradientIcons*/}
{/* name={`${*/}
{/* datas.priceType === "auction"*/}
{/* ? "timeout"*/}
{/* : "gradient-timeout"*/}
{/* }`}*/}
{/* />*/}
{/* </div>*/}
{/* <p className="text-center text-base tracking-wide mt-1 text-dark-gray dark:text-white">*/}
{/* Timed auction*/}
{/* </p>*/}
{/* </div>*/}
{/* </div>*/}
{/* {datas.priceType === "auction" && (*/}
{/* <div*/}
{/* className="sm:w-[122px] w-full h-[132px] primary-gradient rounded-md absolute z-10"*/}
{/* style={{ top: "-1px", left: "-1px" }}*/}
{/* ></div>*/}
{/* )}*/}
{/* </div>*/}
{/* </div>*/}
{/*</div>*/}
<div className="items sm:flex sm:space-x-5">
<div
className="item sm:w-[120px] w-full h-[130px] relative mb-5 sm:mb-0"
onClick={() => cpt("fixed")}
>
<div
className={`w-full h-full bg-white dark:bg-dark-white rounded-md z-20 relative flex justify-center items-center ${
datas.priceType === "fixed"
? ""
: "border border-light-purple dark:border-[#5356fb29] "
}`}
>
<div className="flex flex-col justify-center items-center">
<div
className={`w-[68px] h-[68px] rounded-full flex justify-center items-center ${
datas.priceType === "fixed"
? "primary-gradient"
: "bg-[#F2E8FA]"
}`}
>
<GradientIcons
name={`${
datas.priceType === "fixed"
? "doller"
: "gradient-doller"
}`}
/>
</div>
<p className="text-center text-base tracking-wide mt-1 text-dark-gray dark:text-white">
Fixed price
</p>
</div>
</div>
{datas.priceType === "fixed" && (
<div
className="sm:w-[122px] w-full h-[132px] primary-gradient rounded-md absolute z-10"
style={{ top: "-1px", left: "-1px" }}
></div>
)}
</div>
<div
className="item sm:w-[120px] w-full h-[130px] relative mb-5 sm:mb-0"
onClick={() => cpt("bids")}
>
<div
className={`w-full h-full bg-white dark:bg-dark-white rounded-md z-20 relative flex justify-center items-center ${
datas.priceType === "bids"
? ""
: "border border-light-purple dark:border-[#5356fb29] "
}`}
>
<div className="flex flex-col justify-center items-center">
<div
className={`w-[68px] h-[68px] rounded-full flex justify-center items-center ${
datas.priceType === "bids"
? "primary-gradient"
: "bg-[#F2E8FA]"
}`}
>
<GradientIcons
name={`${
datas.priceType === "bids"
? "hammer"
: "gradient-hammer"
}`}
/>
</div>
<p className="text-center text-base tracking-wide mt-1 text-dark-gray dark:text-white">
Open for bids
</p>
</div>
</div>
{datas.priceType === "bids" && (
<div
className="sm:w-[122px] w-full h-[132px] primary-gradient rounded-md absolute z-10"
style={{ top: "-1px", left: "-1px" }}
></div>
)}
</div>
<div
className="item sm:w-[120px] w-full h-[130px] relative mb-5 sm:mb-0"
onClick={() => cpt("auction")}
>
<div
className={`w-full h-full bg-white dark:bg-dark-white rounded-md z-20 relative flex justify-center items-center ${
datas.priceType === "auction"
? ""
: "border border-light-purple dark:border-[#5356fb29] "
}`}
>
<div className="flex flex-col justify-center items-center">
<div
className={`w-[68px] h-[68px] rounded-full flex justify-center items-center ${
datas.priceType === "auction"
? "primary-gradient"
: "bg-[#F2E8FA]"
}`}
>
<GradientIcons
name={`${
datas.priceType === "auction"
? "timeout"
: "gradient-timeout"
}`}
/>
</div>
<p className="text-center text-base tracking-wide mt-1 text-dark-gray dark:text-white">
Timed auction
</p>
</div>
</div>
{datas.priceType === "auction" && (
<div
className="sm:w-[122px] w-full h-[132px] primary-gradient rounded-md absolute z-10"
style={{ top: "-1px", left: "-1px" }}
></div>
)}
</div>
</div>
</div>
<div className="field w-full mb-6">
<h1 className="field-title">Item Name </h1>
<div className="input-field mt-2">
@@ -161,19 +163,22 @@ export default function ProductUploadField({
/>
</div>
</div>
<div className="field w-full mb-6">
<h1 className="field-title">Exter link </h1>
<div className="input-field mt-2">
<InputCom
fieldClass="px-6"
type="text"
name="link"
inputHandler={linkh}
value={datas.link}
placeholder="https:yoursite.lo/imte/item_name123"
/>
</div>
</div>
{/*<div className="field w-full mb-6">*/}
{/* <h1 className="field-title">Exter link </h1>*/}
{/* <div className="input-field mt-2">*/}
{/* <InputCom*/}
{/* fieldClass="px-6"*/}
{/* type="text"*/}
{/* name="link"*/}
{/* inputHandler={linkh}*/}
{/* value={datas.link}*/}
{/* placeholder="https:yoursite.lo/imte/item_name123"*/}
{/* />*/}
{/* </div>*/}
{/*</div>*/}
<div className="field w-full mb-6">
<h1 className="field-title">Description </h1>
<div className="input-field mt-2">
@@ -188,219 +193,222 @@ export default function ProductUploadField({
</div>
</div>
</div>
<div className="field w-full mb-6">
<h1 className="field-title">Instant sale price </h1>
<div className="input-field my-2">
<div className="input-wrapper border border-light-purple dark:border-[#5356fb29] w-full rounded-[50px] h-[58px] flex items-center overflow-hidden">
<input
value={datas.price}
onChange={(e) => priceHndlr(e)}
placeholder="enter the price for which the item will be instantly sold"
className="input-field placeholder:text-base text-bese px-6 text-dark-gray dark:text-white w-10/12 h-full bg-[#FAFAFA] dark:bg-[#11131F] focus:ring-0 focus:outline-none"
type="number"
/>
<div className="w-[1px] h-[33px] bg-light-purple dark:bg-dark-light-purple "></div>
<div className="flex-1 flex h-full justify-center items-center bg-[#FAFAFA] dark:bg-[#11131F] ">
<div className="flex space-x-1 items-center">
<span className="text-dark-gray dark:text-white text-base">
ETH
</span>
<span>
<svg
width="13"
height="6"
viewBox="0 0 13 6"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
opacity="0.7"
d="M12.7488 0.247421C12.6691 0.169022 12.5744 0.106794 12.4699 0.0643287C12.3655 0.0218632 12.2535 0 12.1403 0C12.0272 0 11.9152 0.0218632 11.8107 0.0643287C11.7063 0.106794 11.6115 0.169022 11.5318 0.247421L7.60655 4.07837C7.52688 4.15677 7.43209 4.219 7.32765 4.26146C7.22321 4.30393 7.11119 4.32579 6.99805 4.32579C6.88491 4.32579 6.77289 4.30393 6.66845 4.26146C6.56401 4.219 6.46922 4.15677 6.38954 4.07837L2.46427 0.247421C2.3846 0.169022 2.28981 0.106794 2.18537 0.0643287C2.08093 0.0218632 1.96891 0 1.85577 0C1.74263 0 1.63061 0.0218632 1.52617 0.0643287C1.42173 0.106794 1.32694 0.169022 1.24727 0.247421C1.08764 0.404141 0.998047 0.616141 0.998047 0.837119C0.998047 1.0581 1.08764 1.2701 1.24727 1.42682L5.18111 5.26613C5.6632 5.73605 6.31669 6 6.99805 6C7.6794 6 8.33289 5.73605 8.81498 5.26613L12.7488 1.42682C12.9084 1.2701 12.998 1.0581 12.998 0.837119C12.998 0.616141 12.9084 0.404141 12.7488 0.247421Z"
fill="#374557"
/>
</svg>
</span>
</div>
</div>
</div>
</div>
<div className="text-base tracking-wide text-dark-gray dark:text-white">
<p>
<span className="text-thin-light-gray">Service fee :</span> 1.5%
</p>
<p>
<span className="text-thin-light-gray">You will Receive :</span>
.29 ETH $120.56
</p>
</div>
</div>
<div className="field w-full mb-6">
<h1 className="field-title">Royalties</h1>
<div className="input-field my-2">
<div className="mb-2">
<InputCom
fieldClass="px-6"
type="text"
name="link"
inputHandler={roltsHndlr}
value={datas.royalties}
placeholder="0%"
/>
</div>
<p className="text-thin-light-gray text-sm tracking-wide">
Suggested: 10%, 20%, 30%
</p>
</div>
</div>
<div className="field w-full mb-6">
<h1 className="field-title">
Properties
<span className="text-thin-light-gray font-normal ml-2">
(Optional)
</span>
</h1>
<div className="input-field my-2">
<div className="mb-2">
<div className="sm:flex sm:space-x-8">
<div className="sm:w-1/2 w-full mb-2 sm:mb-0">
<InputCom
fieldClass="px-6"
type="text"
name="link"
inputHandler={keyHndlr}
value={datas.propertiesKey}
placeholder="Enter key"
/>
</div>
<div className="flex-1">
<InputCom
fieldClass="px-6"
type="text"
name="link"
inputHandler={valueHndlr}
value={datas.propertiesValue}
placeholder="Enter Value"
/>
</div>
</div>
</div>
</div>
</div>
<div className="field w-full mb-6">
<h1 className="field-title">Choose collection</h1>
<div className="input-field mt-2">
<div className="sm:flex sm:space-x-5">
{/* create collection */}
<div className="sm:w-[100px] h-[100px] w-full mb-2 sm:mb-0 rounded-[4px] bg-[#FAFAFA] dark:bg-[#11131F] border border-light-purple dark:border-[#5356fb29] flex justify-center items-center cursor-pointer">
<div>
<span className="mb-1 flex justify-center">
<svg
width="25"
height="25"
viewBox="0 0 25 25"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M25 12.5125C25.019 19.39 19.3853 24.9989 12.5054 25.0001C5.6017 25.0012 -0.0153836 19.3615 3.1653e-05 12.471C0.0154469 5.59949 5.63965 -0.0224583 12.5469 6.7456e-05C19.396 0.0225932 25.0297 5.61846 25 12.5125ZM14.3007 17.2097C14.3007 16.3324 14.3007 15.4551 14.3007 14.5778C14.3007 14.3525 14.3007 14.3525 14.5224 14.3525C16.2299 14.3525 17.9387 14.3525 19.6462 14.3513C19.7339 14.3513 19.8241 14.349 19.9106 14.3335C20.832 14.1711 21.4581 13.327 21.3798 12.356C21.3099 11.4775 20.4988 10.733 19.6011 10.7306C17.9031 10.7271 16.2062 10.7294 14.5082 10.7294C14.2995 10.7294 14.2995 10.7294 14.2995 10.5243C14.2995 8.7851 14.2995 7.04588 14.2983 5.30784C14.2983 5.22959 14.2983 5.15016 14.2805 5.07547C14.0588 4.16021 13.218 3.59588 12.3465 3.68599C11.3836 3.78676 10.697 4.55026 10.697 5.48212C10.697 7.14309 10.697 8.80288 10.697 10.4639C10.697 10.7555 10.7243 10.7294 10.4243 10.7294C8.79504 10.7294 7.16457 10.7401 5.5353 10.7259C4.40524 10.7152 3.60483 11.6293 3.63922 12.6216C3.67242 13.5451 4.45623 14.3513 5.37996 14.3513C7.08275 14.3513 8.78555 14.3513 10.4883 14.3513C10.697 14.3513 10.697 14.3525 10.697 14.5576C10.697 16.2387 10.697 17.9211 10.697 19.6022C10.697 19.6757 10.6935 19.7492 10.703 19.8215C10.8761 21.1256 12.2884 21.8358 13.4255 21.1719C13.9817 20.847 14.3066 20.3586 14.3018 19.684C14.2947 18.86 14.3007 18.0349 14.3007 17.2097Z"
fill="#374557"
fillOpacity="0.6"
/>
</svg>
</span>
<span className="text-thin-light-gray text-center">
Crteate
</span>
</div>
</div>
{/* saved collection list */}
<div className="sm:w-[100px] h-[100px] w-full mb-2 sm:mb-0 rounded-[4px] bg-[#FAFAFA] dark:bg-[#11131F] border-gradient flex justify-center items-center cursor-pointer">
<div>
<div className="mb-1 flex justify-center ">
<div className="w-[50px] h-[50px] rounded-full overflow-hidden">
<img
src={collection1}
alt=""
className="w-full h-full object-cover"
/>
</div>
</div>
<span className="text-thin-light-gray text-center">
Name 1
</span>
</div>
</div>
<div className="sm:w-[100px] h-[100px] w-full mb-2 sm:mb-0 rounded-[4px] bg-[#FAFAFA] dark:bg-[#11131F] border border-light-purple dark:border-[#5356fb29] flex justify-center items-center cursor-pointer">
<div>
<div className="mb-1 flex justify-center ">
<div className="w-[50px] h-[50px] rounded-full overflow-hidden">
<img
src={collection2}
alt=""
className="w-full h-full object-cover"
/>
</div>
</div>
<span className="text-thin-light-gray text-center">
Name 2
</span>
</div>
</div>
<div className="sm:w-[100px] h-[100px] w-full mb-2 sm:mb-0 rounded-[4px] bg-[#FAFAFA] dark:bg-[#11131F] border border-light-purple dark:border-[#5356fb29] flex justify-center items-center cursor-pointer">
<div>
<div className="mb-1 flex justify-center ">
<div className="w-[50px] h-[50px] rounded-full overflow-hidden">
<img
src={collection3}
alt=""
className="w-full h-full object-cover"
/>
</div>
</div>
<span className="text-thin-light-gray text-center">
Name 3
</span>
</div>
</div>
</div>
</div>
</div>
{/*<div className="field w-full mb-6">*/}
{/* <h1 className="field-title">Instant sale price </h1>*/}
{/* <div className="input-field my-2">*/}
{/* <div className="input-wrapper border border-light-purple dark:border-[#5356fb29] w-full rounded-[50px] h-[58px] flex items-center overflow-hidden">*/}
{/* <input*/}
{/* value={datas.price}*/}
{/* onChange={(e) => priceHndlr(e)}*/}
{/* placeholder="enter the price for which the item will be instantly sold"*/}
{/* className="input-field placeholder:text-base text-bese px-6 text-dark-gray dark:text-white w-10/12 h-full bg-[#FAFAFA] dark:bg-[#11131F] focus:ring-0 focus:outline-none"*/}
{/* type="number"*/}
{/* />*/}
{/* <div className="w-[1px] h-[33px] bg-light-purple dark:bg-dark-light-purple "></div>*/}
{/* <div className="flex-1 flex h-full justify-center items-center bg-[#FAFAFA] dark:bg-[#11131F] ">*/}
{/* <div className="flex space-x-1 items-center">*/}
{/* <span className="text-dark-gray dark:text-white text-base">*/}
{/* ETH*/}
{/* </span>*/}
{/* <span>*/}
{/* <svg*/}
{/* width="13"*/}
{/* height="6"*/}
{/* viewBox="0 0 13 6"*/}
{/* fill="none"*/}
{/* xmlns="http://www.w3.org/2000/svg"*/}
{/* >*/}
{/* <path*/}
{/* opacity="0.7"*/}
{/* d="M12.7488 0.247421C12.6691 0.169022 12.5744 0.106794 12.4699 0.0643287C12.3655 0.0218632 12.2535 0 12.1403 0C12.0272 0 11.9152 0.0218632 11.8107 0.0643287C11.7063 0.106794 11.6115 0.169022 11.5318 0.247421L7.60655 4.07837C7.52688 4.15677 7.43209 4.219 7.32765 4.26146C7.22321 4.30393 7.11119 4.32579 6.99805 4.32579C6.88491 4.32579 6.77289 4.30393 6.66845 4.26146C6.56401 4.219 6.46922 4.15677 6.38954 4.07837L2.46427 0.247421C2.3846 0.169022 2.28981 0.106794 2.18537 0.0643287C2.08093 0.0218632 1.96891 0 1.85577 0C1.74263 0 1.63061 0.0218632 1.52617 0.0643287C1.42173 0.106794 1.32694 0.169022 1.24727 0.247421C1.08764 0.404141 0.998047 0.616141 0.998047 0.837119C0.998047 1.0581 1.08764 1.2701 1.24727 1.42682L5.18111 5.26613C5.6632 5.73605 6.31669 6 6.99805 6C7.6794 6 8.33289 5.73605 8.81498 5.26613L12.7488 1.42682C12.9084 1.2701 12.998 1.0581 12.998 0.837119C12.998 0.616141 12.9084 0.404141 12.7488 0.247421Z"*/}
{/* fill="#374557"*/}
{/* />*/}
{/* </svg>*/}
{/* </span>*/}
{/* </div>*/}
{/* </div>*/}
{/* </div>*/}
{/* </div>*/}
{/* <div className="text-base tracking-wide text-dark-gray dark:text-white">*/}
{/* <p>*/}
{/* <span className="text-thin-light-gray">Service fee :</span> 1.5%*/}
{/* </p>*/}
{/* <p>*/}
{/* <span className="text-thin-light-gray">You will Receive :</span>*/}
{/* .29 ETH $120.56*/}
{/* </p>*/}
{/* </div>*/}
{/*</div>*/}
{/*<div className="field w-full mb-6">*/}
{/* <h1 className="field-title">Royalties</h1>*/}
{/* <div className="input-field my-2">*/}
{/* <div className="mb-2">*/}
{/* <InputCom*/}
{/* fieldClass="px-6"*/}
{/* type="text"*/}
{/* name="link"*/}
{/* inputHandler={roltsHndlr}*/}
{/* value={datas.royalties}*/}
{/* placeholder="0%"*/}
{/* />*/}
{/* </div>*/}
{/* <p className="text-thin-light-gray text-sm tracking-wide">*/}
{/* Suggested: 10%, 20%, 30%*/}
{/* </p>*/}
{/* </div>*/}
{/*</div>*/}
{/*<div className="field w-full mb-6">*/}
{/* <h1 className="field-title">*/}
{/* Properties*/}
{/* <span className="text-thin-light-gray font-normal ml-2">*/}
{/* (Optional)*/}
{/* </span>*/}
{/* </h1>*/}
{/* <div className="input-field my-2">*/}
{/* <div className="mb-2">*/}
{/* <div className="sm:flex sm:space-x-8">*/}
{/* <div className="sm:w-1/2 w-full mb-2 sm:mb-0">*/}
{/* <InputCom*/}
{/* fieldClass="px-6"*/}
{/* type="text"*/}
{/* name="link"*/}
{/* inputHandler={keyHndlr}*/}
{/* value={datas.propertiesKey}*/}
{/* placeholder="Enter key"*/}
{/* />*/}
{/* </div>*/}
{/* <div className="flex-1">*/}
{/* <InputCom*/}
{/* fieldClass="px-6"*/}
{/* type="text"*/}
{/* name="link"*/}
{/* inputHandler={valueHndlr}*/}
{/* value={datas.propertiesValue}*/}
{/* placeholder="Enter Value"*/}
{/* />*/}
{/* </div>*/}
{/* </div>*/}
{/* </div>*/}
{/* </div>*/}
{/*</div>*/}
{/*<div className="field w-full mb-6">*/}
{/* <h1 className="field-title">Choose collection</h1>*/}
{/* <div className="input-field mt-2">*/}
{/* <div className="sm:flex sm:space-x-5">*/}
{/* /!* create collection *!/*/}
{/* <div className="sm:w-[100px] h-[100px] w-full mb-2 sm:mb-0 rounded-[4px] bg-[#FAFAFA] dark:bg-[#11131F] border border-light-purple dark:border-[#5356fb29] flex justify-center items-center cursor-pointer">*/}
{/* <div>*/}
{/* <span className="mb-1 flex justify-center">*/}
{/* <svg*/}
{/* width="25"*/}
{/* height="25"*/}
{/* viewBox="0 0 25 25"*/}
{/* fill="none"*/}
{/* xmlns="http://www.w3.org/2000/svg"*/}
{/* >*/}
{/* <path*/}
{/* d="M25 12.5125C25.019 19.39 19.3853 24.9989 12.5054 25.0001C5.6017 25.0012 -0.0153836 19.3615 3.1653e-05 12.471C0.0154469 5.59949 5.63965 -0.0224583 12.5469 6.7456e-05C19.396 0.0225932 25.0297 5.61846 25 12.5125ZM14.3007 17.2097C14.3007 16.3324 14.3007 15.4551 14.3007 14.5778C14.3007 14.3525 14.3007 14.3525 14.5224 14.3525C16.2299 14.3525 17.9387 14.3525 19.6462 14.3513C19.7339 14.3513 19.8241 14.349 19.9106 14.3335C20.832 14.1711 21.4581 13.327 21.3798 12.356C21.3099 11.4775 20.4988 10.733 19.6011 10.7306C17.9031 10.7271 16.2062 10.7294 14.5082 10.7294C14.2995 10.7294 14.2995 10.7294 14.2995 10.5243C14.2995 8.7851 14.2995 7.04588 14.2983 5.30784C14.2983 5.22959 14.2983 5.15016 14.2805 5.07547C14.0588 4.16021 13.218 3.59588 12.3465 3.68599C11.3836 3.78676 10.697 4.55026 10.697 5.48212C10.697 7.14309 10.697 8.80288 10.697 10.4639C10.697 10.7555 10.7243 10.7294 10.4243 10.7294C8.79504 10.7294 7.16457 10.7401 5.5353 10.7259C4.40524 10.7152 3.60483 11.6293 3.63922 12.6216C3.67242 13.5451 4.45623 14.3513 5.37996 14.3513C7.08275 14.3513 8.78555 14.3513 10.4883 14.3513C10.697 14.3513 10.697 14.3525 10.697 14.5576C10.697 16.2387 10.697 17.9211 10.697 19.6022C10.697 19.6757 10.6935 19.7492 10.703 19.8215C10.8761 21.1256 12.2884 21.8358 13.4255 21.1719C13.9817 20.847 14.3066 20.3586 14.3018 19.684C14.2947 18.86 14.3007 18.0349 14.3007 17.2097Z"*/}
{/* fill="#374557"*/}
{/* fillOpacity="0.6"*/}
{/* />*/}
{/* </svg>*/}
{/* </span>*/}
{/* <span className="text-thin-light-gray text-center">*/}
{/* Crteate*/}
{/* </span>*/}
{/* </div>*/}
{/* </div>*/}
{/* /!* saved collection list *!/*/}
{/* <div className="sm:w-[100px] h-[100px] w-full mb-2 sm:mb-0 rounded-[4px] bg-[#FAFAFA] dark:bg-[#11131F] border-gradient flex justify-center items-center cursor-pointer">*/}
{/* <div>*/}
{/* <div className="mb-1 flex justify-center ">*/}
{/* <div className="w-[50px] h-[50px] rounded-full overflow-hidden">*/}
{/* <img*/}
{/* src={collection1}*/}
{/* alt=""*/}
{/* className="w-full h-full object-cover"*/}
{/* />*/}
{/* </div>*/}
{/* </div>*/}
{/* <span className="text-thin-light-gray text-center">*/}
{/* Name 1*/}
{/* </span>*/}
{/* </div>*/}
{/* </div>*/}
{/* <div className="sm:w-[100px] h-[100px] w-full mb-2 sm:mb-0 rounded-[4px] bg-[#FAFAFA] dark:bg-[#11131F] border border-light-purple dark:border-[#5356fb29] flex justify-center items-center cursor-pointer">*/}
{/* <div>*/}
{/* <div className="mb-1 flex justify-center ">*/}
{/* <div className="w-[50px] h-[50px] rounded-full overflow-hidden">*/}
{/* <img*/}
{/* src={collection2}*/}
{/* alt=""*/}
{/* className="w-full h-full object-cover"*/}
{/* />*/}
{/* </div>*/}
{/* </div>*/}
{/* <span className="text-thin-light-gray text-center">*/}
{/* Name 2*/}
{/* </span>*/}
{/* </div>*/}
{/* </div>*/}
{/* <div className="sm:w-[100px] h-[100px] w-full mb-2 sm:mb-0 rounded-[4px] bg-[#FAFAFA] dark:bg-[#11131F] border border-light-purple dark:border-[#5356fb29] flex justify-center items-center cursor-pointer">*/}
{/* <div>*/}
{/* <div className="mb-1 flex justify-center ">*/}
{/* <div className="w-[50px] h-[50px] rounded-full overflow-hidden">*/}
{/* <img*/}
{/* src={collection3}*/}
{/* alt=""*/}
{/* className="w-full h-full object-cover"*/}
{/* />*/}
{/* </div>*/}
{/* </div>*/}
{/* <span className="text-thin-light-gray text-center">*/}
{/* Name 3*/}
{/* </span>*/}
{/* </div>*/}
{/* </div>*/}
{/* </div>*/}
{/* </div>*/}
{/*</div>*/}
{/* unlock purchase */}
<div className="sm:flex justify-between items-center mb-5">
<div className="sm:flex sm:space-x-3 items-center mb-5 sm:mb-0">
<div className="w-[60px] h-[60px] rounded-full flex justify-center items-center bg-light-gray">
<svg
width="22"
height="28"
viewBox="0 0 22 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M10.9703 27.9959C8.44944 27.9959 5.92858 28.0078 3.40773 27.9919C1.27205 27.9799 0.0338085 26.7656 0.0196917 24.6347C-0.00450854 21.2735 -0.00854192 17.9123 0.0196917 14.5511C0.0378419 12.4521 1.3265 11.2158 3.44806 11.2118C8.42121 11.2019 13.3964 11.2039 18.3695 11.2118C20.604 11.2158 21.8564 12.4641 21.8644 14.6909C21.8745 17.9862 21.8786 21.2815 21.8644 24.5767C21.8544 26.7616 20.6242 27.9819 18.43 27.9939C15.9434 28.0058 13.4569 27.9959 10.9703 27.9959ZM8.53213 17.9722C8.61078 18.1699 8.65918 18.789 8.99193 19.0466C9.89541 19.7476 9.75424 20.6544 9.75626 21.567C9.75626 21.9984 9.62719 22.5057 9.81071 22.8412C10.0467 23.2706 10.5367 23.8358 10.9219 23.8398C11.3131 23.8438 11.8496 23.3026 12.0613 22.8752C12.261 22.4698 12.1319 21.9006 12.1319 21.4053C12.1319 20.5525 12.0936 19.7716 12.868 19.0706C13.6041 18.4036 13.4871 17.1354 12.8841 16.3086C12.2811 15.4817 11.2002 15.1262 10.2019 15.4258C9.25208 15.7114 8.54826 16.6621 8.53213 17.9722Z"
fill="black"
/>
<path
d="M18.5315 10.2691C17.3356 10.2691 16.2466 10.2691 15.0345 10.2691C15.0345 9.40439 15.0446 8.58556 15.0325 7.76473C14.9982 5.32022 13.2397 3.47086 10.9467 3.45888C8.64969 3.4469 6.88509 5.28028 6.84476 7.73677C6.83064 8.55959 6.84274 9.38441 6.84274 10.2672C5.64483 10.2672 4.55582 10.2672 3.47286 10.2672C2.71257 5.3322 4.5054 1.66744 8.75456 0.347323C13.5603 -1.14654 18.3984 2.36244 18.5274 7.34932C18.5516 8.30396 18.5315 9.26059 18.5315 10.2691Z"
fill="black"
/>
</svg>
</div>
<div>
<h1 className="text-xl font-bold text-dark-gray dark:text-white tracking-wide">
Unlock once purchased
</h1>
<p className="text-base text-thin-light-gray tracking-wide">
Unlockable content, only revealed by the owner of the item.
</p>
</div>
</div>
<div>
<SwitchCom value={datas.purchase} handler={unlckPrchesHndlr} />
</div>
</div>
{/*<div className="sm:flex justify-between items-center mb-5">*/}
{/* <div className="sm:flex sm:space-x-3 items-center mb-5 sm:mb-0">*/}
{/* <div className="w-[60px] h-[60px] rounded-full flex justify-center items-center bg-light-gray">*/}
{/* <svg*/}
{/* width="22"*/}
{/* height="28"*/}
{/* viewBox="0 0 22 28"*/}
{/* fill="none"*/}
{/* xmlns="http://www.w3.org/2000/svg"*/}
{/* >*/}
{/* <path*/}
{/* d="M10.9703 27.9959C8.44944 27.9959 5.92858 28.0078 3.40773 27.9919C1.27205 27.9799 0.0338085 26.7656 0.0196917 24.6347C-0.00450854 21.2735 -0.00854192 17.9123 0.0196917 14.5511C0.0378419 12.4521 1.3265 11.2158 3.44806 11.2118C8.42121 11.2019 13.3964 11.2039 18.3695 11.2118C20.604 11.2158 21.8564 12.4641 21.8644 14.6909C21.8745 17.9862 21.8786 21.2815 21.8644 24.5767C21.8544 26.7616 20.6242 27.9819 18.43 27.9939C15.9434 28.0058 13.4569 27.9959 10.9703 27.9959ZM8.53213 17.9722C8.61078 18.1699 8.65918 18.789 8.99193 19.0466C9.89541 19.7476 9.75424 20.6544 9.75626 21.567C9.75626 21.9984 9.62719 22.5057 9.81071 22.8412C10.0467 23.2706 10.5367 23.8358 10.9219 23.8398C11.3131 23.8438 11.8496 23.3026 12.0613 22.8752C12.261 22.4698 12.1319 21.9006 12.1319 21.4053C12.1319 20.5525 12.0936 19.7716 12.868 19.0706C13.6041 18.4036 13.4871 17.1354 12.8841 16.3086C12.2811 15.4817 11.2002 15.1262 10.2019 15.4258C9.25208 15.7114 8.54826 16.6621 8.53213 17.9722Z"*/}
{/* fill="black"*/}
{/* />*/}
{/* <path*/}
{/* d="M18.5315 10.2691C17.3356 10.2691 16.2466 10.2691 15.0345 10.2691C15.0345 9.40439 15.0446 8.58556 15.0325 7.76473C14.9982 5.32022 13.2397 3.47086 10.9467 3.45888C8.64969 3.4469 6.88509 5.28028 6.84476 7.73677C6.83064 8.55959 6.84274 9.38441 6.84274 10.2672C5.64483 10.2672 4.55582 10.2672 3.47286 10.2672C2.71257 5.3322 4.5054 1.66744 8.75456 0.347323C13.5603 -1.14654 18.3984 2.36244 18.5274 7.34932C18.5516 8.30396 18.5315 9.26059 18.5315 10.2691Z"*/}
{/* fill="black"*/}
{/* />*/}
{/* </svg>*/}
{/* </div>*/}
{/* <div>*/}
{/* <h1 className="text-xl font-bold text-dark-gray dark:text-white tracking-wide">*/}
{/* Unlock once purchased*/}
{/* </h1>*/}
{/* <p className="text-base text-thin-light-gray tracking-wide">*/}
{/* Unlockable content, only revealed by the owner of the item.*/}
{/* </p>*/}
{/* </div>*/}
{/* </div>*/}
{/* <div>*/}
{/* <SwitchCom value={datas.purchase} handler={unlckPrchesHndlr} />*/}
{/* </div>*/}
{/*</div>*/}
</form>
</div>
</div>
+160 -21
View File
@@ -5,8 +5,15 @@ import ModalCom from "../Helpers/ModalCom";
import Layout from "../Partials/Layout";
// import DropFileWidget from "./DropFileWidget";
import ProductUploadField from "./ProductUploadField";
import LoadingSpinner from "../Spinners/LoadingSpinner";
import usersService from "../../services/UsersService";
import { useNavigate } from "react-router-dom";
export default function UploadProduct({uploadTypes}) {
const apiCall = new usersService()
const [requestStatus, setRequestStatus] = useState({loading: false, status: null, message: ''}) // DETERMINES THE STATUS OF UPLOAD
const navigate = useNavigate()
export default function UploadProduct() {
// preview modal
const [previewProductModal, setPreviewProductModal] = useState(false);
// cancelUploadModal
@@ -68,10 +75,14 @@ export default function UploadProduct() {
};
const fileSelect = useRef(null);
const fileRef = useRef(null);
const [selectedFile, setSelectedFile] = useState("");
const [selectedFile, setSelectedFile] = useState('');
// const [selectedFile, setSelectedFile] = useState({name: '', size: ''});
const [img, setImg] = useState(null);
const [imgDetails, setImgDetails] = useState('')
const changeFile = (e, file) => {
if (e) {
setSelectedFile(e.target.files[0].name);
setImgDetails(e?.target?.files[0])
const imgRead = new FileReader();
imgRead.onload = (event) => {
setImg(event.target.result);
@@ -79,9 +90,10 @@ export default function UploadProduct() {
// most importend
imgRead.readAsDataURL(e.target.files[0]);
}
if (file) {
if (file?.length) {
if (file[0].name) {
setSelectedFile(file[0].name);
setSelectedFile(file?.[0].name);
setImgDetails(file?.[0])
const imgRead = new FileReader();
imgRead.onload = (event) => {
setImg(event.target.result);
@@ -92,6 +104,85 @@ export default function UploadProduct() {
}
};
//FUNCTION TO UPLOAD ITEM
const uploadItem = () => {
let errorArr = []
let uploadInfo = { // SUBMITTED DETAILS FROM USER
img,
itemName,
description
}
//LOOPS THROUGH ITEM DETAILS FOR EMPTINESS
for(let info in uploadInfo){
if(!uploadInfo[info]){
errorArr.push(info)
}
}
// TEST TO SEE IF FIELDS ARE EMPTY
if(errorArr.length){
let message = ''
if(errorArr.length == 1 && errorArr.includes('img')){
message='Please select file to upload'
}else if (errorArr.length == 1 && !errorArr.includes('img')){
message='Item name or description cannot be empty'
}else if (errorArr.length > 1 && errorArr.includes('img')){
message='Please select file to upload & Item name/description cannot be empty'
}else {
message='Item name/description cannot be empty'
}
setRequestStatus({loading: false, status: null, message})
return setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
},5000)
}
let reqData = { // PAYLOAD FOR API CALL
file_name: selectedFile.substring(0,21).replace(/ /gi, ""),//selectedFile.replace(/[ -]/gi, ""),
file_size: imgDetails.size,
file_type: imgDetails.type,
file_data: img,
title: itemName,
description: description,
msg_type: 'FILE',
// action: 'WRENCHBOARD_RESOURCE_MYFILES',
action: 11307
}
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
apiCall.sendFiles(reqData).then(res=>{
if(res.status != 200 || res.data.internal_return < 0){
return setRequestStatus({loading: false, status: false, message: 'Something went wrong, try again'})
}
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
function handleDrop(e) {
const dt = e.dataTransfer;
@@ -157,6 +248,7 @@ export default function UploadProduct() {
setPurchase(false);
cancelUploadModalHandler();
setImg(null);
navigate('/resources', {state:{tab:'created'}})
};
return (
<>
@@ -167,7 +259,7 @@ export default function UploadProduct() {
{/* heading */}
<div className="mb-6">
<h1 className="text-26 font-bold text-dark-gray dark:text-white">
Create new item
{requestStatus.status == null ? 'Create new item' : 'Upload new item'}
</h1>
</div>
{/**
@@ -178,11 +270,18 @@ export default function UploadProduct() {
{/* section-heading */}
<div className="section-heading w-full mb-5 lg:px-9 px-4 lg:pt-9 pt-5 ">
<h1 className="text-dark-gray dark:text-white lg:text-26 text-18 font-bold tracking-wide mb-1">
Image,Video,Audio or 3D Model
Image,Video,Audio or Documents
</h1>
<p className="text-thin-light-gray text-base tracking-wide font-medium">
File types suppported: JPG, PNG, GIP, SVG, MP4, MP3, WEBM,
OGG, GLB, GLTF. Max Size : 100 MB
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">
@@ -289,7 +388,8 @@ export default function UploadProduct() {
</div>
</div>
{/* bottom action */}
<div className="w-full h-[120px] bg-red border-t border-light-purple dark:border-[#5356fb29] flex justify-end items-center">
<div className="w-full h-[120px] bg-red border-t border-light-purple dark:border-[#5356fb29] flex justify-between items-center">
<p className={`px-4 text-sm sm:text-lg ${requestStatus.status ? 'text-green-500' : 'text-red-500'} tracking-wide`}>{requestStatus.message && requestStatus.message}</p>
<div className="flex sm:space-x-4 space-x-2 sm:mr-9 mr-2">
<button
type="button"
@@ -298,22 +398,27 @@ export default function UploadProduct() {
>
<span className="border-b dark:border-[#5356fb29] border-light-red">
{" "}
Cancel
{requestStatus.status == null ? 'Cancel' : 'Return'}
</span>
</button>
{/*<button*/}
{/* onClick={() => previewUploadProduct(data)}*/}
{/* type="button"*/}
{/* className="sm:w-[126px] h-[46px] w-[100px] flex justify-center items-center border-gradient sm:text-18 text-sm rounded-full text-back"*/}
{/*>*/}
{/* <span className="text-gradient"> Preview</span>*/}
{/*</button>*/}
{requestStatus.loading ?
<LoadingSpinner size='8' color='sky-blue' />
:
<button
onClick={() => previewUploadProduct(data)}
type="button"
className="sm:w-[126px] h-[46px] w-[100px] flex justify-center items-center border-gradient sm:text-18 text-sm rounded-full text-back"
>
<span className="text-gradient"> Preview</span>
</button>
<Link
to="/"
// to="/"
onClick={uploadItem}
className="sm:w-[126px] h-[46px] w-[100px] flex justify-center items-center btn-gradient sm:text-18 text-sm rounded-full text-white"
>
Create Now
</Link>
Upload
</button>
}
</div>
</div>
@@ -327,7 +432,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>
@@ -473,3 +578,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
}
}
@@ -42,18 +42,18 @@ function PendingJobsPopout({ details, onClose, situation }) {
setPendingJobLoader({ extend: true });
apiCall.pendingJobExtend(reqData).then(res => {
setRequestMessage({status: true, message: res.data.status})
dispatch(tableReload({ type: "PENDINGTABLE" }));
setTimeout(() => {
setPendingJobLoader({ extend: false, offer: false });
setRequestMessage({status: false, message: ''})
onClose();
}, 2700);
dispatch(tableReload({ type: "PENDINGTABLE" }));
}, 4000);
}).catch(error => {
setRequestMessage({status: false, message:'Try Again'})
setTimeout(() => {
setPendingJobLoader({ extend: false, offer: false });
setRequestMessage({status: false, message: ''})
}, 2700);
}, 3000);
})
}else if(name=='offer'){ // RUNS THIS IF JOB IS SENT TO USER
reqData = { ...pendingData };
@@ -63,13 +63,13 @@ function PendingJobsPopout({ details, onClose, situation }) {
setTimeout(() => {
setPendingJobLoader({ extend: false, offer: false });
setRequestMessage({status: false, message: ''})
}, 2700);
}, 4000);
}).catch(error => {
setRequestMessage('Try Again')
setTimeout(() => {
setPendingJobLoader({ extend: false, offer: false });
setRequestMessage({status: false, message: ''})
}, 2700);
}, 3000);
})
} else return
// try {
+1 -1
View File
@@ -303,7 +303,7 @@ input[type="text"][dir="rtl"] {
.sidebar-logo.enter {
transform: scale(1);
width: 100%;
width: 80%;
}
.sidebar-logo {
transform: scale(0);
+9
View File
@@ -0,0 +1,9 @@
export default function EmailValidator(email) {
let regEx = /^[^0-9][a-zA-Z0-9._%+-]+@[a-zA-Z]+(\.[a-zA-Z]+)+$/;
if (regEx.test(email) == false) {
return false
}else{
return true
}
}
+9
View File
@@ -0,0 +1,9 @@
export default function PasswordValidator(password) {
const regEx = /^[a-zA-Z0-9!@#$%^&*()_+{}\[\]:;<>,.?~\\/\-='"`|]+$/;
if (/[!@#$%^&*()_+{}\[\]:;<>,.?~\\/\-='"`|]/.test(password) == false || /[0-9]/.test(password)==false || /[A-Z]/.test(password)==false || /[a-z]/.test(password)==false) {
return false
}else{
return true
}
}
+69 -58
View File
@@ -86,6 +86,18 @@ class usersService {
return this.postAuxEnd("/loadprofile", null);
}
getUploadedList() {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
page: 1,
limit: 20,
action: 11309,
};
return this.postAuxEnd("/myfiles", postData);
}
getOffersList() {
var postData = {
uuid: localStorage.getItem("uid"),
@@ -226,7 +238,7 @@ class usersService {
return this.postAuxEnd("/sendmoneyfee", postData);
}
// Start Credit for Cards
// Start Credit for Cards
getStartCredit(value) {
var postData = {
uid: localStorage.getItem("uid"),
@@ -577,7 +589,7 @@ class usersService {
return this.postAuxEnd("/familymanage", postData);
}
// END POINT CALL FOR ACCOUNT TOP
// END POINT CALL FOR ACCOUNT TOP
startTopUp(post) {
alert("WHY ARE WE CALLING THIS ?");
// var postData = {
@@ -591,7 +603,6 @@ class usersService {
// return this.postAuxEnd("/starttopup", postData);
}
resultTopUp(post) {
var postData = {
uid: localStorage.getItem("uid"),
@@ -600,7 +611,7 @@ class usersService {
action: 11061,
...post,
};
console.log("topupresult",postData);
console.log("topupresult", postData);
return this.postAuxEnd("/topupresult", postData);
}
@@ -972,64 +983,64 @@ class usersService {
return this.postAuxEnd("/familysuggestlist", postData);
}
// FUNCTION TO CHANGE PROFILE PASSWORD
profilePassChange(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 11005,
...reqData,
};
return this.postAuxEnd("/profilepasschange", postData);
}
// FUNCTION TO CHANGE PROFILE PASSWORD
profilePassChange(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 11005,
...reqData,
};
return this.postAuxEnd("/profilepasschange", postData);
}
// FUNCTION TO GET ACCOUNT SETTINGS
getAccSettings() {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 11059,
};
return this.postAuxEnd("/getaccsettings", postData);
}
// FUNCTION TO GET ACCOUNT SETTINGS
getAccSettings() {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 11059,
};
return this.postAuxEnd("/getaccsettings", postData);
}
// FUNCTION TO SET ACCOUNT SETTINGS
setAccSettings(reqdata) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 11058,
...reqdata,
};
return this.postAuxEnd("/setaccsettings", postData);
}
// FUNCTION TO SET ACCOUNT SETTINGS
setAccSettings(reqdata) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 11058,
...reqdata,
};
return this.postAuxEnd("/setaccsettings", postData);
}
// FUNCTION TO DELETE PAY CARD
payRemCard(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 11057,
...reqData,
};
return this.postAuxEnd("/payremcard", postData);
}
// FUNCTION TO DELETE PAY CARD
payRemCard(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 11057,
...reqData,
};
return this.postAuxEnd("/payremcard", postData);
}
// FUNCTION TO GET SINGLE BLOG ITEM
getSingleBlogData(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
limit: 4,
...reqData,
};
return this.postAuxEnd("/blogdata", postData);
}
// FUNCTION TO GET SINGLE BLOG ITEM
getSingleBlogData(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
limit: 4,
...reqData,
};
return this.postAuxEnd("/blogdata", postData);
}
/*
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username)
+4
View File
@@ -7,6 +7,7 @@ const initialState = {
othersInterestedTable: false,
couponTable: false,
walletTable: false,
uploadsTable: false,
};
export const tableReloadSlice = createSlice({
@@ -33,6 +34,9 @@ export const tableReloadSlice = createSlice({
case "WALLETTABLE":
state.walletTable = !state.walletTable;
return;
case "UPLOADSTABLE":
state.uploadsTable = !state.uploadsTable;
return;
default:
return state;
}
+1 -2
View File
@@ -7,12 +7,11 @@ export default function MyPendingJobsPage() {
let { commonHeadBanner } = useSelector((state) => state.commonHeadBanner);
let { pendingListTable } = useSelector((state) => state.tableReload);
console.log('TESTING', pendingListTable)
const [MyJobList, setMyJobList] = useState({loading: true, data: []});
const api = new usersService();
const getMyJobList = async () => {
setMyJobList({loading: true, data: []});
try {
const res = await api.getMyPendingJobList();
setMyJobList({loading: false, data: res.data});
+3 -1
View File
@@ -1,7 +1,9 @@
import React, { useState, useEffect } from "react";
import Resources from "../components/Resources";
import usersService from "../services/UsersService";
import { useLocation } from "react-router-dom";
export default function ResourcePage() {
const {state, pathname} = useLocation() // CHECKS IF THERE IS AN ACTIVE TAB WITH LINK BACK TO RESOURCES
const [MyResourceData, setMyResourceData] = useState([]);
const api = new usersService();
@@ -17,5 +19,5 @@ export default function ResourcePage() {
getMyResourceData();
}, []);
return <Resources MyResourceData={MyResourceData} />;
return <Resources MyResourceData={MyResourceData} activeTab={state ? state.tab : ''} />;
}
+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} />;
}