-
-
-
- {filterCategories[selectedCategory]} Jobs
-
-
-
-
- {MyJobList?.loading ? (
-
- ) : (
-
-
-
- <>
- {MyJobList &&
- MyJobList?.data?.result_list &&
- MyJobList.data?.result_list.length > 0 ? (
- filteredCurrentJobList?.length ? (
- filteredCurrentJobList.map((value, index) => (
-
- ))
- ) : (
-
- |
- No Jobs Available In This Category!
- |
-
- )
- ) : (
-
- | No Jobs Avaliable! |
-
- )}
- >
-
-
+ const NoJobsRow = ({ text }) => (
+
+ | {text} |
+
+ );
- {/* PAGINATION BUTTON */}
-
=
- currentJobList?.length
- ? true
- : false
- }
- data={currentJobList}
- start={indexOfFirstItem}
- stop={indexOfLastItem}
- />
- {/* END OF PAGINATION BUTTON */}
-
- )}
+ const MyJobListTable = () => (
+
+
+
+ <>
+ {MyJobList?.data?.result_list?.length > 0 ? (
+ filteredCurrentJobList.length > 0 ? (
+ filteredCurrentJobList.map((value, index) => (
+
+ ))
+ ) : (
+
+ )
+ ) : (
+
+ )}
+ >
+
+
- {/* Job List Popout */}
- {jobPopout.show && (
-
{
- setJobPopout({ show: false, data: {} });
- }}
- situation={jobPopout.show}
- />
- )}
- {/* End of Job List Popout */}
-
- {/* Delete Job Popout */}
- {deleteJobPopout.show && (
- {
- setDeleteJobPopout({ show: false, data: {} });
- }}
- reloadJobList={reloadJobList}
- situation={deleteJobPopout.show}
- />
- )}
- {/* END of Delete Job Popout */}
-
- {editJob.show && (
- {
- setEditJob({
- show: false,
- data: {},
- });
- }}
- situation={editJob.show}
- country={myCountry}
- categories={currentJobCart}
- />
- )}
+ {/* PAGINATION BUTTON */}
+ =
+ currentJobList?.length
+ ? true
+ : false
+ }
+ data={currentJobList}
+ start={indexOfFirstItem}
+ stop={indexOfLastItem}
+ />
+ {/* END OF PAGINATION BUTTON */}
);
+ return { MyJobListHeader, MyJobListTable };
}
diff --git a/src/components/MyPendingJobs/MyPendingJobTable.jsx b/src/components/MyPendingJobs/MyPendingJobTable.jsx
index 0d69e14..035ca40 100644
--- a/src/components/MyPendingJobs/MyPendingJobTable.jsx
+++ b/src/components/MyPendingJobs/MyPendingJobTable.jsx
@@ -6,9 +6,7 @@ import PendingJobsPopout from "../jobPopout/PendingJobsPopout";
import { PriceFormatter } from "../Helpers/PriceFormatter";
import localImgLoad from "../../lib/localImgLoad";
-
export default function MyPendingJobTable({ MyJobList, className }) {
-
let [jobPopout, setJobPopout] = useState({ show: false, data: {} }); // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW
const [currentPage, setCurrentPage] = useState(0);
@@ -19,7 +17,7 @@ export default function MyPendingJobTable({ MyJobList, className }) {
indexOfFirstItem,
indexOfLastItem
);
-
+
const handlePagination = (e) => {
handlePagingFunc(e, setCurrentPage);
};
@@ -46,7 +44,11 @@ export default function MyPendingJobTable({ MyJobList, className }) {
value?.currency_code,
value?.currency
);
- let image = `${MyJobList.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
+ let image = `${
+ MyJobList.session_image_server
+ }${localStorage.getItem("session_token")}/job/${
+ value.job_uid
+ }`;
return (
- {value.owner_status == 'OWNER' ? 'Manage' : 'Send Updates'}
+ {value.owner_status == "OWNER"
+ ? "Manage"
+ : "View"}
diff --git a/src/components/MyWallet/Popup/CreditPopup.jsx b/src/components/MyWallet/Popup/CreditPopup.jsx
index 717af4e..47b6549 100644
--- a/src/components/MyWallet/Popup/CreditPopup.jsx
+++ b/src/components/MyWallet/Popup/CreditPopup.jsx
@@ -79,7 +79,7 @@ const CreditPopup = ({ details, onClose, situation, walletItem }) => {
) : confirmCredit?.show?.acceptConfirm?.state ? (
diff --git a/src/components/Partials/Default.jsx b/src/components/Partials/Default.jsx
index fb8c123..b3e9d38 100644
--- a/src/components/Partials/Default.jsx
+++ b/src/components/Partials/Default.jsx
@@ -5,6 +5,13 @@ function Default({ children }) {
// dark mode setup
const [theme, setTheme] = useState(null);
+ // country mode setup
+ const [countryMode, setCountryMode] = useState(localStorage.getItem('cnt') ? localStorage.getItem('cnt')?.toUpperCase() : '')
+
+
+ const queryParams = new URLSearchParams(location?.search);
+ const country = queryParams.get("cnt")?.toUpperCase();
+
useEffect(() => {
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
setTheme("dark");
@@ -24,9 +31,17 @@ function Default({ children }) {
const handleThemeSwitch = () => {
setTheme(theme === "dark" ? "light" : "dark");
};
+
+ useEffect(()=>{
+ if(country){
+ setCountryMode(country)
+ localStorage.setItem('cnt', country)
+ }
+ },[countryMode])
+
return (
<>
-
+
{children && children}
>
diff --git a/src/components/Partials/Layout.jsx b/src/components/Partials/Layout.jsx
index dab7137..81f0b0b 100644
--- a/src/components/Partials/Layout.jsx
+++ b/src/components/Partials/Layout.jsx
@@ -24,7 +24,7 @@ export default function Layout({ children }) {
localStorage.removeItem("member_id");
localStorage.removeItem("uid");
sessionStorage.removeItem("family_uid");
- // localStorage.clear();
+ localStorage.clear();
// toast.success("Come Back Soon", {
// icon: `🙂`,
// });
diff --git a/src/components/jobPopout/JobListPopout.jsx b/src/components/jobPopout/JobListPopout.jsx
index 8df3e9b..f805719 100644
--- a/src/components/jobPopout/JobListPopout.jsx
+++ b/src/components/jobPopout/JobListPopout.jsx
@@ -1,13 +1,13 @@
import { Field, Form, Formik } from "formik";
import React, { useCallback, useEffect, useMemo, useState } from "react";
+import { useDispatch, useSelector } from "react-redux";
import * as Yup from "yup";
import usersService from "../../services/UsersService";
+import { tableReload } from "../../store/TableReloads";
import InputCom from "../Helpers/Inputs/InputCom/index";
import ModalCom from "../Helpers/ModalCom";
import LoadingSpinner from "../Spinners/LoadingSpinner";
import Detail from "./popoutcomponent/Detail";
-import { tableReload } from "../../store/TableReloads";
-import { useDispatch } from "react-redux";
const validationSchema = Yup.object().shape({
family: Yup.string().required("This is required "),
@@ -22,14 +22,22 @@ const validationSchema = Yup.object().shape({
group: Yup.string(),
});
-function JobListPopout({ details, onClose, situation }) {
+function JobListPopout({
+ details,
+ onClose,
+ situation,
+ openWallet,
+ setWalletItem,
+}) {
+ const [selectedTab, setSelectedTab] = useState("public");
+ const tabs = ["public", "individual", "group"];
- const [selectedTab, setSelectedTab] = useState('public')
- const tabs = ['public', 'individual', 'group']
+ const dispatch = useDispatch();
-const dispatch = useDispatch()
-
-const [requestStatus, setRequestStatus] = useState({message:'', status:false})
+ const [requestStatus, setRequestStatus] = useState({
+ message: "",
+ status: false,
+ });
const [familyList, setFamilyList] = useState([]);
let [loader, setLoader] = useState({
@@ -43,6 +51,30 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
});
const apiCall = useMemo(() => new usersService(), []);
+ const { walletDetails } = useSelector((state) => state.walletDetails);
+
+ const getWalletDetail = (currency) => {
+ // A FUNCTION TO GET USER BALANCE BASED ON TASK CURRENCY
+ const walletChecker = walletDetails?.data.find(
+ (item) => item.description === currency
+ );
+ return walletChecker
+ ? {
+ description: walletChecker.description,
+ country: walletChecker.country,
+ code: walletChecker.code,
+ amount: walletChecker.amount,
+ }
+ : 0;
+ };
+
+ const taskWalletSelector = getWalletDetail(details?.currency);
+
+ const openCreditPopup = () => {
+ onClose();
+ setWalletItem(taskWalletSelector);
+ openWallet();
+ };
// member listing
const memberList = useCallback(async () => {
@@ -117,6 +149,7 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
job_uid,
job_description: textArea,
};
+
let reqData;
// for family input
@@ -147,7 +180,7 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
// for group input
reqData = {
...jobReq,
- email: '',
+ email: "",
group_id: values?.group,
assign_mode: 110044,
duration: details?.timeline_days,
@@ -161,52 +194,203 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
try {
const res = await apiCall.assignJobTask(reqData);
let { status, data } = await res;
- if(status != 200 || data.internal_return < 0){
- setRequestStatus({message:'Unable to complete', status:false})
- return setTimeout(()=>{
+ if (status != 200 || data.internal_return < 0) {
+ setRequestStatus({ message: "Unable to complete", status: false });
+ return setTimeout(() => {
setLoader({ jobFields: false });
- setRequestStatus({message:'', status:false})
- },3000)
+ setRequestStatus({ message: "", status: false });
+ }, 3000);
}
dispatch(tableReload({ type: "JOBTABLE" }));
- setRequestStatus({message:'Successful', status:true})
- setTimeout(()=>{
+ setRequestStatus({ message: "Successful", status: true });
+ setTimeout(() => {
setLoader({ jobFields: false });
onClose();
throw new Response(data);
- },3000)
+ }, 3000);
} catch (error) {
- setRequestStatus({message:'Unable to complete', status:false})
- setTimeout(()=>{
- setRequestStatus({message:'', status:false})
+ setRequestStatus({ message: "Unable to complete", status: false });
+ setTimeout(() => {
+ setRequestStatus({ message: "", status: false });
setLoader({ jobFields: false });
throw new Error(error);
- },3000)
+ }, 3000);
}
};
- const [groupList, setGroupList] = useState({loading: true, groups: [], members: []})
+ const [groupList, setGroupList] = useState({
+ loading: true,
+ groups: [],
+ members: [],
+ });
// FUNCTION TO POPULATE USER GROUP LIST
- useEffect(()=>{
+ useEffect(() => {
// setGroupList({loading: true, groups: [], members: []})
- apiCall.jobGroupList({}).then(res => {
- const {status, data} = res
- if(status != 200 || data?.internal_return < 0){
- setGroupList({loading: false, groups: [], members: []})
- return
+ apiCall
+ .jobGroupList({})
+ .then((res) => {
+ const { status, data } = res;
+ if (status != 200 || data?.internal_return < 0) {
+ setGroupList({ loading: false, groups: [], members: [] });
+ return;
}
- if(data.result_list.length < 0){
- setGroupList({loading: false, groups: [], members: []})
- return
+ if (data.result_list.length < 0) {
+ setGroupList({ loading: false, groups: [], members: [] });
+ return;
}
- setGroupList({loading: false, groups: data.result_list, members: data.result_list_member})
- }).catch(error => {
- setGroupList({loading: false, groups: [], members: []})
- })
-},[])
+ setGroupList({
+ loading: false,
+ groups: data.result_list,
+ members: data.result_list_member,
+ });
+ })
+ .catch((error) => {
+ setGroupList({ loading: false, groups: [], members: [] });
+ });
+ }, []);
+
+ const DetailsSection = ({ label, value }) => (
+
+
+
+ );
+
+ const DetailsComponent = () => {
+ const detailsArray = [
+ { label: "Description", value: details.description },
+ { label: "Price", value: details.thePrice },
+ { label: "Timeline", value: `${details.timeline_days} day(s)` },
+ { label: "Created", value: new Date(details?.created).toDateString() },
+ ];
+
+ return (
+
+ {/*
{details.title}
*/}
+
+ {/* INPUT SECTION */}
+ {detailsArray.map((detail, index) => (
+
+ ))}
+
+
+
+
+
{errMsg.deliveryDetail}
+
+
+ );
+ };
+
+ const FormSection = ({
+ selectedTab,
+ initialValues,
+ validationSchema,
+ jobFieldHandler,
+ loader,
+ errorHandler,
+ errMsg,
+ }) => {
+ const renderForm = (props) => {
+ // Render the appropriate form based on the selected tab
+ switch (selectedTab) {
+ case "family":
+ return (
+
+ );
+ case "public":
+ return (
+
+ );
+ case "individual":
+ return (
+
+ );
+ case "group":
+ return (
+
+ );
+ default:
+ return null;
+ }
+ };
+
+ return (
+
+ {(props) => (
+
+ )}
+
+ );
+ };
- // console.log("Job List P >> ", details)
return (
@@ -240,211 +424,60 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
+
-
- {/*
{details.title}
*/}
+
- {/* INPUT SECTION */}
-
-
-
+ <>
+ {/* ACTION SECTION */}
+ {+taskWalletSelector.amount > +details.price ? (
+
+
+ Send this Task to:
+
+
+
+ {tabs.map((item) => (
+
+ ))}
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{errMsg.deliveryDetail}
-
-
-
- {/* ACTION SECTION */}
-
-
Send this Task to:
-
-
- {tabs.map(item => (
-
- ))}
+
+ {requestStatus.message && requestStatus.message}
+
+
+
-
- {selectedTab == 'family' &&
-
- {(props) => {
- return (
-
- );
- }}
-
- }
-
- {selectedTab == 'public' &&
-
- {(props) => {
- return (
-
- );
- }}
-
- }
+ ) : (
+
+ )}
- {selectedTab == 'individual' &&
-
- {(props) => {
- return (
-
- );
- }}
-
- }
-
- {/* { process.env.REACT_APP_SHOW_OFFER_GROUP_JOB != 0 && } */}
- {selectedTab == 'group' &&
-
- {(props) => {
- return (
-
- );
- }}
-
- }
-
-
-
- {requestStatus.message &&
-
{requestStatus.message}
- }
-
- {/* END OF ACTION SECTION */}
+ {/* END OF ACTION SECTION */}
+ >
@@ -480,7 +513,7 @@ const JobFieldInput = ({
>
{label && (
@@ -597,3 +629,44 @@ const publicArray = [
{ duration: 21, name: "3 weeks" },
{ duration: 28, name: "4 weeks" },
];
+
+const ZeroBalanceChecker = ({ amount, code, country, openCreditPopup }) => {
+ return (
+