Compare commits

...

65 Commits

Author SHA1 Message Date
victorAnumudu 7e7176ae5c server icon fix 2023-11-11 07:03:54 +01:00
victorAnumudu 306fa1300d replaced images to server images on mytask route 2023-11-11 06:26:00 +01:00
ameye 7b3178bd1a Merge branch 'add-family-btn-bug' of WrenchBoard/Users-Wrench into master 2023-11-10 17:50:11 +00:00
victorAnumudu 5e94ddee48 fixed add family btn 2023-11-09 07:09:24 +01:00
ameye 32171ae3ce Merge branch 'Server-path-added' of WrenchBoard/Users-Wrench into master 2023-11-08 19:47:53 +00:00
Chief Bube 2c99fedd8c removing session once user logs out or session expires 2023-11-08 10:58:42 -08:00
Chief Bube 7e926cc7bc added family image 2023-11-08 10:42:54 -08:00
ameye 587bcaa411 Merge branch 'family-wallet-copy' of WrenchBoard/Users-Wrench into master 2023-11-08 17:56:42 +00:00
ameye 756628ee1a Merge branch 'image-bug' of WrenchBoard/Users-Wrench into master 2023-11-08 17:56:37 +00:00
victorAnumudu 575710a807 image bug fixed 2023-11-08 18:26:50 +01:00
victorAnumudu c77d8e5693 merged from master branch 2023-11-08 18:18:06 +01:00
victorAnumudu 7e9d734e6f added copy wallet for family member 2023-11-08 18:15:21 +01:00
ameye 9ddb127bd3 Merge branch 'job-image-icon' of WrenchBoard/Users-Wrench into master 2023-11-08 16:24:00 +00:00
victorAnumudu a85e5fdb91 changed default icons to server icons 2023-11-08 09:41:06 +01:00
victorAnumudu 09ad8a94ca changed default icons to server icons 2023-11-08 09:39:28 +01:00
Chief Bube 0c1db6b4b5 fixed svg typos 2023-11-07 23:00:12 -08:00
ameye 6ddffdf2e6 Merge branch 'Server-path-added' of WrenchBoard/Users-Wrench into master 2023-11-08 04:29:31 +00:00
Chief Bube 5043540abb Added conditionals to the paths to avoid breakage and resolved some images in family account 2023-11-07 09:24:28 -08:00
ameye 5f39accdd6 Merge branch 'pend-interest' of WrenchBoard/Users-Wrench into master 2023-11-07 16:20:23 +00:00
victorAnumudu b5aeaf59a4 changed from offer_uid to job_uid 2023-11-07 17:13:50 +01:00
ameye f3e63d2ef6 Merge branch 'default-icon' of WrenchBoard/Users-Wrench into master 2023-11-07 13:52:19 +00:00
victorAnumudu 44a055e76b Merge master into default-icon 2023-11-07 14:22:49 +01:00
victorAnumudu 67c1b2aaa0 placed default job icons 2023-11-07 14:20:19 +01:00
ameye 313cfc1f28 Merge branch 'edit-job-bug-fix' of WrenchBoard/Users-Wrench into master 2023-11-07 12:40:34 +00:00
victorAnumudu 59a7f110be Fixed save job bug 2023-11-07 07:35:40 +01:00
ameye 52e8447f6a Merge branch 'Server-path-added' of WrenchBoard/Users-Wrench into master 2023-11-06 23:33:16 +00:00
Chief Bube c60e28928a changed to job_uid 2023-11-06 15:29:23 -08:00
ameye 58357fd501 Merge branch 'Server-path-added' of WrenchBoard/Users-Wrench into master 2023-11-06 21:15:03 +00:00
Chief Bube 5402980d6c Chnged path from profile to job 2023-11-06 11:15:11 -08:00
ameye 32c7b3d513 Merge branch 'Server-path-added' of WrenchBoard/Users-Wrench into master 2023-11-06 18:56:32 +00:00
Chief Bube a30b22170d Added images server path 2023-11-06 10:53:26 -08:00
ameye e3314b0460 Merge branch 'job-image-upload-fix' of WrenchBoard/Users-Wrench into master 2023-11-06 18:01:42 +00:00
victorAnumudu 86eb1f16bb fixed job image upload 2023-11-06 19:00:28 +01:00
ameye 5660d74e75 Merge branch 'job-image-upload' of WrenchBoard/Users-Wrench into master 2023-11-06 15:48:53 +00:00
victorAnumudu 612016784d added job image upload API 2023-11-06 16:34:41 +01:00
ameye 988aadfb7e Merge branch 'Server-path-added' of WrenchBoard/Users-Wrench into master 2023-11-06 14:28:14 +00:00
ameye 54851b5f77 Merge branch 'family-image-bug' of WrenchBoard/Users-Wrench into master 2023-11-06 14:27:50 +00:00
victorAnumudu 91f3b92138 Merge master into family-image-bug 2023-11-06 15:24:06 +01:00
victorAnumudu f48de9d65f upload bug fixed 2023-11-06 15:22:56 +01:00
Chief Bube c920c35a9c image now works 2023-11-06 06:15:12 -08:00
ameye 7bcaead120 Merge branch 'Server-path-added' of WrenchBoard/Users-Wrench into master 2023-11-06 14:04:08 +00:00
Chief Bube 828f56ed84 Added Image Path for server image 2023-11-06 05:30:30 -08:00
ameye 07118c10a8 Merge branch 'family-profile-image-upload' of WrenchBoard/Users-Wrench into master 2023-11-06 12:13:26 +00:00
victorAnumudu ca5923a7f8 Merge master into family-profile-image-upload 2023-11-06 12:43:20 +01:00
victorAnumudu 4f0d432176 family profile image upload API added 2023-11-06 12:42:10 +01:00
ameye dd3f9d99f3 Merge branch 'Family-Acc-layout-update' of WrenchBoard/Users-Wrench into master 2023-11-06 09:33:43 +00:00
Chief Bube 8807b671ad update market data 2023-11-06 01:25:44 -08:00
victorAnumudu 7020e6d4dc added family profile image upload 2023-11-06 04:10:03 +01:00
ameye d66093a2ad Merge branch 'edit-job-add-image' of WrenchBoard/Users-Wrench into master 2023-11-05 10:53:44 +00:00
victorAnumudu b79eb6b158 Merge master into edit-job-add-image 2023-11-04 17:37:19 +01:00
victorAnumudu a759daaf90 edit job upload image added 2023-11-04 17:35:18 +01:00
ameye 600aec62cf Merge branch 'Family-Acc-layout-update' of WrenchBoard/Users-Wrench into master 2023-11-04 15:54:50 +00:00
Chief Bube 1612bf11ce Added JobOfferCancel 2023-11-04 08:47:42 -07:00
ameye f4e261eb6c Merge branch 'Family-Acc-layout-update' of WrenchBoard/Users-Wrench into master 2023-11-04 08:13:03 +00:00
Chief Bube b622398b6a added assignJobTask function to userServices 2023-11-03 18:47:14 -07:00
ameye e60957e6be Merge branch 'dummy-lnd-page' of WrenchBoard/Users-Wrench into master 2023-11-02 21:35:01 +00:00
victorAnumudu 6a2082d732 added lnd page 2023-11-02 19:01:48 +01:00
ameye 452c6bf8a1 Merge branch 'session-bug' of WrenchBoard/Users-Wrench into master 2023-11-02 01:54:41 +00:00
victorAnumudu 9f89376aa9 Hid text when session expires 2023-11-01 22:11:34 +01:00
ameye 4e91e47978 Merge branch 'session-implement' of WrenchBoard/Users-Wrench into master 2023-11-01 20:09:08 +00:00
ameye fcaa485b17 Merge branch 'history-header-removal' of WrenchBoard/Users-Wrench into master 2023-11-01 20:08:55 +00:00
victorAnumudu 64056bb2a4 changed payment to purchase 2023-11-01 18:45:25 +01:00
victorAnumudu e49c4d66f8 removed table headers if no record is found 2023-11-01 18:39:24 +01:00
ameye 8fdb939b72 Merge branch 'Family-Acc-layout-update' of WrenchBoard/Users-Wrench into master 2023-11-01 17:06:51 +00:00
Chief Bube 7849a027b4 changed fill 2023-11-01 10:04:00 -07:00
52 changed files with 1059 additions and 604 deletions
+2
View File
@@ -49,6 +49,7 @@ 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";
export default function Routers() { export default function Routers() {
return ( return (
@@ -76,6 +77,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 />}>
+2 -2
View File
@@ -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
+49 -36
View File
@@ -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) {
if(value){ // FUNCTION TO VALIDATE CAPTCHA
setValidCaptcha({show: true, valid:value}) if (value) {
}else{ setValidCaptcha({ show: true, valid: value });
setValidCaptcha({show: true, valid:''}) } else {
setValidCaptcha({ show: true, valid: "" });
} }
} }
@@ -245,27 +250,32 @@ 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">
<div className="title-area flex flex-col justify-center items-center relative text-center mb-7"> {/* HIDES THIS IF USER SESSION HAS EXPIRED */}
{/* <h1 className="text-[#181c32] font-semibold dark:text-white mb-3 leading-[27.3px] text-[22.75px]"> {sessionExpired != "true" && (
<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]">
Sign In to WrenchBoard Sign In to WrenchBoard
</h1> */} </h1> */}
<span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]"> <span className="text-gray-400 font-medium text-[16.25px] leading-[24.375px]">
New Here?{" "} New Here?{" "}
<Link <Link
to="/signup" to="/signup"
className="font-semibold text-[#4687ba] hover:text-[#009ef7] transition" className="font-semibold text-[#4687ba] hover:text-[#009ef7] transition"
> >
Create an Account Create an Account
</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">
</div> Your session expired and will need to login again
} </p>
</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={
onChange={captchaChecker} process.env.REACT_APP_GOOGLE_RECAPTCHA_SITEKEY
}
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>
+1 -1
View File
@@ -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 ?
+9 -2
View File
@@ -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">*/}
+11 -25
View File
@@ -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"
> >
+53 -15
View File
@@ -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
@@ -201,7 +201,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>
+11 -7
View File
@@ -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}
+6 -5
View File
@@ -17,7 +17,7 @@ export default function FamilyAcc() {
// 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);
@@ -115,8 +115,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;
@@ -151,7 +151,7 @@ export default function FamilyAcc() {
> >
Family Accounts Family Accounts
</span> </span>
{familyList.length < process.env.REACT_APP_MAX_FAMILY_MEMBERS && {familyList?.result_list?.length < process.env.REACT_APP_MAX_FAMILY_MEMBERS &&
!loader && ( !loader && (
<button <button
onClick={popUpHandler} onClick={popUpHandler}
@@ -172,9 +172,10 @@ export default function FamilyAcc() {
</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>
+3 -3
View File
@@ -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>
+9 -20
View File
@@ -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 */}
+4 -4
View File
@@ -255,9 +255,9 @@ export default function History() {
{/* 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 +268,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} />
} }
+2 -2
View File
@@ -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>
+8 -4
View File
@@ -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" />*/}
+1
View File
@@ -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 ? (
+1 -1
View File
@@ -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" ? (
+27
View File
@@ -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}
/> />
+2
View File
@@ -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>
@@ -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"
/> />
+32 -8
View File
@@ -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"
/> />
+4 -3
View File
@@ -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}
/> />
); );
})} })}
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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>
+21
View File
@@ -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,45 +16,36 @@ 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]'>
<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">Trx.</th>
<th className="p-2">Amount</th>
<th className="p-2">Fee</th>
</tr>
</thead>
{purchase.data.length ? {purchase.data.length ?
( <table className="wallet-activity w-full table-auto border-collapse text-left">
<tbody> <thead className='border-b-2'>
{currentPurchase.map((item, index) => ( <tr className='text-slate-600'>
<tr key={index} className='text-slate-500'> <th className="p-2">Trx.</th>
<td className="p-2">{item.added_date}<br /> <th className="p-2">Amount</th>
<b>{item.confirmation} </b> <th className="p-2">Fee</th>
</td> </tr>
<td className="p-2">{item.amount}</td> </thead>
<td className="p-2">{item.fee}</td> <tbody>
</tr> {currentPurchase.map((item, index) => (
))} <tr key={index} className='text-slate-500'>
</tbody> <td className="p-2">{item.added_date}<br />
) <b>{item.confirmation} </b>
</td>
<td className="p-2">{item.amount}</td>
<td className="p-2">{item.fee}</td>
</tr>
))}
</tbody>
</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>
: :
purchase.error ? <div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
( <span>No Purchase History Found!</span>
<tbody> </div>
<tr className='text-slate-500'>
<td className="p-2" colSpan={4}>Opps! an error occurred. Please try again!</td>
</tr>
</tbody>
)
:
<tbody>
<tr className='text-slate-500'>
<td className="p-2" colSpan={4}>No Purchase History Found!</td>
</tr>
</tbody>
} }
</table>
{/* PAGINATION BUTTON */} {/* 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,16 +19,16 @@ 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]">
<table className="wallet-activity w-full table-auto border-collapse text-left"> {payment?.data?.length > 0 ?
<thead className="border-b-2"> <table className="wallet-activity w-full table-auto border-collapse text-left">
<tr className="text-slate-600"> <thead className="border-b-2">
<th className="p-2">Date</th> <tr className="text-slate-600">
<th className="p-4">Trx.</th> <th className="p-2">Date</th>
<th className="p-2">Amnt./Fee</th> <th className="p-4">Trx.</th>
<th className="p-2">Status</th> <th className="p-2">Amnt./Fee</th>
</tr> <th className="p-2">Status</th>
</thead> </tr>
{payment?.data?.length > 0 ? ( </thead>
<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 ? ( </table>
<tbody> :payment.error ?
<tr className="text-slate-500"> <div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
<td className="p-2" colSpan={4}> <span>Opps! an error occurred. Please try again!</span>
Opps! an error occurred. Please try again! </div>
</td> :
</tr> <div className="p-2 text-slate-500 flex flex-col grow justify-center items-center">
</tbody> <span>No Payment History Found!</span>
) : ( </div>
<tbody> }
<tr className="text-slate-500">
<td className="p-2" colSpan={4}>
No Payment History Found!
</td>
</tr>
</tbody>
)}
</table>
{/* PAGINATION BUTTON */} {/* PAGINATION BUTTON */}
<PaginatedList <PaginatedList
+6 -9
View File
@@ -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,109 @@
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-start 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>
<p className="text-lg text-white tracking-wide flex justify-center items-center gap-8">
HOLDINGS :{" "}
<span className="xxs:scale-100 lg:scale-100 xl:scale-125">
{PriceFormatter(
walletItem.escrow * 0.01,
walletItem.code,
undefined,
"text-[2rem]"
)}
</span>
</p>
<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}
/>
)}
</>
);
}
+13 -1
View File
@@ -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 (
<> <>
+1
View File
@@ -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: `🙂`,
+195 -64
View File
@@ -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 });
@@ -363,65 +482,77 @@ export default function PersonalInfoTab({
</div> </div>
</div> </div>
{/* {process.env.REACT_APP_SHOW_UPLOAD_PROFILE_PICTURE != 0 && */} {/* {process.env.REACT_APP_SHOW_UPLOAD_PROFILE_PICTURE != 0 && */}
<div className="w-[232px] mb-10"> <div className="w-[232px] mb-10">
<div className="update-profile w-full mb-9"> <div className="update-profile w-full mb-9">
<h1 className="text-xl tracking-wide font-bold text-dark-gray dark:text-white flex items-center mb-2"> <h1 className="text-xl tracking-wide font-bold text-dark-gray dark:text-white flex items-center mb-2">
Update Profile Update Profile
<span className="ml-1"> <span className="ml-1">
<Icons name="block-question" /> <Icons name="block-question" />
</span> </span>
</h1> </h1>
<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">
Max 5mb Max 5mb
</span> </span>
. .
</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}
onChange={(e) => profileImgChangHandler(e)} onChange={(e) => profileImgChangHandler(e)}
type="file" type="file"
className="hidden" className="hidden"
/> />
<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
width="32"
height="32"
viewBox="0 0 32 32"
fill="none"
xmlns="http://www.w3.org/2000/svg"
> >
<svg <path
width="32" d="M16.5147 11.5C17.7284 12.7137 18.9234 13.9087 20.1296 15.115C19.9798 15.2611 19.8187 15.4109 19.6651 15.5683C17.4699 17.7635 15.271 19.9587 13.0758 22.1539C12.9334 22.2962 12.7948 22.4386 12.6524 22.5735C12.6187 22.6034 12.5663 22.6296 12.5213 22.6296C11.3788 22.6334 10.2362 22.6297 9.09365 22.6334C9.01498 22.6334 9 22.6034 9 22.536C9 21.4009 9 20.2621 9.00375 19.1271C9.00375 19.0746 9.02997 19.0109 9.06368 18.9772C10.4123 17.6249 11.7609 16.2763 13.1095 14.9277C14.2295 13.8076 15.3459 12.6913 16.466 11.5712C16.4884 11.5487 16.4997 11.5187 16.5147 11.5Z"
height="32" fill="white"
viewBox="0 0 32 32" />
fill="none" <path
xmlns="http://www.w3.org/2000/svg" d="M20.9499 14.2904C19.7436 13.0842 18.5449 11.8854 17.3499 10.6904C17.5634 10.4694 17.7844 10.2446 18.0054 10.0199C18.2639 9.76139 18.5261 9.50291 18.7884 9.24443C19.118 8.91852 19.5713 8.91852 19.8972 9.24443C20.7251 10.0611 21.5492 10.8815 22.3771 11.6981C22.6993 12.0165 22.7105 12.4698 22.3996 12.792C21.9238 13.2865 21.4443 13.7772 20.9686 14.2717C20.9648 14.2792 20.9536 14.2867 20.9499 14.2904Z"
> fill="white"
<path />
d="M16.5147 11.5C17.7284 12.7137 18.9234 13.9087 20.1296 15.115C19.9798 15.2611 19.8187 15.4109 19.6651 15.5683C17.4699 17.7635 15.271 19.9587 13.0758 22.1539C12.9334 22.2962 12.7948 22.4386 12.6524 22.5735C12.6187 22.6034 12.5663 22.6296 12.5213 22.6296C11.3788 22.6334 10.2362 22.6297 9.09365 22.6334C9.01498 22.6334 9 22.6034 9 22.536C9 21.4009 9 20.2621 9.00375 19.1271C9.00375 19.0746 9.02997 19.0109 9.06368 18.9772C10.4123 17.6249 11.7609 16.2763 13.1095 14.9277C14.2295 13.8076 15.3459 12.6913 16.466 11.5712C16.4884 11.5487 16.4997 11.5187 16.5147 11.5Z" </svg>
fill="white"
/>
<path
d="M20.9499 14.2904C19.7436 13.0842 18.5449 11.8854 17.3499 10.6904C17.5634 10.4694 17.7844 10.2446 18.0054 10.0199C18.2639 9.76139 18.5261 9.50291 18.7884 9.24443C19.118 8.91852 19.5713 8.91852 19.8972 9.24443C20.7251 10.0611 21.5492 10.8815 22.3771 11.6981C22.6993 12.0165 22.7105 12.4698 22.3996 12.792C21.9238 13.2865 21.4443 13.7772 20.9686 14.2717C20.9648 14.2792 20.9536 14.2867 20.9499 14.2904Z"
fill="white"
/>
</svg>
</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.loading && <p className="text-center">{uploadStatus.message}</p>}
</div> </div>
{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>
</div>
{/* } */} {/* } */}
</div> </div>
+115 -194
View File
@@ -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>
+134 -35
View File
@@ -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,43 +346,68 @@ const EditJobPopOut = ({
</div> </div>
</div> </div>
</div> </div>
<div className="w-full flex items-center gap-2 mb-2">
<div className="field w-full mb-6"> {/* FOR TASK IMAGE */}
<div <div className="w-1/2 relative max-h-[130px] min-h-[130px]">
className={`flex items-center justify-between mb-2.5`} <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 <label
className="input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold block" 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'>
htmlFor="timeline_days" Select Task Image
>
Timeline
<span className="text-green-700 text-sm tracking-wide">
- Expected duration of this task
</span>
</label> </label>
}
</div> </div>
{/* END OF TASK IMAGE */}
<Field <div className="field w-1/2">
component="select" <div
name="timeline_days" className={`flex items-center justify-between`}
className={`input-field p-2 mt-3 rounded-md placeholder:text-base text-dark-gray dark:text-white w-full h-10 bg-slate-100 dark:bg-[#11131F] focus:ring-0 focus:outline-none ${ >
props.errors.timeline_days && <label
props.touched.timeline_days className="w-full input-label text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold flex flex-col"
? "border-[#ff0a0a63] shadow-red-500 border-[0.5px] animate-shake" htmlFor="timeline_days"
: "border border-[#f5f8fa] dark:border-[#5e6278]"
}`}
value={props.values.timeline_days}
>
<option value="">Select Duration</option>
{publicArray.map(({ name, duration }, idx) => (
<option
className="text-slate-500 text-lg"
value={duration}
> >
{name} Timeline -
</option> <span className="w-full text-center text-green-700 text-sm tracking-wide">
))} Expected duration of this task
</Field> </span>
</label>
</div>
<Field
component="select"
name="timeline_days"
className={`input-field p-2 mt-3 rounded-md placeholder:text-base text-dark-gray dark:text-white w-full h-10 bg-slate-100 dark:bg-[#11131F] focus:ring-0 focus:outline-none ${
props.errors.timeline_days &&
props.touched.timeline_days
? "border-[#ff0a0a63] shadow-red-500 border-[0.5px] animate-shake"
: "border border-[#f5f8fa] dark:border-[#5e6278]"
}`}
value={props.values.timeline_days}
>
<option value="">Select Duration</option>
{publicArray.map(({ name, duration }, idx) => (
<option
key={duration}
className="text-slate-500 text-lg"
value={duration}
>
{name}
</option>
))}
</Field>
</div>
</div> </div>
{/* inputs ends here */} {/* inputs ends here */}
</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">
+33 -2
View File
@@ -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>
+10 -5
View File
@@ -21,10 +21,12 @@ 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},
} = useSelector((state) => state?.userDetails); // CHECKS IF USER Details are avaliable, to determine if user is active } = useSelector((state) => state?.userDetails); // CHECKS IF USER Details are avaliable, to determine if user is active
let loggedIn = username && session && uid ? true : false; // variable to determine if user is logged in let loggedIn = username && session && uid ? true : false; // variable to determine if user is logged in
@@ -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
}; };
@@ -181,13 +184,15 @@ const AuthRoute = ({ redirectPath = "/login", children }) => {
useEffect(() => { useEffect(() => {
const getMyWalletList = async () => { const getMyWalletList = async () => {
dispatch(updateWalletDetails({ loading: true, data:[] })); dispatch(updateWalletDetails({ loading: true, data: [] }));
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");
} }
}; };
+71 -51
View File
@@ -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 = {
@@ -30,12 +40,12 @@ class usersService {
return this.postAuxEnd("/dashdata", postData); return this.postAuxEnd("/dashdata", postData);
} }
getRecentActivities(){ getRecentActivities() {
var postData = { var postData = {
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,52 +1099,51 @@ class usersService {
return this.postAuxEnd("/blogdata", postData); return this.postAuxEnd("/blogdata", postData);
} }
// FUNCTION TO CANCEL TASK OR SEND REMINDER BY FAMILY MEMBER
suggestStatus(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: 22026,
...reqData,
};
return this.postAuxEnd("/suggeststatus", postData);
}
// FUNCTION TO CANCEL TASK OR SEND REMINDER BY FAMILY MEMBER // FUNCTION TO GET FAMILY WALLET
suggestStatus(reqData) { getFamilyWallet(reqData) {
var postData = { var postData = {
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: 22026, action: 22012,
...reqData, ...reqData,
}; };
return this.postAuxEnd("/suggeststatus", postData); return this.postAuxEnd("/familywallet", postData);
} }
// FUNCTION TO GET FAMILY WALLET // FUNCTION TO START FAMILY TRANSFER
getFamilyWallet(reqData) { familyTransferStart(reqData) {
var postData = { var postData = {
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: 22012, ...reqData,
...reqData, };
}; return this.postAuxEnd("/familytransferstart", postData);
return this.postAuxEnd("/familywallet", postData); }
}
// FUNCTION TO START FAMILY TRANSFER // FUNCTION TO PERFORM FAMILY TRANSFER
familyTransferStart(reqData) { familyTransfer(reqData) {
var postData = { var postData = {
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"),
...reqData, ...reqData,
}; };
return this.postAuxEnd("/familytransferstart", postData); return this.postAuxEnd("/familytransfer", postData);
} }
// FUNCTION TO PERFORM FAMILY TRANSFER
familyTransfer(reqData) {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
...reqData,
};
return this.postAuxEnd("/familytransfer", postData);
}
/* /*
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username) - 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username)
@@ -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;
}) })
+13
View File
@@ -0,0 +1,13 @@
import React from 'react'
import Lnd from '../components/Lnd/Lnd'
function LndPage() {
return (
<>
<Lnd />
</>
)
}
export default LndPage