Compare commits

...

35 Commits

Author SHA1 Message Date
victorAnumudu ffc6a23ac5 consumed sendtaskmessage and activejobmsglist APIs in manage active job list page 2023-05-19 10:10:35 +01:00
ameye ed7bd861de Merge branch 'edit-job' of WrenchBoard/Users-Wrench into master 2023-05-19 00:23:04 +00:00
Ebube 4f107df131 Merge branch 'master' into edit-job 2023-05-19 01:16:43 +01:00
ameye f64cdcb316 Merge branch 'user-country-display' of WrenchBoard/Users-Wrench into master 2023-05-19 00:07:16 +00:00
Ebube 7998eaf52d implemented api and fixed interface bug 2023-05-19 00:11:44 +01:00
CHIEFSOFT\ameye 2ac82ee20b Layout change 2023-05-18 17:14:56 -04:00
victorAnumudu f5575ecce5 disabled user country 2023-05-18 16:33:18 +01:00
victorAnumudu b5b95a9040 duplicate info removed 2023-05-18 16:15:37 +01:00
victorAnumudu 24f3a40a43 Only returns User Country as Default Country in Add Job Page 2023-05-18 16:12:14 +01:00
ameye 6803059ee5 Merge branch 'edit-job' of WrenchBoard/Users-Wrench into master 2023-05-18 10:52:39 +00:00
ameye 9d6533167a Merge branch 'text-underline' of WrenchBoard/Users-Wrench into master 2023-05-18 10:52:02 +00:00
Ebube 89399aa29a done with layout, needs an api 2023-05-18 10:22:34 +01:00
victorAnumudu a4236aeb5a paragraph text underlined 2023-05-17 22:24:16 +01:00
ameye 9ccac4b0aa Merge branch 'task-layout' of WrenchBoard/Users-Wrench into master 2023-05-17 08:03:44 +00:00
ameye 4b2f9d6e22 Merge branch 'sidemenu-bug-fix' of WrenchBoard/Users-Wrench into master 2023-05-17 08:02:50 +00:00
victorAnumudu 87523beba9 Side bar Menu Close Bug Fixed 2023-05-17 05:05:27 +01:00
Ebube 5a37352c53 Merge branch 'master' of https://gitlab.chiefsoft.net/WrenchBoard/Users-Wrench into task-layout 2023-05-17 00:21:05 +01:00
Ebube 0c21f953ee Called the api and structured the component 2023-05-17 00:20:41 +01:00
CHIEFSOFT\ameye 448c1c69ba active job message 2023-05-16 19:03:39 -04:00
ameye b535326c51 Merge branch 'centering-btn' of WrenchBoard/Users-Wrench into master 2023-05-16 19:40:51 +00:00
ameye dad2b6781e Merge branch 'task-layout' of WrenchBoard/Users-Wrench into master 2023-05-16 19:40:45 +00:00
victorAnumudu 3cb0604e81 Button centered 2023-05-16 17:58:14 +01:00
Ebube 73a21a2367 added for mobile 2023-05-16 17:25:08 +01:00
Ebube 8716b16a70 Implented zero state for market bubble 2023-05-16 17:22:08 +01:00
tokslaw 3290fce6da Merge branch 'manage-active-jobs' of WrenchBoard/Users-Wrench into master 2023-05-16 14:11:59 +00:00
victorAnumudu 21e4221301 unused snippet of code cleaned up 2023-05-16 15:06:05 +01:00
victorAnumudu d9f1771045 'Merge master with branch` 2023-05-16 15:00:11 +01:00
victorAnumudu 119dfcde06 active jobs page implementation 2023-05-16 14:53:57 +01:00
CHIEFSOFT\ameye f6e37d0f14 My Task page 2023-05-16 06:45:53 -04:00
ameye 3b1dc859e0 Merge branch 'transfer-fund-page' of WrenchBoard/Users-Wrench into master 2023-05-16 10:33:00 +00:00
ameye a45d21cd2d Merge branch 'edit-delete-btn-position' of WrenchBoard/Users-Wrench into master 2023-05-16 10:32:51 +00:00
ameye 1774d07980 Merge branch 'broken-link' of WrenchBoard/Users-Wrench into master 2023-05-16 10:32:02 +00:00
Ebube 69ec1e3766 Merge branch 'master' of https://gitlab.chiefsoft.net/WrenchBoard/Users-Wrench into transfer-fund-page 2023-05-16 00:59:34 +01:00
Ebube 7e0f19212f manage pop up 2023-05-16 00:58:43 +01:00
victorAnumudu 5fd3940911 Fixed broken link on active job view button 2023-05-15 21:39:07 +01:00
26 changed files with 2549 additions and 2499 deletions
+2
View File
@@ -36,6 +36,7 @@ import FamilyAccPage from "./views/FamilyAccPage";
import StartJob from "./components/MyJobs/StartJob"; import StartJob from "./components/MyJobs/StartJob";
import AddJobPage from "./views/AddJobPage"; import AddJobPage from "./views/AddJobPage";
import MyPendingJobsPage from "./views/MyPendingJobsPage"; import MyPendingJobsPage from "./views/MyPendingJobsPage";
import ManageActiveJobs from "./views/ManageActiveJobs";
export default function Routers() { export default function Routers() {
return ( return (
@@ -83,6 +84,7 @@ export default function Routers() {
<Route exact path="/my-pending-jobs" element={<MyPendingJobsPage />} /> <Route exact path="/my-pending-jobs" element={<MyPendingJobsPage />} />
<Route exact path="/acc-family" element={<FamilyAccPage />} /> <Route exact path="/acc-family" element={<FamilyAccPage />} />
<Route exact path="/start-job" element={<StartJob />} /> <Route exact path="/start-job" element={<StartJob />} />
<Route exact path="/manage-active-job" element={<ManageActiveJobs />} />
<Route <Route
exact exact
path="/my-collection/collection-item" path="/my-collection/collection-item"
+373 -326
View File
@@ -1,351 +1,398 @@
import React, {useState, useEffect} from 'react' import React, { useState, useEffect } from "react";
import { Link, useNavigate } from 'react-router-dom'; import { Link, useNavigate } from "react-router-dom";
import InputCom from '../Helpers/Inputs/InputCom'; import InputCom from "../Helpers/Inputs/InputCom";
import LoadingSpinner from '../Spinners/LoadingSpinner'; import LoadingSpinner from "../Spinners/LoadingSpinner";
import usersService from '../../services/UsersService'; import usersService from "../../services/UsersService";
import { useSelector } from "react-redux";
import { Form, Formik } from "formik"; import { Form, Formik } from "formik";
import * as Yup from "yup"; import * as Yup from "yup";
const validationSchema = Yup.object().shape({ const validationSchema = Yup.object().shape({
country: Yup.string() country: Yup.string()
.min(1, "Minimum 3 characters") .min(1, "Minimum 3 characters")
.max(25, "Maximum 25 characters") .max(25, "Maximum 25 characters")
.required("Country is required"), .required("Country is required"),
price: Yup.number() price: Yup.number()
.typeError("you must specify a number")
.min(1, "Price must be greater than 0")
.required("Price is required"),
title: Yup.string()
.min(3, "Minimum 3 characters")
.max(100, "Maximum 25 characters")
.required("Title is required"),
description: Yup.string()
.min(3, "Minimum 3 characters")
.max(250, "Maximum 250 characters")
.required("Description is required"),
job_detail: Yup.string()
.min(3, "Minimum 3 characters")
.max(250, "Maximum 250 characters")
.required("Details is required"),
timeline_days: Yup.number()
.typeError("you must specify a number") .typeError("you must specify a number")
.min(1, "Price must be greater than 0") .min(1, "Price must be greater than 0")
.required("Price is required"), .required("Price is required"),
}); title: Yup.string()
.min(3, "Minimum 3 characters")
.max(100, "Maximum 25 characters")
.required("Title is required"),
description: Yup.string()
.min(3, "Minimum 3 characters")
.max(250, "Maximum 250 characters")
.required("Description is required"),
job_detail: Yup.string()
.min(3, "Minimum 3 characters")
.max(250, "Maximum 250 characters")
.required("Details is required"),
timeline_days: Yup.number()
.typeError("you must specify a number")
.min(1, "Price must be greater than 0")
.required("Timeline is required"),
});
let initialValues = { // initial values for formik // let initialValues = {
country: '', // // initial values for formik
price: 0, // country: "NG",
title: '', // price: 0,
description: '', // title: "",
job_detail: '', // description: "",
timeline_days: '' // job_detail: "",
} // timeline_days: "",
// };
function AddJob() { function AddJob() {
const ApiCall = new usersService() const ApiCall = new usersService();
const navigate = useNavigate() const navigate = useNavigate();
let [pageLoading, setPageLoading] = useState(true) // State used for knowing when the page is mounting let {userDetails} = useSelector((state)=> state.userDetails)
let [country, setCountry] = useState({loading: false, status: false, data:[]}) // To Hold the array of country getUserCountry returns let [pageLoading, setPageLoading] = useState(true); // State used for knowing when the page is mounting
let [requestStatus, setRequestStatus] = useState({loading: false, status: false, message:''}) // Holds state when submit button is pressed let [country, setCountry] = useState({
loading: true,
status: false,
data: [],
}); // To Hold the array of country getUserCountry returns
// FUNCTION TO GET COUNTRY let initialValues = {
const getUserCountry = () =>{ // initial values for formik
setCountry(prev => ({...prev, loading:true})) country: userDetails.country,
ApiCall.getSignupCountryData().then(res => { price: "",
if(res.data.internal_return < 1){ title: "",
setCountry({loading: false, status: true, data:[]}) description: "",
return job_detail: "",
} timeline_days: "",
setCountry({loading: false, status: true, data:res.data.signup_country}) };
}).catch(err => {
setCountry({loading: false, status: false, data:[]})
})
}
// FUNCTION TO HANDLE ADD JOB FORM let [requestStatus, setRequestStatus] = useState({
const handleAddJob = (values, helpers) => { loading: false,
setRequestStatus({loading: true, status: false, message:''}) status: false,
ApiCall.jobManagerCreateJob(values).then(res => { message: "",
if(res.data.internal_return < 1){ }); // Holds state when submit button is pressed
setRequestStatus({loading: false, status: false, message:'Could not complete your request at the moment'})
return
}
setRequestStatus({loading: false, status: true, message:'Job Added Successfully'})
setTimeout(()=>{
navigate('/myjobs', {replace: true})
},1000)
}).catch(err => { // FUNCTION TO GET COUNTRY
setRequestStatus({loading: false, status: false, message:'Opps! soemthing went wrong. Try Again'}) const getUserCountry = () => {
}).finally(()=>{ setCountry((prev) => ({ ...prev, loading: true }));
setTimeout(()=>{ ApiCall.getSignupCountryData()
setRequestStatus({loading: false, status: false, message:''}) .then((res) => {
}, 5000) if (res.data.internal_return < 1) {
}) setCountry({ loading: false, status: true, data: [] });
} return;
}
setCountry({
loading: false,
status: true,
data: res.data.signup_country,
});
})
.catch((err) => {
setCountry({ loading: false, status: false, data: [] });
});
};
useEffect(()=>{ // FUNCTION TO HANDLE ADD JOB FORM
setPageLoading(false) const handleAddJob = (values, helpers) => {
getUserCountry() setRequestStatus({ loading: true, status: false, message: "" });
},[]) ApiCall.jobManagerCreateJob(values)
.then((res) => {
if (res.data.internal_return < 1) {
setRequestStatus({
loading: false,
status: false,
message: "Could not complete your request at the moment",
});
return;
}
setRequestStatus({
loading: false,
status: true,
message: "Job Added Successfully",
});
setTimeout(() => {
navigate("/myjobs", { replace: true });
}, 1000);
})
.catch((err) => {
setRequestStatus({
loading: false,
status: false,
message: "Opps! soemthing went wrong. Try Again",
});
})
.finally(() => {
setTimeout(() => {
setRequestStatus({ loading: false, status: false, message: "" });
}, 5000);
});
};
return pageLoading.loading ? ( useEffect(() => {
<div className="personal-info-tab w-full flex flex-col justify-between"> getUserCountry();
<div className="p-3"> setPageLoading(false);
<LoadingSpinner size="32" color="sky-blue" /> }, []);
</div>
</div>
) : (
<div className="add-job p-5 w-full bg-white rounded-md flex flex-col justify-between">
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={handleAddJob}
>
{(props) => {
return (
<Form>
<h1 className='py-2 my-4 text-lg md:text-xl font-bold tracking-wide'>Create New Job</h1>
<div className="flex flex-col-reverse sm:flex-row">
<div className="fields w-full">
{/* inputs starts here */} return pageLoading.loading ? (
{/* country */} <div className="personal-info-tab w-full flex flex-col justify-between">
<div className="xl:flex xl:space-x-7 mb-6"> <div className="p-3">
<div className="field w-full mb-6 xl:mb-0"> <LoadingSpinner size="32" color="sky-blue" />
{/* <InputCom </div>
fieldClass="px-6" </div>
label="Country" ) : (
labelClass='tracking-wide' <div className="add-job p-5 w-full bg-white rounded-md flex flex-col justify-between">
inputBg = 'bg-slate-100' <Formik
type="text" initialValues={initialValues}
name="country" validationSchema={validationSchema}
// placeholder="Select Country" onSubmit={handleAddJob}
value={props.values.country} >
inputHandler={props.handleChange} {(props) => {
/> */} return (
<label <Form>
htmlFor='country' <h1 className="py-2 my-4 text-lg md:text-xl font-bold tracking-wide">
className="input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold block"> Create New Job
Country </h1>
</label> <div className="flex flex-col-reverse sm:flex-row">
<select <div className="fields w-full">
id='country' {/* inputs starts here */}
name='country' {/* country */}
value={props.values.country} <div className="xl:flex xl:space-x-7 mb-6">
className={`input-field p-2 mt-3 rounded-md placeholder:text-base text-dark-gray dark:text-white w-full h-10 bg-slate-100 dark:bg-[#11131F] focus:ring-0 focus:outline-none`} <div className="field w-full mb-6 xl:mb-0">
onChange={props.handleChange} {/* <InputCom
onBlur={props.handleBlur} fieldClass="px-6 cursor-not-allowed"
> label="Country"
{country.loading ? ( labelClass='tracking-wide'
<option className="text-slate-500 text-lg" value=""> inputBg = 'bg-slate-100'
Loading... type="text"
</option> name="country"
) : country.data.length ? ( disable={true}
<> value={country.loading ? 'loading' : country.data ? country.data : 'no country found!'}
<option className="text-slate-500 text-lg" value=""> inputHandler={(e)=> setCountry((prev) => ({...prev, data:e.target.value}))}
Select...
</option>
{country.data.map((item, index) => (
<option
key={index}
className="text-slate-500 text-lg"
value={item[0]}
>
{item[1]}
</option>
))}
</>
) : (
<option className="text-slate-500 text-lg" value="">
No Options Found! Try Again
</option>
)}
</select>
{props.errors.country && props.touched.country && (
<p className="text-sm text-red-500">
{props.errors.country}
</p>
)}
</div>
{/* Price */} /> */}
<div className="field w-full"> <label
<InputCom htmlFor="country"
fieldClass="px-6" className="input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold block"
label="Price" >
labelClass='tracking-wide' Country
inputBg = 'bg-slate-100' </label>
type="number" <select
name="price" id="country"
fieldClass='text-right' name="country"
// placeholder="Please Enter Amount" disabled
value={props.values.price} value={props.values.country}
inputHandler={props.handleChange} className={`input-field p-2 mt-3 rounded-md placeholder:text-base text-dark-gray dark:text-white w-full h-10 bg-slate-100 dark:bg-[#11131F] focus:ring-0 focus:outline-none`}
blurHandler={props.handleBlur} onChange={props.handleChange}
/> onBlur={props.handleBlur}
{props.errors.price && props.touched.price && ( >
<p className="text-sm text-red-500"> {country.loading ? (
{props.errors.price} <option className="text-slate-500 text-lg" value="">
</p> Loading...
)} </option>
</div> ) : country.data.length ? (
</div> <>
<option className="text-slate-500 text-lg" value="">
{/* Title */} Select...
</option>
<div className="field w-full mb-6"> {country.data.map((item, index) => {
<InputCom if(item[0] == userDetails.country){
fieldClass="px-6" return (
label="Title" <option
labelClass='tracking-wide' key={index}
inputBg = 'bg-slate-100' className="text-slate-500 text-lg"
type="text" value={item[0]}
name="title" >
// placeholder="Enter Job Title" {item[1]}
value={props.values.title} </option>
inputHandler={props.handleChange} )
blurHandler={props.handleBlur} }
/> })}
{props.errors.title && props.touched.title && ( </>
<p className="text-sm text-red-500"> ) : (
{props.errors.title} <option className="text-slate-500 text-lg" value="">
</p> No Options Found! Try Again
)} </option>
</div>
{/* Description */}
<div className="field w-full mb-6">
<InputCom
fieldClass="px-6"
label="Description"
labelClass='tracking-wide'
inputBg = 'bg-slate-100'
type="text"
name="description"
// placeholder="Enter a description"
value={props.values.description}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.description && props.touched.description && (
<p className="text-sm text-red-500">
{props.errors.description}
</p>
)}
</div>
{/* Details */}
<div className="field w-full mb-6">
{/* <InputCom
fieldClass="px-6"
label="Job Delivery Details"
labelClass='tracking-wide'
inputBg = 'bg-slate-100'
type="text"
name="details"
// placeholder="Please Enter Detail Description of Job"
value={props.values.details}
inputHandler={props.handleChange}
/> */}
<label
htmlFor="Job Delivery Details"
className='className="input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold block"'>
Job Delivery Details
</label>
<textarea name="details" id="Job Delivery Details" rows="7"
className={`input-field p-6 mt-3 rounded-md placeholder:text-base text-dark-gray dark:text-white w-full h-full bg-slate-100 dark:bg-[#11131F] focus:ring-0 focus:outline-none`}
style={{resize:'none'}}
name='job_detail'
value={props.values.job_detail}
onChange={props.handleChange}
onBlur={props.handleBlur}
/>
{props.errors.job_detail && props.touched.job_detail && (
<p className="text-sm text-red-500">
{props.errors.job_detail}
</p>
)}
</div>
<div className="field w-full mb-6">
<InputCom
fieldClass="px-6"
label="Timeline"
labelClass='tracking-wide'
inputBg = 'bg-slate-100'
type="text"
name="timeline_days"
spanTag = ' - Expected duration of this task'
// placeholder="Please Enter Detail Description of Job"
value={props.values.timeline_days}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.timeline_days && props.touched.timeline_days && (
<p className="text-sm text-red-500">
{props.errors.timeline_days}
</p>
)}
</div>
{/* inputs ends here */}
</div>
</div>
{/* ERROR DISPLAY AND SUBMIT BUTTON */}
<div className="content-footer w-full">
{/* error or success display */}
{requestStatus.message != "" && (
!requestStatus.status ?
(<div className={`relative p-4 my-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}>
{requestStatus.message}
</div>)
:
requestStatus.status &&
(<div className={`relative p-4 my-4 text-green-700 bg-slate-200 border-slate-800 mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}>
{requestStatus.message}
</div>
)
)} )}
{/* End of error or success display */} </select>
{props.errors.country && props.touched.country && (
<div className="w-full h-[120px] border-t border-light-purple dark:border-[#5356fb29] flex justify-end items-center"> <p className="text-sm text-red-500">
<div className="flex items-center space-x-4 mr-9"> {props.errors.country}
<Link </p>
to="/myjobs" )}
className="text-18 text-light-red tracking-wide "
>
<span className="border-b dark:border-[#5356fb29] border-light-red">
{" "}
Cancel
</span>
</Link>
{requestStatus.loading ? (
<LoadingSpinner size="8" color="sky-blue" />
) : (
<button
type="submit"
className="w-[152px] h-[46px] flex justify-center items-center btn-gradient text-base rounded-full text-white"
// className='w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white'
>
Add Job
</button>
)}
</div>
</div>
</div> </div>
</Form>
); {/* Price */}
}} <div className="field w-full">
</Formik> <InputCom
</div> fieldClass="px-6 text-right"
) label="Price"
labelClass="tracking-wide"
inputBg="bg-slate-100"
type="number"
name="price"
placeholder="0"
value={props.values.price}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.price && props.touched.price && (
<p className="text-sm text-red-500">
{props.errors.price}
</p>
)}
</div>
</div>
{/* Title */}
<div className="field w-full mb-6">
<InputCom
fieldClass="px-6"
label="Title"
labelClass="tracking-wide"
inputBg="bg-slate-100"
type="text"
name="title"
// placeholder="Enter Job Title"
value={props.values.title}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.title && props.touched.title && (
<p className="text-sm text-red-500">
{props.errors.title}
</p>
)}
</div>
{/* Description */}
<div className="field w-full mb-6">
<InputCom
fieldClass="px-6"
label="Description"
labelClass="tracking-wide"
inputBg="bg-slate-100"
type="text"
name="description"
// placeholder="Enter a description"
value={props.values.description}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.description && props.touched.description && (
<p className="text-sm text-red-500">
{props.errors.description}
</p>
)}
</div>
{/* Details */}
<div className="field w-full mb-6">
<label
htmlFor="Job Delivery Details"
className='className="input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold block"'
>
Job Delivery Details
</label>
<textarea
id="Job Delivery Details"
rows="7"
className={`input-field p-6 mt-3 rounded-md placeholder:text-base text-dark-gray dark:text-white w-full h-full bg-slate-100 dark:bg-[#11131F] focus:ring-0 focus:outline-none`}
style={{ resize: "none" }}
name="job_detail"
value={props.values.job_detail}
onChange={props.handleChange}
onBlur={props.handleBlur}
/>
{props.errors.job_detail && props.touched.job_detail && (
<p className="text-sm text-red-500">
{props.errors.job_detail}
</p>
)}
</div>
<div className="field w-full mb-6">
<InputCom
fieldClass="px-6"
label="Timeline"
labelClass="tracking-wide"
inputBg="bg-slate-100"
type="text"
name="timeline_days"
spanTag=" - Expected duration of this task"
// placeholder="Please Enter Detail Description of Job"
value={props.values.timeline_days}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.timeline_days &&
props.touched.timeline_days && (
<p className="text-sm text-red-500">
{props.errors.timeline_days}
</p>
)}
</div>
{/* inputs ends here */}
</div>
</div>
{/* ERROR DISPLAY AND SUBMIT BUTTON */}
<div className="content-footer w-full">
{/* error or success display */}
{requestStatus.message != "" &&
(!requestStatus.status ? (
<div
className={`relative p-4 my-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
) : (
requestStatus.status && (
<div
className={`relative p-4 my-4 text-green-700 bg-slate-200 border-slate-800 mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
)
))}
{/* End of error or success display */}
<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
to="/myjobs"
className="text-18 text-light-red tracking-wide "
>
<span className="border-b dark:border-[#5356fb29] border-light-red">
{" "}
Cancel
</span>
</Link>
{requestStatus.loading ? (
<LoadingSpinner size="8" color="sky-blue" />
) : (
<button
type="submit"
className="w-[152px] h-[46px] flex justify-center items-center btn-gradient text-base rounded-full text-white"
// className='w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white'
>
Add Job
</button>
)}
</div>
</div>
</div>
</Form>
);
}}
</Formik>
</div>
);
} }
export default AddJob export default AddJob;
+66 -57
View File
@@ -4,7 +4,6 @@ import LoadingSpinner from "../Spinners/LoadingSpinner";
export default function FamilyTable({ className, familyList, loader }) { export default function FamilyTable({ className, familyList, loader }) {
const filterCategories = ["All Categories", "Explore", "Featured"]; const filterCategories = ["All Categories", "Explore", "Featured"];
const [selectedCategory, setCategory] = useState(filterCategories[0]); const [selectedCategory, setCategory] = useState(filterCategories[0]);
return ( return (
<div <div
@@ -13,12 +12,12 @@ export default function FamilyTable({ className, familyList, loader }) {
}`} }`}
> >
<div className="relative w-full overflow-x-auto sm:rounded-lg"> <div className="relative w-full overflow-x-auto sm:rounded-lg">
{loader ? ( {loader ? (
<div className="h-full min-h-[500px] w-full overflow-hidden flex justify-center items-center"> <div className="h-full min-h-[500px] w-full overflow-hidden flex justify-center items-center">
<LoadingSpinner size='16' color='sky-blue' /> <LoadingSpinner size="16" color="sky-blue" />
</div> </div>
) : ( ) : (
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400 relative"> <table className="w-full text-sm text-left text-gray-500 dark:text-gray-400 relative">
<> <>
<thead className="sticky top-0"> <thead className="sticky top-0">
<tr className="text-base text-thin-light-gray whitespace-nowrap border-b dark:border-[#5356fb29] default-border-bottom "> <tr className="text-base text-thin-light-gray whitespace-nowrap border-b dark:border-[#5356fb29] default-border-bottom ">
@@ -31,55 +30,65 @@ export default function FamilyTable({ className, familyList, loader }) {
<tbody className="overflow-y-scroll h-auto"> <tbody className="overflow-y-scroll h-auto">
<> <>
{familyList?.length > 0 ? ( {familyList?.length > 0 ? (
familyList?.map(({ firstname, lastname, age }, idx) => ( familyList?.map(
<tr (
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50" { firstname, lastname, age, added, last_login },
key={idx} idx
> ) => {
<td className=" py-4"> let addedDate = added?.split(" ")[0];
<div className="flex space-x-2 items-center"> return (
<div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center"> <tr
<img className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
src={dataImage1} key={idx}
alt="data"
className="w-full h-full"
/>
</div>
<div className="flex flex-col">
<h1 className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap">
{`${firstname} ${lastname} (${age})`}
</h1>
<span className="text-sm text-thin-light-gray">
Added{" "}
<span className="text-purple">10-10-2029</span>
</span>
</div>
</div>
</td>
<td className="text-center py-4 px-2">
<div className="flex space-x-1 items-center justify-center">
<span className="text-base text-dark-gray dark:text-white font-medium whitespace-nowrap">
10-10-2019
</span>
</div>
</td>
<td className="text-center py-4 px-2">
<div className="flex space-x-1 items-center justify-center">
<span className="text-base text-dark-gray dark:text-white font-medium whitespace-nowrap">
100
</span>
</div>
</td>
<td className="text-right py-4 px-2">
<button
type="button"
className="w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
> >
Manage <td className=" py-4">
</button> <div className="flex space-x-2 items-center">
</td> <div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center">
</tr> <img
)) src={dataImage1}
alt="data"
className="w-full h-full"
/>
</div>
<div className="flex flex-col">
<h1 className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap">
{`${firstname} ${lastname} (${age})`}
</h1>
<span className="text-sm text-thin-light-gray">
Added:{" "}
<span className="text-purple ml-1">
{addedDate}
</span>
</span>
</div>
</div>
</td>
<td className="text-center py-4 px-2">
<div className="flex space-x-1 items-center justify-center">
<span className="text-base text-dark-gray dark:text-white font-medium whitespace-nowrap">
{last_login}
</span>
</div>
</td>
<td className="text-center py-4 px-2">
<div className="flex space-x-1 items-center justify-center">
<span className="text-base text-dark-gray dark:text-white font-medium whitespace-nowrap">
100
</span>
</div>
</td>
<td className="text-right py-4 px-2 flex items-center justify-center">
<button
type="button"
className="w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
>
Manage
</button>
</td>
</tr>
);
}
)
) : ( ) : (
<tr className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap"> <tr className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap">
<td className="p-2" colSpan="4"> <td className="p-2" colSpan="4">
@@ -90,8 +99,8 @@ export default function FamilyTable({ className, familyList, loader }) {
</> </>
</tbody> </tbody>
</> </>
</table> </table>
)} )}
</div> </div>
</div> </div>
); );
+4 -4
View File
@@ -211,7 +211,7 @@ const FamilyForm = ({
type="text" type="text"
parentClass="flex items-center gap-1 w-full" parentClass="flex items-center gap-1 w-full"
labelClass="flex-[0.2] mb-0" labelClass="flex-[0.2] mb-0"
inputClass="flex-[0.8]" inputClass="flex-[0.8] input-curve lg border border-[#dce4e9]"
fieldClass="px-2" fieldClass="px-2"
value={first_name} value={first_name}
inputHandler={inputHandler} inputHandler={inputHandler}
@@ -223,7 +223,7 @@ const FamilyForm = ({
type="text" type="text"
parentClass="flex items-center gap-1 w-full" parentClass="flex items-center gap-1 w-full"
labelClass="flex-[0.2] mb-0" labelClass="flex-[0.2] mb-0"
inputClass="flex-[0.8]" inputClass="flex-[0.8] input-curve lg border border-[#dce4e9]"
fieldClass="px-2" fieldClass="px-2"
value={last_name} value={last_name}
inputHandler={inputHandler} inputHandler={inputHandler}
@@ -242,11 +242,11 @@ const FamilyForm = ({
<select <select
name="age-selection" name="age-selection"
id="age-selection" id="age-selection"
className="input-wrapper border border-[#f5f8fa]] dark:border-[#5e6278] w-full rounded-[0.475rem] h-[42px] overflow-hidden relative font-medium leading-6 bg-clip-padding text-[#5e6278] dark:text-gray-100 bg-[#f5f8fa] dark:bg-[#5e6278] text-base focus-visible:border-transparent focus-visible:outline-0 focus-visible:ring-transparent px-2" className="input-wrapper border border-[#f5f8fa] dark:border-[#5e6278] w-full rounded-[35px] h-[42px] overflow-hidden relative font-medium leading-6 bg-clip-padding text-[#5e6278] dark:text-gray-100 bg-[#f5f8fa] dark:bg-[#5e6278] text-base focus-visible:border-transparent focus-visible:outline-0 focus-visible:ring-transparent px-4"
onChange={ageHandler} onChange={ageHandler}
value={ageValue} value={ageValue}
> >
<option value={""}>Select your age</option> <option value={""}>Select age</option>
{ageRange?.length > 0 && {ageRange?.length > 0 &&
ageRange?.map((age) => ( ageRange?.map((age) => (
<option value={age} key={age}> <option value={age} key={age}>
@@ -82,7 +82,7 @@ export default function InputCom({
name={name} name={name}
minLength={minLengthValidation()} minLength={minLengthValidation()}
maxLength={maxLengthValidation()} maxLength={maxLengthValidation()}
pattern={() => inputPatterns} // pattern={inputPatterns()}
ref={inputRef} ref={inputRef}
readOnly={disable} readOnly={disable}
onBlur={blurHandler} onBlur={blurHandler}
+2 -2
View File
@@ -1,6 +1,6 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
export default function ModalCom({ action, children, situation, isOpen }) { export default function ModalCom({ action, children, situation, isOpen, className }) {
useEffect(() => { useEffect(() => {
if (situation) { if (situation) {
document.body.style.overflowY = "hidden"; document.body.style.overflowY = "hidden";
@@ -16,7 +16,7 @@ export default function ModalCom({ action, children, situation, isOpen }) {
onClick={action || isOpen} onClick={action || isOpen}
className="fixed top-0 left-0 w-full lg:h-[100vh] h-full bg-black bg-opacity-40 backdrop-filter backdrop-blur-sm z-50" className="fixed top-0 left-0 w-full lg:h-[100vh] h-full bg-black bg-opacity-40 backdrop-filter backdrop-blur-sm z-50"
></div> ></div>
<div className="children-element fixed lg:h-100vh h-full z-[99999999999999] w-full lg:w-auto "> <div className={`children-element fixed lg:h-100vh h-full z-[99999999999999] w-full lg:w-auto ${className}`}>
{children && children} {children && children}
</div> </div>
</div> </div>
@@ -0,0 +1,62 @@
import React, { useState } from "react";
import dataImage1 from "../../assets/images/data-table-user-1.png";
import dataImage2 from "../../assets/images/data-table-user-2.png";
import dataImage3 from "../../assets/images/data-table-user-3.png";
import dataImage4 from "../../assets/images/data-table-user-4.png";
import SelectBox from "../Helpers/SelectBox";
import PaginatedList from "../Pagination/PaginatedList";
import { handlePagingFunc } from "../Pagination/HandlePagination";
export default function ActiveJobMessage({ activeJobMesList }) {
const [currentPage, setCurrentPage] = useState(0);
const indexOfFirstItem = Number(currentPage);
const indexOfLastItem = Number(indexOfFirstItem)+Number(process.env.REACT_APP_ITEM_PER_PAGE);
const currentActiveJobMesList = activeJobMesList?.data?.slice(indexOfFirstItem, indexOfLastItem);
const handlePagination = (e) => {
handlePagingFunc(e,setCurrentPage)
}
return (
<div className='flex flex-col justify-between h-full'>
<table className="wallet-activity w-full table-auto border-collapse text-left">
<thead className='border-b-2'>
<tr className='text-slate-600'>
<th className="p-2"></th>
</tr>
</thead>
{activeJobMesList.data.length ?
(
<tbody>
{currentActiveJobMesList.map((item, index) => (
<tr key={index} className='text-slate-500'>
<td className="p-2" dangerouslySetInnerHTML={{__html: item.message}}></td>
</tr>
))}
</tbody>
)
:
activeJobMesList.error ?
(
<tbody>
<tr className='text-slate-500'>
<td className="p-2" colSpan={4}>Opps! an error occurred. Please try again!</td>
</tr>
</tbody>
)
:
<tbody>
<tr className='text-slate-500'>
<td className="p-2" colSpan={4}>No Purchase History Found!</td>
</tr>
</tbody>
}
</table>
{/* PAGINATION BUTTON */}
<PaginatedList onClick={handlePagination} prev={currentPage == 0 ? true : false} next={currentPage+Number(process.env.REACT_APP_ITEM_PER_PAGE) >= activeJobMesList?.data?.length ? true : false} data={activeJobMesList?.data} start={indexOfFirstItem} stop={indexOfLastItem} />
{/* END OF PAGINATION BUTTON */}
</div>
)
}
+216
View File
@@ -0,0 +1,216 @@
import React, { useEffect, 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 usersService from "../../services/UsersService";
function ActiveJobs(props) {
const ApiCall = new usersService()
let { userDetails } = useSelector((state) => state.userDetails);
let navigate = useNavigate()
let [messageToSend, setMessageToSend] = useState('') // State to hold the value of message to be sent
let [requestStatus, setRequestStatus] = useState({loading: false, status: false, message: ''})
// FUNCTION TO HANDLE MESSAGE CHANGE
const handleMessageChange = ({target:{value}}) => {
setMessageToSend(value)
}
// FUNCTION TO SEND TASK MESSAGE
const sendTaskMessage = () => {
let reqData={message: messageToSend, msg_type: 'TEXT', contract:props.details.contract}
if(!reqData.message){
setRequestStatus({loading: false, status: false, message: 'Message is empty'})
return setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
}, 5000)
}
setRequestStatus({loading: true, status: false, message: ''})
ApiCall.sendTaskMessage(reqData).then((res)=>{
if(res.status != 200 || res.data.internal_return < 0){
setRequestStatus({loading: false, status: false, message: 'Message could not be sent, try again later'})
return
}
setRequestStatus({loading: false, status: true, message: 'Message Sent Successfully'})
props.reloadActiveJobList(prev => !prev) // MAKES ACTIVE JOB MESSAGE LIST TO RELOAD
setMessageToSend('') // SENDS MESSAGE TO SEND BACK TO EMPTY STRINGS
}).catch(error => {
setRequestStatus({loading: false, status: false, message: 'Opps! something went wrong'})
}).finally(()=>{
setTimeout(()=>{
setRequestStatus({loading: false, status: false, message: ''})
}, 5000)
})
}
return (
<Layout>
<div className="p-4 lg:flex justify-between items-start space-y-4 lg:space-x-4 lg:space-y-0 rounded-lg shadow-lg bg-slate-100">
<div className="w-full lg:w-1/2">
<div className="py-[20px] bg-white px-4 rounded-md shadow-md">
{/* back btn and title */}
<div className="w-full flex justify-start space-x-3 items-center">
<button
type="button"
className="text-[#374557] border border-sky-blue p-1 rounded-full"
onClick={() => navigate('/my-active-jobs', {replace: true})}
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="35"
height="35"
viewBox="0 0 24 24"
fill="skyblue"
>
<path d="M19 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H19v-2z" />
</svg>
</button>
<h1 className="text-lg font-bold text-dark-gray dark:text-white tracking-wide">
{props.details?.title && props.details.title}
</h1>
</div>
{/* END of back btn and title */}
<div className="mt-2 w-full lg:flex lg:justify-between lg:items-center lg:space-x-2">
<div className="my-2 lg:my-0">
<p className="text-base text-slate-700 dark:text-black">
{props.details?.contract && props.details.contract}
</p>
<p className="text-base text-slate-700 dark:text-black">
<span className="font-semibold">Description: </span>
{props.details?.description && props.details.description}
</p>
<p className="text-base text-sky-blue">Delivery Detail</p>
</div>
<div className="">
<p className="text-base text-sky-blue">
{userDetails.firstname && userDetails.firstname}
</p>
<p className="text-base text-slate-700 dark:text-black">
<span className="font-semibold">Due: </span>
{props.details?.delivery_date &&
props.details.delivery_date.split(" ")[0]}
</p>
<p className="text-base text-slate-700 dark:text-black">
{props.details?.delivery_date &&
props.details.delivery_date.split(" ")[1]}
</p>
<p className="text-base text-slate-700 dark:text-black">
{props.details?.timeline_days && props.details.timeline_days} day(s)
</p>
</div>
</div>
</div>
<div className="mt-5 bg-white p-4 rounded-md shadow-md">
<div className="">
<p className="relative py-2 my-2 text-lg font-bold text-slate-600 dark:text-black border-b-2 border-slate-300 tracking-wide after:absolute after:-bottom-0.5 after:content-[''] after:w-[100px] after:h-[2px] after:bg-sky-blue after:left-0">Message(s)</p>
<textarea
className="p-4 w-full text-base text-slate-600 border-y border-slate-300 outline-none"
rows="10"
style={{ resize: "none" }}
name='message'
onChange={handleMessageChange}
value={messageToSend}
/>
</div>
{/* ERROR DISPLAY AND SUBMIT BUTTON */}
<div className="w-full">
{/* error or success display */}
{requestStatus.message != "" &&
(!requestStatus.status ? (
<div
className={`relative p-4 my-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
) : (
requestStatus.status && (
<div
className={`relative p-4 my-4 text-green-700 bg-slate-200 border-slate-800 mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
)
))}
</div>
{/* End of error or success display */}
{/* Buttons Sections */}
<div className="py-2 mb-8 sm:flex sm:justify-center sm:items-center">
<div className="w-full sm:w-2/4 mb-5 sm:mb-0">
<button
onClick={()=>{console.log('working')}}
type="button"
className="btn-gradient text-base tracking-wide px-4 py-2 rounded-md flex justify-center items-center"
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill='white'>
<path d="M12 2L2 12h3v8h14v-8h3L12 2zm0 16v-6h-2v6H7l5-5 5 5h-3z"/>
</svg>
<span className="text-white">Upload Files</span>
</button>
</div>
<div className="w-full sm:w-2/4 flex justify-between items-center space-x-2">
<button
type="button"
className="bg-red-600 text-base text-white tracking-wide px-4 py-2 rounded-md hover:opacity-90"
>
<span className="text-white">Clear</span>
</button>
<button
onClick={sendTaskMessage}
type="button"
className="btn-gradient text-base text-white tracking-wide px-4 py-2 rounded-md"
>
{requestStatus.loading ?
<LoadingSpinner size='6' color='sky-blue' />
:
<span className="text-white">Send</span>
}
</button>
</div>
</div>
{/* end of Buttons Sections */}
</div>
</div>
{/* ACTION SECTION */}
<div className="w-full lg:w-1/2 h-full">
<div className="py-[20px] bg-white px-4 rounded-md shadow-md">
<h1 className="text-lg font-bold text-dark-gray dark:text-white tracking-wide">Actions</h1>
<p className="my-3 py-1 text-base">
Waiting for the completion message from the client before you can approve.
</p>
</div>
<div className="mt-5 bg-white p-4 rounded-md shadow-md">
<div className="">
<p className="text-lg font-bold text-dark-gray dark:text-black tracking-wide">Message</p>
{props.activeJobMesList.loading ?
<LoadingSpinner size='16' color='sky-blue' />
:
<ActiveJobMessage activeJobMesList={props.activeJobMesList} />
}
</div>
</div>
</div>
</div>
</Layout>
);
}
export default ActiveJobs;
+122 -98
View File
@@ -1,112 +1,136 @@
import React, { useState } from "react"; import React, { useState } from "react";
import dataImage1 from "../../assets/images/data-table-user-1.png";
import dataImage2 from "../../assets/images/data-table-user-2.png"; import dataImage2 from "../../assets/images/data-table-user-2.png";
import dataImage3 from "../../assets/images/data-table-user-3.png";
import dataImage4 from "../../assets/images/data-table-user-4.png";
import SelectBox from "../Helpers/SelectBox";
import ActiveJobsPopout from "../jobPopout/ActiveJobsPopout";
import PaginatedList from "../Pagination/PaginatedList"; import { useNavigate } from "react-router-dom";
import { handlePagingFunc } from "../Pagination/HandlePagination"; import { handlePagingFunc } from "../Pagination/HandlePagination";
import PaginatedList from "../Pagination/PaginatedList";
export default function MyActiveJobTable({MyJobList, className }) { export default function MyActiveJobTable({ MyJobList, className }) {
const filterCategories = ["All Categories", "Explore", "Featured"]; const navigate = useNavigate()
const [selectedCategory, setCategory] = useState(filterCategories[0]);
let [jobPopout,setJobPopout] = useState({show:false, data:{}}) // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW const filterCategories = ["All Categories", "Explore", "Featured"];
const [selectedCategory, setCategory] = useState(filterCategories[0]);
const [currentPage, setCurrentPage] = useState(0); const [currentPage, setCurrentPage] = useState(0);
const indexOfFirstItem = Number(currentPage); const indexOfFirstItem = Number(currentPage);
const indexOfLastItem = Number(indexOfFirstItem)+Number(process.env.REACT_APP_ITEM_PER_PAGE); const indexOfLastItem =
const currentActiveJobList = MyJobList?.result_list?.slice(indexOfFirstItem, indexOfLastItem); Number(indexOfFirstItem) + Number(process.env.REACT_APP_ITEM_PER_PAGE);
const currentActiveJobList = MyJobList?.result_list?.slice(
indexOfFirstItem,
indexOfLastItem
);
const handlePagination = (e) => { const handlePagination = (e) => {
handlePagingFunc(e,setCurrentPage) handlePagingFunc(e, setCurrentPage);
} };
return ( return (
<div <div
className={`update-table w-full p-8 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow ${ className={`update-table w-full p-8 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow ${
className || "" className || ""
}`} }`}
> >
{MyJobList && MyJobList?.result_list && {MyJobList && MyJobList?.result_list && (
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full"> <div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full">
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400"> <table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<tbody> <tbody>
{/*<tr className="text-base text-thin-light-gray border-b dark:border-[#5356fb29] default-border-b dark:border-[#5356fb29] ottom ">*/} {/*<tr className="text-base text-thin-light-gray border-b dark:border-[#5356fb29] default-border-b dark:border-[#5356fb29] ottom ">*/}
{/* <td className="py-4">All Product</td>*/} {/* <td className="py-4">All Product</td>*/}
{/* <td className="py-4 text-right">.</td>*/} {/* <td className="py-4 text-right">.</td>*/}
{/*</tr>*/} {/*</tr>*/}
{ {
<> <>
{MyJobList && MyJobList?.result_list && {MyJobList &&
MyJobList.result_list.length > 0 && MyJobList?.result_list &&
currentActiveJobList.map((value, index) => ( MyJobList.result_list.length > 0 &&
<tr key={index} className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"> currentActiveJobList.map((value, index) => (
<td className=" py-4"> <tr
<div className="flex space-x-2 items-center"> key={index}
<div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center"> className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
<img >
src={dataImage2} <td className=" py-4">
alt="data" <div className="flex space-x-2 items-center">
className="w-full h-full" <div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center">
/> <img
</div> src={dataImage2}
<div className="flex flex-col"> alt="data"
<h1 className="font-bold text-xl text-dark-gray dark:text-white"> className="w-full h-full"
{value.title} />
</h1> </div>
<div> <div className="flex flex-col">
{value.description} <h1 className="font-bold text-xl text-dark-gray dark:text-white">
</div> {value.title}
<span className="text-sm text-thin-light-gray"> </h1>
Price: <span className="text-purple">{value.price*0.01}</span> <div>{value.description}</div>
</span> <span className="text-sm text-thin-light-gray">
<span className="text-sm text-thin-light-gray"> Price:{" "}
Duration: <span className="text-purple"> {value.timeline_days} day(s)</span> <span className="text-purple">
</span> {value.price * 0.01}
<span className="text-sm text-thin-light-gray"> </span>
Expire: <span className="text-purple"> {value.expire}</span> </span>
</span> <span className="text-sm text-thin-light-gray">
<span className="text-sm text-thin-light-gray"> Duration:{" "}
Send to: <span className="text-purple"> {value.job_to}</span> <span className="text-purple">
</span> {" "}
{value.timeline_days} day(s)
</span>
</span>
<span className="text-sm text-thin-light-gray">
Expire:{" "}
<span className="text-purple">
{" "}
{value.expire}
</span>
</span>
<span className="text-sm text-thin-light-gray">
Send to:{" "}
<span className="text-purple">
{" "}
{value.job_to}
</span>
</span>
</div>
</div>
</td>
</div> <td className="text-right py-4 px-2">
</div> <div className="flex justify-center items-center">
</td> <button
type="button"
onClick={() => {
<td className="text-right py-4 px-2"> navigate('/manage-active-job', {state:value});
<button }}
type="button" className="w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
onClick={()=>{setJobPopout({show:true, data:value})}} >
className="w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white" View
> </button>
View </div>
</button> </td>
</td> </tr>
</tr> ))}
))} </>
}
</tbody>
</> </table>
} {/* PAGINATION BUTTON */}
</tbody> <PaginatedList
</table> onClick={handlePagination}
{/* PAGINATION BUTTON */} prev={currentPage == 0 ? true : false}
<PaginatedList onClick={handlePagination} prev={currentPage == 0 ? true : false} next={currentPage+Number(process.env.REACT_APP_ITEM_PER_PAGE) >= MyJobList?.result_list.length ? true : false} data={MyJobList?.result_list} start={indexOfFirstItem} stop={indexOfLastItem} /> next={
{/* END OF PAGINATION BUTTON */} currentPage + Number(process.env.REACT_APP_ITEM_PER_PAGE) >=
</div> MyJobList?.result_list.length
? true
: false
} }
data={MyJobList?.result_list}
{/* Active Job Popout */} start={indexOfFirstItem}
{jobPopout.show && stop={indexOfLastItem}
<ActiveJobsPopout details={jobPopout.data} onClose={()=>{setJobPopout({show:false, data:{}})}} situation={jobPopout.show} /> />
} {/* END OF PAGINATION BUTTON */}
{/* End of Active Job Popout */}
</div> </div>
); )}
</div>
);
} }
+28 -28
View File
@@ -5,37 +5,37 @@ import CommonHead from "../UserHeader/CommonHead";
import MyActiveJobTable from "./MyActiveJobTable"; import MyActiveJobTable from "./MyActiveJobTable";
export default function MyActiveJobs(props) { export default function MyActiveJobs(props) {
const [selectTab, setValue] = useState("today"); const [selectTab, setValue] = useState("today");
const filterHandler = (value) => { const filterHandler = (value) => {
setValue(value); setValue(value);
}; };
console.log("AMEYE LOC1", props.MyJobList); console.log("AMEYE LOC1", props.MyJobList);
return ( return (
<Layout> <Layout>
<CommonHead /> <CommonHead />
<div className="notification-page w-full mb-10"> <div className="notification-page w-full mb-10">
<div className="notification-wrapper w-full"> <div className="notification-wrapper w-full">
{/* heading */} {/* heading */}
<div className="sm:flex justify-between items-center mb-6"> <div className="sm:flex justify-between items-center mb-6">
<div className="mb-5 sm:mb-0"> <div className="mb-5 sm:mb-0">
<h1 className="text-26 font-bold text-dark-gray dark:text-white"> <h1 className="text-26 font-bold text-dark-gray dark:text-white">
<span <span
className={`${selectTab === "today" ? "block" : "hidden"}`} className={`${selectTab === "today" ? "block" : "hidden"}`}
> >
Active Job(s) Active Job(s)
</span> </span>
</h1>
</h1>
</div>
<div className="slider-btns flex space-x-4">
<div onClick={() => filterHandler("today")} className="relative">
</div>
</div>
</div>
<MyActiveJobTable MyJobList={props.MyJobList} />
</div>
</div> </div>
</Layout> <div className="slider-btns flex space-x-4">
); <div
onClick={() => filterHandler("today")}
className="relative"
></div>
</div>
</div>
<MyActiveJobTable MyJobList={props.MyJobList} />
</div>
</div>
</Layout>
);
} }
+227 -121
View File
@@ -1,4 +1,4 @@
import React, { useState } from "react"; import React, { useCallback, useEffect, useMemo, useState } from "react";
import dataImage1 from "../../assets/images/data-table-user-1.png"; import dataImage1 from "../../assets/images/data-table-user-1.png";
import dataImage2 from "../../assets/images/data-table-user-2.png"; import dataImage2 from "../../assets/images/data-table-user-2.png";
import dataImage3 from "../../assets/images/data-table-user-3.png"; import dataImage3 from "../../assets/images/data-table-user-3.png";
@@ -9,137 +9,243 @@ import DeleteJobPopout from "../jobPopout/DeleteJobPopout";
import PaginatedList from "../Pagination/PaginatedList"; import PaginatedList from "../Pagination/PaginatedList";
import { handlePagingFunc } from "../Pagination/HandlePagination"; import { handlePagingFunc } from "../Pagination/HandlePagination";
import EditJobPopOut from "../jobPopout/EditJobPopout";
import usersService from "../../services/UsersService";
import { useSelector } from "react-redux";
export default function MyJobTable({MyJobList, className }) { export default function MyJobTable({ MyJobList, className }) {
const filterCategories = ["All Categories", "Explore", "Featured"]; const [myCountry, setCountries] = useState("");
const [selectedCategory, setCategory] = useState(filterCategories[0]); const {
userDetails: { country },
} = useSelector((state) => state?.userDetails);
let [jobPopout,setJobPopout] = useState({show:false, data:{}}) // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW const userApi = useMemo(() => new usersService(), []);
let [deleteJobPopout,setDeleteJobPopout] = useState({show:false, data:{}}) // STATE TO HOLD THE VALUE OF THE ITEM DETAILS TO DELETE AND DETERMINE WHEN TO SHOW // Get Country Api
const getCountryList = useCallback(async () => {
const res = await userApi.getSignupCountryData();
const [currentPage, setCurrentPage] = useState(0); try {
const indexOfFirstItem = Number(currentPage); if (res.status === 200) {
const indexOfLastItem = Number(indexOfFirstItem)+Number(process.env.REACT_APP_ITEM_PER_PAGE); const {
const currentJobList = MyJobList?.result_list?.slice(indexOfFirstItem, indexOfLastItem); data: { signup_country },
} = await res;
const handlePagination = (e) => { console.log(signup_country);
handlePagingFunc(e,setCurrentPage) let checkCountry = signup_country
?.filter((item) => item[0] == country)
?.map((item, idx) => item[1])
.join("");
setCountries(checkCountry);
}
} catch (error) {
throw new Error(error);
} }
}, [userApi, country]);
return ( useEffect(() => {
<div getCountryList();
className={`update-table w-full p-8 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow ${ }, [getCountryList]);
className || ""
}`}
>
<div className="header w-full flex justify-between items-center mb-5">
<div className="flex space-x-2 items-center">
<h1 className="text-xl font-bold text-dark-gray dark:text-white tracking-wide">
All Jobs
</h1>
</div>
<SelectBox
action={setCategory}
datas={filterCategories}
className="Update-table-dropdown"
contentBodyClasses="w-auto min-w-max"
/>
</div>
{MyJobList && MyJobList?.result_list &&
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full">
<table className="table-auto min-w-full text-sm text-left text-gray-500 dark:text-gray-400">
<tbody>
<tr className="text-base text-thin-light-gray border-b default-border-b dark:border-[#5356fb29] ottom ">
<td className="py-1">.</td>
<td className="py-1 text-right">.</td>
</tr>
{selectedCategory === "All Categories" ? ( const filterCategories = ["All Categories", "Explore", "Featured"];
<> const [selectedCategory, setCategory] = useState(filterCategories[0]);
{MyJobList && MyJobList?.result_list &&
MyJobList.result_list.length > 0 &&
currentJobList.map((value, index) => (
<tr key={index} className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50">
<td className="py-9">
<div className="sm:flex sm:space-x-2 sm:justify-between sm:items-center job-items">
<div className="flex space-x-2 items-center job-items">
<div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center">
<img
src={dataImage2}
alt="data"
className="w-full h-full"
/>
</div>
<div className="flex flex-col">
<h1 className="font-bold text-xl text-dark-gray dark:text-white">
{value.title}
</h1>
<div>
{value.description}
</div>
<span className="text-sm text-thin-light-gray">
Price: <span className="text-purple">{value.price*0.01}</span>
</span>
<span className="text-sm text-thin-light-gray">
Duration: <span className="text-purple"> {value.timeline_days} day(s)</span>
</span>
</div> let [jobPopout, setJobPopout] = useState({ show: false, data: {} }); // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW
</div>
<div className="min-w-[110px] max-w-[110px] bg-yellow-300 mx-2 rounded-md flex flex-nowrap space-x-2 justify-center items-center self-end"> let [deleteJobPopout, setDeleteJobPopout] = useState({
<button type="button" className="p-2 w-[60px] h-11" onClick={()=>{setDeleteJobPopout({show:true, data:value})}}>[Delete]</button> show: false,
<span>|</span> data: {},
<button type="button" className="p-2 w-[40px] h-11">Edit</button> }); // STATE TO HOLD THE VALUE OF THE ITEM DETAILS TO DELETE AND DETERMINE WHEN TO SHOW
</div> const [editJob, setEditJob] = useState({ show: false, data: {} });
</div>
</td> const [currentPage, setCurrentPage] = useState(0);
const indexOfFirstItem = Number(currentPage);
const indexOfLastItem =
Number(indexOfFirstItem) + Number(process.env.REACT_APP_ITEM_PER_PAGE);
const currentJobList = MyJobList?.result_list?.slice(
indexOfFirstItem,
indexOfLastItem
);
<td className="text-right py-9 px-2"> const handlePagination = (e) => {
<button handlePagingFunc(e, setCurrentPage);
type="button" };
onClick={()=>{setJobPopout({show:true, data:value})}}
className="w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
>
Manage
</button>
</td>
</tr>
))}
return (
</> <div
) : selectedCategory === "Explore" ? ( className={`update-table w-full p-8 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow ${
<> className || ""
}`}
</> >
) : ( <div className="header w-full flex justify-between items-center mb-5">
<> <div className="flex space-x-2 items-center">
<h1 className="text-xl font-bold text-dark-gray dark:text-white tracking-wide">
</> All Jobs
)} </h1>
</tbody>
</table>
{/* PAGINATION BUTTON */}
<PaginatedList onClick={handlePagination} prev={currentPage == 0 ? true : false} next={currentPage+Number(process.env.REACT_APP_ITEM_PER_PAGE) >= MyJobList?.result_list?.length ? true : false} data={MyJobList?.result_list} start={indexOfFirstItem} stop={indexOfLastItem} />
{/* END OF PAGINATION BUTTON */}
</div>
}
{/* Job List Popout */}
{jobPopout.show &&
<JobListPopout details={jobPopout.data} onClose={()=>{setJobPopout({show:false, data:{}})}} situation={jobPopout.show} />
}
{/* End of Job List Popout */}
{/* Delete Job Popout */}
{deleteJobPopout.show &&
<DeleteJobPopout details={deleteJobPopout.data} onClose={()=>{setDeleteJobPopout({show:false, data:{}})}} situation={deleteJobPopout.show} />
}
{/* END of Delete Job Popout */}
</div> </div>
); <SelectBox
action={setCategory}
datas={filterCategories}
className="Update-table-dropdown"
contentBodyClasses="w-auto min-w-max"
/>
</div>
{MyJobList && MyJobList?.result_list && (
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full">
<table className="table-auto min-w-full text-sm text-left text-gray-500 dark:text-gray-400">
<tbody>
<tr className="text-base text-thin-light-gray border-b default-border-b dark:border-[#5356fb29] ottom ">
<td className="py-1">.</td>
<td className="py-1 text-right">.</td>
</tr>
{selectedCategory === "All Categories" ? (
<>
{MyJobList &&
MyJobList?.result_list &&
MyJobList.result_list.length > 0 &&
currentJobList.map((value, index) => (
<tr
key={index}
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
>
<td className="py-9">
<div className="sm:flex sm:space-x-2 sm:justify-between sm:items-center job-items">
<div className="flex space-x-2 items-center job-items">
<div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center">
<img
src={dataImage2}
alt="data"
className="w-full h-full"
/>
</div>
<div className="flex flex-col">
<h1 className="font-bold text-xl text-dark-gray dark:text-white">
{value.title}
</h1>
<div>{value.description}</div>
<span className="text-sm text-thin-light-gray">
Price:{" "}
<span className="text-purple">
{value.price * 0.01}
</span>
</span>
<span className="text-sm text-thin-light-gray">
Duration:{" "}
<span className="text-purple">
{" "}
{value.timeline_days} day(s)
</span>
</span>
</div>
</div>
<div className="min-w-[110px] max-w-[110px] bg-yellow-300 mx-2 rounded-md flex flex-nowrap space-x-2 justify-center items-center self-end">
<button
type="button"
className="p-2 w-[60px] h-11"
onClick={() => {
setDeleteJobPopout({
show: true,
data: value,
});
}}
>
[Delete]
</button>
<span>|</span>
<button
type="button"
className="p-2 w-[40px] h-11"
onClick={() => {
setEditJob({
show: true,
data: value,
});
}}
>
Edit
</button>
</div>
</div>
</td>
<td className="text-right py-9 px-2">
<button
type="button"
onClick={() => {
setJobPopout({ show: true, data: value });
}}
className="w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
>
Manage
</button>
</td>
</tr>
))}
</>
) : selectedCategory === "Explore" ? (
<></>
) : (
<></>
)}
</tbody>
</table>
{/* PAGINATION BUTTON */}
<PaginatedList
onClick={handlePagination}
prev={currentPage == 0 ? true : false}
next={
currentPage + Number(process.env.REACT_APP_ITEM_PER_PAGE) >=
MyJobList?.result_list?.length
? true
: false
}
data={MyJobList?.result_list}
start={indexOfFirstItem}
stop={indexOfLastItem}
/>
{/* END OF PAGINATION BUTTON */}
</div>
)}
{/* Job List Popout */}
{jobPopout.show && (
<JobListPopout
details={jobPopout.data}
onClose={() => {
setJobPopout({ show: false, data: {} });
}}
situation={jobPopout.show}
/>
)}
{/* End of Job List Popout */}
{/* Delete Job Popout */}
{deleteJobPopout.show && (
<DeleteJobPopout
details={deleteJobPopout.data}
onClose={() => {
setDeleteJobPopout({ show: false, data: {} });
}}
situation={deleteJobPopout.show}
/>
)}
{/* END of Delete Job Popout */}
{editJob.show && (
<EditJobPopOut
details={editJob.data}
onClose={() => {
setEditJob({
show: false,
data: {},
});
}}
situation={editJob.show}
country={myCountry}
/>
)}
</div>
);
} }
+38 -34
View File
@@ -5,40 +5,44 @@ import MyJobTable from "./MyJobTable";
import CommonHead from "../UserHeader/CommonHead"; import CommonHead from "../UserHeader/CommonHead";
export default function MyJobs(props) { export default function MyJobs(props) {
const [selectTab, setValue] = useState("today"); const [selectTab, setValue] = useState("today");
const filterHandler = (value) => { const filterHandler = (value) => {
setValue(value); setValue(value);
}; };
console.log("AMEYE LOC1", props.MyJobList); console.log("AMEYE LOC1", props.MyJobList);
return ( return (
<Layout> <Layout>
<CommonHead /> <CommonHead />
<div className="notification-page w-full mb-10"> <div className="notification-page w-full mb-10">
<div className="notification-wrapper w-full"> <div className="notification-wrapper w-full">
{/* heading */} {/* heading */}
<div className="sm:flex justify-between items-center mb-6"> <div className="sm:flex justify-between items-center mb-6">
<div className="mb-5 sm:mb-0"> <div className="mb-5 sm:mb-0">
<h1 className="text-26 font-bold flex items-center space-x-1 text-dark-gray dark:text-white"> <h1 className="text-26 font-bold flex items-center space-x-1 text-dark-gray dark:text-white gap-2">
<span <span
className={`${selectTab === "today" ? "block" : "hidden"}`} className={`${selectTab === "today" ? "block" : "hidden"}`}
> >
My Jobs My Jobs
</span> </span>
<Link to='/add-job' className='w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white'> <Link
Add Job to="/add-job"
</Link> className="text-white btn-gradient text-lg tracking-wide px-5 py-2 rounded-full"
</h1> >
</div> Add Job
<div className="slider-btns flex space-x-4"> </Link>
<div onClick={() => filterHandler("today")} className="relative"> </h1>
</div>
</div>
</div>
<MyJobTable MyJobList={props.MyJobList} />
</div>
</div> </div>
</Layout> <div className="slider-btns flex space-x-4">
); <div
onClick={() => filterHandler("today")}
className="relative"
></div>
</div>
</div>
<MyJobTable MyJobList={props.MyJobList} />
</div>
</div>
</Layout>
);
} }
@@ -4,7 +4,7 @@ import dataImage2 from "../../assets/images/data-table-user-2.png";
import dataImage3 from "../../assets/images/data-table-user-3.png"; import dataImage3 from "../../assets/images/data-table-user-3.png";
import dataImage4 from "../../assets/images/data-table-user-4.png"; import dataImage4 from "../../assets/images/data-table-user-4.png";
import SelectBox from "../Helpers/SelectBox"; import SelectBox from "../Helpers/SelectBox";
import ActiveJobsPopout from "../jobPopout/ActiveJobsPopout"; import PendingJobsPopout from "../jobPopout/PendingJobsPopout";
import PaginatedList from "../Pagination/PaginatedList"; import PaginatedList from "../Pagination/PaginatedList";
import { handlePagingFunc } from "../Pagination/HandlePagination"; import { handlePagingFunc } from "../Pagination/HandlePagination";
@@ -104,7 +104,7 @@ export default function MyPendingJobTable({MyJobList, className }) {
{/* Active Job Popout */} {/* Active Job Popout */}
{jobPopout.show && {jobPopout.show &&
<ActiveJobsPopout details={jobPopout.data} onClose={()=>{setJobPopout({show:false, data:{}})}} situation={jobPopout.show} /> <PendingJobsPopout details={jobPopout.data} onClose={()=>{setJobPopout({show:false, data:{}})}} situation={jobPopout.show} />
} }
{/* End of Active Job Popout */} {/* End of Active Job Popout */}
</div> </div>
File diff suppressed because it is too large Load Diff
+27 -27
View File
@@ -5,36 +5,36 @@ import MyJobTable from "./MyJobTable";
import CommonHead from "../UserHeader/CommonHead"; import CommonHead from "../UserHeader/CommonHead";
export default function MyTasks() { export default function MyTasks() {
const [selectTab, setValue] = useState("today"); const [selectTab, setValue] = useState("today");
const filterHandler = (value) => { const filterHandler = (value) => {
setValue(value); setValue(value);
}; };
return ( return (
<Layout> <Layout>
<CommonHead /> <CommonHead />
<div className="notification-page w-full mb-10"> <div className="notification-page w-full mb-10">
<div className="notification-wrapper w-full"> <div className="notification-wrapper w-full">
{/* heading */} {/* heading */}
<div className="sm:flex justify-between items-center mb-6"> <div className="sm:flex justify-between items-center mb-6">
<div className="mb-5 sm:mb-0"> <div className="mb-5 sm:mb-0">
<h1 className="text-26 font-bold text-dark-gray dark:text-white"> <h1 className="text-26 font-bold text-dark-gray dark:text-white">
<span <span
className={`${selectTab === "today" ? "block" : "hidden"}`} className={`${selectTab === "today" ? "block" : "hidden"}`}
> >
My Tasks My Tasks
</span> </span>
</h1>
</h1>
</div>
<div className="slider-btns flex space-x-4">
<div onClick={() => filterHandler("today")} className="relative">
</div>
</div>
</div>
<MyJobTable />
</div>
</div> </div>
</Layout> <div className="slider-btns flex space-x-4">
); <div
onClick={() => filterHandler("today")}
className="relative"
></div>
</div>
</div>
<MyJobTable />
</div>
</div>
</Layout>
);
} }
+183 -169
View File
@@ -1,4 +1,4 @@
import {Link} from 'react-router-dom' import { Link, useLocation, useNavigate } from "react-router-dom";
import Icons from "../Helpers/Icons"; import Icons from "../Helpers/Icons";
import bank1 from "../../assets/images/bank-1.png"; import bank1 from "../../assets/images/bank-1.png";
import bank2 from "../../assets/images/bank-2.png"; import bank2 from "../../assets/images/bank-2.png";
@@ -8,180 +8,194 @@ import Accordion from "../Helpers/Accordion";
export default function WalletHeader(props) { export default function WalletHeader(props) {
// debugger; // debugger;
//props.myWalletList.result_list //props.myWalletList.result_list
return ( let { pathname } = useLocation();
<> let navigate = useNavigate();
<div return (
className="lg:flex hidden user-balance cursor-pointer lg:w-[152px] w-[150px] h-[48px] items-center rounded-full relative bg-purple pr-1.5 pl-4"> <>
<div <div className="lg:flex hidden user-balance cursor-pointer lg:w-[152px] w-[150px] h-[48px] items-center rounded-full relative bg-purple pr-1.5 pl-4">
onClick={() => props.handlerBalance()} <div
className="flex items-center lg:justify-between justify-center w-full h-full" onClick={() => props.handlerBalance()}
> className="flex items-center lg:justify-between justify-center w-full h-full"
<span className="lg:block hidden"> >
<Icons name="wallet"/> <span className="lg:block hidden">
</span> <Icons name="wallet" />
<p className="lg:text-xl text-lg font-bold text-white"> </span>
Wallet <p className="lg:text-xl text-lg font-bold text-white">Wallet</p>
</p> <span className="lg:block hidden">
<span className="lg:block hidden"> <Icons name="deep-plus" />
<Icons name="deep-plus"/> </span>
</span> </div>
</div> <div
<div className={`balance-dropdown w-96 z-30 bg-white dark:bg-dark-white absolute -left-24 rounded-lg cursor-pointer ${
className={`balance-dropdown w-96 z-30 bg-white dark:bg-dark-white absolute -left-24 rounded-lg cursor-pointer ${ props.balanceDropdown ? "active" : ""
props.balanceDropdown ? "active" : "" }`}
}`} >
> <div className="heading border-b dark:border-[#5356fb29] border-light-purple px-7 py-6">
<div className="heading border-b dark:border-[#5356fb29] border-light-purple px-7 py-6"> <h3 className="text-xl font-bold text-dark-gray dark:text-white">
<h3 className="text-xl font-bold text-dark-gray dark:text-white"> Wallet
Wallet </h3>
</h3> </div>
<div className="content px-7 pb-7">
<ul>
{props.myWalletList &&
props.myWalletList?.result_list?.length > 0 &&
props.myWalletList.result_list.map((value, index) => (
<li
key={index}
className="content-item py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple"
>
<div className="sm:flex justify-between items-center">
<div className="account-name flex space-x-4 items-center mb-2 sm:mb-0">
<div className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple ">
<img src={bank1} alt="" />
</div>
<div className="name">
<p className="text-base text-dark-gray dark:text-white font-medium">
{value.description}
</p>
</div>
</div>
<div>
<p className="eth text-xl font-bold text-purple">
{(value.amount * 0.01).toFixed(2)} {value.code}
</p>
<p className="usd text-base text-thin-light-gray text-right">
{/*(773.69 USD)*/}
</p>
</div>
</div> </div>
<div className="content px-7 pb-7"> </li>
<ul> ))}
{props.myWalletList && {/*<li className="content-item py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple">*/}
props.myWalletList?.result_list?.length > 0 && {/* <div className="sm:flex justify-between items-center">*/}
props.myWalletList.result_list.map((value, index) => ( {/* <div className="account-name flex space-x-4 items-center mb-2 sm:mb-0">*/}
<li key={index} className="content-item py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple"> {/* <div*/}
<div className="sm:flex justify-between items-center"> {/* className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple ">*/}
<div className="account-name flex space-x-4 items-center mb-2 sm:mb-0"> {/* <img src={bank1} alt=""/>*/}
<div {/* </div>*/}
className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple "> {/* <div className="name">*/}
<img src={bank1} alt=""/> {/* <p className="text-base text-dark-gray dark:text-white font-medium">*/}
</div> {/* MetaMask*/}
<div className="name"> {/* </p>*/}
<p className="text-base text-dark-gray dark:text-white font-medium"> {/* </div>*/}
{value.description} {/* </div>*/}
</p> {/* <div>*/}
</div> {/* <p className="eth text-xl font-bold text-purple">*/}
</div> {/* 75,320 ETH*/}
<div> {/* </p>*/}
<p className="eth text-xl font-bold text-purple"> {/* <p className="usd text-base text-thin-light-gray text-right">*/}
{(value.amount*0.01).toFixed(2)} {value.code} {/* (773.69 USD)*/}
</p> {/* </p>*/}
<p className="usd text-base text-thin-light-gray text-right"> {/* </div>*/}
{/*(773.69 USD)*/} {/* </div>*/}
</p> {/*</li>*/}
</div> {/*<li className="content-item py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple">*/}
</div> {/* <div className="sm:flex justify-between items-center">*/}
</li> {/* <div className="account-name flex space-x-4 items-center mb-2 sm:mb-0">*/}
))} {/* <div*/}
{/* className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple ">*/}
{/*<li className="content-item py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple">*/} {/* <img src={bank2} alt=""/>*/}
{/* <div className="sm:flex justify-between items-center">*/} {/* </div>*/}
{/* <div className="account-name flex space-x-4 items-center mb-2 sm:mb-0">*/} {/* <div className="name">*/}
{/* <div*/} {/* <p className="text-base text-dark-gray dark:text-white font-medium">*/}
{/* className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple ">*/} {/* Coinbase Wallet*/}
{/* <img src={bank1} alt=""/>*/} {/* </p>*/}
{/* </div>*/} {/* </div>*/}
{/* <div className="name">*/} {/* </div>*/}
{/* <p className="text-base text-dark-gray dark:text-white font-medium">*/} {/* <div>*/}
{/* MetaMask*/} {/* <p className="eth text-xl font-bold text-purple">*/}
{/* </p>*/} {/* 56,124 ETH*/}
{/* </div>*/} {/* </p>*/}
{/* </div>*/} {/* <p className="usd text-base text-thin-light-gray text-right">*/}
{/* <div>*/} {/* (773.69 USD)*/}
{/* <p className="eth text-xl font-bold text-purple">*/} {/* </p>*/}
{/* 75,320 ETH*/} {/* </div>*/}
{/* </p>*/} {/* </div>*/}
{/* <p className="usd text-base text-thin-light-gray text-right">*/} {/*</li>*/}
{/* (773.69 USD)*/} {/*<li className="content-item py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple">*/}
{/* </p>*/} {/* <div className="sm:flex justify-between items-center">*/}
{/* </div>*/} {/* <div className="account-name flex space-x-4 items-center mb-2 sm:mb-0">*/}
{/* </div>*/} {/* <div*/}
{/*</li>*/} {/* className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple ">*/}
{/*<li className="content-item py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple">*/} {/* <img src={bank3} alt=""/>*/}
{/* <div className="sm:flex justify-between items-center">*/} {/* </div>*/}
{/* <div className="account-name flex space-x-4 items-center mb-2 sm:mb-0">*/} {/* <div className="name">*/}
{/* <div*/} {/* <p className="text-base text-dark-gray dark:text-white font-medium">*/}
{/* className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple ">*/} {/* Bitski*/}
{/* <img src={bank2} alt=""/>*/} {/* </p>*/}
{/* </div>*/} {/* </div>*/}
{/* <div className="name">*/} {/* </div>*/}
{/* <p className="text-base text-dark-gray dark:text-white font-medium">*/} {/* <div>*/}
{/* Coinbase Wallet*/} {/* <p className="eth text-xl font-bold text-purple">*/}
{/* </p>*/} {/* 99,123 ETH*/}
{/* </div>*/} {/* </p>*/}
{/* </div>*/} {/* <p className="usd text-base text-thin-light-gray text-right">*/}
{/* <div>*/} {/* (773.69 USD)*/}
{/* <p className="eth text-xl font-bold text-purple">*/} {/* </p>*/}
{/* 56,124 ETH*/} {/* </div>*/}
{/* </p>*/} {/* </div>*/}
{/* <p className="usd text-base text-thin-light-gray text-right">*/} {/*</li>*/}
{/* (773.69 USD)*/} {/*<li className="content-item py-5">*/}
{/* </p>*/} {/* <div className="sm:flex justify-between items-center">*/}
{/* </div>*/} {/* <div className="account-name flex space-x-4 items-center mb-2 sm:mb-0">*/}
{/* </div>*/} {/* <div*/}
{/*</li>*/} {/* className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple ">*/}
{/*<li className="content-item py-4 border-b dark:border-[#5356fb29] border-light-purple hover:border-purple dark:hover:border-purple">*/} {/* <img src={bank4} alt=""/>*/}
{/* <div className="sm:flex justify-between items-center">*/} {/* </div>*/}
{/* <div className="account-name flex space-x-4 items-center mb-2 sm:mb-0">*/} {/* <div className="name">*/}
{/* <div*/} {/* <p className="text-base text-dark-gray dark:text-white font-medium">*/}
{/* className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple ">*/} {/* WalletConnect*/}
{/* <img src={bank3} alt=""/>*/} {/* </p>*/}
{/* </div>*/} {/* </div>*/}
{/* <div className="name">*/} {/* </div>*/}
{/* <p className="text-base text-dark-gray dark:text-white font-medium">*/} {/* <div>*/}
{/* Bitski*/} {/* <p className="eth text-xl font-bold text-purple">*/}
{/* </p>*/} {/* 43,728 ETH*/}
{/* </div>*/} {/* </p>*/}
{/* </div>*/} {/* <p className="usd text-base text-thin-light-gray text-right">*/}
{/* <div>*/} {/* (773.69 USD)*/}
{/* <p className="eth text-xl font-bold text-purple">*/} {/* </p>*/}
{/* 99,123 ETH*/} {/* </div>*/}
{/* </p>*/} {/* </div>*/}
{/* <p className="usd text-base text-thin-light-gray text-right">*/} {/*</li>*/}
{/* (773.69 USD)*/} </ul>
{/* </p>*/} <div className="add-money-btn flex justify-center items-center mt-3">
{/* </div>*/} {/* <button
{/* </div>*/} onClick={() => {
{/*</li>*/} if(pathname == '/my-wallet') props.setBalanceDropdown.toggle()
{/*<li className="content-item py-5">*/} else navigate('/my-wallet', {replace: true})
{/* <div className="sm:flex justify-between items-center">*/} }}
{/* <div className="account-name flex space-x-4 items-center mb-2 sm:mb-0">*/}
{/* <div*/}
{/* className="icon w-14 h-14 transition duration-300 ease-in-out rounded-full flex justify-center items-center bg-light-purple dark:bg-dark-light-purple ">*/}
{/* <img src={bank4} alt=""/>*/}
{/* </div>*/}
{/* <div className="name">*/}
{/* <p className="text-base text-dark-gray dark:text-white font-medium">*/}
{/* WalletConnect*/}
{/* </p>*/}
{/* </div>*/}
{/* </div>*/}
{/* <div>*/}
{/* <p className="eth text-xl font-bold text-purple">*/}
{/* 43,728 ETH*/}
{/* </p>*/}
{/* <p className="usd text-base text-thin-light-gray text-right">*/}
{/* (773.69 USD)*/}
{/* </p>*/}
{/* </div>*/}
{/* </div>*/}
{/*</li>*/}
</ul>
<div className="add-money-btn flex justify-center items-center mt-3">
{/* <button
onClick={() => props.addMoneyHandler()}
type="button" type="button"
className="w-[122px] h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white" className="w-[122px] h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
> >
Manage Manage
</button> */} </button> */}
<Link to='/my-wallet' className="w-[122px] h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white">Manage</Link> <Link
</div> to="/my-wallet"
</div> onClick={() => {
</div> if (pathname == "/my-wallet")
props.setBalanceDropdown.toggle();
else navigate("/my-wallet", { replace: true });
}}
className="w-[122px] h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
>
Manage
</Link>
</div> </div>
{/*<div*/} </div>
{/* className="lg:hidden flex user-balance cursor-pointer lg:w-[252px] w-[150px] h-[48px] items-center rounded-full relative bg-purple">*/} </div>
{/* <div className="flex items-center lg:justify-between justify-center w-full h-full">*/} </div>
{/* <p className="lg:text-xl text-lg font-bold text-white">*/} {/*<div*/}
{/* $ 234,435.34*/} {/* className="lg:hidden flex user-balance cursor-pointer lg:w-[252px] w-[150px] h-[48px] items-center rounded-full relative bg-purple">*/}
{/* </p>*/} {/* <div className="flex items-center lg:justify-between justify-center w-full h-full">*/}
{/* </div>*/} {/* <p className="lg:text-xl text-lg font-bold text-white">*/}
{/*</div>*/} {/* $ 234,435.34*/}
<div className="lg:hidden block"></div> {/* </p>*/}
</>); {/* </div>*/}
{/*</div>*/}
<div className="lg:hidden block"></div>
</>
);
} }
+1 -1
View File
@@ -3,7 +3,7 @@ import { createRoutesFromChildren } from 'react-router-dom';
const PaginatedList = ({ onClick, prev, next, data, start, stop }) => { const PaginatedList = ({ onClick, prev, next, data, start, stop }) => {
if(data.length){ if(data.length > process.env.REACT_APP_ITEM_PER_PAGE){
return ( return (
<div className='p-3 flex justify-center items-center space-x-2 border-t-2'> <div className='p-3 flex justify-center items-center space-x-2 border-t-2'>
{/* Render pagination buttons */} {/* Render pagination buttons */}
+12 -2
View File
@@ -1,5 +1,5 @@
import React, { useContext,useState, useEffect } from "react"; import React, { useContext,useState, useEffect } from "react";
import { Link } from "react-router-dom"; import { Link, useLocation } from "react-router-dom";
import bank1 from "../../assets/images/bank-1.png"; import bank1 from "../../assets/images/bank-1.png";
import bank2 from "../../assets/images/bank-2.png"; import bank2 from "../../assets/images/bank-2.png";
import bank3 from "../../assets/images/bank-3.png"; import bank3 from "../../assets/images/bank-3.png";
@@ -91,6 +91,15 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
setToggleNotification.toggle() setToggleNotification.toggle()
} }
// getting the location of head
let {pathname} = useLocation()
const handleWalletBtn = () => {
if (pathname === "/my-wallet"){
setbalanceValue.set(false)
} else return balanceDropdown
}
// User Profile // User Profile
let {firstname, lastname, email, profile_pic} = userDetails let {firstname, lastname, email, profile_pic} = userDetails
let userEmail = email.split('@')[0] let userEmail = email.split('@')[0]
@@ -234,7 +243,8 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
myWalletList={myWalletList} myWalletList={myWalletList}
handlerBalance={handlerBalance} handlerBalance={handlerBalance}
balanceDropdown={balanceDropdown} balanceDropdown={balanceDropdown}
addMoneyHandler={addMoneyHandler} /> addMoneyHandler={addMoneyHandler}
setBalanceDropdown = {setbalanceValue} />
{/* notification */} {/* notification */}
<div className="user-notification lg:block hidden relative"> <div className="user-notification lg:block hidden relative">
<div <div
+36 -38
View File
@@ -12,7 +12,7 @@ export default function MobileSidebar({ sidebar, action, logoutModalHandler }) {
let { jobLists } = useSelector((state) => state.jobLists); let { jobLists } = useSelector((state) => state.jobLists);
const marketData = jobLists?.result_list; const marketData = jobLists?.result_list;
let noOfJobs = marketData?.length; let noOfJobs = marketData?.length <= 0 ? "0" : marketData?.length;
return ( return (
<div className="w-full h-full"> <div className="w-full h-full">
@@ -163,19 +163,20 @@ export default function MobileSidebar({ sidebar, action, logoutModalHandler }) {
</div> </div>
</div> </div>
{!userDetails.post_jobs ? {!userDetails.post_jobs ? (
<div className="setting-item"> <div className="setting-item">
<div className="top-platform bg-pink dark:bg-dark-white rounded-2xl p-16 2xl:w-[180px] w-full 2xl:mb-10 2xl:border-none border "> <div className="top-platform bg-pink dark:bg-dark-white rounded-2xl p-16 2xl:w-[180px] w-full 2xl:mb-10 2xl:border-none border ">
<NavLink to="/start-job" className="nav-item flex items-center justify-start space-x-3.5"> <NavLink
<span className="item-content relative group-hover:text-purple text-xl transition-all duration-300 ease-in-out text-lighter-gray font-medium active flex-1"> to="/start-job"
Enable Job Post className="nav-item flex items-center justify-start space-x-3.5"
</span> >
</NavLink> <span className="item-content relative group-hover:text-purple text-xl transition-all duration-300 ease-in-out text-lighter-gray font-medium active flex-1">
Enable Job Post
</span>
</NavLink>
</div>
</div> </div>
</div> ) : jobLists?.result_list?.length ? (
:
jobLists?.result_list?.length ?
(
<div className="setting-item"> <div className="setting-item">
<div className="heading mb-5"> <div className="heading mb-5">
<h1 className="title text-xl font-bold text-purple">My Jobs</h1> <h1 className="title text-xl font-bold text-purple">My Jobs</h1>
@@ -224,33 +225,30 @@ export default function MobileSidebar({ sidebar, action, logoutModalHandler }) {
</ul> </ul>
</div> </div>
</div> </div>
) ) : (
: <div className="setting-item">
( <div className="heading mb-5">
<div className="setting-item"> <h1 className="title text-xl font-bold text-purple">My Jobs</h1>
<div className="heading mb-5">
<h1 className="title text-xl font-bold text-purple">My Jobs</h1>
</div>
<div className="items">
<ul className="flex flex-col space-y-6">
<li className="item group">
<NavLink
to="/add-job"
className="nav-item flex items-center justify-start space-x-3.5"
>
<span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white">
<Icons name="people-two" />
</span>
<span className="item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium active flex-1">
My Jobs
</span>
</NavLink>
</li>
</ul>
</div>
</div> </div>
) <div className="items">
} <ul className="flex flex-col space-y-6">
<li className="item group">
<NavLink
to="/add-job"
className="nav-item flex items-center justify-start space-x-3.5"
>
<span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white">
<Icons name="people-two" />
</span>
<span className="item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium active flex-1">
My Jobs
</span>
</NavLink>
</li>
</ul>
</div>
</div>
)}
</div> </div>
{/* signout area */} {/* signout area */}
{sidebar ? ( {sidebar ? (
+196 -131
View File
@@ -13,7 +13,7 @@ export default function Sidebar({ sidebar, action, logoutModalHandler }) {
let { jobLists } = useSelector((state) => state.jobLists); let { jobLists } = useSelector((state) => state.jobLists);
const marketData = jobLists?.result_list; const marketData = jobLists?.result_list;
let noOfJobs = marketData?.length; let noOfJobs = marketData?.length <= 0 ? "0" : marketData?.length;
useEffect(() => { useEffect(() => {
const title = document.querySelectorAll(".menu-setting-items .heading"); const title = document.querySelectorAll(".menu-setting-items .heading");
@@ -112,7 +112,7 @@ export default function Sidebar({ sidebar, action, logoutModalHandler }) {
title={name} title={name}
route={path} route={path}
bubble={bubble} bubble={bubble}
sidebar sidebar = {sidebar}
/> />
))} ))}
{/*<li className="item group">*/} {/*<li className="item group">*/}
@@ -220,46 +220,38 @@ export default function Sidebar({ sidebar, action, logoutModalHandler }) {
</ul> </ul>
</div> </div>
</div> </div>
{/*<div className="setting-item">*/}
{/* <div class="heading bg-pink dark:bg-dark-white rounded-2xl p-6 2xl:w-[180px] w-full 2xl:mb-10 2xl:border-none border ">*/}
{/* <NavLink to="/acc-family">*/}
{/* <span className="item-content relative group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray font-medium active flex-1">*/}
{/* Family Account*/}
{/* </span>*/}
{/* </NavLink>*/}
{/* </div>*/}
{/*</div>*/}
<div className="setting-item"> {/* <div className="setting-item">
<div className="heading mb-5 bg-dark-blue rounded-2xl p-2 2xl:w-[180px] w-full 2xl:mb-10 2xl:border-none border"> <div class="heading bg-pink dark:bg-dark-white rounded-2xl p-6 2xl:w-[180px] w-full 2xl:mb-10 2xl:border-none border ">
<NavLink to="/acc-family"> <NavLink to="/acc-family">
<h1 className="title text-xl font-bold text-purple">Family Corner</h1> <span className="item-content relative group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray font-medium active flex-1">
</NavLink> Family Account
</div> </span>
</div> </NavLink>
</div>
</div> */}
{!userDetails.post_jobs ? {/* menu and settings item */}
<div className="setting-item"> <div className="menu-setting-items mb-11">
<div className="top-platform bg-pink dark:bg-dark-white rounded-2xl p-16 2xl:w-[180px] w-full 2xl:mb-10 2xl:border-none border "> {/* menus item */}
<NavLink to="/start-job"> <div className={`menu-item transition-all duration-300 ease-in-out ${
<span className="item-content relative group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray font-medium active flex-1"> sidebar ? "mb-14" : ""
Enable Job Post }`}>
</span> {/* <div className="heading mb-5 bg-dark-blue rounded-2xl p-2 2xl:w-[180px] w-full 2xl:mb-10 2xl:border-none border">
</NavLink> <NavLink to="/acc-family">
</div> <h1 className="title text-xl font-bold text-purple">
</div> Family Corner
: </h1>
jobLists?.result_list?.length ? </NavLink>
( </div> */}
<div className="setting-item"> <div className="items">
<div className="heading mb-5"> <div className="heading mb-5">
<h1 className="title text-xl font-bold text-purple">My Jobs</h1> <h1 className="title text-xl font-bold text-purple">Family</h1>
</div> </div>
<div className="items">
<ul className="flex flex-col space-y-6"> <ul className="flex flex-col space-y-6">
<li className="item group"> <li className="item group">
<NavLink <NavLink
to="/myjobs" to="/acc-family"
className={`nav-item flex items-center ${ className={`nav-item flex items-center ${
((navData) => (navData.isActive ? "active" : ""), ((navData) => (navData.isActive ? "active" : ""),
sidebar ? "justify-start space-x-3.5" : "justify-center") sidebar ? "justify-start space-x-3.5" : "justify-center")
@@ -273,105 +265,39 @@ export default function Sidebar({ sidebar, action, logoutModalHandler }) {
sidebar ? "active flex-1" : "w-0" sidebar ? "active flex-1" : "w-0"
}`} }`}
> >
List Family Corner
</span> </span>
</NavLink> </NavLink>
</li> </li>
<li className="item group">
<NavLink
to="/my-pending-jobs"
className={`nav-item flex items-center ${
((navData) => (navData.isActive ? "active" : ""),
sidebar ? "justify-start space-x-3.5" : "justify-center")
}`}
>
<span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">
<Icons name="people-two" />
</span>
<span
className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${
sidebar ? "active flex-1" : "w-0"
}`}
>
Pending
</span>
</NavLink>
</li>
<li className="item group">
<NavLink
to="/my-active-jobs"
className={`nav-item flex items-center ${
((navData) => (navData.isActive ? "active" : ""),
sidebar ? "justify-start space-x-3.5" : "justify-center")
}`}
>
<span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">
<Icons name="people-two" />
</span>
<span
className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${
sidebar ? "active flex-1" : "w-0"
}`}
>
Active
</span>
</NavLink>
</li>
{/*<li className="item group">*/}
{/* <NavLink*/}
{/* to="/profile"*/}
{/* className={`nav-item flex items-center ${*/}
{/* ((navData) => (navData.isActive ? "active" : ""),*/}
{/* sidebar ? "justify-start space-x-3.5" : "justify-center")*/}
{/* }`}*/}
{/* >*/}
{/* <span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">*/}
{/* <Icons name="people-two" />*/}
{/* </span>*/}
{/* <span*/}
{/* className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${*/}
{/* sidebar ? "active flex-1" : "w-0"*/}
{/* }`}*/}
{/* >*/}
{/* My Profile*/}
{/* </span>*/}
{/* </NavLink>*/}
{/*</li>*/}
{/*<li className="item group">*/}
{/* <NavLink*/}
{/* to="/settings"*/}
{/* className={`nav-item flex items-center ${*/}
{/* ((navData) => (navData.isActive ? "active" : ""),*/}
{/* sidebar ? "justify-start space-x-3.5" : "justify-center")*/}
{/* }`}*/}
{/* >*/}
{/* <span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">*/}
{/* <Icons name="setting" />*/}
{/* </span>*/}
{/* <span*/}
{/* className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${*/}
{/* sidebar ? "active flex-1" : "w-0"*/}
{/* }`}*/}
{/* >*/}
{/* Settings*/}
{/* </span>*/}
{/* </NavLink>*/}
{/*</li>*/}
</ul> </ul>
</div> </div>
</div> </div>
) </div>
:
( {!userDetails.post_jobs ? (
<div className="setting-item">
<div className="heading mb-5"> <div className="menu-setting-items mb-11">
<h1 className="title text-xl font-bold text-purple">My Jobs</h1> {/* menus item */}
</div> <div className={`menu-item transition-all duration-300 ease-in-out bg-pink dark:bg-dark-white rounded-2xl p-3 ${
sidebar ? "mb-14" : "rounded-none p-0"
}`}>
{/* <div className="setting-item">
<div className="top-platform bg-pink dark:bg-dark-white rounded-2xl p-16 2xl:w-[180px] w-full 2xl:mb-10 2xl:border-none border">
<NavLink to="/start-job">
<span className="item-content relative group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray font-medium active flex-1">
Enable Job Post
</span>
</NavLink>
</div>
</div> */}
<div className="items"> <div className="items">
<div className="heading mb-5">
<h1 className="title text-xl font-bold text-purple">Job Post</h1>
</div>
<ul className="flex flex-col space-y-6"> <ul className="flex flex-col space-y-6">
<li className="item group"> <li className="item group">
<NavLink <NavLink
to="/add-job" to="/start-job"
className={`nav-item flex items-center ${ className={`nav-item flex items-center ${
((navData) => (navData.isActive ? "active" : ""), ((navData) => (navData.isActive ? "active" : ""),
sidebar ? "justify-start space-x-3.5" : "justify-center") sidebar ? "justify-start space-x-3.5" : "justify-center")
@@ -385,16 +311,155 @@ export default function Sidebar({ sidebar, action, logoutModalHandler }) {
sidebar ? "active flex-1" : "w-0" sidebar ? "active flex-1" : "w-0"
}`} }`}
> >
Add Job Enable Job Post
</span> </span>
</NavLink> </NavLink>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
) </div>
} ) : jobLists?.result_list?.length ? (
<div className="setting-item">
<div className="heading mb-5">
<h1 className="title text-xl font-bold text-purple">My Jobs</h1>
</div>
<div className="items">
<ul className="flex flex-col space-y-6">
<li className="item group">
<NavLink
to="/myjobs"
className={`nav-item flex items-center ${
((navData) => (navData.isActive ? "active" : ""),
sidebar ? "justify-start space-x-3.5" : "justify-center")
}`}
>
<span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">
<Icons name="people-two" />
</span>
<span
className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${
sidebar ? "active flex-1" : "w-0"
}`}
>
List
</span>
</NavLink>
</li>
<li className="item group">
<NavLink
to="/my-pending-jobs"
className={`nav-item flex items-center ${
((navData) => (navData.isActive ? "active" : ""),
sidebar ? "justify-start space-x-3.5" : "justify-center")
}`}
>
<span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">
<Icons name="people-two" />
</span>
<span
className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${
sidebar ? "active flex-1" : "w-0"
}`}
>
Pending
</span>
</NavLink>
</li>
<li className="item group">
<NavLink
to="/my-active-jobs"
className={`nav-item flex items-center ${
((navData) => (navData.isActive ? "active" : ""),
sidebar ? "justify-start space-x-3.5" : "justify-center")
}`}
>
<span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">
<Icons name="people-two" />
</span>
<span
className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${
sidebar ? "active flex-1" : "w-0"
}`}
>
Active
</span>
</NavLink>
</li>
{/*<li className="item group">*/}
{/* <NavLink*/}
{/* to="/profile"*/}
{/* className={`nav-item flex items-center ${*/}
{/* ((navData) => (navData.isActive ? "active" : ""),*/}
{/* sidebar ? "justify-start space-x-3.5" : "justify-center")*/}
{/* }`}*/}
{/* >*/}
{/* <span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">*/}
{/* <Icons name="people-two" />*/}
{/* </span>*/}
{/* <span*/}
{/* className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${*/}
{/* sidebar ? "active flex-1" : "w-0"*/}
{/* }`}*/}
{/* >*/}
{/* My Profile*/}
{/* </span>*/}
{/* </NavLink>*/}
{/*</li>*/}
{/*<li className="item group">*/}
{/* <NavLink*/}
{/* to="/settings"*/}
{/* className={`nav-item flex items-center ${*/}
{/* ((navData) => (navData.isActive ? "active" : ""),*/}
{/* sidebar ? "justify-start space-x-3.5" : "justify-center")*/}
{/* }`}*/}
{/* >*/}
{/* <span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">*/}
{/* <Icons name="setting" />*/}
{/* </span>*/}
{/* <span*/}
{/* className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${*/}
{/* sidebar ? "active flex-1" : "w-0"*/}
{/* }`}*/}
{/* >*/}
{/* Settings*/}
{/* </span>*/}
{/* </NavLink>*/}
{/*</li>*/}
</ul>
</div>
</div>
) : (
<div className="setting-item">
<div className="heading mb-5">
<h1 className="title text-xl font-bold text-purple">My Jobs</h1>
</div>
<div className="items">
<ul className="flex flex-col space-y-6">
<li className="item group">
<NavLink
to="/add-job"
className={`nav-item flex items-center ${
((navData) => (navData.isActive ? "active" : ""),
sidebar ? "justify-start space-x-3.5" : "justify-center")
}`}
>
<span className="item-icon group-hover:bg-purple group-hover:text-white w-8 h-8 flex justify-center items-center transition-all duration-300 ease-in-out bg-light-purple dark:bg-dark-light-purple rounded-full text-dark-gray dark:text-white dark:text-lighter-gray">
<Icons name="people-two" />
</span>
<span
className={`item-content group-hover:text-purple text-[18px] transition-all duration-300 ease-in-out text-lighter-gray relative font-medium ${
sidebar ? "active flex-1" : "w-0"
}`}
>
Add Job
</span>
</NavLink>
</li>
</ul>
</div>
</div>
)}
</div> </div>
{/* signout area */} {/* signout area */}
{sidebar ? ( {sidebar ? (
+310
View File
@@ -0,0 +1,310 @@
import React, { useCallback, useEffect, useMemo, useState } from "react";
import ModalCom from "../Helpers/ModalCom";
import { Form, Formik } from "formik";
import * as Yup from "yup";
import InputCom from "../Helpers/Inputs/InputCom";
import LoadingSpinner from "../Spinners/LoadingSpinner";
import usersService from "../../services/UsersService";
import { useNavigate } from "react-router-dom";
const EditJobPopOut = ({ details, onClose, situation, country }) => {
let [requestStatus, setRequestStatus] = useState({
loading: false,
status: false,
message: "",
}); // Holds state when submit button is pressed
const validationSchema = Yup.object().shape({
country: Yup.string()
.min(1, "Minimum 3 characters")
.max(25, "Maximum 25 characters")
.required("Country is required"),
price: Yup.number()
.typeError("you must specify a number")
.min(1, "Price must be greater than 0")
.required("Price is required"),
title: Yup.string()
.min(3, "Minimum 3 characters")
.max(100, "Maximum 25 characters")
.required("Title is required"),
description: Yup.string()
.min(3, "Minimum 3 characters")
.max(250, "Maximum 250 characters")
.required("Description is required"),
job_detail: Yup.string()
.min(3, "Minimum 3 characters")
.max(250, "Maximum 250 characters")
.required("Details is required"),
timeline_days: Yup.number()
.typeError("you must specify a number")
.min(1, "Price must be greater than 0")
.required("Price is required"),
});
let initialValues = {
// initial values for formik
country: country,
price: details?.price,
title: details?.title,
description: details?.description,
job_detail: details?.job_detail,
timeline_days: details?.timeline_days,
};
const jobApi = useMemo(() => new usersService(), []);
const navigate = useNavigate();
const handleEditJob = useCallback(
async (values) => {
setRequestStatus({ loading: true, message: "" });
let reqData = {
job_id: details.job_id,
job_uid: details.job_uid,
...values,
};
try {
let res = await jobApi.jobManagerUpdateJob(reqData);
let { data } = await res;
if (data?.internal_return < 0) return;
setRequestStatus({ loading: false, message: null });
setTimeout(() => {
navigate("/myjobs", { replace: true });
onClose();
}, 1000);
} catch (error) {
setRequestStatus({ loading: false, message: error });
throw new Error(error);
}
},
[jobApi, navigate, onClose, details]
);
return (
<ModalCom action={onClose} situation={situation} className="edit-popup">
<div className="logout-modal-wrapper lg:w-[600px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl">
<div className="logout-modal-header w-full flex items-center justify-between lg:px-10 lg:py-8 px-[30px] py-[23px] border-b border-light-purple dark:border-[#5356fb29] ">
<h1 className="text-26 font-bold text-dark-gray dark:text-white tracking-wide">
Edit Job
</h1>
<button
type="button"
className="text-[#374557] dark:text-red-500"
onClick={onClose}
>
<svg
width="36"
height="36"
viewBox="0 0 36 36"
fill="none"
className="fill-current"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M36 16.16C36 17.4399 36 18.7199 36 20.0001C35.7911 20.0709 35.8636 20.2554 35.8385 20.4001C34.5321 27.9453 30.246 32.9248 22.9603 35.2822C21.9006 35.6251 20.7753 35.7657 19.6802 35.9997C18.4003 35.9997 17.1204 35.9997 15.8401 35.9997C15.5896 35.7086 15.2189 35.7732 14.9034 35.7093C7.77231 34.2621 3.08728 30.0725 0.769671 23.187C0.435002 22.1926 0.445997 21.1199 0 20.1599C0 18.7198 0 17.2798 0 15.8398C0.291376 15.6195 0.214408 15.2656 0.270759 14.9808C1.71321 7.69774 6.02611 2.99691 13.0428 0.700951C14.0118 0.383805 15.0509 0.386897 15.9999 0C17.2265 0 18.4532 0 19.6799 0C19.7156 0.124041 19.8125 0.136067 19.9225 0.146719C27.3 0.868973 33.5322 6.21922 35.3801 13.427C35.6121 14.3313 35.7945 15.2484 36 16.16ZM33.011 18.0787C33.0433 9.77105 26.3423 3.00309 18.077 2.9945C9.78479 2.98626 3.00344 9.658 2.98523 17.8426C2.96667 26.1633 9.58859 32.9601 17.7602 33.0079C26.197 33.0577 32.9787 26.4186 33.011 18.0787Z"
fill=""
fillOpacity="0.6"
/>
<path
d="M15.9309 18.023C13.9329 16.037 12.007 14.1207 10.0787 12.2072C9.60071 11.733 9.26398 11.2162 9.51996 10.506C9.945 9.32677 11.1954 9.0811 12.1437 10.0174C13.9067 11.7585 15.6766 13.494 17.385 15.2879C17.9108 15.8401 18.1633 15.7487 18.6375 15.258C20.3586 13.4761 22.1199 11.7327 23.8822 9.99096C24.8175 9.06632 26.1095 9.33639 26.4967 10.517C26.7286 11.2241 26.3919 11.7413 25.9133 12.2178C24.1757 13.9472 22.4477 15.6855 20.7104 17.4148C20.5228 17.6018 20.2964 17.7495 20.0466 17.9485C22.0831 19.974 24.0372 21.8992 25.9689 23.8468C26.9262 24.8119 26.6489 26.1101 25.4336 26.4987C24.712 26.7292 24.2131 26.3441 23.7455 25.8757C21.9945 24.1227 20.2232 22.3892 18.5045 20.6049C18.0698 20.1534 17.8716 20.2269 17.4802 20.6282C15.732 22.4215 13.9493 24.1807 12.1777 25.951C11.7022 26.4262 11.193 26.7471 10.4738 26.4537C9.31345 25.9798 9.06881 24.8398 9.98589 23.8952C11.285 22.5576 12.6138 21.2484 13.9387 19.9355C14.5792 19.3005 15.2399 18.6852 15.9309 18.023Z"
fill="#"
fillOpacity="0.6"
/>
</svg>
</button>
</div>
<div className="logout-modal-body w-full flex flex-col items-center px-10 py-8">
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={handleEditJob}
>
{(props) => (
<Form className="w-full">
<div className="flex flex-col-reverse sm:flex-row">
<div className="fields w-full">
<div className="xl:flex xl:space-x-7 mb-6">
<div className="field w-full mb-6 xl:mb-0">
<InputCom
fieldClass="px-6 cursor-default"
label="Country"
labelClass="tracking-wide"
inputBg="bg-slate-100"
inputClass="input-curve lg border border-light-purple"
type="text"
name="country"
value={props.values.country}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
disable={true}
/>
{props.errors.country && props.touched.country && (
<p className="text-sm text-red-500">
{props.errors.country}
</p>
)}
</div>
{/* Price */}
<div className="field w-full">
<InputCom
fieldClass="px-6 text-right"
label="Price"
labelClass="tracking-wide"
inputBg="bg-slate-100"
inputClass="input-curve lg border border-light-purple"
type="number"
name="price"
// placeholder="Please Enter Amount"
value={props.values.price}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.price && props.touched.price && (
<p className="text-sm text-red-500">
{props.errors.price}
</p>
)}
</div>
</div>
{/* Title */}
<div className="field w-full mb-6">
<InputCom
fieldClass="px-6"
label="Title"
labelClass="tracking-wide"
inputBg="bg-slate-100"
inputClass=" input-curve lg border border-light-purple"
type="text"
name="title"
// placeholder="Enter Job Title"
value={props.values.title}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.title && props.touched.title && (
<p className="text-sm text-red-500">
{props.errors.title}
</p>
)}
</div>
{/* Description */}
<div className="field w-full mb-6">
<InputCom
fieldClass="px-6"
label="Description"
labelClass="tracking-wide"
inputBg="bg-slate-100"
inputClass=" input-curve lg border border-light-purple"
type="text"
name="description"
// placeholder="Enter a description"
value={props.values.description}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.description &&
props.touched.description && (
<p className="text-sm text-red-500">
{props.errors.description}
</p>
)}
</div>
{/* Details */}
<div className="field w-full mb-6">
<label
htmlFor="Job Delivery Details"
className='className="input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold block mb-3'
>
Job Delivery Details
</label>
<textarea
id="Job Delivery Details"
rows="5"
className={`input-field px-6 py-2 placeholder:text-base text-dark-gray dark:text-white w-full h-[100px] bg-slate-100 dark:bg-[#11131F] focus:ring-0 focus:outline-[#dce4e9] border border-[#dce4e9] rounded-[10px]`}
style={{ resize: "none" }}
name="job_detail"
value={props.values.job_detail}
onChange={props.handleChange}
onBlur={props.handleBlur}
/>
{props.errors.job_detail && props.touched.job_detail && (
<p className="text-sm text-red-500">
{props.errors.job_detail}
</p>
)}
</div>
<div className="field w-full mb-6">
<InputCom
fieldClass="px-6"
label="Timeline"
labelClass="tracking-wide"
inputBg="bg-slate-100"
inputClass=" input-curve lg border border-[#dce4e9]"
type="text"
name="timeline_days"
spanTag=" - Expected duration of this task"
// placeholder="Please Enter Detail Description of Job"
value={props.values.timeline_days}
inputHandler={props.handleChange}
blurHandler={props.handleBlur}
/>
{props.errors.timeline_days &&
props.touched.timeline_days && (
<p className="text-sm text-red-500">
{props.errors.timeline_days}
</p>
)}
</div>
{/* inputs ends here */}
</div>
</div>
{/* ERROR DISPLAY AND SUBMIT BUTTON */}
<div className="content-footer w-full">
{/* error or success display */}
{requestStatus.message != "" &&
(!requestStatus.status ? (
<div
className={`relative p-4 my-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
) : (
requestStatus.status && (
<div
className={`relative p-4 my-4 text-green-700 bg-slate-200 border-slate-800 mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
)
))}
{/* End of error or success display */}
<div className="w-full border-t border-light-purple dark:border-[#5356fb29] flex justify-end items-center">
<div className="flex items-center space-x-4 mr-2 mt-2">
{requestStatus.loading ? (
<LoadingSpinner size="6" color="sky-blue" />
) : (
<button
type="submit"
className="w-[120px] h-[40px] flex justify-center items-center btn-gradient text-base rounded-full text-white"
// className='w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white'
>
Edit Job
</button>
)}
</div>
</div>
</div>
</Form>
)}
</Formik>
</div>
</div>
</ModalCom>
);
};
export default EditJobPopOut;
@@ -3,7 +3,7 @@ import Detail from './popoutcomponent/Detail'
import ModalCom from '../Helpers/ModalCom' import ModalCom from '../Helpers/ModalCom'
function ActiveJobsPopout({details, onClose, situation}) { function PendingJobsPopout({details, onClose, situation}) {
return ( return (
<ModalCom action={onClose} situation={situation}> <ModalCom action={onClose} situation={situation}>
<div className="logout-modal-wrapper lw-[90%] md:w-[768px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto"> <div className="logout-modal-wrapper lw-[90%] md:w-[768px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto">
@@ -66,7 +66,7 @@ function ActiveJobsPopout({details, onClose, situation}) {
<div className='my-2 md:flex'> <div className='my-2 md:flex'>
<Detail <Detail
label='Offer Expire' label='Offer Expire'
value={`${details.expire.split(' ')[0]} ${details.expire.split(' ')[1].split('.')[0]}`} value={details.expire && `${details.expire.split(' ')[0]} ${details.expire.split(' ')[1].split('.')[0]}`}
/> />
</div> </div>
@@ -139,4 +139,4 @@ function ActiveJobsPopout({details, onClose, situation}) {
) )
} }
export default ActiveJobsPopout export default PendingJobsPopout
+8
View File
@@ -771,3 +771,11 @@ TODO: Responsive ===========================
background-color: #fff; background-color: #fff;
background: linear-gradient(134.38deg, #f539f8 0%, #c342f9 43.55%, #5356fb 104.51%); background: linear-gradient(134.38deg, #f539f8 0%, #c342f9 43.55%, #5356fb 104.51%);
} }
.input-curve.lg{
border-radius: 35px !important;
}
.edit-popup{
top: 75px;
}
+50
View File
@@ -198,6 +198,18 @@ class usersService {
return this.postAuxEnd("/sendmoneyfee", postData); return this.postAuxEnd("/sendmoneyfee", postData);
} }
// Task for the person doing the job
getMyActiveTaskList(){
var postData = {
uuid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
page:0,
offset:0,
limit :100
};
return this.postAuxEnd("/activetaskslist", postData);
}
getMyActiveJobList(){ getMyActiveJobList(){
var postData = { var postData = {
uuid: localStorage.getItem("uid"), uuid: localStorage.getItem("uid"),
@@ -449,6 +461,44 @@ class usersService {
return this.postAuxEnd("/jobmanagercreatejob", postData); return this.postAuxEnd("/jobmanagercreatejob", postData);
} }
jobManagerUpdateJob(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
job_id: localStorage.getItem("job_id"),
action: 13010,
...reqData
};
return this.postAuxEnd("/jobmanagerupdatejob", postData);
}
// FUNCTION TO GET ACTIVE JOB MESSAGE LIST
activeJobMesList(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
limit: 30,
action: 14011,
offset: 0,
...reqData
};
return this.postAuxEnd("/activejobmsglist", postData);
}
// FUNCTION TO SEND ACTIVE JOB TASK MESSAGE
sendTaskMessage(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 14010,
...reqData
};
return this.postAuxEnd("/sendtaskmessage", postData);
}
// END POINT TO DELETE A JOB // END POINT TO DELETE A JOB
deleteJob(reqData) { deleteJob(reqData) {
var postData = { var postData = {
+46
View File
@@ -0,0 +1,46 @@
import React, {useState, useEffect} from 'react'
import ActiveJobs from '../components/MyActiveJobs/ActiveJobs'
import { useLocation, useNavigate } from 'react-router-dom'
import usersService from '../services/UsersService'
function ManageActiveJobs() {
const ApiCall = new usersService()
let navigate = useNavigate()
let {state} = useLocation()
let [details, setDetails] = useState({}) // to hold state values
let [activeJobMesList, setActiveJobMesList] = useState({loading: true, error: false, data: []})
let [activeJobMesListReload, setActiveJobMesListReload] = useState(false)// state to determine when ACTIVE JOB MESSAGE LIST RELOADS/RE-RENDERS
const getActiveJobMesList = () => { // FUNCTION TO GET ACTIVE JOB MESSAGE LIST
setActiveJobMesList({loading: true, error: false, data: []})
let contract = {contract: state.contract}
ApiCall.activeJobMesList(contract).then((res)=>{
if(res.status != 200 || res.data.internal_return < 0){
setActiveJobMesList({loading: false, error: false, data: []})
return
}
setActiveJobMesList({loading: false, error: false, data: res.data.result_list})
}).catch((error)=>{
setActiveJobMesList({loading: false, error: true, data: []})
})
}
useEffect(()=>{
if(!state){
navigate('/my-active-jobs', {replace: true})
}
setDetails(state)
getActiveJobMesList()
},[activeJobMesListReload])
return (
<ActiveJobs details={state} activeJobMesList={activeJobMesList} reloadActiveJobList={setActiveJobMesListReload} />
)
}
export default ManageActiveJobs
+1 -1
View File
@@ -10,7 +10,7 @@ export default function MyTaskPage() {
const getMyActiveJobList = async () => { const getMyActiveJobList = async () => {
try { try {
const res = await api.getMyActiveJobList(); const res = await api.getMyActiveTaskList();
setMyActiveJobList(res.data); setMyActiveJobList(res.data);
} catch (error) { } catch (error) {
console.log("Error getting mode"); console.log("Error getting mode");