Compare commits
80 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d12a1fd579 | |||
| 235bb7d667 | |||
| 18a319a437 | |||
| d3e2cc6744 | |||
| a08d8feb7d | |||
| 7cb5cc558b | |||
| 36025ade56 | |||
| b80c21358a | |||
| f5ad68f7bb | |||
| 27cba1ac68 | |||
| dbb21d8a08 | |||
| a4597599b7 | |||
| 894f986574 | |||
| e42a358da6 | |||
| 23c2e840c2 | |||
| 7e7176ae5c | |||
| 306fa1300d | |||
| 7b3178bd1a | |||
| 5e94ddee48 | |||
| 32171ae3ce | |||
| 2c99fedd8c | |||
| 7e926cc7bc | |||
| 587bcaa411 | |||
| 756628ee1a | |||
| 575710a807 | |||
| c77d8e5693 | |||
| 7e9d734e6f | |||
| 9ddb127bd3 | |||
| a85e5fdb91 | |||
| 09ad8a94ca | |||
| 0c1db6b4b5 | |||
| 6ddffdf2e6 | |||
| 5043540abb | |||
| 5f39accdd6 | |||
| b5aeaf59a4 | |||
| f3e63d2ef6 | |||
| 44a055e76b | |||
| 67c1b2aaa0 | |||
| 313cfc1f28 | |||
| 59a7f110be | |||
| 52e8447f6a | |||
| c60e28928a | |||
| 58357fd501 | |||
| 5402980d6c | |||
| 32c7b3d513 | |||
| a30b22170d | |||
| e3314b0460 | |||
| 86eb1f16bb | |||
| 5660d74e75 | |||
| 612016784d | |||
| 988aadfb7e | |||
| 54851b5f77 | |||
| 91f3b92138 | |||
| f48de9d65f | |||
| c920c35a9c | |||
| 7bcaead120 | |||
| 828f56ed84 | |||
| 07118c10a8 | |||
| ca5923a7f8 | |||
| 4f0d432176 | |||
| dd3f9d99f3 | |||
| 8807b671ad | |||
| 7020e6d4dc | |||
| d66093a2ad | |||
| b79eb6b158 | |||
| a759daaf90 | |||
| 600aec62cf | |||
| 1612bf11ce | |||
| f4e261eb6c | |||
| b622398b6a | |||
| e60957e6be | |||
| 6a2082d732 | |||
| 452c6bf8a1 | |||
| 9f89376aa9 | |||
| 4e91e47978 | |||
| fcaa485b17 | |||
| 64056bb2a4 | |||
| e49c4d66f8 | |||
| 8fdb939b72 | |||
| 7849a027b4 |
@@ -49,6 +49,8 @@ import MyWaitingJobsPage from "./views/MyWaitingJobsPage";
|
|||||||
import FamilyMarketPage from "./views/FamilyMarketPage";
|
import FamilyMarketPage from "./views/FamilyMarketPage";
|
||||||
import FacebookRedirect from "./views/FacebookRedirect";
|
import FacebookRedirect from "./views/FacebookRedirect";
|
||||||
import AppleRedirectPage from "./views/AppleRedirectPage";
|
import AppleRedirectPage from "./views/AppleRedirectPage";
|
||||||
|
import LndPage from "./views/LndPage";
|
||||||
|
import FamilySettingsPage from "./views/FamilySettingsPage";
|
||||||
|
|
||||||
export default function Routers() {
|
export default function Routers() {
|
||||||
return (
|
return (
|
||||||
@@ -76,6 +78,7 @@ export default function Routers() {
|
|||||||
<Route path="/vemail" element={<VerifyLinkPages />} />
|
<Route path="/vemail" element={<VerifyLinkPages />} />
|
||||||
<Route path="/complereset" element={<VerifyPasswordPages />} />
|
<Route path="/complereset" element={<VerifyPasswordPages />} />
|
||||||
<Route exact path="/outmessage" element={<VerifyYouPages />} />
|
<Route exact path="/outmessage" element={<VerifyYouPages />} />
|
||||||
|
<Route exact path="/lnd/*" element={<LndPage />} />
|
||||||
|
|
||||||
{/* private route */}
|
{/* private route */}
|
||||||
<Route element={<AuthRoute />}>
|
<Route element={<AuthRoute />}>
|
||||||
@@ -96,6 +99,7 @@ export default function Routers() {
|
|||||||
<Route exact path="/market-place" element={<MarketPlacePage />} />
|
<Route exact path="/market-place" element={<MarketPlacePage />} />
|
||||||
<Route exact path="/market" element={<MarketPlacePage />} />
|
<Route exact path="/market" element={<MarketPlacePage />} />
|
||||||
<Route exact path="/familymarket" element={<FamilyMarketPage />} />
|
<Route exact path="/familymarket" element={<FamilyMarketPage />} />
|
||||||
|
<Route exact path="/familysettings" element={<FamilySettingsPage />} />
|
||||||
<Route exact path="/notification" element={<Notification />} />
|
<Route exact path="/notification" element={<Notification />} />
|
||||||
<Route exact path="/mytask" element={<MyTaskPage />} />
|
<Route exact path="/mytask" element={<MyTaskPage />} />
|
||||||
<Route exact path="/myjobs" element={<MyJobsPage />} />
|
<Route exact path="/myjobs" element={<MyJobsPage />} />
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ function AddJob({ popUpHandler, categories }) {
|
|||||||
onChange={props.handleChange}
|
onChange={props.handleChange}
|
||||||
onBlur={props.handleBlur}
|
onBlur={props.handleBlur}
|
||||||
>
|
>
|
||||||
{walletDetails.loading ? (
|
{walletDetails?.loading ? (
|
||||||
<option className="text-slate-500 text-lg" value="">
|
<option className="text-slate-500 text-lg" value="">
|
||||||
Loading...
|
Loading...
|
||||||
</option>
|
</option>
|
||||||
@@ -400,7 +400,7 @@ function AddJob({ popUpHandler, categories }) {
|
|||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
{requestStatus.loading ? (
|
{requestStatus?.loading ? (
|
||||||
<LoadingSpinner size="8" color="sky-blue" />
|
<LoadingSpinner size="8" color="sky-blue" />
|
||||||
) : (
|
) : (
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ import { updateUserDetails } from "../../../store/UserDetails";
|
|||||||
import ReCAPTCHA from "react-google-recaptcha";
|
import ReCAPTCHA from "react-google-recaptcha";
|
||||||
|
|
||||||
export default function Login() {
|
export default function Login() {
|
||||||
|
// eslint-disable-next-line no-restricted-globals
|
||||||
const queryParams = new URLSearchParams(location?.search);
|
const queryParams = new URLSearchParams(location?.search);
|
||||||
const sessionExpired = queryParams.get("sessionExpired")
|
const sessionExpired = queryParams.get("sessionExpired");
|
||||||
|
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const { state } = useLocation();
|
const { state } = useLocation();
|
||||||
|
|
||||||
const [validCaptcha, setValidCaptcha] = useState({show: false, valid:''}); // FOR CAPTCHA
|
const [validCaptcha, setValidCaptcha] = useState({ show: false, valid: "" }); // FOR CAPTCHA
|
||||||
|
|
||||||
let [loginType, setLoginType] = useState("");
|
let [loginType, setLoginType] = useState("");
|
||||||
|
|
||||||
@@ -115,7 +115,8 @@ export default function Login() {
|
|||||||
}, Number(process.env.REACT_APP_LOGIN_ERROR_TIMEOUT));
|
}, Number(process.env.REACT_APP_LOGIN_ERROR_TIMEOUT));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(name == "full" && !validCaptcha.valid && validCaptcha.show){ // RUNS AND DISPLAYS CAPTCHA, IF ERROR OCCURED DURING LOGIN FOR FULL LOGIN ALONE
|
if (name == "full" && !validCaptcha.valid && validCaptcha.show) {
|
||||||
|
// RUNS AND DISPLAYS CAPTCHA, IF ERROR OCCURED DURING LOGIN FOR FULL LOGIN ALONE
|
||||||
setMsgError("Please Verify Captcha");
|
setMsgError("Please Verify Captcha");
|
||||||
setLoginLoading(false);
|
setLoginLoading(false);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -136,12 +137,15 @@ export default function Login() {
|
|||||||
// setMsgError("Wrong, email/password");
|
// setMsgError("Wrong, email/password");
|
||||||
setLoginError(true);
|
setLoginError(true);
|
||||||
setLoginLoading(false);
|
setLoginLoading(false);
|
||||||
setValidCaptcha(prev => ({...prev, show:true})) // DISPLAYS CAPTCHA IF ERROR
|
setValidCaptcha((prev) => ({ ...prev, show: true })); // DISPLAYS CAPTCHA IF ERROR
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
localStorage.setItem("member_id", `${res.data.member_id}`);
|
localStorage.setItem("member_id", `${res.data.member_id}`);
|
||||||
localStorage.setItem("uid", `${res.data.uid}`);
|
localStorage.setItem("uid", `${res.data.uid}`);
|
||||||
localStorage.setItem("session_token", `${res.data.session}`);
|
localStorage.setItem("session_token", `${res.data.session}`);
|
||||||
|
if (name === "family") {
|
||||||
|
sessionStorage.setItem("family_uid", res.data?.family_uid);
|
||||||
|
}
|
||||||
// localStorage.setItem("session", `${res.data.session}`);
|
// localStorage.setItem("session", `${res.data.session}`);
|
||||||
dispatch(updateUserDetails({ ...res.data }));
|
dispatch(updateUserDetails({ ...res.data }));
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -152,7 +156,7 @@ export default function Login() {
|
|||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
setMsgError("Unable to login, try again");
|
setMsgError("Unable to login, try again");
|
||||||
setLoginLoading(false);
|
setLoginLoading(false);
|
||||||
setValidCaptcha(prev => ({...prev, show:true})) // DISPLAYS CAPTCHA IF ERROR
|
setValidCaptcha((prev) => ({ ...prev, show: true })); // DISPLAYS CAPTCHA IF ERROR
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -163,11 +167,12 @@ export default function Login() {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function captchaChecker(value) { // FUNCTION TO VALIDATE CAPTCHA
|
function captchaChecker(value) {
|
||||||
|
// FUNCTION TO VALIDATE CAPTCHA
|
||||||
if (value) {
|
if (value) {
|
||||||
setValidCaptcha({show: true, valid:value})
|
setValidCaptcha({ show: true, valid: value });
|
||||||
} else {
|
} else {
|
||||||
setValidCaptcha({show: true, valid:''})
|
setValidCaptcha({ show: true, valid: "" });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,6 +250,8 @@ export default function Login() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="content-wrapper login shadow-md w-full lg:max-w-[530px] mx-auto flex justify-center items-center xl:bg-white dark:bg-dark-white 2xl:w-[828px] rounded-[0.475rem] sm:p-7 p-5">
|
<div className="content-wrapper login shadow-md w-full lg:max-w-[530px] mx-auto flex justify-center items-center xl:bg-white dark:bg-dark-white 2xl:w-[828px] rounded-[0.475rem] sm:p-7 p-5">
|
||||||
<div className="w-full">
|
<div className="w-full">
|
||||||
|
{/* HIDES THIS IF USER SESSION HAS EXPIRED */}
|
||||||
|
{sessionExpired != "true" && (
|
||||||
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
|
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7">
|
||||||
{/* <h1 className="text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]">
|
{/* <h1 className="text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]">
|
||||||
Sign In to WrenchBoard
|
Sign In to WrenchBoard
|
||||||
@@ -259,13 +266,16 @@ export default function Login() {
|
|||||||
</Link>
|
</Link>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* SHOWS THIS IF USER SESSION HAS EXPIRED */}
|
{/* SHOWS THIS IF USER SESSION HAS EXPIRED */}
|
||||||
{sessionExpired == 'true' &&
|
{sessionExpired == "true" && (
|
||||||
<div className="w-full p-1">
|
<div className="w-full p-1 mb-7">
|
||||||
<p className="text-red-500 text-sm text-center">Your session expired and will need to login again</p>
|
<p className="text-red-500 text-base text-center">
|
||||||
|
Your session expired and will need to login again
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
}
|
)}
|
||||||
|
|
||||||
{/* switch login component */}
|
{/* switch login component */}
|
||||||
<div className="ml-7 flex justify-start items-center gap-3">
|
<div className="ml-7 flex justify-start items-center gap-3">
|
||||||
@@ -331,14 +341,16 @@ export default function Login() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* hCaptha clone for the time being */}
|
{/* hCaptha clone for the time being */}
|
||||||
{validCaptcha.show &&
|
{validCaptcha.show && (
|
||||||
<div className="mb-5 flex justify-center w-full">
|
<div className="mb-5 flex justify-center w-full">
|
||||||
<ReCAPTCHA
|
<ReCAPTCHA
|
||||||
sitekey={process.env.REACT_APP_GOOGLE_RECAPTCHA_SITEKEY}
|
sitekey={
|
||||||
|
process.env.REACT_APP_GOOGLE_RECAPTCHA_SITEKEY
|
||||||
|
}
|
||||||
onChange={captchaChecker}
|
onChange={captchaChecker}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
}
|
)}
|
||||||
|
|
||||||
{loginError && (
|
{loginError && (
|
||||||
<div className="relative p-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-thin leading-[19.5px] text-[13px]">
|
<div className="relative p-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-thin leading-[19.5px] text-[13px]">
|
||||||
@@ -495,7 +507,8 @@ export default function Login() {
|
|||||||
|
|
||||||
{loginType == "full" && (
|
{loginType == "full" && (
|
||||||
<div className="pt-5 text-[#181c32] text-center font-semibold text-[13.975px] leading-[20.9625px]">
|
<div className="pt-5 text-[#181c32] text-center font-semibold text-[13.975px] leading-[20.9625px]">
|
||||||
This site is protected by a Captcha. Our Privacy Policy and Terms of Service apply.
|
This site is protected by a Captcha. Our Privacy Policy and
|
||||||
|
Terms of Service apply.
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export default function BlogItem(props) {
|
|||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<div className="notification-wrapper w-full bg-white p-8 rounded-2xl">
|
<div className="notification-wrapper w-full bg-white p-8 rounded-2xl">
|
||||||
{blogdata.loading ?
|
{blogdata?.loading ?
|
||||||
<LoadingSpinner size='8' color='sky-blue' height='h-[100px]' />
|
<LoadingSpinner size='8' color='sky-blue' height='h-[100px]' />
|
||||||
:
|
:
|
||||||
blogdata?.data?.blogdata && blogdata.data?.blogdata.length ?
|
blogdata?.data?.blogdata && blogdata.data?.blogdata.length ?
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import dataImage2 from "../../assets/images/taskbanners/default.jpg";
|
|
||||||
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
||||||
import MarketPopUp from "../MarketPlace/PopUp/MarketPopUp";
|
import MarketPopUp from "../MarketPlace/PopUp/MarketPopUp";
|
||||||
|
|
||||||
@@ -8,6 +7,7 @@ export default function AvailableJobsCard({
|
|||||||
datas,
|
datas,
|
||||||
hidden = false,
|
hidden = false,
|
||||||
contentDisplay,
|
contentDisplay,
|
||||||
|
image_server,
|
||||||
}) {
|
}) {
|
||||||
//debugger;
|
//debugger;
|
||||||
const [marketPopUp, setMarketPopUp] = useState({ show: false, data: {} });
|
const [marketPopUp, setMarketPopUp] = useState({ show: false, data: {} });
|
||||||
@@ -23,6 +23,13 @@ export default function AvailableJobsCard({
|
|||||||
const imagePath = require(`../../assets/images/${datas.thumbnil}`); // Replace with your directory path for local images
|
const imagePath = require(`../../assets/images/${datas.thumbnil}`); // Replace with your directory path for local images
|
||||||
setImageUrl(imagePath);
|
setImageUrl(imagePath);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const image = localStorage.getItem("session_token")
|
||||||
|
? `${image_server}${localStorage.getItem("session_token")}/job/${
|
||||||
|
datas.job_uid
|
||||||
|
}`
|
||||||
|
: "";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{contentDisplay == "grid" ? (
|
{contentDisplay == "grid" ? (
|
||||||
@@ -131,7 +138,7 @@ export default function AvailableJobsCard({
|
|||||||
<div className="card-style-two w-full p-8 my-2 flex items-center gap-4 bg-white dark:bg-dark-white rounded-2xl section-shadow">
|
<div className="card-style-two w-full p-8 my-2 flex items-center gap-4 bg-white dark:bg-dark-white rounded-2xl section-shadow">
|
||||||
<div className="flex gap-5 items-center w-full">
|
<div className="flex gap-5 items-center w-full">
|
||||||
<div className="w-full h-[60px] rounded-full overflow-hidden flex justify-center items-center flex-[0.1] min-w-[60px] max-w-[60px]">
|
<div className="w-full h-[60px] rounded-full overflow-hidden flex justify-center items-center flex-[0.1] min-w-[60px] max-w-[60px]">
|
||||||
<img src={dataImage2} alt="data" className="w-full h-full" />
|
<img src={image} alt="data" className="w-full h-full" />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col flex-[0.9]">
|
<div className="flex flex-col flex-[0.9]">
|
||||||
<h1
|
<h1
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import localImgLoad from "../../lib/localImgLoad";
|
|||||||
import CountDown from "../Helpers/CountDown";
|
import CountDown from "../Helpers/CountDown";
|
||||||
import Icons from "../Helpers/Icons";
|
import Icons from "../Helpers/Icons";
|
||||||
|
|
||||||
export default function FamilyActiveJobsCard({ datas, hidden = false }) {
|
export default function FamilyActiveJobsCard({ datas, hidden = false, image_server }) {
|
||||||
|
|
||||||
let { pathname } = useLocation();
|
let { pathname } = useLocation();
|
||||||
|
|
||||||
@@ -22,7 +22,8 @@ export default function FamilyActiveJobsCard({ datas, hidden = false }) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
//debugger;
|
//debugger;
|
||||||
const bannerName = datas.banner == null ?'default.jpg':datas.banner;
|
// const bannerName = datas.banner == null ?'default.jpg':datas.banner;
|
||||||
|
let image = `${image_server}${localStorage.getItem('session_token')}/job/${datas.origin_job_uid}`
|
||||||
return (
|
return (
|
||||||
<div className="card-style-one flex flex-col justify-between w-full h-[387px] bg-white dark:bg-dark-white p-3 pb rounded-2xl">
|
<div className="card-style-one flex flex-col justify-between w-full h-[387px] bg-white dark:bg-dark-white p-3 pb rounded-2xl">
|
||||||
<div className="content">
|
<div className="content">
|
||||||
@@ -31,10 +32,13 @@ export default function FamilyActiveJobsCard({ datas, hidden = false }) {
|
|||||||
{/* thumbnail image */}
|
{/* thumbnail image */}
|
||||||
<div
|
<div
|
||||||
className="thumbnail w-full h-full rounded-xl overflow-hidden px-4 pt-4"
|
className="thumbnail w-full h-full rounded-xl overflow-hidden px-4 pt-4"
|
||||||
|
// style={{
|
||||||
|
// background: `url(${localImgLoad(
|
||||||
|
// `images/taskbanners/${bannerName}`
|
||||||
|
// )}) center / contain no-repeat`,
|
||||||
|
// }}
|
||||||
style={{
|
style={{
|
||||||
background: `url(${localImgLoad(
|
background: `url(${image}) center / contain no-repeat`,
|
||||||
`images/taskbanners/${bannerName}`
|
|
||||||
)}) center / contain no-repeat`,
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{/* <div className="product-options flex justify-between relative">*/}
|
{/* <div className="product-options flex justify-between relative">*/}
|
||||||
|
|||||||
@@ -2,13 +2,20 @@ import localImgLoad from "../../lib/localImgLoad";
|
|||||||
import CountDown from "../Helpers/CountDown";
|
import CountDown from "../Helpers/CountDown";
|
||||||
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
||||||
|
|
||||||
export default function OfferCard({ datas, hidden = false, setOfferPopout }) {
|
export default function OfferCard({
|
||||||
|
datas,
|
||||||
|
hidden = false,
|
||||||
|
setOfferPopout,
|
||||||
|
image_server,
|
||||||
|
}) {
|
||||||
let thePrice = PriceFormatter(
|
let thePrice = PriceFormatter(
|
||||||
datas?.price * 0.01,
|
datas?.price * 0.01,
|
||||||
datas?.currency_code,
|
datas?.currency_code,
|
||||||
datas?.currency
|
datas?.currency
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let image = `${image_server}${localStorage.getItem("session_token")}/job/${datas.job_uid}`
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="card-style-one flex flex-col justify-between w-full h-[387px] bg-white dark:bg-dark-white p-3 pb rounded-2xl">
|
<div className="card-style-one flex flex-col justify-between w-full h-[387px] bg-white dark:bg-dark-white p-3 pb rounded-2xl">
|
||||||
<div className="content">
|
<div className="content">
|
||||||
@@ -18,9 +25,7 @@ export default function OfferCard({ datas, hidden = false, setOfferPopout }) {
|
|||||||
<div
|
<div
|
||||||
className="thumbnail w-full h-full rounded-xl overflow-hidden px-4 pt-4"
|
className="thumbnail w-full h-full rounded-xl overflow-hidden px-4 pt-4"
|
||||||
style={{
|
style={{
|
||||||
background: `url(${localImgLoad(
|
background: `url(${image}) center / contain no-repeat`,
|
||||||
`images/taskbanners/${datas?.banner || "default.jpg"}`
|
|
||||||
)}) center / contain no-repeat`,
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{hidden && <div className="flex justify-center"></div>}
|
{hidden && <div className="flex justify-center"></div>}
|
||||||
@@ -31,26 +36,7 @@ export default function OfferCard({ datas, hidden = false, setOfferPopout }) {
|
|||||||
<h1 className="text-xl font-bold text-dark-gray dark:text-white mb-2 capitalize line-clamp-1">
|
<h1 className="text-xl font-bold text-dark-gray dark:text-white mb-2 capitalize line-clamp-1">
|
||||||
{datas.title}
|
{datas.title}
|
||||||
</h1>
|
</h1>
|
||||||
{/* countdown */}
|
|
||||||
{/* <div className="w-full h-[54px] flex justify-evenly items-center p-2 rounded-lg border border-[#E3E4FE] dark:border-[#a7a9b533] ">
|
|
||||||
<div className="flex flex-col justify-between">
|
|
||||||
<p className="text-sm text-thin-light-gray dark:text-white tracking-wide">
|
|
||||||
Task Code
|
|
||||||
</p>
|
|
||||||
<p className="text-base font-bold tracking-wide text-dark-gray dark:text-white">
|
|
||||||
{datas.contract}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="w-[1px] h-full bg-[#E3E4FE] dark:bg-[#a7a9b533] "></div>
|
|
||||||
<div className="flex flex-col justify-between">
|
|
||||||
<p className="text-sm text-thin-light-gray dark:text-white tracking-wide">
|
|
||||||
Remaining Time
|
|
||||||
</p>
|
|
||||||
<p className="text-base font-bold tracking-wide text-dark-gray dark:text-white">
|
|
||||||
<CountDown lastDate={datas.expire} />
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div> */}
|
|
||||||
<div className="w-full p-2 rounded-lg border border-[#E3E4FE] dark:border-[#a7a9b533] ">
|
<div className="w-full p-2 rounded-lg border border-[#E3E4FE] dark:border-[#a7a9b533] ">
|
||||||
<div className="grid grid-cols-2 gap-2">
|
<div className="grid grid-cols-2 gap-2">
|
||||||
<div className="flex flex-col justify-between items-center border-r-2">
|
<div className="flex flex-col justify-between items-center border-r-2">
|
||||||
@@ -96,7 +82,7 @@ export default function OfferCard({ datas, hidden = false, setOfferPopout }) {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
setOfferPopout({ show: true, data: { ...datas, thePrice } })
|
setOfferPopout({ show: true, data: { ...datas, thePrice, image } })
|
||||||
}
|
}
|
||||||
className="btn-shine w-[98px] h-[33px] text-white rounded-full text-sm bg-pink flex justify-center items-center"
|
className="btn-shine w-[98px] h-[33px] text-white rounded-full text-sm bg-pink flex justify-center items-center"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export default function FamilyManageTabs({
|
|||||||
loading: false,
|
loading: false,
|
||||||
data: null,
|
data: null,
|
||||||
};
|
};
|
||||||
|
// console.log('accountDetails',accountDetails)
|
||||||
// State for family details, tasks, waitlist, and pending
|
// State for family details, tasks, waitlist, and pending
|
||||||
const [details, setDetails] = useState({
|
const [details, setDetails] = useState({
|
||||||
familyDetails: { ...initialDetailState },
|
familyDetails: { ...initialDetailState },
|
||||||
@@ -66,8 +66,10 @@ export default function FamilyManageTabs({
|
|||||||
// State for family task popout
|
// State for family task popout
|
||||||
const [familyTaskPopout, setFamilyTaskPopout] = useState(false);
|
const [familyTaskPopout, setFamilyTaskPopout] = useState(false);
|
||||||
|
|
||||||
|
let [uploadStatus, setUploadStatus] = useState({loading: false, status: false, message:''}) // HOLDS STATE FOR UPLOAD PROFILE PICTURE STATUS
|
||||||
|
|
||||||
// State for profile image
|
// State for profile image
|
||||||
const [profileImg, setProfileImg] = useState(profile);
|
const [profileImg, setProfileImg] = useState(accountDetails.image ? accountDetails.image : profile);
|
||||||
|
|
||||||
// Ref for profile image input
|
// Ref for profile image input
|
||||||
const profileImgInput = useRef(null);
|
const profileImgInput = useRef(null);
|
||||||
@@ -90,24 +92,59 @@ export default function FamilyManageTabs({
|
|||||||
* Checks if the selected file exceeds the maximum file size limit and displays an alert if it does.
|
* Checks if the selected file exceeds the maximum file size limit and displays an alert if it does.
|
||||||
* If the file is within the size limit, it reads the file using the FileReader API and sets the profile image state with the result.
|
* If the file is within the size limit, it reads the file using the FileReader API and sets the profile image state with the result.
|
||||||
*/
|
*/
|
||||||
const profileImgChangeHandler = (e) => {
|
|
||||||
const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
|
|
||||||
|
|
||||||
const file = e.target.files[0];
|
const profileImgChangeHandler = (e) => {
|
||||||
if (file && file.size > MAX_FILE_SIZE) {
|
setUploadStatus({loading: false, status: false, message:''})
|
||||||
alert("File size exceeds the limit.");
|
let acceptedFormat = ["jpeg", "jpg", "png", "bmp", "gif"] // ARRAY OF SUPPORTED FORMATS
|
||||||
return;
|
let uploadedFile = e.target.files[0] //UPLOADED FILE
|
||||||
|
|
||||||
|
const fileFormat = uploadedFile?.type?.split("/")[1]?.toLowerCase();
|
||||||
|
if(!acceptedFormat.includes(fileFormat)){ //CHECKING FOR CORRECT UPLOAD FORMAT
|
||||||
|
const msg = `Please select ${acceptedFormat.slice(0, -1).join(', ')} or ${acceptedFormat.slice(-1)}`;
|
||||||
|
setUploadStatus({loading: false, status: false, message:msg})
|
||||||
|
return setTimeout(()=>{
|
||||||
|
profileImgInput.current.value = '' // clear the input
|
||||||
|
setUploadStatus({loading: false, status: false, message:''})
|
||||||
|
},5000)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file) {
|
if(uploadedFile.size > 5*1048576){ // CHECKING FOR CORRECT FILE SIZE
|
||||||
const imgReader = new FileReader();
|
setUploadStatus({loading: false, status: false, message:'File must not exceed 5MB'})
|
||||||
imgReader.onload = () => {
|
return setTimeout(()=>{
|
||||||
const imageDataUrl = imgReader.result;
|
profileImgInput.current.value = '' // clear the input
|
||||||
|
setUploadStatus({loading: false, status: false, message:''})
|
||||||
|
},5000)
|
||||||
|
}
|
||||||
|
|
||||||
// Set the profile image
|
if (e.target.value !== "") {
|
||||||
setProfileImg(imageDataUrl);
|
const imgReader = new FileReader();
|
||||||
|
imgReader.onload = (event) => {
|
||||||
|
let base64Img = imgReader.result.split(",")[1];
|
||||||
|
let reqData = { // PAYLOAD FOR API CALL
|
||||||
|
family_uid: accountDetails?.family_uid,
|
||||||
|
file_name: uploadedFile?.name,
|
||||||
|
file_size: uploadedFile?.size,
|
||||||
|
file_type: uploadedFile?.type?.split("/")[0]?.toLowerCase(),
|
||||||
|
file_data: base64Img,
|
||||||
|
msg_type: 'FILE',
|
||||||
|
action: 11305
|
||||||
|
}
|
||||||
|
setUploadStatus({loading: true, status: false, message:'Loading...'})
|
||||||
|
apiCall.sendFiles(reqData).then(res=>{
|
||||||
|
if(res.status != 200 || res.data.internal_return < 0){
|
||||||
|
return setUploadStatus({loading: false, status: false, message: 'Something went wrong, try again'})
|
||||||
|
}
|
||||||
|
setUploadStatus({loading: false, status: true, message: 'Uploaded successfully'})
|
||||||
|
setProfileImg(event.target.result);
|
||||||
|
}).catch(error=>{
|
||||||
|
setUploadStatus({loading: false, status: false, message: 'Network error, try again'})
|
||||||
|
}).finally(()=>{
|
||||||
|
setTimeout(()=>{
|
||||||
|
setUploadStatus({loading: false, status: false, message: ''})
|
||||||
|
},5000)
|
||||||
|
})
|
||||||
};
|
};
|
||||||
imgReader.readAsDataURL(file);
|
imgReader.readAsDataURL(e.target.files[0]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -298,6 +335,7 @@ export default function FamilyManageTabs({
|
|||||||
profileImgChangeHandler={profileImgChangeHandler}
|
profileImgChangeHandler={profileImgChangeHandler}
|
||||||
browseProfileImg={browseProfileImg}
|
browseProfileImg={browseProfileImg}
|
||||||
accountDetails={accountDetails}
|
accountDetails={accountDetails}
|
||||||
|
uploadStatus={uploadStatus}
|
||||||
/>
|
/>
|
||||||
<div className="mt-4 flex flex-col justify-center items-center gap-2 lg:flex-row lg:justify-center lg:items-center xl:flex-col xl:justify-center xl:items-center 2xl:flex-row 2xl:justify-center 2xl:items-center 2xl:gap-[2px]">
|
<div className="mt-4 flex flex-col justify-center items-center gap-2 lg:flex-row lg:justify-center lg:items-center xl:flex-col xl:justify-center xl:items-center 2xl:flex-row 2xl:justify-center 2xl:items-center 2xl:gap-[2px]">
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import { PriceFormatter } from "../../Helpers/PriceFormatter";
|
|||||||
import LoadingSpinner from "../../Spinners/LoadingSpinner";
|
import LoadingSpinner from "../../Spinners/LoadingSpinner";
|
||||||
import Detail from "../../jobPopout/popoutcomponent/Detail";
|
import Detail from "../../jobPopout/popoutcomponent/Detail";
|
||||||
import { NewTasks } from "./forms";
|
import { NewTasks } from "./forms";
|
||||||
|
import { tableReload } from "../../../store/TableReloads";
|
||||||
|
import { useDispatch } from "react-redux";
|
||||||
|
|
||||||
const AssignTaskPopout = React.memo(
|
const AssignTaskPopout = React.memo(
|
||||||
({
|
({
|
||||||
@@ -19,6 +21,8 @@ const AssignTaskPopout = React.memo(
|
|||||||
}) => {
|
}) => {
|
||||||
const apiCall = new usersService();
|
const apiCall = new usersService();
|
||||||
|
|
||||||
|
const dispatch = useDispatch()
|
||||||
|
|
||||||
let [requestStatus, setRequestStatus] = useState({
|
let [requestStatus, setRequestStatus] = useState({
|
||||||
loading: false,
|
loading: false,
|
||||||
status: false,
|
status: false,
|
||||||
@@ -90,11 +94,11 @@ const AssignTaskPopout = React.memo(
|
|||||||
const requiredFields = {
|
const requiredFields = {
|
||||||
banner,
|
banner,
|
||||||
// category,
|
// category,
|
||||||
country,
|
currency:country,
|
||||||
description,
|
description,
|
||||||
job_detail,
|
'job detail':job_detail,
|
||||||
price,
|
price,
|
||||||
timeline_days,
|
timeline:timeline_days,
|
||||||
title,
|
title,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -104,7 +108,7 @@ const AssignTaskPopout = React.memo(
|
|||||||
setRequestStatus({
|
setRequestStatus({
|
||||||
loading: false,
|
loading: false,
|
||||||
status: false,
|
status: false,
|
||||||
message: `${field} is empty`,
|
message: `${field[0].toUpperCase()+field.slice(1).toLowerCase()} is empty`,
|
||||||
});
|
});
|
||||||
return setTimeout(() => {
|
return setTimeout(() => {
|
||||||
setRequestStatus({ loading: false, status: false, message: "" });
|
setRequestStatus({ loading: false, status: false, message: "" });
|
||||||
@@ -145,6 +149,7 @@ const AssignTaskPopout = React.memo(
|
|||||||
message: "action successful",
|
message: "action successful",
|
||||||
});
|
});
|
||||||
setUpdatePage(prev => !prev) // Updates family task page by calling the useeffect hook
|
setUpdatePage(prev => !prev) // Updates family task page by calling the useeffect hook
|
||||||
|
dispatch(tableReload({ type: "WALLETTABLE" })); // RELOADS USER WALLET
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setRequestStatus({ loading: false, status: false, message: "" });
|
setRequestStatus({ loading: false, status: false, message: "" });
|
||||||
action(); // FUNCTION THAT CLOSES THE MODAL BOX
|
action(); // FUNCTION THAT CLOSES THE MODAL BOX
|
||||||
@@ -201,7 +206,7 @@ const AssignTaskPopout = React.memo(
|
|||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{familyTask.loading ? (
|
{familyTask?.loading ? (
|
||||||
<div className="h-[100px] w-full flex justify-center items-center">
|
<div className="h-[100px] w-full flex justify-center items-center">
|
||||||
<LoadingSpinner color="sky-blue" size="16" />
|
<LoadingSpinner color="sky-blue" size="16" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ export default function NewTasks({ formState, setFormState }) {
|
|||||||
onChange={handleInputChange}
|
onChange={handleInputChange}
|
||||||
// onBlur={props.handleBlur}
|
// onBlur={props.handleBlur}
|
||||||
>
|
>
|
||||||
{currency.loading ? (
|
{currency?.loading ? (
|
||||||
<option className="text-slate-500 text-[13.975px]" value="">
|
<option className="text-slate-500 text-[13.975px]" value="">
|
||||||
Loading...
|
Loading...
|
||||||
</option>
|
</option>
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import React from "react";
|
||||||
|
import Layout from "../../Partials/Layout";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
|
||||||
|
const FamilySettings = () => {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<div className="notification-page w-full mb-10">
|
||||||
|
<div className="notification-wrapper w-full">
|
||||||
|
{/* heading */}
|
||||||
|
<div className="sm:flex justify-between items-center mb-6">
|
||||||
|
<div className="mb-5 sm:mb-0">
|
||||||
|
<h1 className="text-26 font-bold inline-flex gap-3 text-dark-gray dark:text-white items-center">
|
||||||
|
<span className={``}>Family Settings</span>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<Link to="/acc-family">Go Back</Link>
|
||||||
|
</div>
|
||||||
|
{/* Something Here */}
|
||||||
|
{/* <form className="logout-modal-body w-full flex flex-col items-center px-10 py-8 gap-4"></form> */}
|
||||||
|
<div className="w-full bg-white dark:bg-dark-white overflow-y-auto rounded-2xl section-shadow h-full ">
|
||||||
|
<div className="update-table w-full h-full p-4 bg-white dark:bg-dark-white overflow-y-auto rounded-2xl section-shadow min-h-[520px] flex flex-col justify-between "></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FamilySettings;
|
||||||
@@ -19,6 +19,7 @@ export default function FamilyTable({
|
|||||||
familyList,
|
familyList,
|
||||||
loader,
|
loader,
|
||||||
popUpHandler,
|
popUpHandler,
|
||||||
|
imageServer
|
||||||
}) {
|
}) {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [currentPage, setCurrentPage] = useState(0);
|
const [currentPage, setCurrentPage] = useState(0);
|
||||||
@@ -54,11 +55,13 @@ export default function FamilyTable({
|
|||||||
banner,
|
banner,
|
||||||
enable_traking,
|
enable_traking,
|
||||||
profile_picture,
|
profile_picture,
|
||||||
|
imageServer
|
||||||
}) => {
|
}) => {
|
||||||
// Check for valid dates
|
// Check for valid dates
|
||||||
const addedDate = added ? added.split(" ")[0] : "N/A";
|
const addedDate = added ? added.split(" ")[0] : "N/A";
|
||||||
const loginDate = last_login ? formatDateString(last_login) : "N/A";
|
const loginDate = last_login ? formatDateString(last_login) : "N/A";
|
||||||
const key = `family-${family_uid}`; // Assign a unique key
|
const key = `family-${family_uid}`; // Assign a unique key
|
||||||
|
const image = localStorage.getItem('session_token') ? `${imageServer}${localStorage.getItem('session_token')}/family/${family_uid}` : ''
|
||||||
|
|
||||||
const trackingStatus =
|
const trackingStatus =
|
||||||
enable_traking === "0"
|
enable_traking === "0"
|
||||||
@@ -76,15 +79,15 @@ export default function FamilyTable({
|
|||||||
<div className="flex space-x-2 items-center w-full">
|
<div className="flex space-x-2 items-center w-full">
|
||||||
<div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center flex-[0.1]">
|
<div className="w-[60px] h-[60px] rounded-full overflow-hidden flex justify-center items-center flex-[0.1]">
|
||||||
<img
|
<img
|
||||||
src={profile_picture}
|
// src={profile_picture}
|
||||||
// src={profile_picture || localImgLoad(`images/icons/${banner}`)}
|
src={image || profile_picture || localImgLoad(`images/icons/${banner}`)}
|
||||||
alt={`Avatar of ${firstname} ${lastname}`}
|
alt={`Avatar of ${firstname} ${lastname}`}
|
||||||
className="w-full h-full"
|
className="w-full h-full"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col flex-[0.9]">
|
<div className="flex flex-col flex-[0.9]">
|
||||||
<h1 className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap">
|
<h1 className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap">
|
||||||
{`${firstname} ${lastname} (${age})`}
|
{`${firstname} ${lastname} (${age < 10 ? `0${age}` : age})`}
|
||||||
</h1>
|
</h1>
|
||||||
<span className="text-sm text-thin-light-gray">
|
<span className="text-sm text-thin-light-gray">
|
||||||
Added: <span className="text-purple ml-1">{addedDate}</span>
|
Added: <span className="text-purple ml-1">{addedDate}</span>
|
||||||
@@ -133,6 +136,7 @@ export default function FamilyTable({
|
|||||||
task_count,
|
task_count,
|
||||||
family_uid,
|
family_uid,
|
||||||
banner,
|
banner,
|
||||||
|
image
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
type="button"
|
type="button"
|
||||||
@@ -147,8 +151,8 @@ export default function FamilyTable({
|
|||||||
<path
|
<path
|
||||||
fill-rule="evenodd"
|
fill-rule="evenodd"
|
||||||
d="M.366 19.708c.405.39 1.06.39 1.464 0l8.563-8.264a1.95 1.95 0 0 0 0-2.827L1.768.292A1.063 1.063 0 0 0 .314.282a.976.976 0 0 0-.011 1.425l7.894 7.617a.975.975 0 0 1 0 1.414L.366 18.295a.974.974 0 0 0 0 1.413"
|
d="M.366 19.708c.405.39 1.06.39 1.464 0l8.563-8.264a1.95 1.95 0 0 0 0-2.827L1.768.292A1.063 1.063 0 0 0 .314.282a.976.976 0 0 0-.011 1.425l7.894 7.617a.975.975 0 0 1 0 1.414L.366 18.295a.974.974 0 0 0 0 1.413"
|
||||||
fill="#4687ba"
|
// fill=""
|
||||||
className="color000000 svgShape"
|
className="color000000 svgShape fill-[#fff]"
|
||||||
></path>
|
></path>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
@@ -182,7 +186,7 @@ export default function FamilyTable({
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody className="h-full">
|
<tbody className="h-full">
|
||||||
{currentFamilyList?.map((familyMember, index) => {
|
{currentFamilyList?.map((familyMember, index) => {
|
||||||
return <FamilyRow key={index} {...familyMember} />;
|
return <FamilyRow key={index} {...familyMember} imageServer={imageServer} />;
|
||||||
})}
|
})}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -213,7 +217,7 @@ export default function FamilyTable({
|
|||||||
<PaginatedList
|
<PaginatedList
|
||||||
onClick={handlePagination}
|
onClick={handlePagination}
|
||||||
prev={currentPage == 0}
|
prev={currentPage == 0}
|
||||||
next={currentPage + itemsPerPage >= familyList.length}
|
next={currentPage + itemsPerPage >= familyList?.length}
|
||||||
data={familyList}
|
data={familyList}
|
||||||
start={indexOfFirstItem}
|
start={indexOfFirstItem}
|
||||||
stop={indexOfLastItem}
|
stop={indexOfLastItem}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ export default function FamilyPending({
|
|||||||
value?.currency_code,
|
value?.currency_code,
|
||||||
value?.currency
|
value?.currency
|
||||||
);
|
);
|
||||||
let image = value.banner ? value.banner : "default.jpg";
|
let image = `${familyData.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={index}
|
key={index}
|
||||||
@@ -64,9 +64,7 @@ export default function FamilyPending({
|
|||||||
<div className="flex space-x-2 items-center w-full">
|
<div className="flex space-x-2 items-center w-full">
|
||||||
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
||||||
<img
|
<img
|
||||||
src={localImgLoad(
|
src={image}
|
||||||
`images/taskbanners/${image}`
|
|
||||||
)}
|
|
||||||
alt="data"
|
alt="data"
|
||||||
className="w-full h-full rounded-full"
|
className="w-full h-full rounded-full"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -67,9 +67,7 @@ export default function FamilyTasks({
|
|||||||
value?.currency_code,
|
value?.currency_code,
|
||||||
value?.currency
|
value?.currency
|
||||||
);
|
);
|
||||||
let image = value.banner
|
let image = `${familyData.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
|
||||||
? value.banner
|
|
||||||
: "default.jpg";
|
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={index}
|
key={index}
|
||||||
@@ -79,9 +77,7 @@ export default function FamilyTasks({
|
|||||||
<div className="flex space-x-2 items-center w-full">
|
<div className="flex space-x-2 items-center w-full">
|
||||||
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
||||||
<img
|
<img
|
||||||
src={localImgLoad(
|
src={image}
|
||||||
`images/taskbanners/${image}`
|
|
||||||
)}
|
|
||||||
alt="data"
|
alt="data"
|
||||||
className="w-full h-full rounded-full"
|
className="w-full h-full rounded-full"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -67,6 +67,8 @@ const FamilyWaitlist = memo(
|
|||||||
const selectedImage = require(`../../../assets/images/family/${
|
const selectedImage = require(`../../../assets/images/family/${
|
||||||
value?.banner || "default.jpg"
|
value?.banner || "default.jpg"
|
||||||
}`);
|
}`);
|
||||||
|
console.log('VALUE', value)
|
||||||
|
// let image = `${familyData.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
|
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ export default function ProfileInfo({
|
|||||||
profileImgChangeHandler,
|
profileImgChangeHandler,
|
||||||
browseProfileImg,
|
browseProfileImg,
|
||||||
accountDetails,
|
accountDetails,
|
||||||
|
uploadStatus
|
||||||
}) {
|
}) {
|
||||||
// console.log(accountDetails.banner)
|
// console.log(accountDetails.banner)
|
||||||
return (
|
return (
|
||||||
@@ -52,6 +53,11 @@ export default function ProfileInfo({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{/* DISPLAYS PROFILE UPLOADING STATUS */}
|
||||||
|
<div className="w-full">
|
||||||
|
{uploadStatus.message && !uploadStatus.loading && <p className={`text-center ${uploadStatus.status ? 'text-green-500':'text-red-500'}`}>{uploadStatus.message}</p>}
|
||||||
|
{uploadStatus.loading && <p className="text-center">{uploadStatus.message}</p>}
|
||||||
|
</div>
|
||||||
<div className="flex flex-col justify-center gap-3 items-center">
|
<div className="flex flex-col justify-center gap-3 items-center">
|
||||||
<h1 className="font-bold text-xl tracking-wide line-clamp-1 text-dark-gray dark:text-white capitalize">
|
<h1 className="font-bold text-xl tracking-wide line-clamp-1 text-dark-gray dark:text-white capitalize">
|
||||||
{accountDetails?.firstname}
|
{accountDetails?.firstname}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import React, {
|
|||||||
useMemo,
|
useMemo,
|
||||||
useState,
|
useState,
|
||||||
} from "react";
|
} from "react";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
import usersService from "../../services/UsersService";
|
import usersService from "../../services/UsersService";
|
||||||
import InputCom from "../Helpers/Inputs/InputCom";
|
import InputCom from "../Helpers/Inputs/InputCom";
|
||||||
import ModalCom from "../Helpers/ModalCom";
|
import ModalCom from "../Helpers/ModalCom";
|
||||||
@@ -13,11 +14,10 @@ import LoadingSpinner from "../Spinners/LoadingSpinner";
|
|||||||
import FamilyTable from "./FamilyTable";
|
import FamilyTable from "./FamilyTable";
|
||||||
|
|
||||||
export default function FamilyAcc() {
|
export default function FamilyAcc() {
|
||||||
const [selectTab, setValue] = useState("today");
|
|
||||||
// State to store the selected year and month
|
// State to store the selected year and month
|
||||||
const [selectedYear, setSelectedYear] = useState("");
|
const [selectedYear, setSelectedYear] = useState("");
|
||||||
const [selectedMonth, setSelectedMonth] = useState("");
|
const [selectedMonth, setSelectedMonth] = useState("");
|
||||||
const [familyList, setFamilyList] = useState([]);
|
const [familyList, setFamilyList] = useState({});
|
||||||
const [loader, setLoader] = useState(false);
|
const [loader, setLoader] = useState(false);
|
||||||
const [popUp, setPopUp] = useState(false);
|
const [popUp, setPopUp] = useState(false);
|
||||||
const [listReload, setListReload] = useState(false);
|
const [listReload, setListReload] = useState(false);
|
||||||
@@ -33,10 +33,6 @@ export default function FamilyAcc() {
|
|||||||
setPopUp((prev) => !prev);
|
setPopUp((prev) => !prev);
|
||||||
};
|
};
|
||||||
|
|
||||||
const filterHandler = (value) => {
|
|
||||||
setValue(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Handle year selection
|
// Handle year selection
|
||||||
const handleYearChange = (e) => {
|
const handleYearChange = (e) => {
|
||||||
setSelectedYear(e.target.value);
|
setSelectedYear(e.target.value);
|
||||||
@@ -115,8 +111,8 @@ export default function FamilyAcc() {
|
|||||||
const res = await apiCall.familyListings(reqData);
|
const res = await apiCall.familyListings(reqData);
|
||||||
const { data } = res;
|
const { data } = res;
|
||||||
if (data?.internal_return >= 0 && data?.status === "OK") {
|
if (data?.internal_return >= 0 && data?.status === "OK") {
|
||||||
const { result_list } = data;
|
const { result_list, session_image_server } = data;
|
||||||
setFamilyList(result_list);
|
setFamilyList({ result_list, session_image_server });
|
||||||
setLoader(false);
|
setLoader(false);
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
@@ -146,12 +142,9 @@ export default function FamilyAcc() {
|
|||||||
<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 inline-flex gap-3 text-dark-gray dark:text-white items-center">
|
<h1 className="text-26 font-bold inline-flex gap-3 text-dark-gray dark:text-white items-center">
|
||||||
<span
|
<span className={``}>Family Accounts</span>
|
||||||
className={`${selectTab === "today" ? "block" : "hidden"}`}
|
{familyList?.result_list?.length <
|
||||||
>
|
process.env.REACT_APP_MAX_FAMILY_MEMBERS &&
|
||||||
Family Accounts
|
|
||||||
</span>
|
|
||||||
{familyList.length < process.env.REACT_APP_MAX_FAMILY_MEMBERS &&
|
|
||||||
!loader && (
|
!loader && (
|
||||||
<button
|
<button
|
||||||
onClick={popUpHandler}
|
onClick={popUpHandler}
|
||||||
@@ -163,18 +156,37 @@ export default function FamilyAcc() {
|
|||||||
)}
|
)}
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<div className="slider-btns flex space-x-4">
|
<Link
|
||||||
<div
|
to={`/familysettings`}
|
||||||
onClick={() => filterHandler("today")}
|
className="slider-btns flex space-x-4 w-12 h-12 rounded-md shadow-sm justify-center items-center cursor-pointer dark:bg-[linear-gradient(134.38deg,#f539f8_0%,#c342f9_43.55%,#5356fb_104.51%)]"
|
||||||
className="relative"
|
>
|
||||||
></div>
|
<svg
|
||||||
</div>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
strokeWidth={1.5}
|
||||||
|
stroke="currentColor"
|
||||||
|
className="w-6 h-6 dark:stroke-white"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<Suspense fallback={<LoadingSpinner color="sky-blue" size="16" />}>
|
<Suspense fallback={<LoadingSpinner color="sky-blue" size="16" />}>
|
||||||
<FamilyTable
|
<FamilyTable
|
||||||
familyList={familyList}
|
familyList={familyList?.result_list}
|
||||||
loader={loader}
|
loader={loader}
|
||||||
popUpHandler={popUpHandler}
|
popUpHandler={popUpHandler}
|
||||||
|
imageServer={familyList?.session_image_server}
|
||||||
/>
|
/>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -478,13 +478,13 @@ export default function Icons({ name }) {
|
|||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
fill="none"
|
fill="none"
|
||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
stroke-width="1.5"
|
strokeWidth="1.5"
|
||||||
stroke="currentColor"
|
stroke="currentColor"
|
||||||
className="w-4 h-4"
|
className="w-4 h-4"
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
stroke-linecap="round"
|
strokeLinecap="round"
|
||||||
stroke-linejoin="round"
|
strokeLinejoin="round"
|
||||||
d="M8.25 4.5l7.5 7.5-7.5 7.5"
|
d="M8.25 4.5l7.5 7.5-7.5 7.5"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
import React, {useEffect, useState} from 'react'
|
||||||
|
import Image from '../../assets/images/taskbanners/default.jpg'
|
||||||
|
|
||||||
|
import usersService from '../../services/UsersService';
|
||||||
|
import { handlePagingFunc } from '../../components/Pagination/HandlePagination';
|
||||||
|
import PaginatedList from '../../components/Pagination/PaginatedList';
|
||||||
|
|
||||||
|
import LoadingSpinner from '../Spinners/LoadingSpinner';
|
||||||
|
|
||||||
|
import { AmountTo2DP } from '../Helpers/PriceFormatter';
|
||||||
|
|
||||||
|
function JobsCompleted() {
|
||||||
|
|
||||||
|
const apiCall = new usersService()
|
||||||
|
|
||||||
|
let [familyRewardHistory, setFamilyRewardHistory] = useState({ // FOR PURCHASE HISTORY
|
||||||
|
loading: true,
|
||||||
|
data: [],
|
||||||
|
error: false
|
||||||
|
})
|
||||||
|
|
||||||
|
const [currentPage, setCurrentPage] = useState(0);
|
||||||
|
const indexOfFirstItem = Number(currentPage);
|
||||||
|
const indexOfLastItem = Number(indexOfFirstItem)+Number(process.env.REACT_APP_ITEM_PER_PAGE);
|
||||||
|
const currentReward = familyRewardHistory?.data?.slice(indexOfFirstItem, indexOfLastItem);
|
||||||
|
|
||||||
|
const handlePagination = (e) => {
|
||||||
|
handlePagingFunc(e,setCurrentPage)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//FUNCTION TO GET FAMILY REWARD HISTORY
|
||||||
|
const getJobCompletedHistory = ()=>{
|
||||||
|
// apiCall.getFamilyRewardHx().then((res)=>{
|
||||||
|
// if(res.data.internal_return < 0){ // success but no data
|
||||||
|
// setFamilyRewardHistory(prev => ({...prev, loading: false}))
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// setFamilyRewardHistory(prev => ({...prev, loading: false, data: res.data.result_list}))
|
||||||
|
// }).catch((error)=>{
|
||||||
|
// setFamilyRewardHistory(prev => ({...prev, loading: false, error: true}))
|
||||||
|
// })
|
||||||
|
setTimeout(()=>{
|
||||||
|
setFamilyRewardHistory(prev => ({...prev, loading: false, error:true}))
|
||||||
|
},3000)
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
getJobCompletedHistory()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='flex flex-col justify-between min-h-[500px]'>
|
||||||
|
{familyRewardHistory.loading ?
|
||||||
|
<LoadingSpinner size='16' color='sky-blue' height='h-[500px]' />
|
||||||
|
: familyRewardHistory.data.length ?
|
||||||
|
<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>
|
||||||
|
<th className="p-2">Amount</th>
|
||||||
|
<th className="p-2">Date</th>
|
||||||
|
<th className="p-2">Confirmation</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{currentReward.map((item, index) => {
|
||||||
|
let date = new Date(item.added).toLocaleDateString()
|
||||||
|
return (
|
||||||
|
<tr key={index} className='text-slate-500'>
|
||||||
|
<td className="p-2">
|
||||||
|
<div className='flex items-center gap-2'>
|
||||||
|
<img src={item.icon} className='min-w-[60px] max-w-[60px] min-h-[60px] max-h-[60px] rounded-full bg-slate-500' alt='Reward Logo' />
|
||||||
|
<div className='flex flex-col'>
|
||||||
|
<h1 className='text-lg font-bold'>Reward to {item.rec_firstname} {item.rec_lastname}</h1>
|
||||||
|
<p className='text-sm'>{item.description}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td className="p-2">{AmountTo2DP(item.amount*0.01)} {item.currency}</td>
|
||||||
|
<td className="p-2">{date}</td>
|
||||||
|
<td className="p-2">{item.confirmation}</td>
|
||||||
|
</tr>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
:familyRewardHistory.error ?
|
||||||
|
<div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
|
||||||
|
<span>Opps! an error occurred. Please try again!</span>
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
|
||||||
|
<span>No Completed Job History Found!</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{/* PAGINATION BUTTON */}
|
||||||
|
<PaginatedList onClick={handlePagination} prev={currentPage == 0 ? true : false} next={currentPage+Number(process.env.REACT_APP_ITEM_PER_PAGE) >= familyRewardHistory?.data?.length ? true : false} data={familyRewardHistory?.data} start={indexOfFirstItem} stop={indexOfLastItem} />
|
||||||
|
{/* END OF PAGINATION BUTTON */}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default JobsCompleted
|
||||||
@@ -50,7 +50,7 @@ function RewardsTable() {
|
|||||||
<div className='flex flex-col justify-between min-h-[500px]'>
|
<div className='flex flex-col justify-between min-h-[500px]'>
|
||||||
{familyRewardHistory.loading ?
|
{familyRewardHistory.loading ?
|
||||||
<LoadingSpinner size='16' color='sky-blue' height='h-[500px]' />
|
<LoadingSpinner size='16' color='sky-blue' height='h-[500px]' />
|
||||||
:
|
: familyRewardHistory.data.length ?
|
||||||
<table className="wallet-activity w-full table-auto border-collapse text-left">
|
<table className="wallet-activity w-full table-auto border-collapse text-left">
|
||||||
<thead className='border-b-2'>
|
<thead className='border-b-2'>
|
||||||
<tr className='text-slate-600'>
|
<tr className='text-slate-600'>
|
||||||
@@ -60,8 +60,6 @@ function RewardsTable() {
|
|||||||
<th className="p-2">Confirmation</th>
|
<th className="p-2">Confirmation</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
{familyRewardHistory.data.length ?
|
|
||||||
(
|
|
||||||
<tbody>
|
<tbody>
|
||||||
{currentReward.map((item, index) => {
|
{currentReward.map((item, index) => {
|
||||||
let date = new Date(item.added).toLocaleDateString()
|
let date = new Date(item.added).toLocaleDateString()
|
||||||
@@ -84,24 +82,15 @@ function RewardsTable() {
|
|||||||
}
|
}
|
||||||
)}
|
)}
|
||||||
</tbody>
|
</tbody>
|
||||||
)
|
|
||||||
:
|
|
||||||
familyRewardHistory.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 Rewards History Found!</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
}
|
|
||||||
</table>
|
</table>
|
||||||
|
:familyRewardHistory.error ?
|
||||||
|
<div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
|
||||||
|
<span>Opps! an error occurred. Please try again!</span>
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
|
||||||
|
<span>No Rewards History Found!</span>
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
{/* PAGINATION BUTTON */}
|
{/* PAGINATION BUTTON */}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import PurchasesTable from "../MyWallet/WalletComponent/PurchasesTable";
|
|||||||
import RecentActivityTable from "../MyWallet/WalletComponent/RecentActivityTable";
|
import RecentActivityTable from "../MyWallet/WalletComponent/RecentActivityTable";
|
||||||
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
||||||
import RewardsTable from "./RewardsTable";
|
import RewardsTable from "./RewardsTable";
|
||||||
|
import JobsCompleted from "./JobsCompleted";
|
||||||
|
|
||||||
export default function History() {
|
export default function History() {
|
||||||
|
|
||||||
@@ -249,15 +250,24 @@ export default function History() {
|
|||||||
>
|
>
|
||||||
Rewards
|
Rewards
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
name="jobs_completed"
|
||||||
|
onClick={(e) => setTab(e.target.name)}
|
||||||
|
className={`px-4 py-1 rounded-t-2xl ${
|
||||||
|
tab == "jobs_completed" ? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white" : "bg-white text-[#000] border-t-[2px]"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
Jobs Completed
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{/* END OF switch button */}
|
{/* END OF switch button */}
|
||||||
<div className="history-tables w-full">
|
<div className="history-tables w-full">
|
||||||
{/* PURCHASE SECTION */}
|
{/* PURCHASE SECTION */}
|
||||||
{tab == 'purchases' &&
|
{tab == 'purchases' &&
|
||||||
<div className="wallet w-full border-t">
|
<div className="wallet w-full border-t">
|
||||||
<h1 className="p-2 text-xl font-bold text-dark-gray dark:text-white tracking-wide">Purchases</h1>
|
{/* <h1 className="p-2 text-xl font-bold text-dark-gray dark:text-white tracking-wide">Purchases</h1> */}
|
||||||
{purchaseHistory.loading ?
|
{purchaseHistory.loading ?
|
||||||
<LoadingSpinner size='16' color='sky-blue' />
|
<LoadingSpinner size='16' color='sky-blue' height='h-[500px]' />
|
||||||
:
|
:
|
||||||
<PurchasesTable purchase={purchaseHistory} />
|
<PurchasesTable purchase={purchaseHistory} />
|
||||||
}
|
}
|
||||||
@@ -268,10 +278,10 @@ export default function History() {
|
|||||||
{/* RECENT ACTIVITY SECTION */}
|
{/* RECENT ACTIVITY SECTION */}
|
||||||
{tab == 'recent' &&
|
{tab == 'recent' &&
|
||||||
<div className="wallet w-full border-t">
|
<div className="wallet w-full border-t">
|
||||||
<h1 className="p-2 text-xl font-bold text-dark-gray dark:text-white tracking-wide">Recent Activity</h1>
|
{/* <h1 className="p-2 text-xl font-bold text-dark-gray dark:text-white tracking-wide">Recent Activity</h1> */}
|
||||||
{/* <p className='text-base text-slate-500 dark:text-white'>Activity Report</p> */}
|
{/* <p className='text-base text-slate-500 dark:text-white'>Activity Report</p> */}
|
||||||
{paymentHistory.loading ?
|
{paymentHistory.loading ?
|
||||||
<LoadingSpinner size='16' color='sky-blue' />
|
<LoadingSpinner size='16' color='sky-blue' height='h-[500px]' />
|
||||||
:
|
:
|
||||||
<RecentActivityTable payment={paymentHistory} />
|
<RecentActivityTable payment={paymentHistory} />
|
||||||
}
|
}
|
||||||
@@ -286,6 +296,14 @@ export default function History() {
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
{/* END OF REWARD SECTION */}
|
{/* END OF REWARD SECTION */}
|
||||||
|
|
||||||
|
{/* JOBS COMPLETED SECTION */}
|
||||||
|
{tab == 'jobs_completed' &&
|
||||||
|
<div className="wallet w-full border-t">
|
||||||
|
<JobsCompleted />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
{/* END OF JOBS COMPLETED SECTION */}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/*<HistoryTable />*/}
|
{/*<HistoryTable />*/}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import Icons from "../Helpers/Icons";
|
|||||||
import SliderCom from "../Helpers/SliderCom";
|
import SliderCom from "../Helpers/SliderCom";
|
||||||
import FamilyActiveJobsCard from "../Cards/FamilyActiveJobsCard";
|
import FamilyActiveJobsCard from "../Cards/FamilyActiveJobsCard";
|
||||||
|
|
||||||
export default function FamilyActiveLSlde({ className, trending }) {
|
export default function FamilyActiveLSlde({ className, trending, image_server }) {
|
||||||
const settings = {
|
const settings = {
|
||||||
arrows: false,
|
arrows: false,
|
||||||
slidesToShow: 3,
|
slidesToShow: 3,
|
||||||
@@ -98,7 +98,7 @@ export default function FamilyActiveLSlde({ className, trending }) {
|
|||||||
{trending &&
|
{trending &&
|
||||||
trending.length > 0 &&
|
trending.length > 0 &&
|
||||||
trending.map((item) => (
|
trending.map((item) => (
|
||||||
<FamilyActiveJobsCard key={item.id} datas={item} />
|
<FamilyActiveJobsCard key={item.id} datas={item} image_server={image_server} />
|
||||||
))}
|
))}
|
||||||
</SliderCom>
|
</SliderCom>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,18 +4,22 @@ import MyOffersFamilyTable from "../MyTasks/MyOffersFamilyTable";
|
|||||||
import FamilyActiveLSlde from "./FamilyActiveLSlde";
|
import FamilyActiveLSlde from "./FamilyActiveLSlde";
|
||||||
|
|
||||||
export default function FamilyDash({ familyOffers, MyActiveJobList }) {
|
export default function FamilyDash({ familyOffers, MyActiveJobList }) {
|
||||||
console.log("PROPS IN FAMILY DASH->", familyOffers);
|
// console.log("PROPS IN FAMILY DASH->", familyOffers?.result_list);
|
||||||
|
|
||||||
const trending = MyActiveJobList;
|
const trending = MyActiveJobList;
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className="home-page-wrapper">
|
<div className="home-page-wrapper">
|
||||||
{/* <CommonHead commonHeadData={props.commonHeadData} /> */}
|
{/* <CommonHead commonHeadData={props.commonHeadData} /> */}
|
||||||
{familyOffers && familyOffers.length > 0 && (
|
{familyOffers?.result_list && familyOffers?.result_list.length > 0 && (
|
||||||
<MyOffersFamilyTable familyOffers={familyOffers} className="mb-10" />
|
<MyOffersFamilyTable
|
||||||
|
familyOffers={familyOffers?.result_list}
|
||||||
|
image_server={familyOffers?.session_image_server}
|
||||||
|
className="mb-10"
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
{trending && trending.length > 0 && (
|
{trending && trending.length > 0 && (
|
||||||
<FamilyActiveLSlde trending={trending} className="mb-10" />
|
<FamilyActiveLSlde trending={trending} className="mb-10" image_server={familyOffers?.session_image_server} />
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/*<TopSellerTopBuyerSliderSection className="mb-10" />*/}
|
{/*<TopSellerTopBuyerSliderSection className="mb-10" />*/}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ export default function FullAccountDash(props) {
|
|||||||
<MyJobTable
|
<MyJobTable
|
||||||
ActiveJobList={props.MyActiveJobList}
|
ActiveJobList={props.MyActiveJobList}
|
||||||
Account={userDetails}
|
Account={userDetails}
|
||||||
|
imageServer={props.offersList?.data?.session_image_server}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
) : !props.offersList?.loading && !props.MyActiveJobList?.loading ? (
|
) : !props.offersList?.loading && !props.MyActiveJobList?.loading ? (
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ export default function Home(props) {
|
|||||||
<FamilyDash
|
<FamilyDash
|
||||||
account={userDetails}
|
account={userDetails}
|
||||||
commonHeadData={props.bannerList}
|
commonHeadData={props.bannerList}
|
||||||
familyOffers={MyOffersList?.data?.result_list}
|
familyOffers={MyOffersList?.data}
|
||||||
MyActiveJobList={MyActiveJobList?.data}
|
MyActiveJobList={MyActiveJobList?.data}
|
||||||
/>
|
/>
|
||||||
) : userDetails && userDetails?.account_type == "FULL" ? (
|
) : userDetails && userDetails?.account_type == "FULL" ? (
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import React, { useEffect, useState } from 'react'
|
||||||
|
import Layout from '../Partials/Layout'
|
||||||
|
|
||||||
|
import LoadingSpinner from '../Spinners/LoadingSpinner'
|
||||||
|
|
||||||
|
function Lnd() {
|
||||||
|
|
||||||
|
const [reqStatus, setReqStatus] = useState({loading:true, data: []})
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
const timer = setTimeout(()=>{
|
||||||
|
setReqStatus({loading:false, data: []})
|
||||||
|
},2000)
|
||||||
|
return () => clearTimeout(timer)
|
||||||
|
}, [])
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{reqStatus.loading ?
|
||||||
|
<LoadingSpinner color='sky-blue' size='32' height='min-h-screen' />
|
||||||
|
:
|
||||||
|
<div className='min-h-screen flex flex-col justify-center items-center'>Empty Dummy Page</div>
|
||||||
|
}
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Lnd
|
||||||
@@ -8,6 +8,7 @@ import SelectBox from "../Helpers/SelectBox";
|
|||||||
export default function MainSection({
|
export default function MainSection({
|
||||||
className,
|
className,
|
||||||
marketPlaceProduct,
|
marketPlaceProduct,
|
||||||
|
image_server,
|
||||||
categories,
|
categories,
|
||||||
}) {
|
}) {
|
||||||
// Creating All cart..
|
// Creating All cart..
|
||||||
@@ -110,6 +111,7 @@ export default function MainSection({
|
|||||||
{({ datas }) => (
|
{({ datas }) => (
|
||||||
<AvailableJobsCard
|
<AvailableJobsCard
|
||||||
contentDisplay={contentDisplay}
|
contentDisplay={contentDisplay}
|
||||||
|
image_server={image_server}
|
||||||
key={datas.id}
|
key={datas.id}
|
||||||
datas={datas}
|
datas={datas}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ export default function MarketPlace({ commonHeadData }) {
|
|||||||
let { jobLists } = useSelector((state) => state.jobLists);
|
let { jobLists } = useSelector((state) => state.jobLists);
|
||||||
const marketData = jobLists?.result_list;
|
const marketData = jobLists?.result_list;
|
||||||
const categories = jobLists?.categories;
|
const categories = jobLists?.categories;
|
||||||
|
const image_server = jobLists?.session_image_server;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -15,6 +16,7 @@ export default function MarketPlace({ commonHeadData }) {
|
|||||||
<MainSection
|
<MainSection
|
||||||
marketPlaceProduct={marketData}
|
marketPlaceProduct={marketData}
|
||||||
categories={categories}
|
categories={categories}
|
||||||
|
image_server={image_server}
|
||||||
className="mb-10"
|
className="mb-10"
|
||||||
/>
|
/>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|||||||
@@ -3,9 +3,12 @@ import ModalCom from '../../Helpers/ModalCom'
|
|||||||
import LoadingSpinner from '../../Spinners/LoadingSpinner'
|
import LoadingSpinner from '../../Spinners/LoadingSpinner'
|
||||||
import { useNavigate } from 'react-router-dom'
|
import { useNavigate } from 'react-router-dom'
|
||||||
import usersService from '../../../services/UsersService'
|
import usersService from '../../../services/UsersService'
|
||||||
|
import { useDispatch } from 'react-redux'
|
||||||
|
import { tableReload } from '../../../store/TableReloads'
|
||||||
|
|
||||||
function ReviewJobAction({jobDetails}) {
|
function ReviewJobAction({jobDetails}) {
|
||||||
|
|
||||||
|
const dispatch = useDispatch()
|
||||||
const apiCall = new usersService()
|
const apiCall = new usersService()
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
|
|
||||||
@@ -48,6 +51,7 @@ function ReviewJobAction({jobDetails}) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
setReqStatus({loading:false, status: true, message: 'job completion accepted successfully'})
|
setReqStatus({loading:false, status: true, message: 'job completion accepted successfully'})
|
||||||
|
dispatch(tableReload({ type: "WALLETTABLE" }));
|
||||||
setTimeout(()=>{ // Sets popout to false and navigates user to /my-review-jobs after 3 seconds
|
setTimeout(()=>{ // Sets popout to false and navigates user to /my-review-jobs after 3 seconds
|
||||||
popUpHandler()
|
popUpHandler()
|
||||||
navigate('/my-review-jobs', {replace: true})
|
navigate('/my-review-jobs', {replace: true})
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { handlePagingFunc } from "../Pagination/HandlePagination";
|
|||||||
import PaginatedList from "../Pagination/PaginatedList";
|
import PaginatedList from "../Pagination/PaginatedList";
|
||||||
|
|
||||||
export default function MyActiveJobTable({ MyJobList, className }) {
|
export default function MyActiveJobTable({ MyJobList, className }) {
|
||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
let { pathname } = useLocation();
|
let { pathname } = useLocation();
|
||||||
|
|
||||||
@@ -44,6 +45,7 @@ export default function MyActiveJobTable({ MyJobList, className }) {
|
|||||||
value?.currency_code,
|
value?.currency_code,
|
||||||
value?.currency
|
value?.currency
|
||||||
);
|
);
|
||||||
|
let image = `${MyJobList.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={index}
|
key={index}
|
||||||
@@ -51,11 +53,9 @@ export default function MyActiveJobTable({ MyJobList, className }) {
|
|||||||
>
|
>
|
||||||
<td className=" py-4">
|
<td className=" py-4">
|
||||||
<div className="flex space-x-2 items-center w-full">
|
<div className="flex space-x-2 items-center w-full">
|
||||||
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
<div className="max-w-[60px] max-h-[60px] min-w-[60px] min-h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
||||||
<img
|
<img
|
||||||
src={localImgLoad(
|
src={image}
|
||||||
`images/taskbanners/${value.banner}`
|
|
||||||
)}
|
|
||||||
alt="data"
|
alt="data"
|
||||||
className="w-full h-full rounded-full"
|
className="w-full h-full rounded-full"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ import PaginatedList from "../Pagination/PaginatedList";
|
|||||||
import EditJobPopOut from "../jobPopout/EditJobPopout";
|
import EditJobPopOut from "../jobPopout/EditJobPopout";
|
||||||
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
||||||
|
|
||||||
import EditIcon from '../../assets/images/icon-edit.svg'
|
import EditIcon from "../../assets/images/icon-edit.svg";
|
||||||
import DeleteIcon from '../../assets/images/icon-delete.svg'
|
import DeleteIcon from "../../assets/images/icon-delete.svg";
|
||||||
import localImgLoad from "../../lib/localImgLoad";
|
import localImgLoad from "../../lib/localImgLoad";
|
||||||
|
|
||||||
export default function MyJobTable({ MyJobList, reloadJobList, className }) {
|
export default function MyJobTable({ MyJobList, reloadJobList, className }) {
|
||||||
@@ -101,12 +101,19 @@ export default function MyJobTable({ MyJobList, reloadJobList, className }) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const JobListItem = ({ value, index }) => {
|
const JobListItem = ({ value, index, image_server }) => {
|
||||||
let thePrice = PriceFormatter(
|
let thePrice = PriceFormatter(
|
||||||
value?.price * 0.01,
|
value?.price * 0.01,
|
||||||
value?.currency_code,
|
value?.currency_code,
|
||||||
value?.currency
|
value?.currency
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const image = localStorage.getItem("session_token")
|
||||||
|
? `${image_server}${localStorage.getItem("session_token")}/job/${
|
||||||
|
value.job_uid
|
||||||
|
}`
|
||||||
|
: "";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={index}
|
key={index}
|
||||||
@@ -116,7 +123,11 @@ export default function MyJobTable({ MyJobList, reloadJobList, className }) {
|
|||||||
<div className="sm:flex sm:space-x-2 sm:justify-between sm:items-center job-items">
|
<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 w-full">
|
<div className="flex space-x-2 items-center job-items w-full">
|
||||||
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
||||||
<img src={localImgLoad(`images/taskbanners/${value.banner ? value.banner : 'default.jpg'}`)} alt="data" className="w-full h-full rounded-full" />
|
<img
|
||||||
|
src={image}
|
||||||
|
alt="data"
|
||||||
|
className="w-full h-full rounded-full"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col flex-[0.9]">
|
<div className="flex flex-col flex-[0.9]">
|
||||||
<h1 className="font-bold text-xl text-dark-gray dark:text-white">
|
<h1 className="font-bold text-xl text-dark-gray dark:text-white">
|
||||||
@@ -147,7 +158,11 @@ export default function MyJobTable({ MyJobList, reloadJobList, className }) {
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<img className="w-[21px] h-[21px]" src={DeleteIcon} alt='delete-icon' />
|
<img
|
||||||
|
className="w-[21px] h-[21px]"
|
||||||
|
src={DeleteIcon}
|
||||||
|
alt="delete-icon"
|
||||||
|
/>
|
||||||
</button>
|
</button>
|
||||||
<div className="mx-[4px] h-full w-[1px] bg-black dark:bg-dark-gray"></div>
|
<div className="mx-[4px] h-full w-[1px] bg-black dark:bg-dark-gray"></div>
|
||||||
<button
|
<button
|
||||||
@@ -160,7 +175,11 @@ export default function MyJobTable({ MyJobList, reloadJobList, className }) {
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<img className="w-[21px] h-[21px]" src={EditIcon} alt='edit-icon' />
|
<img
|
||||||
|
className="w-[21px] h-[21px]"
|
||||||
|
src={EditIcon}
|
||||||
|
alt="edit-icon"
|
||||||
|
/>
|
||||||
<span className="text-sm text-sky-blue">Edit</span>
|
<span className="text-sm text-sky-blue">Edit</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -201,7 +220,7 @@ export default function MyJobTable({ MyJobList, reloadJobList, className }) {
|
|||||||
contentBodyClasses="w-auto min-w-max"
|
contentBodyClasses="w-auto min-w-max"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{MyJobList.loading ? (
|
{MyJobList?.loading ? (
|
||||||
<LoadingSpinner size="16" color="sky-blue" />
|
<LoadingSpinner size="16" color="sky-blue" />
|
||||||
) : (
|
) : (
|
||||||
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between min-h-[520px]">
|
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between min-h-[520px]">
|
||||||
@@ -213,7 +232,12 @@ export default function MyJobTable({ MyJobList, reloadJobList, className }) {
|
|||||||
MyJobList.data?.result_list.length > 0 ? (
|
MyJobList.data?.result_list.length > 0 ? (
|
||||||
filteredCurrentJobList?.length ? (
|
filteredCurrentJobList?.length ? (
|
||||||
filteredCurrentJobList.map((value, index) => (
|
filteredCurrentJobList.map((value, index) => (
|
||||||
<JobListItem index={index} key={index} value={value} />
|
<JobListItem
|
||||||
|
index={index}
|
||||||
|
key={index}
|
||||||
|
value={value}
|
||||||
|
image_server={MyJobList?.data.session_image_server}
|
||||||
|
/>
|
||||||
))
|
))
|
||||||
) : (
|
) : (
|
||||||
<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">
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import localImgLoad from "../../lib/localImgLoad";
|
|||||||
|
|
||||||
|
|
||||||
export default function MyPendingJobTable({ MyJobList, className }) {
|
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
|
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);
|
const [currentPage, setCurrentPage] = useState(0);
|
||||||
@@ -45,6 +46,7 @@ export default function MyPendingJobTable({ MyJobList, className }) {
|
|||||||
value?.currency_code,
|
value?.currency_code,
|
||||||
value?.currency
|
value?.currency
|
||||||
);
|
);
|
||||||
|
let image = `${MyJobList.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={index}
|
key={index}
|
||||||
@@ -54,7 +56,7 @@ export default function MyPendingJobTable({ MyJobList, className }) {
|
|||||||
<div className="flex space-x-2 items-center w-full">
|
<div className="flex space-x-2 items-center w-full">
|
||||||
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
||||||
<img
|
<img
|
||||||
src={localImgLoad(`images/taskbanners/${value.banner || "default.jpg"}`)}
|
src={image}
|
||||||
alt="data"
|
alt="data"
|
||||||
className="w-full h-full rounded-full"
|
className="w-full h-full rounded-full"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import localImgLoad from "../../lib/localImgLoad";
|
|||||||
const noTasksBg = require("../../assets/images/no-task-background.jpg");
|
const noTasksBg = require("../../assets/images/no-task-background.jpg");
|
||||||
const noFamilyTasksBg = require("../../assets/images/family-no-task-background.jpg");
|
const noFamilyTasksBg = require("../../assets/images/family-no-task-background.jpg");
|
||||||
|
|
||||||
export default function MyJobTable({ className, ActiveJobList, Account }) {
|
export default function MyJobTable({ className, ActiveJobList, Account, imageServer }) {
|
||||||
let navigate = useNavigate();
|
let navigate = useNavigate();
|
||||||
let { pathname } = useLocation();
|
let { pathname } = useLocation();
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ export default function MyJobTable({ className, ActiveJobList, Account }) {
|
|||||||
{!ActiveJobList?.data.length && accountType && (
|
{!ActiveJobList?.data.length && accountType && (
|
||||||
<div className="absolute inset-0 bg-black opacity-30"></div>
|
<div className="absolute inset-0 bg-black opacity-30"></div>
|
||||||
)}
|
)}
|
||||||
{ActiveJobList.loading ?
|
{ActiveJobList?.loading ?
|
||||||
<div className="w-full h-[520px] flex items-center justify-center">
|
<div className="w-full h-[520px] flex items-center justify-center">
|
||||||
<LoadingSpinner size="16" color="sky-blue" />
|
<LoadingSpinner size="16" color="sky-blue" />
|
||||||
</div>
|
</div>
|
||||||
@@ -71,6 +71,7 @@ export default function MyJobTable({ className, ActiveJobList, Account }) {
|
|||||||
task?.currency_code,
|
task?.currency_code,
|
||||||
task?.currency
|
task?.currency
|
||||||
);
|
);
|
||||||
|
let image = `${imageServer}${localStorage.getItem('session_token')}/job/${task.origin_job_uid}`
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] w-full flex justify-between items-center hover:bg-gray-50"
|
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] w-full flex justify-between items-center hover:bg-gray-50"
|
||||||
@@ -80,7 +81,7 @@ export default function MyJobTable({ className, ActiveJobList, Account }) {
|
|||||||
<div className="flex space-x-2 items-center">
|
<div className="flex space-x-2 items-center">
|
||||||
<div className="w-full min-w-[60px] max-w-[60px] flex-[0.1] h-[60px] rounded-full overflow-hidden flex justify-center items-center">
|
<div className="w-full min-w-[60px] max-w-[60px] flex-[0.1] h-[60px] rounded-full overflow-hidden flex justify-center items-center">
|
||||||
<img
|
<img
|
||||||
src={localImgLoad(`images/taskbanners/${task?.banner}`)}
|
src={image}
|
||||||
alt="data"
|
alt="data"
|
||||||
className="w-full h-full"
|
className="w-full h-full"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import Icons from "../Helpers/Icons";
|
|||||||
import SliderCom from "../Helpers/SliderCom";
|
import SliderCom from "../Helpers/SliderCom";
|
||||||
import FamilyOfferJobPopout from "../jobPopout/FamilyOfferJobPopout";
|
import FamilyOfferJobPopout from "../jobPopout/FamilyOfferJobPopout";
|
||||||
|
|
||||||
export default function MyOffersFamilyTable({ className, familyOffers }) {
|
export default function MyOffersFamilyTable({ className, familyOffers, image_server }) {
|
||||||
let [offerPopout, setOfferPopout] = useState({ show: false, data: {} }); // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW
|
let [offerPopout, setOfferPopout] = useState({ show: false, data: {} }); // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW
|
||||||
const settings = {
|
const settings = {
|
||||||
arrows: false,
|
arrows: false,
|
||||||
@@ -117,6 +117,7 @@ export default function MyOffersFamilyTable({ className, familyOffers }) {
|
|||||||
key={item.id}
|
key={item.id}
|
||||||
datas={item}
|
datas={item}
|
||||||
setOfferPopout={setOfferPopout}
|
setOfferPopout={setOfferPopout}
|
||||||
|
image_server={image_server}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ export default function MyOffersTable({ className, MyActiveOffersList }) {
|
|||||||
MyActiveOffersList?.result_list?.length > 0 &&
|
MyActiveOffersList?.result_list?.length > 0 &&
|
||||||
MyActiveOffersList.result_list.map((item) => {
|
MyActiveOffersList.result_list.map((item) => {
|
||||||
return (
|
return (
|
||||||
<OfferCard key={item.id} datas={item} setOfferPopout={setOfferPopout} />
|
<OfferCard key={item.id} datas={item} setOfferPopout={setOfferPopout} image_server={MyActiveOffersList.session_image_server} />
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
</SliderCom>
|
</SliderCom>
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ export default function MyTasks({
|
|||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
<MyJobTable ActiveJobList={ActiveJobList} Account={userDetails} />
|
<MyJobTable ActiveJobList={ActiveJobList} Account={userDetails} imageServer={MyActiveOffersList.session_image_server} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export default function MyWaitingJobTable({ MyJobList, className }) {
|
|||||||
value?.currency_code,
|
value?.currency_code,
|
||||||
value?.currency
|
value?.currency
|
||||||
);
|
);
|
||||||
let image = value.banner ? value.banner : 'default.jpg'
|
let image = `${MyJobList.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={index}
|
key={index}
|
||||||
@@ -52,9 +52,9 @@ export default function MyWaitingJobTable({ MyJobList, className }) {
|
|||||||
>
|
>
|
||||||
<td className=" py-4">
|
<td className=" py-4">
|
||||||
<div className="flex space-x-2 items-center w-full">
|
<div className="flex space-x-2 items-center w-full">
|
||||||
<div className="w-[60px] h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
<div className="max-w-[60px] max-h-[60px] min-w-[60px] min-h-[60px] p-2 bg-alice-blue rounded-full overflow-hidden flex justify-center items-center">
|
||||||
<img
|
<img
|
||||||
src={localImgLoad(`images/taskbanners/${image}`)}
|
src={image}
|
||||||
alt="data"
|
alt="data"
|
||||||
className="w-full h-full rounded-full"
|
className="w-full h-full rounded-full"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -170,9 +170,9 @@ function ConfirmNairaWithdraw({
|
|||||||
viewBox="0 0 24 24"
|
viewBox="0 0 24 24"
|
||||||
fill="none"
|
fill="none"
|
||||||
stroke="green"
|
stroke="green"
|
||||||
stroke-width="2"
|
strokeWidth="2"
|
||||||
stroke-linecap="round"
|
strokeLinecap="round"
|
||||||
stroke-linejoin="round"
|
strokeLinejoin="round"
|
||||||
className="feather feather-check-circle"
|
className="feather feather-check-circle"
|
||||||
>
|
>
|
||||||
<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path>
|
<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path>
|
||||||
@@ -186,9 +186,9 @@ function ConfirmNairaWithdraw({
|
|||||||
width="100"
|
width="100"
|
||||||
height="100"
|
height="100"
|
||||||
stroke="red"
|
stroke="red"
|
||||||
stroke-width="2"
|
strokeWidth="2"
|
||||||
stroke-linecap="round"
|
strokeLinecap="round"
|
||||||
stroke-linejoin="round"
|
strokeLinejoin="round"
|
||||||
className="feather feather-x-circle"
|
className="feather feather-x-circle"
|
||||||
>
|
>
|
||||||
<circle cx="12" cy="12" r="10"></circle>
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
import { useSelector } from "react-redux";
|
||||||
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
||||||
import WalletItemCard from "./WalletItemCard";
|
import WalletItemCard from "./WalletItemCard";
|
||||||
|
import WalletItemCardFamily from "./WalletItemCardFamily";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders a list of wallet items or a loading spinner depending on the state of the `wallet` object.
|
* Renders a list of wallet items or a loading spinner depending on the state of the `wallet` object.
|
||||||
@@ -7,9 +9,27 @@ import WalletItemCard from "./WalletItemCard";
|
|||||||
export default function WalletBox({ wallet, payment, countries }) {
|
export default function WalletBox({ wallet, payment, countries }) {
|
||||||
const { loading, data } = wallet;
|
const { loading, data } = wallet;
|
||||||
|
|
||||||
|
const { userDetails } = useSelector((state) => state.userDetails);
|
||||||
|
const accountType = userDetails?.account_type === "FAMILY";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="my-wallet-wrapper w-full mb-10">
|
<div className="my-wallet-wrapper w-full mb-10">
|
||||||
<div className="main-wrapper w-full">
|
<div className="main-wrapper w-full">
|
||||||
|
{accountType ?
|
||||||
|
<div className="balance-inquery w-auto grid sm:grid-cols-2 lg:grid-cols-2 xl:grid-cols-[repeat(auto-fill,_minmax(354px,_1fr))] min-[1440px]:grid-cols-[repeat(auto-fill,_minmax(415px,_1fr))] gap-5 mb-11 h-auto">
|
||||||
|
{loading ? (
|
||||||
|
<div className="w-full h-full flex items-center justify-center">
|
||||||
|
<LoadingSpinner size="16" color="sky-blue" />
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
data.length > 0 && data.map((item) => (
|
||||||
|
<div key={item.wallet_uid} className="lg:w-full h-full mb-10 lg:mb-0">
|
||||||
|
<WalletItemCardFamily walletItem={item} payment={payment} countries={countries} />
|
||||||
|
</div>
|
||||||
|
))
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
:
|
||||||
<div className="balance-inquery w-auto grid sm:grid-cols-2 lg:grid-cols-2 xl:grid-cols-[repeat(auto-fill,_minmax(354px,_1fr))] min-[1440px]:grid-cols-[repeat(auto-fill,_minmax(415px,_1fr))] gap-5 mb-11 h-auto">
|
<div className="balance-inquery w-auto grid sm:grid-cols-2 lg:grid-cols-2 xl:grid-cols-[repeat(auto-fill,_minmax(354px,_1fr))] min-[1440px]:grid-cols-[repeat(auto-fill,_minmax(415px,_1fr))] gap-5 mb-11 h-auto">
|
||||||
{loading ? (
|
{loading ? (
|
||||||
<div className="w-full h-full flex items-center justify-center">
|
<div className="w-full h-full flex items-center justify-center">
|
||||||
@@ -23,6 +43,7 @@ export default function WalletBox({ wallet, payment, countries }) {
|
|||||||
))
|
))
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ function PurchasesTable({purchase}) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col justify-between min-h-[500px]'>
|
<div className='flex flex-col justify-between min-h-[500px]'>
|
||||||
|
{purchase.data.length ?
|
||||||
<table className="wallet-activity w-full table-auto border-collapse text-left">
|
<table className="wallet-activity w-full table-auto border-collapse text-left">
|
||||||
<thead className='border-b-2'>
|
<thead className='border-b-2'>
|
||||||
<tr className='text-slate-600'>
|
<tr className='text-slate-600'>
|
||||||
@@ -24,8 +25,6 @@ function PurchasesTable({purchase}) {
|
|||||||
<th className="p-2">Fee</th>
|
<th className="p-2">Fee</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
{purchase.data.length ?
|
|
||||||
(
|
|
||||||
<tbody>
|
<tbody>
|
||||||
{currentPurchase.map((item, index) => (
|
{currentPurchase.map((item, index) => (
|
||||||
<tr key={index} className='text-slate-500'>
|
<tr key={index} className='text-slate-500'>
|
||||||
@@ -37,24 +36,16 @@ function PurchasesTable({purchase}) {
|
|||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
</tbody>
|
</tbody>
|
||||||
)
|
|
||||||
:
|
|
||||||
purchase.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>
|
</table>
|
||||||
|
:purchase.error ?
|
||||||
|
<div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
|
||||||
|
<span>Opps! an error occurred. Please try again!</span>
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
|
||||||
|
<span>No Purchase History Found!</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
{/* PAGINATION BUTTON */}
|
{/* PAGINATION BUTTON */}
|
||||||
<PaginatedList onClick={handlePagination} prev={currentPage == 0 ? true : false} next={currentPage+Number(process.env.REACT_APP_ITEM_PER_PAGE) >= purchase?.data?.length ? true : false} data={purchase?.data} start={indexOfFirstItem} stop={indexOfLastItem} />
|
<PaginatedList onClick={handlePagination} prev={currentPage == 0 ? true : false} next={currentPage+Number(process.env.REACT_APP_ITEM_PER_PAGE) >= purchase?.data?.length ? true : false} data={purchase?.data} start={indexOfFirstItem} stop={indexOfLastItem} />
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ function RecentActivityTable({ payment }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col justify-between min-h-[500px]">
|
<div className="flex flex-col justify-between min-h-[500px]">
|
||||||
|
{payment?.data?.length > 0 ?
|
||||||
<table className="wallet-activity w-full table-auto border-collapse text-left">
|
<table className="wallet-activity w-full table-auto border-collapse text-left">
|
||||||
<thead className="border-b-2">
|
<thead className="border-b-2">
|
||||||
<tr className="text-slate-600">
|
<tr className="text-slate-600">
|
||||||
@@ -28,7 +29,6 @@ function RecentActivityTable({ payment }) {
|
|||||||
<th className="p-2">Status</th>
|
<th className="p-2">Status</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
{payment?.data?.length > 0 ? (
|
|
||||||
<tbody>
|
<tbody>
|
||||||
{currentActivity.map((item, index) => (
|
{currentActivity.map((item, index) => (
|
||||||
<tr key={index} className="text-slate-500">
|
<tr key={index} className="text-slate-500">
|
||||||
@@ -46,24 +46,16 @@ function RecentActivityTable({ payment }) {
|
|||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
</tbody>
|
</tbody>
|
||||||
) : payment?.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 Payment History Found!
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
)}
|
|
||||||
</table>
|
</table>
|
||||||
|
:payment.error ?
|
||||||
|
<div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
|
||||||
|
<span>Opps! an error occurred. Please try again!</span>
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
|
||||||
|
<span>No Payment History Found!</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
{/* PAGINATION BUTTON */}
|
{/* PAGINATION BUTTON */}
|
||||||
<PaginatedList
|
<PaginatedList
|
||||||
|
|||||||
@@ -11,8 +11,7 @@ import WalletAction from "./WalletAction";
|
|||||||
* Renders a card displaying information about a wallet item.
|
* Renders a card displaying information about a wallet item.
|
||||||
*/
|
*/
|
||||||
export default function WalletItemCard({ walletItem, payment, countries }) {
|
export default function WalletItemCard({ walletItem, payment, countries }) {
|
||||||
const { userDetails } = useSelector((state) => state.userDetails);
|
|
||||||
const accountType = userDetails?.account_type === "FAMILY";
|
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const [creditPopup, setCreditPopup] = useState({ show: false, data: {} });
|
const [creditPopup, setCreditPopup] = useState({ show: false, data: {} });
|
||||||
|
|
||||||
@@ -91,13 +90,11 @@ export default function WalletItemCard({ walletItem, payment, countries }) {
|
|||||||
|
|
||||||
<div className="my-2 w-full h-[1px] bg-white"></div>
|
<div className="my-2 w-full h-[1px] bg-white"></div>
|
||||||
|
|
||||||
{!accountType && (
|
|
||||||
<WalletAction
|
<WalletAction
|
||||||
walletItem={{ ...walletItem, walletCountry: currentWalletCurrency }}
|
walletItem={{ ...walletItem, walletCountry: currentWalletCurrency }}
|
||||||
payment={payment}
|
payment={payment}
|
||||||
openPopUp={openPopUp}
|
openPopUp={openPopUp}
|
||||||
/>
|
/>
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{creditPopup.show && (
|
{creditPopup.show && (
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
import React, { useState } from "react";
|
||||||
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
|
import background from "../../assets/images/bg-sky-blue.jpg"; //shape/balance-bg.svg";
|
||||||
|
import localImgLoad from "../../lib/localImgLoad";
|
||||||
|
import { tableReload } from "../../store/TableReloads";
|
||||||
|
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
||||||
|
import CreditPopup from "./Popup/CreditPopup";
|
||||||
|
import WalletAction from "./WalletAction";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders a card displaying information about a wallet item.
|
||||||
|
*/
|
||||||
|
export default function WalletItemCardFamily({ walletItem, payment, countries }) {
|
||||||
|
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const [creditPopup, setCreditPopup] = useState({ show: false, data: {} });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens the credit popup.
|
||||||
|
* @param {Object} value - The value object.
|
||||||
|
*/
|
||||||
|
const openPopUp = (value) => {
|
||||||
|
setCreditPopup({
|
||||||
|
show: true,
|
||||||
|
data: { ...value },
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the credit popup and dispatches a table reload action.
|
||||||
|
*/
|
||||||
|
const closePopUp = () => {
|
||||||
|
setCreditPopup({ show: false, data: {} });
|
||||||
|
dispatch(tableReload({ type: "WALLETTABLE" }));
|
||||||
|
};
|
||||||
|
|
||||||
|
const currentWalletCurrency = countries
|
||||||
|
.map((country) => country)
|
||||||
|
.filter((country) => country[0] === walletItem.country);
|
||||||
|
|
||||||
|
const image = walletItem.code
|
||||||
|
? `${walletItem.code.toLowerCase()}.svg`
|
||||||
|
: "default.png";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div
|
||||||
|
className="current-balance-widget w-full h-full rounded-2xl overflow-hidden flex flex-col items-center gap-2 p-8 justify-between"
|
||||||
|
style={{
|
||||||
|
background: `url(${background}) 0% 0% / cover no-repeat`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div className="wallet w-full flex justify-between items-center gap-3">
|
||||||
|
<div className="min-w-[100px] min-h-[100px] max-w-min md:max-w-[150px] max-h-min md:max-h-[150px] rounded-full bg-[#e3e3e3] flex justify-center items-center">
|
||||||
|
<img
|
||||||
|
src={localImgLoad(`images/currency/${image}`)}
|
||||||
|
className="w-full h-full"
|
||||||
|
alt="currency-icon"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="balance w-full mt-2 flex justify-center">
|
||||||
|
<div className="">
|
||||||
|
<p className="text-base sm:text-lg text-white opacity-[70%] tracking-wide mb-2 sm:mb-6">
|
||||||
|
Current Balance
|
||||||
|
</p>
|
||||||
|
<p className="text-[44px] lg:text-[62px] font-bold text-white tracking-wide leading-10 xxs:scale-100 lg:scale-100 xl:scale-125">
|
||||||
|
{PriceFormatter(
|
||||||
|
walletItem.amount * 0.01,
|
||||||
|
walletItem.code,
|
||||||
|
undefined,
|
||||||
|
"text-[2rem]"
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="my-2 w-full h-[1px] bg-white"></div>
|
||||||
|
|
||||||
|
{/* <WalletAction
|
||||||
|
walletItem={{ ...walletItem, walletCountry: currentWalletCurrency }}
|
||||||
|
payment={payment}
|
||||||
|
openPopUp={openPopUp}
|
||||||
|
/> */}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{creditPopup.show && (
|
||||||
|
<CreditPopup
|
||||||
|
details={creditPopup.data}
|
||||||
|
walletItem={walletItem}
|
||||||
|
onClose={closePopUp}
|
||||||
|
situation={openPopUp}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -6,8 +6,11 @@ import CommonHead from "../UserHeader/CommonHead";
|
|||||||
import usersService from "../../services/UsersService";
|
import usersService from "../../services/UsersService";
|
||||||
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
||||||
import OthersInterestedTable from "./OthersInterestedTable";
|
import OthersInterestedTable from "./OthersInterestedTable";
|
||||||
|
import { useDispatch } from "react-redux";
|
||||||
|
import { tableReload } from "../../store/TableReloads";
|
||||||
|
|
||||||
export default function ManageInterestOffer(props) {
|
export default function ManageInterestOffer(props) {
|
||||||
|
const dispatch = useDispatch()
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
const apiCall = new usersService()
|
const apiCall = new usersService()
|
||||||
|
|
||||||
@@ -89,6 +92,7 @@ export default function ManageInterestOffer(props) {
|
|||||||
setRedirectTime(prev => prev - 1)
|
setRedirectTime(prev => prev - 1)
|
||||||
}, 1000);
|
}, 1000);
|
||||||
setRequestStatus({loading: false, status: true, message: `Offer ${name}ed`, processType: ''})
|
setRequestStatus({loading: false, status: true, message: `Offer ${name}ed`, processType: ''})
|
||||||
|
dispatch(tableReload({ type: "WALLETTABLE" }));
|
||||||
setTimeout(()=>{
|
setTimeout(()=>{
|
||||||
navigate('/offer-interest', {replace: true})
|
navigate('/offer-interest', {replace: true})
|
||||||
clearInterval(intervalTime)
|
clearInterval(intervalTime)
|
||||||
|
|||||||
@@ -36,6 +36,18 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
|
|||||||
const { notifications } = useSelector((state) => state?.notifications); // NOTIFICATION STORE
|
const { notifications } = useSelector((state) => state?.notifications); // NOTIFICATION STORE
|
||||||
const { walletDetails } = useSelector((state) => state?.walletDetails); // WALLET STORE
|
const { walletDetails } = useSelector((state) => state?.walletDetails); // WALLET STORE
|
||||||
|
|
||||||
|
const image = localStorage.getItem("session_token")
|
||||||
|
? userDetails.account_type === "FAMILY"
|
||||||
|
? `${userDetails.session_image_server}${localStorage.getItem(
|
||||||
|
"session_token"
|
||||||
|
)}/family/${sessionStorage.getItem("family_uid")}`
|
||||||
|
: `${userDetails.session_image_server}${localStorage.getItem(
|
||||||
|
"session_token"
|
||||||
|
)}/profile/${userDetails.uid}`
|
||||||
|
: "";
|
||||||
|
|
||||||
|
// 9308RDR122
|
||||||
|
|
||||||
const handlerBalance = () => {
|
const handlerBalance = () => {
|
||||||
setbalanceValue.toggle();
|
setbalanceValue.toggle();
|
||||||
if (notificationDropdown) {
|
if (notificationDropdown) {
|
||||||
@@ -91,7 +103,7 @@ export default function Header({ logoutModalHandler, sidebarHandler }) {
|
|||||||
// User Profile
|
// User Profile
|
||||||
let { firstname, lastname, email, profile_pic_url } = userDetails;
|
let { firstname, lastname, email, profile_pic_url } = userDetails;
|
||||||
let userEmail = email?.split("@")[0];
|
let userEmail = email?.split("@")[0];
|
||||||
const userProfileImage = profile_pic_url || DEFAULT_PROFILE_IMAGE;
|
const userProfileImage = image || DEFAULT_PROFILE_IMAGE;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ export default function Layout({ children }) {
|
|||||||
localStorage.removeItem("session_token");
|
localStorage.removeItem("session_token");
|
||||||
localStorage.removeItem("member_id");
|
localStorage.removeItem("member_id");
|
||||||
localStorage.removeItem("uid");
|
localStorage.removeItem("uid");
|
||||||
|
sessionStorage.removeItem("family_uid");
|
||||||
// localStorage.clear();
|
// localStorage.clear();
|
||||||
// toast.success("Come Back Soon", {
|
// toast.success("Come Back Soon", {
|
||||||
// icon: `🙂`,
|
// icon: `🙂`,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useRef, useState } from "react";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import usersService from "../../../services/UsersService";
|
import usersService from "../../../services/UsersService";
|
||||||
@@ -6,6 +6,9 @@ import Icons from "../../Helpers/Icons";
|
|||||||
import InputCom from "../../Helpers/Inputs/InputCom";
|
import InputCom from "../../Helpers/Inputs/InputCom";
|
||||||
import LoadingSpinner from "../../Spinners/LoadingSpinner";
|
import LoadingSpinner from "../../Spinners/LoadingSpinner";
|
||||||
|
|
||||||
|
import cover from "../../../assets/images/profile-info-cover.png";
|
||||||
|
import profileImage from "../../../assets/images/profile.jpg";
|
||||||
|
|
||||||
import { Form, Formik } from "formik";
|
import { Form, Formik } from "formik";
|
||||||
import * as Yup from "yup";
|
import * as Yup from "yup";
|
||||||
|
|
||||||
@@ -43,18 +46,15 @@ export default function PersonalInfoTab({
|
|||||||
frstNmeHndlr,
|
frstNmeHndlr,
|
||||||
lstNmeHndlr,
|
lstNmeHndlr,
|
||||||
dscrphn,
|
dscrphn,
|
||||||
profileImg,
|
|
||||||
coverImg,
|
|
||||||
profileImgInput,
|
|
||||||
browseProfileImg,
|
|
||||||
profileImgChangHandler,
|
|
||||||
coverImgInput,
|
|
||||||
browseCoverImg,
|
|
||||||
coverImgChangHandler,
|
|
||||||
uploadStatus
|
|
||||||
}) {
|
}) {
|
||||||
let { userDetails } = useSelector((state) => state.userDetails);
|
let { userDetails } = useSelector((state) => state.userDetails);
|
||||||
|
|
||||||
|
const image = localStorage.getItem("session_token")
|
||||||
|
? `${userDetails.session_image_server}${localStorage.getItem(
|
||||||
|
"session_token"
|
||||||
|
)}/profile/${userDetails.uid}`
|
||||||
|
: "";
|
||||||
|
|
||||||
const apiCall = new usersService();
|
const apiCall = new usersService();
|
||||||
|
|
||||||
let navigate = useNavigate();
|
let navigate = useNavigate();
|
||||||
@@ -85,6 +85,125 @@ export default function PersonalInfoTab({
|
|||||||
status: false,
|
status: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const [profileImg, setProfileImg] = useState(
|
||||||
|
userDetails?.session_image_server ? image : profileImage
|
||||||
|
);
|
||||||
|
|
||||||
|
let [uploadStatus, setUploadStatus] = useState({
|
||||||
|
loading: false,
|
||||||
|
status: false,
|
||||||
|
message: "",
|
||||||
|
}); // HOLDS STATE FOR UPLOAD PROFILE PICTURE STATUS
|
||||||
|
|
||||||
|
const [coverImg, setCoverImg] = useState(cover);
|
||||||
|
|
||||||
|
// profile img
|
||||||
|
const profileImgInput = useRef(null);
|
||||||
|
const browseProfileImg = () => {
|
||||||
|
profileImgInput.current.click();
|
||||||
|
};
|
||||||
|
|
||||||
|
const profileImgChangHandler = (e) => {
|
||||||
|
setUploadStatus({ loading: false, status: false, message: "" });
|
||||||
|
const acceptedFormat = ["jpeg", "jpg", "png", "bmp", "gif"]; // ARRAY OF SUPPORTED FORMATS
|
||||||
|
const uploadedFile = e.target.files[0]; //UPLOADED FILE
|
||||||
|
|
||||||
|
const fileFormat = uploadedFile?.type?.split("/")[1]?.toLowerCase();
|
||||||
|
const MAX_FILE_SIZE = 5 * 1048576; // 5MB
|
||||||
|
|
||||||
|
if (!acceptedFormat.includes(fileFormat)) {
|
||||||
|
//CHECKING FOR CORRECT UPLOAD FORMAT
|
||||||
|
const msg = `Please select ${acceptedFormat
|
||||||
|
.slice(0, -1)
|
||||||
|
.join(", ")} or ${acceptedFormat.slice(-1)}`;
|
||||||
|
setUploadStatus({ loading: false, status: false, message: msg });
|
||||||
|
return setTimeout(() => {
|
||||||
|
profileImgInput.current.value = ""; // clear the input
|
||||||
|
setUploadStatus({ loading: false, status: false, message: "" });
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uploadedFile.size > MAX_FILE_SIZE) {
|
||||||
|
// CHECKING FOR CORRECT FILE SIZE
|
||||||
|
setUploadStatus({
|
||||||
|
loading: false,
|
||||||
|
status: false,
|
||||||
|
message: "File must not exceed 5MB",
|
||||||
|
});
|
||||||
|
return setTimeout(() => {
|
||||||
|
profileImgInput.current.value = ""; // clear the input
|
||||||
|
setUploadStatus({ loading: false, status: false, message: "" });
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.target.value !== "") {
|
||||||
|
const imgReader = new FileReader();
|
||||||
|
imgReader.onload = (event) => {
|
||||||
|
let base64Img = imgReader.result.split(",")[1];
|
||||||
|
let reqData = {
|
||||||
|
// PAYLOAD FOR API CALL
|
||||||
|
file_name: uploadedFile?.name,
|
||||||
|
file_size: uploadedFile?.size,
|
||||||
|
file_type: uploadedFile?.type?.split("/")[0]?.toLowerCase(),
|
||||||
|
file_data: base64Img,
|
||||||
|
msg_type: "FILE",
|
||||||
|
action: 11300,
|
||||||
|
};
|
||||||
|
|
||||||
|
setUploadStatus({
|
||||||
|
loading: true,
|
||||||
|
status: false,
|
||||||
|
message: "Loading...",
|
||||||
|
});
|
||||||
|
apiCall
|
||||||
|
.sendFiles(reqData)
|
||||||
|
.then((res) => {
|
||||||
|
if (res.status != 200 || res.data.internal_return < 0) {
|
||||||
|
return setUploadStatus({
|
||||||
|
loading: false,
|
||||||
|
status: false,
|
||||||
|
message: "Something went wrong, try again",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
setUploadStatus({
|
||||||
|
loading: false,
|
||||||
|
status: true,
|
||||||
|
message: "Uploaded successfully",
|
||||||
|
});
|
||||||
|
setProfileImg(event.target.result);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
setUploadStatus({
|
||||||
|
loading: false,
|
||||||
|
status: false,
|
||||||
|
message: "Network error, try again",
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
setUploadStatus({ loading: false, status: false, message: "" });
|
||||||
|
}, 5000);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
imgReader.readAsDataURL(uploadedFile);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// cover img
|
||||||
|
const coverImgInput = useRef(null);
|
||||||
|
const browseCoverImg = () => {
|
||||||
|
coverImgInput.current.click();
|
||||||
|
};
|
||||||
|
const coverImgChangHandler = (e) => {
|
||||||
|
if (e.target.value !== "") {
|
||||||
|
const imgReader = new FileReader();
|
||||||
|
imgReader.onload = (event) => {
|
||||||
|
setCoverImg(event.target.result);
|
||||||
|
};
|
||||||
|
imgReader.readAsDataURL(e.target.files[0]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleUpdateUser = (values, helpers) => {
|
const handleUpdateUser = (values, helpers) => {
|
||||||
setRequestState({ message: "", loading: true, status: false });
|
setRequestState({ message: "", loading: true, status: false });
|
||||||
|
|
||||||
@@ -374,7 +493,7 @@ export default function PersonalInfoTab({
|
|||||||
<p className="text-base text-thin-light-gray mb-5">
|
<p className="text-base text-thin-light-gray mb-5">
|
||||||
Profile of at least Size
|
Profile of at least Size
|
||||||
<span className="ml-1 text-dark-gray dark:text-white">
|
<span className="ml-1 text-dark-gray dark:text-white">
|
||||||
300x300
|
200x200
|
||||||
</span>
|
</span>
|
||||||
. Gifs work too.
|
. Gifs work too.
|
||||||
<span className="ml-1 text-dark-gray dark:text-white">
|
<span className="ml-1 text-dark-gray dark:text-white">
|
||||||
@@ -383,11 +502,11 @@ export default function PersonalInfoTab({
|
|||||||
.
|
.
|
||||||
</p>
|
</p>
|
||||||
<div className="flex justify-center">
|
<div className="flex justify-center">
|
||||||
<div className="w-full relative">
|
<div className="w-[200px] h-[200px] relative">
|
||||||
<img
|
<img
|
||||||
src={profileImg}
|
src={profileImg}
|
||||||
alt="profile"
|
alt="profile"
|
||||||
className="sm:w-[198px] sm:h-[198px] w-[120px] h-[120px] rounded-full overflow-hidden object-contain object-center"
|
className="sm:w-[198px] sm:h-[198px] w-full h-full rounded-full overflow-hidden object-cover object-center"
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
ref={profileImgInput}
|
ref={profileImgInput}
|
||||||
@@ -397,7 +516,7 @@ export default function PersonalInfoTab({
|
|||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
onClick={browseProfileImg}
|
onClick={browseProfileImg}
|
||||||
className="w-[32px] h-[32px] absolute bottom-7 sm:right-10 right-[105px] hover:bg-pink bg-dark-gray rounded-full cursor-pointer"
|
className="w-[32px] h-[32px] absolute bottom-4 right-4 hover:bg-pink bg-dark-gray rounded-full cursor-pointer"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
width="32"
|
width="32"
|
||||||
@@ -418,8 +537,20 @@ export default function PersonalInfoTab({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{uploadStatus.message && !uploadStatus.loading && <p className={`text-center ${uploadStatus.status ? 'text-green-500':'text-red-500'}`}>{uploadStatus.message}</p>}
|
{uploadStatus.message && !uploadStatus.loading && (
|
||||||
{uploadStatus.loading && <p className="text-center">{uploadStatus.message}</p>}
|
<p
|
||||||
|
className={`text-center ${
|
||||||
|
uploadStatus.status
|
||||||
|
? "text-green-500"
|
||||||
|
: "text-red-500"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{uploadStatus.message}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
{uploadStatus.loading && (
|
||||||
|
<p className="text-center">{uploadStatus.message}</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/* } */}
|
{/* } */}
|
||||||
|
|||||||
+115
-194
@@ -6,8 +6,6 @@ import React, {
|
|||||||
useState,
|
useState,
|
||||||
} from "react";
|
} from "react";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import cover from "../../assets/images/profile-info-cover.png";
|
|
||||||
import profile from "../../assets/images/profile.jpg";
|
|
||||||
import usersService from "../../services/UsersService";
|
import usersService from "../../services/UsersService";
|
||||||
import Icons from "../Helpers/Icons";
|
import Icons from "../Helpers/Icons";
|
||||||
import Layout from "../Partials/Layout";
|
import Layout from "../Partials/Layout";
|
||||||
@@ -26,161 +24,8 @@ import RecipientAccountTab from "./Tabs/RecipientAccountTab";
|
|||||||
export default function Settings({ faq }) {
|
export default function Settings({ faq }) {
|
||||||
const apiCall = new usersService();
|
const apiCall = new usersService();
|
||||||
const { userDetails } = useSelector((state) => state?.userDetails);
|
const { userDetails } = useSelector((state) => state?.userDetails);
|
||||||
const [profileImg, setProfileImg] = useState(
|
|
||||||
userDetails?.profile_pic_url ? userDetails.profile_pic_url : profile
|
|
||||||
);
|
|
||||||
let [uploadStatus, setUploadStatus] = useState({loading: false, status: false, message:''}) // HOLDS STATE FOR UPLOAD PROFILE PICTURE STATUS
|
|
||||||
const [coverImg, setCoverImg] = useState(cover);
|
|
||||||
const [reloadCardList, setReloadCardList] = useState(false); // STATE TO DETERMINE WHEN CARD LIST RELOADS. EG: WHEN USER DELETES A CARD
|
const [reloadCardList, setReloadCardList] = useState(false); // STATE TO DETERMINE WHEN CARD LIST RELOADS. EG: WHEN USER DELETES A CARD
|
||||||
|
|
||||||
// profile img
|
|
||||||
const profileImgInput = useRef(null);
|
|
||||||
const browseProfileImg = () => {
|
|
||||||
profileImgInput.current.click();
|
|
||||||
};
|
|
||||||
const profileImgChangHandler = (e) => {
|
|
||||||
// if (e.target.value !== "") {
|
|
||||||
// const imgReader = new FileReader();
|
|
||||||
// imgReader.onload = (event) => {
|
|
||||||
// setProfileImg(event.target.result);
|
|
||||||
// };
|
|
||||||
// imgReader.readAsDataURL(e.target.files[0]);
|
|
||||||
// }
|
|
||||||
setUploadStatus({loading: false, status: false, message:''})
|
|
||||||
let acceptedFormat = ["jpeg", "jpg", "png", "bmp", "gif"] // ARRAY OF SUPPORTED FORMATS
|
|
||||||
let uploadedFile = e.target.files[0] //UPLOADED FILE
|
|
||||||
|
|
||||||
if(!acceptedFormat.includes(uploadedFile?.type?.split("/")[1]?.toLowerCase())){ //CHECKING FOR CORRECT UPLOAD FORMAT
|
|
||||||
let msg = 'Please select '
|
|
||||||
for(let i=0; i<=acceptedFormat.length-1; i++){
|
|
||||||
if(i == acceptedFormat.length-1){
|
|
||||||
msg+=`or ${acceptedFormat[i]}`
|
|
||||||
}else{
|
|
||||||
msg+=`${acceptedFormat[i]}, `
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setUploadStatus({loading: false, status: false, message:msg})
|
|
||||||
return setTimeout(()=>{
|
|
||||||
profileImgInput.current.value = '' // clear the input
|
|
||||||
setUploadStatus({loading: false, status: false, message:''})
|
|
||||||
},5000)
|
|
||||||
}
|
|
||||||
|
|
||||||
if(uploadedFile.size > 5*1048576){ // CHECKING FOR CORRECT FILE SIZE
|
|
||||||
setUploadStatus({loading: false, status: false, message:'File must not exceed 5MB'})
|
|
||||||
return setTimeout(()=>{
|
|
||||||
profileImgInput.current.value = '' // clear the input
|
|
||||||
setUploadStatus({loading: false, status: false, message:''})
|
|
||||||
},5000)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.target.value !== "") {
|
|
||||||
const imgReader = new FileReader();
|
|
||||||
imgReader.onload = (event) => {
|
|
||||||
let reqData = { // PAYLOAD FOR API CALL
|
|
||||||
file_name: uploadedFile?.name,
|
|
||||||
file_size: uploadedFile?.size,
|
|
||||||
file_type: uploadedFile?.type?.split("/")[0]?.toLowerCase(),
|
|
||||||
file_data: event?.target?.result,
|
|
||||||
msg_type: 'FILE',
|
|
||||||
action: 'WRENCHBOARD_PICTURE_PROFILE',
|
|
||||||
// action: 11307
|
|
||||||
}
|
|
||||||
setUploadStatus({loading: true, status: false, message:'Loading...'})
|
|
||||||
apiCall.sendFiles(reqData).then(res=>{
|
|
||||||
if(res.status != 200 || res.data.internal_return < 0){
|
|
||||||
return setUploadStatus({loading: false, status: false, message: 'Something went wrong, try again'})
|
|
||||||
}
|
|
||||||
setUploadStatus({loading: false, status: true, message: 'Uploaded successfully'})
|
|
||||||
setProfileImg(event.target.result);
|
|
||||||
}).catch(error=>{
|
|
||||||
setUploadStatus({loading: false, status: false, message: 'Network error, try again'})
|
|
||||||
}).finally(()=>{
|
|
||||||
setTimeout(()=>{
|
|
||||||
setUploadStatus({loading: false, status: false, message: ''})
|
|
||||||
},5000)
|
|
||||||
})
|
|
||||||
};
|
|
||||||
imgReader.readAsDataURL(e.target.files[0]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
// cover img
|
|
||||||
const coverImgInput = useRef(null);
|
|
||||||
const browseCoverImg = () => {
|
|
||||||
coverImgInput.current.click();
|
|
||||||
};
|
|
||||||
const coverImgChangHandler = (e) => {
|
|
||||||
if (e.target.value !== "") {
|
|
||||||
const imgReader = new FileReader();
|
|
||||||
imgReader.onload = (event) => {
|
|
||||||
setCoverImg(event.target.result);
|
|
||||||
};
|
|
||||||
imgReader.readAsDataURL(e.target.files[0]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Tabs Handling
|
|
||||||
const tabs = [
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
name: "personal",
|
|
||||||
title: "Edit Profile",
|
|
||||||
iconName: "people-hover",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
name: "payment",
|
|
||||||
title: "Payment Cards",
|
|
||||||
iconName: "bank-card",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
name: "recipients-account",
|
|
||||||
title: "Recipients Account",
|
|
||||||
iconName: "bank-card",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
name: "notification",
|
|
||||||
title: "Notification Setting",
|
|
||||||
iconName: "notification-setting",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 5,
|
|
||||||
name: "login_activity",
|
|
||||||
title: "Login Activity",
|
|
||||||
iconName: "login-activity",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 6,
|
|
||||||
name: "password",
|
|
||||||
title: "Change Password",
|
|
||||||
iconName: "password-hover",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 7,
|
|
||||||
name: "faq",
|
|
||||||
title: "FAQ",
|
|
||||||
iconName: "block-question",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 8,
|
|
||||||
name: "privacy",
|
|
||||||
title: "Privacy Policy",
|
|
||||||
iconName: "page-right",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 9,
|
|
||||||
name: "terms",
|
|
||||||
title: "Terms and Conditions",
|
|
||||||
iconName: "page-right",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
const [tab, setTab] = useState(tabs[0].name);
|
|
||||||
const tabHandler = (value) => {
|
|
||||||
setTab(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Recipient Account
|
// Recipient Account
|
||||||
const [recipientAccount, setRecipientAccount] = useState({
|
const [recipientAccount, setRecipientAccount] = useState({
|
||||||
state: false,
|
state: false,
|
||||||
@@ -223,6 +68,120 @@ export default function Settings({ faq }) {
|
|||||||
getRecipientAccount();
|
getRecipientAccount();
|
||||||
}, [reloadCardList]);
|
}, [reloadCardList]);
|
||||||
|
|
||||||
|
// Tabs Handling
|
||||||
|
const tabs = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: "personal",
|
||||||
|
title: "Edit Profile",
|
||||||
|
iconName: "people-hover",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: "payment",
|
||||||
|
title: "Payment Cards",
|
||||||
|
iconName: "bank-card",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
name: "recipients_account",
|
||||||
|
title: "Recipients Account",
|
||||||
|
iconName: "bank-card",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
name: "notification",
|
||||||
|
title: "Notification Setting",
|
||||||
|
iconName: "notification-setting",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
name: "login_activity",
|
||||||
|
title: "Login Activity",
|
||||||
|
iconName: "login-activity",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 6,
|
||||||
|
name: "password",
|
||||||
|
title: "Change Password",
|
||||||
|
iconName: "password-hover",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 7,
|
||||||
|
name: "faq",
|
||||||
|
title: "FAQ",
|
||||||
|
iconName: "block-question",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 8,
|
||||||
|
name: "privacy",
|
||||||
|
title: "Privacy Policy",
|
||||||
|
iconName: "page-right",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 9,
|
||||||
|
name: "terms",
|
||||||
|
title: "Terms and Conditions",
|
||||||
|
iconName: "page-right",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const [tab, setTab] = useState(() => {
|
||||||
|
// Retrieve the active tab from local storage or use the default tab
|
||||||
|
return localStorage.getItem("activeTab") || tabs[0].name;
|
||||||
|
});
|
||||||
|
|
||||||
|
const tabHandler = (value) => {
|
||||||
|
setTab(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Update local storage when the tab changes
|
||||||
|
useEffect(() => {
|
||||||
|
localStorage.setItem("activeTab", tab);
|
||||||
|
}, [tab]);
|
||||||
|
|
||||||
|
const tabComponents = {
|
||||||
|
personal: (
|
||||||
|
<div className="tab-item">
|
||||||
|
<PersonalInfoTab />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
payment: (
|
||||||
|
<div className="tab-item">
|
||||||
|
<PaymentMathodsTab />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
recipients_account: (
|
||||||
|
<div className="tab-item">
|
||||||
|
<RecipientAccountTab
|
||||||
|
recipientAccount={recipientAccount}
|
||||||
|
setRecipientAccount={setRecipientAccount}
|
||||||
|
setReloadCardList={setReloadCardList}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
notification: (
|
||||||
|
<div className="tab-item">
|
||||||
|
<NotificationSettingTab />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
login_activity: <LoginActivityTab />,
|
||||||
|
password: <ChangePasswordTab />,
|
||||||
|
faq: <FaqTab datas={faq} />,
|
||||||
|
privacy: <PrivacyPolicyTab />,
|
||||||
|
terms: <TermsConditionTab />,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Default tab component
|
||||||
|
const defaultTabComponent = (
|
||||||
|
<div className="tab-item">
|
||||||
|
<PersonalInfoTab />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
// Selected tab component based on the current 'tab'
|
||||||
|
const selectedTabComponent = tabComponents[tab] || defaultTabComponent;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Layout>
|
<Layout>
|
||||||
@@ -263,45 +222,7 @@ export default function Settings({ faq }) {
|
|||||||
</div>
|
</div>
|
||||||
<div className="w-[1px] bg-[#E3E4FE] dark:bg-[#a7a9b533] mr-10"></div>
|
<div className="w-[1px] bg-[#E3E4FE] dark:bg-[#a7a9b533] mr-10"></div>
|
||||||
<div className="content-body-items flex-1">
|
<div className="content-body-items flex-1">
|
||||||
{tab === "personal" && (
|
{selectedTabComponent}
|
||||||
<div className="tab-item">
|
|
||||||
<PersonalInfoTab
|
|
||||||
profileImg={profileImg}
|
|
||||||
coverImg={coverImg}
|
|
||||||
browseProfileImg={browseProfileImg}
|
|
||||||
profileImgInput={profileImgInput}
|
|
||||||
profileImgChangHandler={profileImgChangHandler}
|
|
||||||
coverImgChangHandler={coverImgChangHandler}
|
|
||||||
browseCoverImg={browseCoverImg}
|
|
||||||
coverImgInput={coverImgInput}
|
|
||||||
uploadStatus={uploadStatus}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{tab === "payment" && (
|
|
||||||
<div className="tab-item">
|
|
||||||
<PaymentMathodsTab />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{tab === "recipients-account" && (
|
|
||||||
<div className="tab-item">
|
|
||||||
<RecipientAccountTab
|
|
||||||
recipientAccount={recipientAccount}
|
|
||||||
setRecipientAccount={setRecipientAccount}
|
|
||||||
setReloadCardList={setReloadCardList}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{tab === "notification" && (
|
|
||||||
<div className="tab-item">
|
|
||||||
<NotificationSettingTab />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{tab === "login_activity" && <LoginActivityTab />}
|
|
||||||
{tab === "password" && <ChangePasswordTab />}
|
|
||||||
{tab === "faq" && <FaqTab datas={faq} />}
|
|
||||||
{tab === "privacy" && <PrivacyPolicyTab />}
|
|
||||||
{tab === "terms" && <TermsConditionTab />}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Field, Form, Formik } from "formik";
|
import { Field, Form, Formik } from "formik";
|
||||||
import React, { useCallback, useMemo, useState } from "react";
|
import React, { useCallback, useMemo, useState } from "react";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import * as Yup from "yup";
|
import * as Yup from "yup";
|
||||||
import usersService from "../../services/UsersService";
|
import usersService from "../../services/UsersService";
|
||||||
@@ -51,6 +51,13 @@ const EditJobPopOut = ({
|
|||||||
categories,
|
categories,
|
||||||
}) => {
|
}) => {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
|
const { userDetails } = useSelector((state) => state.userDetails);
|
||||||
|
|
||||||
|
const uploadedImage = `${userDetails.session_image_server}${localStorage.getItem('session_token')}/job/${details?.job_uid}`
|
||||||
|
|
||||||
|
const [taskImage, setTaskImage] = useState(uploadedImage)
|
||||||
|
|
||||||
|
let [uploadStatus, setUploadStatus] = useState({loading: false, status: false, message:''}) // HOLDS STATE FOR UPLOAD PROFILE PICTURE STATUS
|
||||||
|
|
||||||
let [requestStatus, setRequestStatus] = useState({
|
let [requestStatus, setRequestStatus] = useState({
|
||||||
loading: false,
|
loading: false,
|
||||||
@@ -105,6 +112,66 @@ const EditJobPopOut = ({
|
|||||||
[jobApi, navigate, onClose, details]
|
[jobApi, navigate, onClose, details]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const taskImgChangeHandler = (e) => {
|
||||||
|
setUploadStatus({loading: false, status: false, message:''})
|
||||||
|
let acceptedFormat = ["jpeg", "jpg", "png", "bmp", "gif"] // ARRAY OF SUPPORTED FORMATS
|
||||||
|
let uploadedFile = e.target.files[0] //UPLOADED FILE
|
||||||
|
|
||||||
|
const fileFormat = uploadedFile?.type?.split("/")[1]?.toLowerCase();
|
||||||
|
if(!acceptedFormat.includes(fileFormat)){ //CHECKING FOR CORRECT UPLOAD FORMAT
|
||||||
|
const msg = `Please select ${acceptedFormat.slice(0, -1).join(', ')} or ${acceptedFormat.slice(-1)}`;
|
||||||
|
setUploadStatus({loading: false, status: false, message:msg})
|
||||||
|
return setTimeout(()=>{
|
||||||
|
// profileImgInput.current.value = '' // clear the input
|
||||||
|
setUploadStatus({loading: false, status: false, message:''})
|
||||||
|
},5000)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(uploadedFile.size > 5*1048576){ // CHECKING FOR CORRECT FILE SIZE
|
||||||
|
setUploadStatus({loading: false, status: false, message:'File must not exceed 5MB'})
|
||||||
|
return setTimeout(()=>{
|
||||||
|
// profileImgInput.current.value = '' // clear the input
|
||||||
|
setUploadStatus({loading: false, status: false, message:''})
|
||||||
|
},5000)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.target.value !== "") {
|
||||||
|
const imgReader = new FileReader();
|
||||||
|
imgReader.onload = (event) => {
|
||||||
|
let base64Img = imgReader.result.split(",")[1];
|
||||||
|
let reqData = { // PAYLOAD FOR API CALL
|
||||||
|
job_uid: details?.job_uid,
|
||||||
|
file_name: uploadedFile?.name.slice(0,19),
|
||||||
|
file_size: uploadedFile?.size,
|
||||||
|
file_type: uploadedFile?.type?.split("/")[0]?.toLowerCase(),
|
||||||
|
file_data: base64Img,
|
||||||
|
msg_type: 'FILE',
|
||||||
|
action: 11303
|
||||||
|
}
|
||||||
|
setUploadStatus({loading: true, status: false, message:'Loading...'})
|
||||||
|
jobApi.sendFiles(reqData).then(res=>{
|
||||||
|
if(res.status != 200 || res.data.internal_return < 0){
|
||||||
|
return setUploadStatus({loading: false, status: false, message: 'Something went wrong, try again'})
|
||||||
|
}
|
||||||
|
setUploadStatus({loading: false, status: true, message: 'Uploaded successfully'})
|
||||||
|
setTaskImage(event.target.result);
|
||||||
|
setTimeout(() => {
|
||||||
|
dispatch(tableReload({ type: "JOBTABLE" }));
|
||||||
|
navigate("/myjobs", { replace: true });
|
||||||
|
onClose();
|
||||||
|
}, 1000);
|
||||||
|
}).catch(error=>{
|
||||||
|
setUploadStatus({loading: false, status: false, message: 'Network error, try again'})
|
||||||
|
}).finally(()=>{
|
||||||
|
setTimeout(()=>{
|
||||||
|
setUploadStatus({loading: false, status: false, message: ''})
|
||||||
|
},5000)
|
||||||
|
})
|
||||||
|
};
|
||||||
|
imgReader.readAsDataURL(e.target.files[0]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ModalCom action={onClose} situation={situation} className="edit-popup">
|
<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-wrapper lg:w-[600px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl">
|
||||||
@@ -138,7 +205,7 @@ const EditJobPopOut = ({
|
|||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="logout-modal-body w-full flex flex-col items-center px-10 py-8">
|
<div className="logout-modal-body w-full flex flex-col items-center px-10 pb-8 pt-2">
|
||||||
<Formik
|
<Formik
|
||||||
initialValues={initialValues}
|
initialValues={initialValues}
|
||||||
validationSchema={validationSchema}
|
validationSchema={validationSchema}
|
||||||
@@ -258,7 +325,7 @@ const EditJobPopOut = ({
|
|||||||
role="group"
|
role="group"
|
||||||
aria-labelledby="checked-group"
|
aria-labelledby="checked-group"
|
||||||
>
|
>
|
||||||
{Object.entries(categories).map(([key, value]) => (
|
{categories && Object.entries(categories)?.map(([key, value]) => (
|
||||||
<label
|
<label
|
||||||
key={key}
|
key={key}
|
||||||
className="flex gap-1 w-full items-center"
|
className="flex gap-1 w-full items-center"
|
||||||
@@ -279,18 +346,41 @@ const EditJobPopOut = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="w-full flex items-center gap-2 mb-2">
|
||||||
|
{/* FOR TASK IMAGE */}
|
||||||
|
<div className="w-1/2 relative max-h-[130px] min-h-[130px]">
|
||||||
|
<input
|
||||||
|
id="task_image"
|
||||||
|
className="hidden"
|
||||||
|
type="file"
|
||||||
|
accept="image/*"
|
||||||
|
onChange={taskImgChangeHandler}
|
||||||
|
/>
|
||||||
|
{taskImage ?
|
||||||
|
<div className="w-full absolute -top-5">
|
||||||
|
<img src={taskImage} className="max-h-[150px] min-h-[150px] w-full object-cover" alt="uplaoded task image" />
|
||||||
|
<span onClick={()=>setTaskImage('')} className="p-2 absolute text-sm top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-white/80 hover:bg-white hover:shadow-md transition-all duration-500 cursor-pointer text-slate-800">Remove Image</span>
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<label
|
||||||
|
className="absolute -top-5 h-[150px] w-full flex flex-col justify-center items-center bg-slate-100 dark:bg-[#11131F] cursor-pointer input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold" htmlFor='task_image'>
|
||||||
|
Select Task Image
|
||||||
|
</label>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
{/* END OF TASK IMAGE */}
|
||||||
|
|
||||||
<div className="field w-full mb-6">
|
<div className="field w-1/2">
|
||||||
<div
|
<div
|
||||||
className={`flex items-center justify-between mb-2.5`}
|
className={`flex items-center justify-between`}
|
||||||
>
|
>
|
||||||
<label
|
<label
|
||||||
className="input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold block"
|
className="w-full input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold flex flex-col"
|
||||||
htmlFor="timeline_days"
|
htmlFor="timeline_days"
|
||||||
>
|
>
|
||||||
Timeline
|
Timeline -
|
||||||
<span className="text-green-700 text-sm tracking-wide">
|
<span className="w-full text-center text-green-700 text-sm tracking-wide">
|
||||||
- Expected duration of this task
|
Expected duration of this task
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -309,6 +399,7 @@ const EditJobPopOut = ({
|
|||||||
<option value="">Select Duration</option>
|
<option value="">Select Duration</option>
|
||||||
{publicArray.map(({ name, duration }, idx) => (
|
{publicArray.map(({ name, duration }, idx) => (
|
||||||
<option
|
<option
|
||||||
|
key={duration}
|
||||||
className="text-slate-500 text-lg"
|
className="text-slate-500 text-lg"
|
||||||
value={duration}
|
value={duration}
|
||||||
>
|
>
|
||||||
@@ -317,6 +408,7 @@ const EditJobPopOut = ({
|
|||||||
))}
|
))}
|
||||||
</Field>
|
</Field>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{/* inputs ends here */}
|
{/* inputs ends here */}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -341,6 +433,12 @@ const EditJobPopOut = ({
|
|||||||
))}
|
))}
|
||||||
{/* End of error or success display */}
|
{/* End of error or success display */}
|
||||||
|
|
||||||
|
{/* DISPLAYS TASK IMAGE UPLOADING STATUS */}
|
||||||
|
<div className="w-full">
|
||||||
|
{uploadStatus.message && !uploadStatus.loading && <p className={`text-center ${uploadStatus.status ? 'text-green-500':'text-red-500'}`}>{uploadStatus.message}</p>}
|
||||||
|
{uploadStatus.loading && <p className="text-center">{uploadStatus.message}</p>}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="w-full border-t border-light-purple dark:border-[#5356fb29] flex justify-end items-center">
|
<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">
|
<div className="flex items-center space-x-4 mr-2 mt-2">
|
||||||
{requestStatus.loading ? (
|
{requestStatus.loading ? (
|
||||||
@@ -350,6 +448,7 @@ const EditJobPopOut = ({
|
|||||||
type="submit"
|
type="submit"
|
||||||
className="w-[120px] h-[40px] flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
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'
|
// className='w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white'
|
||||||
|
disabled={requestStatus.loading || uploadStatus.loading}
|
||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ function FamilyOfferJobPopout({ details, onClose, situation }) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
console.log(details)
|
||||||
|
|
||||||
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">
|
||||||
@@ -138,7 +140,7 @@ function FamilyOfferJobPopout({ details, onClose, situation }) {
|
|||||||
<div className="p-4 w-full md:w-3/4 md:border-r-2">
|
<div className="p-4 w-full md:w-3/4 md:border-r-2">
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<div className="image-wrapper w-32">
|
<div className="image-wrapper w-32">
|
||||||
<img className="w-full h-auto" src={localImgLoad(`images/taskbanners/${details.banner}`)} alt='Banner-Image' />
|
<img className="w-full h-auto" src={details?.image} alt='banner' />
|
||||||
</div>
|
</div>
|
||||||
<div className="details-wrapper">
|
<div className="details-wrapper">
|
||||||
<p className="text-lg my-5 font-semibold text-slate-900 tracking-wide">
|
<p className="text-lg my-5 font-semibold text-slate-900 tracking-wide">
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ function PendingJobsPopout({ details, onClose, situation }) {
|
|||||||
const [pendingJobLoader, setPendingJobLoader] = useState({
|
const [pendingJobLoader, setPendingJobLoader] = useState({
|
||||||
extend: false,
|
extend: false,
|
||||||
offer: false,
|
offer: false,
|
||||||
|
cancel: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
let [requestMessage, setRequestMessage] = useState({
|
let [requestMessage, setRequestMessage] = useState({
|
||||||
@@ -81,6 +82,29 @@ function PendingJobsPopout({ details, onClose, situation }) {
|
|||||||
setRequestMessage({ status: false, message: "" });
|
setRequestMessage({ status: false, message: "" });
|
||||||
}, 3000);
|
}, 3000);
|
||||||
});
|
});
|
||||||
|
} else if (name == "cancel") {
|
||||||
|
// RUNS THIS IF JOB OFFER IS CANCELLED
|
||||||
|
reqData = { ...pendingData, reason: "cancel", offer_result: 3333 };
|
||||||
|
setPendingJobLoader({ cancel: true });
|
||||||
|
apiCall
|
||||||
|
.pendingCancelOffer(reqData)
|
||||||
|
.then((res) => {
|
||||||
|
setRequestMessage({ status: true, message: res.data.status });
|
||||||
|
setTimeout(() => {
|
||||||
|
setPendingJobLoader({ cancel: false });
|
||||||
|
setRequestMessage({ status: false, message: "" });
|
||||||
|
onClose();
|
||||||
|
dispatch(tableReload({ type: "PENDINGTABLE" }));
|
||||||
|
dispatch(tableReload({ type: "JOBTABLE" }));
|
||||||
|
}, 4000);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
setRequestMessage("Try Again");
|
||||||
|
setTimeout(() => {
|
||||||
|
setPendingJobLoader({ cancel: false });
|
||||||
|
setRequestMessage({ status: false, message: "" });
|
||||||
|
}, 3000);
|
||||||
|
});
|
||||||
} else return;
|
} else return;
|
||||||
// try {
|
// try {
|
||||||
// if (name === "extend") {
|
// if (name === "extend") {
|
||||||
@@ -274,9 +298,16 @@ function PendingJobsPopout({ details, onClose, situation }) {
|
|||||||
<div className="mt-10 md:mt-32 md:flex md:justify-center">
|
<div className="mt-10 md:mt-32 md:flex md:justify-center">
|
||||||
<button
|
<button
|
||||||
className="px-2 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
className="px-2 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
||||||
onClick={onClose}
|
onClick={handlePendingJobsBtn}
|
||||||
|
name="cancel"
|
||||||
>
|
>
|
||||||
Cancel Offer
|
{pendingJobLoader.cancel ? (
|
||||||
|
<div className="w-[96px] flex justify-center items-center h-full">
|
||||||
|
<LoadingSpinner size={5} color="sky-blue" />
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
"Cancel Offer"
|
||||||
|
)}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ const AuthRoute = ({ redirectPath = "/login", children }) => {
|
|||||||
const [loadProfileDetails, setLoadProfileDetails] = useState([]);
|
const [loadProfileDetails, setLoadProfileDetails] = useState([]);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const { jobListTable, walletTable } = useSelector((state) => state.tableReload);
|
const { jobListTable, walletTable } = useSelector(
|
||||||
|
(state) => state.tableReload
|
||||||
|
);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
userDetails: { username, uid, session},
|
userDetails: { username, uid, session},
|
||||||
@@ -35,6 +37,7 @@ const AuthRoute = ({ redirectPath = "/login", children }) => {
|
|||||||
localStorage.removeItem("uid");
|
localStorage.removeItem("uid");
|
||||||
localStorage.removeItem("member_id");
|
localStorage.removeItem("member_id");
|
||||||
localStorage.removeItem("session_token");
|
localStorage.removeItem("session_token");
|
||||||
|
sessionStorage.removeItem("family_uid");
|
||||||
navigate("/login", { replace: true }); // redirects user to login page after session expires
|
navigate("/login", { replace: true }); // redirects user to login page after session expires
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -185,7 +188,9 @@ const AuthRoute = ({ redirectPath = "/login", children }) => {
|
|||||||
try {
|
try {
|
||||||
const res = await apiCall.getUserWallets();
|
const res = await apiCall.getUserWallets();
|
||||||
console.log("wallet - >", res.data);
|
console.log("wallet - >", res.data);
|
||||||
dispatch(updateWalletDetails({ loading: false, data:res.data?.result_list }));
|
dispatch(
|
||||||
|
updateWalletDetails({ loading: false, data: res.data?.result_list })
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(updateWalletDetails({ loading: false, data: [] }));
|
dispatch(updateWalletDetails({ loading: false, data: [] }));
|
||||||
console.log("Error getting mode");
|
console.log("Error getting mode");
|
||||||
|
|||||||
@@ -19,6 +19,16 @@ class usersService {
|
|||||||
return this.postAuxEnd("/completesignuplink", reqData);
|
return this.postAuxEnd("/completesignuplink", reqData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assignJobTask(reqData) {
|
||||||
|
var postData = {
|
||||||
|
uid: localStorage.getItem("uid"),
|
||||||
|
member_id: localStorage.getItem("member_id"),
|
||||||
|
sessionid: localStorage.getItem("session_token"),
|
||||||
|
...reqData,
|
||||||
|
};
|
||||||
|
return this.postAuxEnd("/assigntask", postData);
|
||||||
|
}
|
||||||
|
|
||||||
// FUNCTION TO GET USER CURRENT TASK DUE TIME
|
// FUNCTION TO GET USER CURRENT TASK DUE TIME
|
||||||
getHomeDate() {
|
getHomeDate() {
|
||||||
var postData = {
|
var postData = {
|
||||||
@@ -35,7 +45,7 @@ class usersService {
|
|||||||
uid: localStorage.getItem("uid"),
|
uid: localStorage.getItem("uid"),
|
||||||
member_id: localStorage.getItem("member_id"),
|
member_id: localStorage.getItem("member_id"),
|
||||||
sessionid: localStorage.getItem("session_token"),
|
sessionid: localStorage.getItem("session_token"),
|
||||||
action: 11202
|
action: 11202,
|
||||||
};
|
};
|
||||||
return this.postAuxEnd("/recentactivities", postData);
|
return this.postAuxEnd("/recentactivities", postData);
|
||||||
}
|
}
|
||||||
@@ -368,7 +378,7 @@ class usersService {
|
|||||||
page: 0,
|
page: 0,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
limit: 100,
|
limit: 100,
|
||||||
allstatus: 0
|
allstatus: 0,
|
||||||
};
|
};
|
||||||
return this.postAuxEnd("/activetaskslist", postData);
|
return this.postAuxEnd("/activetaskslist", postData);
|
||||||
}
|
}
|
||||||
@@ -598,7 +608,7 @@ class usersService {
|
|||||||
sessionid: localStorage.getItem("session_token"),
|
sessionid: localStorage.getItem("session_token"),
|
||||||
page: 0,
|
page: 0,
|
||||||
limit: 100,
|
limit: 100,
|
||||||
...reqdata
|
...reqdata,
|
||||||
};
|
};
|
||||||
return this.postAuxEnd("/familyupdate", postData);
|
return this.postAuxEnd("/familyupdate", postData);
|
||||||
}
|
}
|
||||||
@@ -782,6 +792,17 @@ class usersService {
|
|||||||
return this.postAuxEnd("/pendingjobsendtome", postData);
|
return this.postAuxEnd("/pendingjobsendtome", postData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pendingCancelOffer(reqData) {
|
||||||
|
var postData = {
|
||||||
|
uid: localStorage.getItem("uid"),
|
||||||
|
member_id: localStorage.getItem("member_id"),
|
||||||
|
sessionid: localStorage.getItem("session_token"),
|
||||||
|
action: 13043,
|
||||||
|
...reqData,
|
||||||
|
};
|
||||||
|
return this.postAuxEnd("/pendingjobcancel", postData);
|
||||||
|
}
|
||||||
|
|
||||||
// FUNCTION TO GET ACTIVE JOB MESSAGE LIST
|
// FUNCTION TO GET ACTIVE JOB MESSAGE LIST
|
||||||
activeJobMesList(reqData) {
|
activeJobMesList(reqData) {
|
||||||
var postData = {
|
var postData = {
|
||||||
@@ -817,11 +838,11 @@ class usersService {
|
|||||||
action: 14010,
|
action: 14010,
|
||||||
...reqData,
|
...reqData,
|
||||||
};
|
};
|
||||||
|
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
for (let data in postData) {
|
for (let data in postData) {
|
||||||
formData.append(data, postData[data]);
|
formData.append(data, postData[data]);
|
||||||
}
|
}
|
||||||
// return this.postAuxEnd("/uploads", formData);
|
|
||||||
|
|
||||||
return this.postAuxEnd("/uploads", postData);
|
return this.postAuxEnd("/uploads", postData);
|
||||||
}
|
}
|
||||||
@@ -1078,7 +1099,6 @@ class usersService {
|
|||||||
return this.postAuxEnd("/blogdata", postData);
|
return this.postAuxEnd("/blogdata", postData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// FUNCTION TO CANCEL TASK OR SEND REMINDER BY FAMILY MEMBER
|
// FUNCTION TO CANCEL TASK OR SEND REMINDER BY FAMILY MEMBER
|
||||||
suggestStatus(reqData) {
|
suggestStatus(reqData) {
|
||||||
var postData = {
|
var postData = {
|
||||||
@@ -1237,9 +1257,9 @@ class usersService {
|
|||||||
console.log(response);
|
console.log(response);
|
||||||
// res = response;
|
// res = response;
|
||||||
console.log("~~~~~~~ Toks2 POST ~~~~~~~~");
|
console.log("~~~~~~~ Toks2 POST ~~~~~~~~");
|
||||||
if(response.data.internal_return == '-9999'){
|
if (response.data.internal_return == "-9999") {
|
||||||
localStorage.clear()
|
localStorage.clear();
|
||||||
window.location.href=`/login?sessionExpired=true`
|
window.location.href = `/login?sessionExpired=true`;
|
||||||
}
|
}
|
||||||
return response;
|
return response;
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import FamilySettings from "../components/FamilyAcc/FamilySettings";
|
||||||
|
|
||||||
|
export default function FamilySettingsPage() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<FamilySettings />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
import Lnd from '../components/Lnd/Lnd'
|
||||||
|
|
||||||
|
function LndPage() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Lnd />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default LndPage
|
||||||
Reference in New Issue
Block a user