Compare commits
35 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0440b36f24 | |||
| de56fb601a | |||
| f286960bed | |||
| a8a090c671 | |||
| 24e2a905d2 | |||
| 19c2500263 | |||
| 909c74b734 | |||
| 0ea988fcea | |||
| db5eb85794 | |||
| fb6a2767bc | |||
| c48ae540cc | |||
| c51693deb5 | |||
| b28d02b2f5 | |||
| 74b395d99e | |||
| 21a2754fc9 | |||
| 19282ad15a | |||
| f48b72b149 | |||
| 72d4af20aa | |||
| e6f5746692 | |||
| d0e7f58d5f | |||
| f4e21cb73e | |||
| 6ad8ed34f5 | |||
| b4bbe03bdd | |||
| 2c54aa36f8 | |||
| 00c83b357f | |||
| 0b7ec73409 | |||
| f58e8834fb | |||
| 1a829789d4 | |||
| 84dccfca50 | |||
| 49e3fc5810 | |||
| e4b6391ed2 | |||
| 3abbdd32eb | |||
| e4a5c2682e | |||
| 21abc93a04 | |||
| d51bbdbc29 |
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
@@ -68,6 +68,7 @@ import FamilyWalletPage from "./views/FamilyWalletPage";
|
|||||||
import FamilyActivitiesPage from "./views/FamilyActivitiesPage";
|
import FamilyActivitiesPage from "./views/FamilyActivitiesPage";
|
||||||
import FamGamesPage from "./views/FamGamesPage";
|
import FamGamesPage from "./views/FamGamesPage";
|
||||||
import FamilyRoutesPage from "./views/FamilyRoutesPage";
|
import FamilyRoutesPage from "./views/FamilyRoutesPage";
|
||||||
|
import PromoPage from "./views/PromoPage";
|
||||||
|
|
||||||
export default function Routers() {
|
export default function Routers() {
|
||||||
return (
|
return (
|
||||||
@@ -93,6 +94,7 @@ export default function Routers() {
|
|||||||
<Route exact path="/outmessage" element={<VerifyYouPagesTwo />} />
|
<Route exact path="/outmessage" element={<VerifyYouPagesTwo />} />
|
||||||
<Route exact path="/eoffer" element={<LoginPageTwo />} />
|
<Route exact path="/eoffer" element={<LoginPageTwo />} />
|
||||||
<Route exact path="/invite" element={<LoginPageTwo />} />
|
<Route exact path="/invite" element={<LoginPageTwo />} />
|
||||||
|
<Route exact path="/promo/:name/:id" element={<PromoPage />} />
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
@@ -162,7 +162,7 @@ function AddJob({ popUpHandler, categories }) {
|
|||||||
<div className="field w-full mb-[5px] xl:mb-0">
|
<div className="field w-full mb-[5px] xl:mb-0">
|
||||||
<InputCom
|
<InputCom
|
||||||
fieldClass="px-6 text-right flex"
|
fieldClass="px-6 text-right flex"
|
||||||
label="Price"
|
label="Reward"
|
||||||
labelClass=""
|
labelClass=""
|
||||||
type="number"
|
type="number"
|
||||||
name="price"
|
name="price"
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export default function ActivitiesTab({ className }) {
|
|||||||
<div className="relative w-full overflow-x-auto sm:rounded-lg">
|
<div className="relative w-full overflow-x-auto sm:rounded-lg">
|
||||||
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr className="text-base text-thin-light-gray whitespace-nowrap border-b dark:border-[#5356fb29] default-border-b dark:border-[#5356fb29] ottom ">
|
<tr className="text-base text-thin-light-gray whitespace-nowrap border-b default-border-b dark:border-[#5356fb29] ottom ">
|
||||||
<td className="py-4 pr-12">List</td>
|
<td className="py-4 pr-12">List</td>
|
||||||
<td className="py-4 text-start px-2">Product Name</td>
|
<td className="py-4 text-start px-2">Product Name</td>
|
||||||
<td className="py-4 text-start px-2">Price</td>
|
<td className="py-4 text-start px-2">Price</td>
|
||||||
|
|||||||
@@ -0,0 +1,252 @@
|
|||||||
|
import React, {useState, useEffect} from 'react'
|
||||||
|
import { Link, useParams, useNavigate } from "react-router-dom";
|
||||||
|
import { useDispatch } from "react-redux";
|
||||||
|
import { updateUserDetails } from "../../../store/UserDetails";
|
||||||
|
|
||||||
|
import usersService from "../../../services/UsersService";
|
||||||
|
|
||||||
|
import PromoPageLayout from '../PromoPageLayout'
|
||||||
|
import InputCom from "../../Helpers/Inputs/InputCom";
|
||||||
|
import WrenchBoard from "../../../assets/images/wrenchboard-logo-text.png";
|
||||||
|
import LoadingSpinner from '../../../components/Spinners/LoadingSpinner'
|
||||||
|
|
||||||
|
import GoogleDownload from '../../../assets/images/download/andriod.jpg'
|
||||||
|
import IOSDownload from '../../../assets/images/download/apple.jpg'
|
||||||
|
|
||||||
|
export default function Promo() {
|
||||||
|
|
||||||
|
const api = new usersService()
|
||||||
|
|
||||||
|
const {name, id} = useParams() // PARAMETERS COMING FROM THE LINK
|
||||||
|
// console.log(name, id)
|
||||||
|
|
||||||
|
const navigate = useNavigate()
|
||||||
|
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
|
const [requestStatus, setRequestStatus] = useState({loading:true, data:{}})
|
||||||
|
|
||||||
|
const [completeSignUp, setCompleteSignUp] = useState({loading:false, status:false, message: ''});
|
||||||
|
|
||||||
|
const [showPassword, setShowPassword] = useState(false);
|
||||||
|
|
||||||
|
const [password, setPassword] = useState("");
|
||||||
|
|
||||||
|
const handlePassword = (e) => {
|
||||||
|
setPassword(e.target.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
// To Show and Hide Password
|
||||||
|
const togglePasswordVisibility = () => {
|
||||||
|
setShowPassword(!showPassword);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleContinue = () => {
|
||||||
|
let reqData = { // API REQUEST DATA/PAYLOAD
|
||||||
|
username: requestStatus?.data?.email,
|
||||||
|
promo: name,
|
||||||
|
promo_owner: id,
|
||||||
|
password: password,
|
||||||
|
sessionid: '24271A99426'
|
||||||
|
}
|
||||||
|
setCompleteSignUp({loading:true, status:false, message: ''})
|
||||||
|
if(!password){ // CHECKS FOR EMPTY PASSWORD
|
||||||
|
setCompleteSignUp({loading:false, status:false, message: 'Please Enter Password'})
|
||||||
|
return setTimeout(()=>{
|
||||||
|
setCompleteSignUp({loading:false, status:false, message: ''})
|
||||||
|
},2000)
|
||||||
|
}
|
||||||
|
api.loginPromo(reqData).then(res => { //loginPromo
|
||||||
|
console.log('RES', res)
|
||||||
|
if(res.data?.internal_return < 0 || !res?.data?.member_id || !res?.data?.uid || !res?.data?.session || res?.data?.status_message == 'VALID_LINK_NOT_FOUND'){
|
||||||
|
setCompleteSignUp({loading:false, status:false, message: 'Unable to login'})
|
||||||
|
return setTimeout(()=>{
|
||||||
|
setCompleteSignUp({loading:false, status:false, message: ''})
|
||||||
|
},4000)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do LOGIN HERE
|
||||||
|
localStorage.setItem("member_id", `${res.data.member_id}`);
|
||||||
|
localStorage.setItem("uid", `${res.data.uid}`);
|
||||||
|
localStorage.setItem("session_token", `${res.data.session}`);
|
||||||
|
localStorage.setItem("wallet_available_status", `${res.data.wallet_available_status}`);
|
||||||
|
if (res.data?.account_type == "FAMILY") {
|
||||||
|
sessionStorage.setItem("family_uid", res.data?.family_uid);
|
||||||
|
sessionStorage.setItem("parent_uid", res.data?.parent_uid);
|
||||||
|
}
|
||||||
|
dispatch(updateUserDetails({ ...res.data }));
|
||||||
|
setTimeout(() => {
|
||||||
|
navigate("/", { replace: true });
|
||||||
|
setCompleteSignUp({loading:false, status:true, message: ''})
|
||||||
|
}, 2000);
|
||||||
|
|
||||||
|
}).catch(err => {
|
||||||
|
setCompleteSignUp({loading:false, status:false, message: 'Opps! try again'})
|
||||||
|
setTimeout(()=>{
|
||||||
|
setCompleteSignUp({loading:false, status:false, message: ''})
|
||||||
|
},4000)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
let reqData = { // API REQUEST DATA/PAYLOAD
|
||||||
|
promo: name,
|
||||||
|
promo_owner: id,
|
||||||
|
sessionid: '79970A12501'
|
||||||
|
}
|
||||||
|
api.verifyPromo(reqData).then(res => {
|
||||||
|
if(res?.data?.internal_return < 0 || !res?.data?.email || res?.data?.status_message != 'VALID_LINK_FOUND'){
|
||||||
|
return setRequestStatus({loading:false, data:{}})
|
||||||
|
}
|
||||||
|
setRequestStatus({loading:false, data:res?.data})
|
||||||
|
}).catch(err => {
|
||||||
|
setRequestStatus({loading:false, data:{}})
|
||||||
|
})
|
||||||
|
},[])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PromoPageLayout>
|
||||||
|
<div className="w-full">
|
||||||
|
<div className="mb-5">
|
||||||
|
<Link to="#">
|
||||||
|
<img
|
||||||
|
src={WrenchBoard}
|
||||||
|
alt="wrenchboard"
|
||||||
|
className="h-10 mx-auto"
|
||||||
|
/>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
{requestStatus.loading ?
|
||||||
|
<div className='flex flex-col justify-center items-center'>
|
||||||
|
<LoadingSpinner height='h-40' size='8' />
|
||||||
|
<p>Loading...</p>
|
||||||
|
<p>please do not refresh</p>
|
||||||
|
</div>
|
||||||
|
: Object.keys(requestStatus.data).length > 0 ?
|
||||||
|
<div className="flex place-content-center">
|
||||||
|
<div className="w-10/12 pb-3">
|
||||||
|
<div className="p-6 input-area login-area border-2 border-[#4687ba] rounded-2xl">
|
||||||
|
<div className="input-item mb-5">
|
||||||
|
<InputCom
|
||||||
|
labelClass="tracking-wider"
|
||||||
|
fieldClass="sm:px-6 px-2"
|
||||||
|
value={requestStatus?.data?.email}
|
||||||
|
// inputHandler={handleEmail}
|
||||||
|
placeholder="Your Email"
|
||||||
|
label="Email"
|
||||||
|
name="email"
|
||||||
|
type="email"
|
||||||
|
iconName="message"
|
||||||
|
disable={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="input-item mb-5">
|
||||||
|
<InputCom
|
||||||
|
labelClass="tracking-wider"
|
||||||
|
fieldClass="sm:px-6 px-2 tracking-[0.25em] text-2xl"
|
||||||
|
value={password}
|
||||||
|
inputHandler={handlePassword}
|
||||||
|
placeholder="● ● ● ● ● ●"
|
||||||
|
label="Set Password"
|
||||||
|
name="password"
|
||||||
|
type={showPassword ? "text" : "password"}
|
||||||
|
onClick={togglePasswordVisibility}
|
||||||
|
passIcon={showPassword ? "password" : "password"}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{completeSignUp.message && (
|
||||||
|
<div className="relative p-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]">
|
||||||
|
{completeSignUp.message}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className="flex justify-center">
|
||||||
|
<button
|
||||||
|
name="full"
|
||||||
|
onClick={handleContinue}
|
||||||
|
type="button"
|
||||||
|
disabled={completeSignUp.loading}
|
||||||
|
className={`btn-login rounded-full text-xl text-white flex justify-center bg-[#4687ba] hover:bg-[#009ef7] transition-all duration-300 items-center text-[15px]`}
|
||||||
|
>
|
||||||
|
{completeSignUp.loading ? (
|
||||||
|
<div className="signup btn-loader"></div>
|
||||||
|
) : (
|
||||||
|
<>Continue</>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* APP DOWNLOAD STORE */}
|
||||||
|
<div className="w-full mt-4">
|
||||||
|
<div className="w-full flex justify-between items-center gap-10 sm:gap-32">
|
||||||
|
<div className="w-full">
|
||||||
|
<a
|
||||||
|
// className="px-1 py-1 lg:py-2 flex justify-center items-center gap-1 w-full rounded-md bg-black text-white hover:text-slate-500 hover:shadow-lg transition-all duration-300"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
href={process.env.REACT_APP_APPLE_APP}
|
||||||
|
>
|
||||||
|
{/* <i className="fa-brands fa-apple text-3xl"></i>
|
||||||
|
<div className="flex flex-col">
|
||||||
|
<span className="text-[11px]">Available on the</span>
|
||||||
|
<span className="text-[12px] lg:text-base">
|
||||||
|
App Store
|
||||||
|
</span>
|
||||||
|
</div> */}
|
||||||
|
<img src={IOSDownload} className='w-full h-auto' alt='IOS Download' />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div className="w-full">
|
||||||
|
<a
|
||||||
|
// className="px-1 py-1 lg:py-2 flex justify-center items-center gap-1 w-full rounded-md bg-black text-white hover:text-slate-500 hover:shadow-lg transition-all duration-300"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
href={process.env.REACT_APP_ANDROID_APP}
|
||||||
|
>
|
||||||
|
{/* <i className="fa-brands fa-google-play text-2xl"></i>
|
||||||
|
<div className="flex flex-col">
|
||||||
|
<span className="text-[11px]">Available on the</span>
|
||||||
|
<span className="text-[12px] lg:text-base">
|
||||||
|
Google Play
|
||||||
|
</span>
|
||||||
|
</div> */}
|
||||||
|
<img src={GoogleDownload} className='w-full h-auto' alt='IOS Download' />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
:
|
||||||
|
<ErrorComponent onClick={() => navigate("/login")} />
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</PromoPageLayout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const ErrorComponent = ({ onClick }) => (
|
||||||
|
<div className="input-area">
|
||||||
|
<div className="my-5">
|
||||||
|
<p className="text-[14px] leading-[19px] text-center text-[#181c32]">
|
||||||
|
This error occurs because you have already verified this link or the
|
||||||
|
link has expired. Try login or reset password. If none worked, try to
|
||||||
|
create the account from the start.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="signin-area flex justify-center mb-3.5">
|
||||||
|
<button
|
||||||
|
onClick={onClick}
|
||||||
|
type="button"
|
||||||
|
className={`rounded-[0.475rem] mb-6 text-[15px] font-semibold text-[#009ef7] hover:text-white flex justify-center bg-[#f1faff] hover:bg-[#009ef7] transition-all duration-300 items-center py-[0.8875rem] px-[1.81rem]`}
|
||||||
|
>
|
||||||
|
<span>Return Home</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
import React, { useContext } from "react";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
import { localImgLoad } from "../../lib";
|
||||||
|
|
||||||
|
import DarkModeContext from "../Contexts/DarkModeContext";
|
||||||
|
|
||||||
|
export default function PromoPageLayout({ children }) {
|
||||||
|
const bgImg = localImgLoad("images/left-wrenchboard.jpg");
|
||||||
|
const bgImgNig = localImgLoad("images/wrench-home-back-nigeria.jpg");
|
||||||
|
const bgImgCom = localImgLoad("images/wrench-promo-back-common.jpg");
|
||||||
|
|
||||||
|
const { countryMode } = useContext(DarkModeContext);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={`min-h-screen overflow-y-auto bg-cover bg-center flex flex-col justify-between items-center`}
|
||||||
|
style={{
|
||||||
|
backgroundImage: `url(${countryMode == "NG" ? bgImgCom : bgImgCom})`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
|
||||||
|
<div className={`w-full grid grid-cols-1`}>
|
||||||
|
{/* <div
|
||||||
|
className={`auth-bg hidden xl:block bg-blue-50 relative bg-cover bg-no-repeat border-0 after:content-[''] after:absolute after:inset-0`}
|
||||||
|
style={{backgroundImage: `url(${bgImg})`}}
|
||||||
|
>
|
||||||
|
</div> */}
|
||||||
|
<div className="p-5 sm:p-7 flex place-content-center">
|
||||||
|
<div className="py-5 w-full sm:w-11/12 max-w-[550px] shadow-md bg-slate-50 dark:bg-dark-white rounded-[0.475rem]">
|
||||||
|
<div className="w-full flex justify-center items-center">
|
||||||
|
{children && children}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className='hidden w-full shadow-md bg-slate-50 dark:bg-dark-white'>
|
||||||
|
<div className="w-full flex flex-col md:flex-row justify-center items-center px-10 py-2">
|
||||||
|
<div className="flex justify-center items-center">
|
||||||
|
<div className="flex items-center">
|
||||||
|
<a
|
||||||
|
href="https://www.wrenchboard.com/about-us"
|
||||||
|
className="text-[#a1a5b7] text-[15px] px-2 font-medium hover:text-[#009ef7]"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
About
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://www.wrenchboard.com/service"
|
||||||
|
className="text-[#a1a5b7] text-[15px] px-2 font-medium hover:text-[#009ef7]"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
Services
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://www.wrenchboard.com/contact"
|
||||||
|
className="text-[#a1a5b7] text-[15px] px-2 font-medium hover:text-[#009ef7]"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
Contact Us
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p className="text-black text-[15px] px-2 font-medium flex items-center gap-1">
|
||||||
|
<span className="dark:text-white">
|
||||||
|
© {new Date().getFullYear()} -
|
||||||
|
</span>
|
||||||
|
<Link to="/" className="text-[#009ef7] ml-1">
|
||||||
|
WrenchBoard
|
||||||
|
</Link>{" "}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -42,10 +42,10 @@ export default function ActivitiesTab({ className }) {
|
|||||||
<div className="relative w-full overflow-x-auto sm:rounded-lg">
|
<div className="relative w-full overflow-x-auto sm:rounded-lg">
|
||||||
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr className="text-base text-thin-light-gray whitespace-nowrap border-b dark:border-[#5356fb29] default-border-b dark:border-[#5356fb29] ottom ">
|
<tr className="text-base text-thin-light-gray whitespace-nowrap border-b default-border-b dark:border-[#5356fb29] ottom ">
|
||||||
<td className="py-4 pr-12">List</td>
|
<td className="py-4 pr-12">List</td>
|
||||||
<td className="py-4 text-start px-2">Product Name</td>
|
<td className="py-4 text-start px-2">Product Name</td>
|
||||||
<td className="py-4 text-start px-2">Price</td>
|
<td className="py-4 text-start px-2">Reward</td>
|
||||||
<td className="py-4 text-start px-2">Quantity</td>
|
<td className="py-4 text-start px-2">Quantity</td>
|
||||||
<td className="py-4 text-start px-2">From</td>
|
<td className="py-4 text-start px-2">From</td>
|
||||||
<td className="py-4 text-start px-2 pr-12">To</td>
|
<td className="py-4 text-start px-2 pr-12">To</td>
|
||||||
|
|||||||
@@ -28,21 +28,14 @@ export default function VerifyYou() {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="input-area">
|
<div className="input-area">
|
||||||
<div className="mb-5">
|
<div className="mb-5">
|
||||||
<p className="text-[14px] leading-[19px] text-center text-[#181c32]">
|
<p className="text-[14px] leading-[19px] text-center text-[#181c32]">
|
||||||
<b>Verify Email.</b> Help us secure your WrenchBoard account
|
Please <span className="font-semibold tracking-wide">verify your email</span> to secure your account.
|
||||||
by verifying your email registration address. Verification
|
|
||||||
will let you access all of WrenchBoard's features.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-5">
|
<div className="mb-5">
|
||||||
<p className="text-[14px] leading-[19px] text-center text-[#181c32]">
|
<p className="text-[14px] leading-[19px] text-center text-[#181c32]">
|
||||||
If you do not receive the confirmation message within a few
|
If you don't see the confirmation email, check your <span className='font-semibold tracking-wide'>Junk</span> or <span className='font-semibold tracking-wide'>Spam</span> folder and mark it as "Not Junk"
|
||||||
minutes of signing up, please check your Junk E-mail folder
|
|
||||||
just in case the confirmation email got delivered there
|
|
||||||
instead of your inbox. If so, select the confirmation
|
|
||||||
message and click Not Junk, which will allow future messages
|
|
||||||
to get through.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -26,9 +26,11 @@ export default function BlogItem(props) {
|
|||||||
const queryParams = new URLSearchParams(location?.search);
|
const queryParams = new URLSearchParams(location?.search);
|
||||||
const blog_id = queryParams.get("blog_id");
|
const blog_id = queryParams.get("blog_id");
|
||||||
|
|
||||||
|
// console.log('MUMU', 'meta_value', blogdata, blogdata.data.image_url)
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
if(!blog_id){
|
if(!blog_id){
|
||||||
navigate('/',{replace:true})
|
return navigate('/',{replace:true})
|
||||||
}
|
}
|
||||||
apiCall.getSingleBlogData({blog_id}).then(res => {
|
apiCall.getSingleBlogData({blog_id}).then(res => {
|
||||||
setBlogdata({loading: false, data:res.data})
|
setBlogdata({loading: false, data:res.data})
|
||||||
@@ -87,7 +89,11 @@ export default function BlogItem(props) {
|
|||||||
<div className="slider-btns flex space-x-4">
|
<div className="slider-btns flex space-x-4">
|
||||||
</div>
|
</div>
|
||||||
</div> */}
|
</div> */}
|
||||||
<div dangerouslySetInnerHTML={{__html: blogdata.data?.blogdata?.[0]?.post_content}}>
|
{/* console.log('MUMU', 'meta_value', blogdata, blogdata.data.image_url) */}
|
||||||
|
<div className='w-full mb-8'>
|
||||||
|
<img src={`${blogdata.data.image_url}/${blogdata.data?.blogdata?.[0]?.meta_value}`} className='w-full h-auto' alt='Blog Image' />
|
||||||
|
</div>
|
||||||
|
<div dangerouslySetInnerHTML={{__html: blogdata.data?.blogdata?.[0]?.post_content}} className='prose leading-relaxed'>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
:
|
:
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ export default function AvailableJobsCard({
|
|||||||
<div className="block sm:flex flex-wrap gap-4">
|
<div className="block sm:flex flex-wrap gap-4">
|
||||||
<p className="text-sm text-thin-light-gray flex flext-start gap-1 items-center">
|
<p className="text-sm text-thin-light-gray flex flext-start gap-1 items-center">
|
||||||
{datas?.offer_depend_uid && <i className="fa-solid fa-lock p-1 text-red-500 text-[12px]"></i>}
|
{datas?.offer_depend_uid && <i className="fa-solid fa-lock p-1 text-red-500 text-[12px]"></i>}
|
||||||
Price: <span className="text-purple">{thePrice}</span>
|
Reward: <span className="text-purple">{thePrice}</span>
|
||||||
</p>
|
</p>
|
||||||
<p className="text-sm text-thin-light-gray">
|
<p className="text-sm text-thin-light-gray">
|
||||||
Duration:{" "}
|
Duration:{" "}
|
||||||
|
|||||||
@@ -1,10 +1,19 @@
|
|||||||
import React from "react";
|
import React, { Suspense, lazy, useState } from "react";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
|
import VideoElement from '../../components/VideoCom/VideoElement'
|
||||||
|
import OfferJobPopout from '../../components/jobPopout/OfferJobPopout'
|
||||||
|
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
||||||
|
import CountDown from '../Helpers/CountDown'
|
||||||
|
|
||||||
|
const AccountDashboard = ({ className, bannerList, offersList, imageServer }) => {
|
||||||
|
|
||||||
|
let [offerPopout, setOfferPopout] = useState({ show: false, data: {} }); // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW
|
||||||
|
|
||||||
|
let offersListLength = offersList?.length
|
||||||
|
|
||||||
const AccountDashboard = ({ className, bannerList }) => {
|
|
||||||
// getting the upper three banners for the home layout
|
// getting the upper three banners for the home layout
|
||||||
const getUpperBanner = bannerList?.filter((value, idx) => idx <= 2);
|
const getUpperBanner = bannerList?.filter((value, idx) => idx <= 2 - offersListLength);
|
||||||
const getLowerBanner = bannerList?.filter((value, idx) => idx > 2);
|
const getLowerBanner = bannerList?.filter((value, idx) => !getUpperBanner?.map(item => item?.title)?.includes(value.title));
|
||||||
|
|
||||||
let getImage = ({ banner_location, banner }) => {
|
let getImage = ({ banner_location, banner }) => {
|
||||||
if (banner_location == "LOCAL") {
|
if (banner_location == "LOCAL") {
|
||||||
@@ -14,56 +23,90 @@ const AccountDashboard = ({ className, bannerList }) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log(getLowerBanner);
|
|
||||||
return (
|
return (
|
||||||
<div
|
<>
|
||||||
className={`w-full min-h-[450px] flex flex-col justify-between items-center gap-4 rounded-2xl overflow-hidden ${
|
<div
|
||||||
className || ""
|
className={`w-full min-h-[450px] flex flex-col justify-between items-center gap-4 rounded-2xl overflow-hidden ${
|
||||||
}`}
|
className || ""
|
||||||
>
|
}`}
|
||||||
<div className="w-full grid xxs:grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 items-center justify-center gap-2 md:gap-4">
|
>
|
||||||
{getUpperBanner?.map((props, idx) => {
|
|
||||||
let image = getImage(props);
|
|
||||||
|
|
||||||
let { short_title, short_description, short_button_text, link_path } =
|
<div className="w-full grid xxs:grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 items-center justify-center gap-2 md:gap-4">
|
||||||
props;
|
|
||||||
|
|
||||||
return (
|
{/* OFFER LIST DISPLAY */}
|
||||||
<div key={idx}>
|
<>
|
||||||
<TopBanner
|
{(offersList && offersList?.length > 0) &&
|
||||||
btn={short_button_text}
|
offersList.map((item, index) => {
|
||||||
image={image}
|
let thePrice = PriceFormatter(
|
||||||
title={short_title}
|
item?.price * 0.01,
|
||||||
desc={short_description}
|
item?.currency_code,
|
||||||
link_path={link_path}
|
item?.currency
|
||||||
/>
|
);
|
||||||
</div>
|
|
||||||
);
|
let image = `${imageServer}${localStorage.getItem("session_token")}/job/${item.job_uid}`
|
||||||
})}
|
return (
|
||||||
|
<div key={item.id}>
|
||||||
|
<NewOfferCard datas={item} image={image} price={thePrice} setOfferPopout={setOfferPopout} />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</>
|
||||||
|
|
||||||
|
{getUpperBanner?.map((props, idx) => {
|
||||||
|
let image = getImage(props);
|
||||||
|
|
||||||
|
let { short_title, short_description, short_button_text, link_path, card_type, blog_id } =
|
||||||
|
props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div key={idx}>
|
||||||
|
<TopBanner
|
||||||
|
btn={short_button_text}
|
||||||
|
image={image}
|
||||||
|
title={short_title}
|
||||||
|
desc={short_description}
|
||||||
|
link_path={card_type=='BLOG' ? `${link_path}?blog_id=${blog_id}` : link_path}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
<div className="w-full grid-cols-1 md:grid-cols-2 2xl::grid-cols-3 grid items-center justify-center gap-2 md:gap-4">
|
||||||
|
{getLowerBanner?.map((props, idx) => {
|
||||||
|
let image = getImage(props);
|
||||||
|
|
||||||
|
let { short_title, short_description, short_button_text, link_path, card_type, blog_id } =
|
||||||
|
props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div key={idx}>
|
||||||
|
<LowerBanner
|
||||||
|
btn={short_button_text}
|
||||||
|
image={image}
|
||||||
|
title={short_title}
|
||||||
|
desc={short_description}
|
||||||
|
link_path={link_path}
|
||||||
|
card_type={card_type}
|
||||||
|
blog_id={blog_id}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-full grid-cols-1 md:grid-cols-2 2xl::grid-cols-3 grid items-center justify-center gap-2 md:gap-4">
|
|
||||||
{getLowerBanner?.map((props, idx) => {
|
|
||||||
let image = getImage(props);
|
|
||||||
|
|
||||||
let { short_title, short_description, short_button_text, link_path, card_type, blog_id } =
|
{/* Offer Job Popout */}
|
||||||
props;
|
{offerPopout.show && (
|
||||||
|
<OfferJobPopout
|
||||||
return (
|
details={offerPopout.data}
|
||||||
<div key={idx}>
|
onClose={() => {
|
||||||
<LowerBanner
|
setOfferPopout({ show: false, data: {} });
|
||||||
btn={short_button_text}
|
}}
|
||||||
image={image}
|
situation={offerPopout.show}
|
||||||
title={short_title}
|
/>
|
||||||
desc={short_description}
|
)}
|
||||||
link_path={link_path}
|
{/* End of Offer Job Popout */}
|
||||||
card_type={card_type}
|
</>
|
||||||
blog_id={blog_id}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -71,25 +114,25 @@ export default AccountDashboard;
|
|||||||
|
|
||||||
const TopBanner = ({ image, title = "", desc = "", btn, link_path, key }) => {
|
const TopBanner = ({ image, title = "", desc = "", btn, link_path, key }) => {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col shadow-md rounded-xl dark:border-[#5356fb29]" key={key}>
|
<div className="flex flex-col shadow-md rounded-xl dark:border-[#5356fb29] overflow-hidden" key={key}>
|
||||||
<Link to={link_path} className="h-[12rem] rounded-t-xl">
|
<Link to={link_path} className="h-[12rem] bg-white">
|
||||||
<img
|
<img
|
||||||
src={image}
|
src={image}
|
||||||
alt="banner-img"
|
alt="banner-img"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
className="w-full h-full rounded-t-xl object-cover"
|
className="w-auto mx-auto h-full"
|
||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
<div className="h-[7rem] rounded-b-xl bg-white dark:bg-dark-white">
|
<div className="rounded-b-xl bg-white dark:bg-dark-white">
|
||||||
<div className="border-b border-slate-300 px-2 py-1 h-[5.4rem] flex flex-col gap-2 dark:text-white">
|
<div className="border-b border-slate-300 px-2 py-1 h-[5.4rem] flex flex-col gap-2 dark:text-white">
|
||||||
<Link to={link_path} className="font-bold text-lg">
|
<Link to={link_path} className="font-bold text-lg line-clamp-1">
|
||||||
{title}
|
{title}
|
||||||
</Link>
|
</Link>
|
||||||
<Link to={link_path} className="text-sm">
|
<Link to={link_path} className="text-sm">
|
||||||
{desc}
|
{desc}
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between w-full px-2 items-center pt-[0.2rem]">
|
<div className="flex justify-between w-full p-1 items-center">
|
||||||
<Link to={link_path} className="text-slate-300 font-semibold text-sm">
|
<Link to={link_path} className="text-slate-300 font-semibold text-sm">
|
||||||
{btn}
|
{btn}
|
||||||
</Link>
|
</Link>
|
||||||
@@ -104,6 +147,64 @@ const TopBanner = ({ image, title = "", desc = "", btn, link_path, key }) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const NewOfferCard = ({ datas, hidden = false, price, setOfferPopout, image }) => {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col shadow-md bg-red-50 dark:bg-dark-white rounded-xl dark:border-[#5356fb29] overflow-hidden">
|
||||||
|
<div className="h-[12rem] bg-transparent">
|
||||||
|
{/* thumbnail image/video */}
|
||||||
|
{datas.job_type == "MEDIA" ?
|
||||||
|
<Suspense fallback={<p>Loading...</p>}>
|
||||||
|
<VideoElement videoId={datas?.media_uid} />
|
||||||
|
</Suspense>
|
||||||
|
:
|
||||||
|
<div
|
||||||
|
className="thumbnail w-full h-full rounded-xl overflow-hidden px-4 pt-4"
|
||||||
|
style={{
|
||||||
|
background: `url(${image}) center / contain no-repeat`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{hidden && <div className="flex justify-center"></div>}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<div className="rounded-b-xl bg-transparent dark:bg-dark-transparent">
|
||||||
|
<div className="border-b border-slate-300 px-2 py-1 h-[5.4rem] flex flex-col gap-2 dark:text-white">
|
||||||
|
<h1 className="font-bold text-lg line-clamp-1 text-center">
|
||||||
|
{datas?.title}
|
||||||
|
</h1>
|
||||||
|
{/* <Link to={link_path} className="text-sm">
|
||||||
|
{desc}
|
||||||
|
</Link> */}
|
||||||
|
<div className="card-buttons flex justify-center items-center space-x-2">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() =>
|
||||||
|
setOfferPopout({ show: true, data: { ...datas, price, image } })
|
||||||
|
}
|
||||||
|
className="btn-shine w-2/3 h-[40px] text-white rounded-full text-sm bg-pink flex justify-center items-center"
|
||||||
|
>
|
||||||
|
Start Task
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-between w-full p-1 items-center">
|
||||||
|
<div className="flex gap-1 items-center">
|
||||||
|
<p className="text-[12px] text-red-500 tracking-wide">Expires</p>
|
||||||
|
<p className="text-[12px] font-semibold tracking-wide text-dark-gray dark:text-white">
|
||||||
|
<CountDown lastDate={datas.expire} />
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<button className="flex items-center justify-center gap-2">
|
||||||
|
<div className="w-[4px] h-[4px] bg-slate-400 rounded-full"></div>
|
||||||
|
<div className="w-[4px] h-[4px] bg-slate-400 rounded-full"></div>
|
||||||
|
<div className="w-[4px] h-[4px] bg-slate-400 rounded-full"></div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const LowerBanner = ({ image, title = "", desc = "", btn, link_path, card_type, blog_id, key }) => {
|
const LowerBanner = ({ image, title = "", desc = "", btn, link_path, card_type, blog_id, key }) => {
|
||||||
const newLinkPath = card_type == 'BLOG' ? `${link_path}?blog_id=${blog_id}` : link_path
|
const newLinkPath = card_type == 'BLOG' ? `${link_path}?blog_id=${blog_id}` : link_path
|
||||||
|
|
||||||
@@ -113,7 +214,7 @@ const LowerBanner = ({ image, title = "", desc = "", btn, link_path, card_type,
|
|||||||
className="flex flex-col bg-white shadow-md h-full rounded-xl dark:border-[#5356fb29] dark:bg-dark-white"
|
className="flex flex-col bg-white shadow-md h-full rounded-xl dark:border-[#5356fb29] dark:bg-dark-white"
|
||||||
>
|
>
|
||||||
<div className="w-full xxs:flex justify-between items-center border-b border-slate-300 p-2">
|
<div className="w-full xxs:flex justify-between items-center border-b border-slate-300 p-2">
|
||||||
<div className="min-h-[150px] sm:min-h-[130px] flex justify-between items-center">
|
<div className="min-h-[130px] sm:min-h-[100px] flex justify-between items-center">
|
||||||
<div className="px-2 flex flex-col gap-2 dark:text-white">
|
<div className="px-2 flex flex-col gap-2 dark:text-white">
|
||||||
<Link to={newLinkPath} className="text-lg font-bold">
|
<Link to={newLinkPath} className="text-lg font-bold">
|
||||||
{title}
|
{title}
|
||||||
@@ -132,7 +233,7 @@ const LowerBanner = ({ image, title = "", desc = "", btn, link_path, card_type,
|
|||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between w-full px-2 items-center">
|
<div className="flex justify-between w-full p-1 items-center">
|
||||||
<Link to={newLinkPath} className="text-slate-300 font-semibold text-sm">
|
<Link to={newLinkPath} className="text-slate-300 font-semibold text-sm">
|
||||||
{btn}
|
{btn}
|
||||||
</Link>
|
</Link>
|
||||||
@@ -181,7 +282,7 @@ const BannerSection = ({ banners, variant }) => {
|
|||||||
variant === "top"
|
variant === "top"
|
||||||
? "rounded-b-xl bg-white"
|
? "rounded-b-xl bg-white"
|
||||||
: "border-b border-slate-300"
|
: "border-b border-slate-300"
|
||||||
} h-[7rem]`}
|
}`}
|
||||||
>
|
>
|
||||||
<div className="border-b border-slate-300 px-2 py-1 h-[5.4rem] flex flex-col gap-2">
|
<div className="border-b border-slate-300 px-2 py-1 h-[5.4rem] flex flex-col gap-2">
|
||||||
<Link to={link_path} className="font-bold text-lg">
|
<Link to={link_path} className="font-bold text-lg">
|
||||||
@@ -191,7 +292,7 @@ const BannerSection = ({ banners, variant }) => {
|
|||||||
{short_description}
|
{short_description}
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between w-full px-2 items-center">
|
<div className="flex justify-between w-full p-1 items-center">
|
||||||
<Link to={link_path} className="text-slate-300 font-semibold">
|
<Link to={link_path} className="text-slate-300 font-semibold">
|
||||||
{short_button_text}
|
{short_button_text}
|
||||||
</Link>
|
</Link>
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { useSelector } from "react-redux";
|
|||||||
export default function FamilyParentDashboard({
|
export default function FamilyParentDashboard({
|
||||||
className,
|
className,
|
||||||
bannerList,
|
bannerList,
|
||||||
nextDueTask,
|
|
||||||
}) {
|
}) {
|
||||||
const { userDetails } = useSelector((state) => state?.userDetails);
|
const { userDetails } = useSelector((state) => state?.userDetails);
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React from "react";
|
|||||||
// import HomeSliders from "./HomeSliders";
|
// import HomeSliders from "./HomeSliders";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
|
|
||||||
export default function HomeDashboard({ className, bannerList, nextDueTask }) {
|
export default function HomeDashboard({ className, bannerList }) {
|
||||||
const { userDetails } = useSelector((state) => state?.userDetails);
|
const { userDetails } = useSelector((state) => state?.userDetails);
|
||||||
|
|
||||||
let loginDate = userDetails?.last_login.split(" ")[0];
|
let loginDate = userDetails?.last_login.split(" ")[0];
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { useSelector } from "react-redux";
|
|||||||
export default function JobOwnerDashboard({
|
export default function JobOwnerDashboard({
|
||||||
className,
|
className,
|
||||||
bannerList,
|
bannerList,
|
||||||
nextDueTask,
|
|
||||||
}) {
|
}) {
|
||||||
const { userDetails } = useSelector((state) => state?.userDetails);
|
const { userDetails } = useSelector((state) => state?.userDetails);
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { useSelector } from "react-redux";
|
|||||||
export default function WorkerDashboard({
|
export default function WorkerDashboard({
|
||||||
className,
|
className,
|
||||||
bannerList,
|
bannerList,
|
||||||
nextDueTask,
|
|
||||||
}) {
|
}) {
|
||||||
const { userDetails } = useSelector((state) => state?.userDetails);
|
const { userDetails } = useSelector((state) => state?.userDetails);
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ export default function FamilyPending({ familyData }) {
|
|||||||
</h1>
|
</h1>
|
||||||
<div>{value.description}</div>
|
<div>{value.description}</div>
|
||||||
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
||||||
Price:{" "}
|
Reward:{" "}
|
||||||
<span className="text-purple">
|
<span className="text-purple">
|
||||||
{thePrice}
|
{thePrice}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ export default function FamilyNewTasks({
|
|||||||
</h1>
|
</h1>
|
||||||
<div className="flex flex-col sm:flex-row items-start gap-1 md:gap-4 md:items-center">
|
<div className="flex flex-col sm:flex-row items-start gap-1 md:gap-4 md:items-center">
|
||||||
<span className="text-sm text-thin-light-gray flex flex-start gap-1">
|
<span className="text-sm text-thin-light-gray flex flex-start gap-1">
|
||||||
Price:{" "}
|
Reward:{" "}
|
||||||
<span className="text-purple">
|
<span className="text-purple">
|
||||||
{thePrice}
|
{thePrice}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ export default function FamilyPending({
|
|||||||
</h1>
|
</h1>
|
||||||
<div>{value.description}</div>
|
<div>{value.description}</div>
|
||||||
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
||||||
Price:{" "}
|
Reward:{" "}
|
||||||
<span className="text-purple">
|
<span className="text-purple">
|
||||||
{thePrice}
|
{thePrice}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ export default function FamilyTasks({
|
|||||||
</h1>
|
</h1>
|
||||||
<div className="flex flex-col sm:flex-row items-start gap-1 md:gap-4 md:items-center">
|
<div className="flex flex-col sm:flex-row items-start gap-1 md:gap-4 md:items-center">
|
||||||
<span className="text-sm text-thin-light-gray flex flex-start gap-1">
|
<span className="text-sm text-thin-light-gray flex flex-start gap-1">
|
||||||
Price:{" "}
|
Reward:{" "}
|
||||||
<span className="text-purple">
|
<span className="text-purple">
|
||||||
{thePrice}
|
{thePrice}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
|
||||||
import ModalCom from "../../../Helpers/ModalCom";
|
|
||||||
import InputCom from "../../../Helpers/Inputs/InputCom";
|
|
||||||
import { Form, Formik } from "formik";
|
import { Form, Formik } from "formik";
|
||||||
|
import React, { useEffect, useState } from "react";
|
||||||
import * as Yup from "yup";
|
import * as Yup from "yup";
|
||||||
|
import InputCom from "../../../Helpers/Inputs/InputCom";
|
||||||
|
import ModalCom from "../../../Helpers/ModalCom";
|
||||||
|
|
||||||
import { AmountTo2DP } from "../../../Helpers/PriceFormatter";
|
|
||||||
import usersService from "../../../../services/UsersService";
|
|
||||||
import LoadingSpinner from "../../../Spinners/LoadingSpinner";
|
|
||||||
import { PriceFormatter } from "../../../Helpers/PriceFormatter";
|
|
||||||
import { tableReload } from "../../../../store/TableReloads";
|
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
import { apiConst } from "../../../../lib/apiConst";
|
import { apiConst } from "../../../../lib/apiConst";
|
||||||
|
import usersService from "../../../../services/UsersService";
|
||||||
|
import { tableReload } from "../../../../store/TableReloads";
|
||||||
import { SocketValues } from "../../../Contexts/SocketIOContext";
|
import { SocketValues } from "../../../Contexts/SocketIOContext";
|
||||||
|
import { AmountTo2DP } from "../../../Helpers/PriceFormatter";
|
||||||
|
import LoadingSpinner from "../../../Spinners/LoadingSpinner";
|
||||||
|
|
||||||
const validationSchema = Yup.object().shape({
|
const validationSchema = Yup.object().shape({
|
||||||
// amount: Yup.string()
|
// amount: Yup.string()
|
||||||
@@ -31,10 +30,9 @@ const validationSchema = Yup.object().shape({
|
|||||||
});
|
});
|
||||||
|
|
||||||
function FamilyAddFundPopout({ action, situation, wallet, familyData }) {
|
function FamilyAddFundPopout({ action, situation, wallet, familyData }) {
|
||||||
|
const { userDetails } = useSelector((state) => state?.userDetails); // Gets User Detail
|
||||||
|
|
||||||
const {userDetails} = useSelector((state) => state?.userDetails); // Gets User Detail
|
const { parentAssignJobToKid } = SocketValues(); // socket emit event from FULL account
|
||||||
|
|
||||||
const { parentAssignJobToKid } = SocketValues() // socket emit event from FULL account
|
|
||||||
|
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
@@ -60,7 +58,6 @@ function FamilyAddFundPopout({ action, situation, wallet, familyData }) {
|
|||||||
};
|
};
|
||||||
// FUNCTION TO PERFORM FAMILY TRANSFER
|
// FUNCTION TO PERFORM FAMILY TRANSFER
|
||||||
const handleAddFund = (values) => {
|
const handleAddFund = (values) => {
|
||||||
|
|
||||||
setRequestStatus({ loading: true, status: false, message: "" });
|
setRequestStatus({ loading: true, status: false, message: "" });
|
||||||
|
|
||||||
let senderBal = startTransfer?.data?.origing_current_balance || ""; // SENDER'S ACCOUNT BALANCE
|
let senderBal = startTransfer?.data?.origing_current_balance || ""; // SENDER'S ACCOUNT BALANCE
|
||||||
@@ -143,12 +140,12 @@ function FamilyAddFundPopout({ action, situation, wallet, familyData }) {
|
|||||||
//SENDS MESSAGE TO SOCKET TO UPDATE CHILD ACCOUNT
|
//SENDS MESSAGE TO SOCKET TO UPDATE CHILD ACCOUNT
|
||||||
// message, room
|
// message, room
|
||||||
let socketMsg = {
|
let socketMsg = {
|
||||||
"audience": "MEMBER",
|
audience: "MEMBER",
|
||||||
"action": "REFRESH_WALLET",
|
action: "REFRESH_WALLET",
|
||||||
"family_uid": reqData.family_uid,
|
family_uid: reqData.family_uid,
|
||||||
}
|
};
|
||||||
let socketRoom = `FAMILY-${userDetails.uid}`
|
let socketRoom = `FAMILY-${userDetails.uid}`;
|
||||||
parentAssignJobToKid(socketMsg, socketRoom) //SENDS MESSAGE TO SOCKET TO UPDATE CHILD ACCOUNT
|
parentAssignJobToKid(socketMsg, socketRoom); //SENDS MESSAGE TO SOCKET TO UPDATE CHILD ACCOUNT
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setRequestStatus({ loading: false, status: false, message: "" });
|
setRequestStatus({ loading: false, status: false, message: "" });
|
||||||
@@ -189,14 +186,8 @@ function FamilyAddFundPopout({ action, situation, wallet, familyData }) {
|
|||||||
<ModalCom action={action} situation={situation}>
|
<ModalCom action={action} situation={situation}>
|
||||||
<div className="relative logout-modal-wrapper lg:w-[500px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl">
|
<div className="relative logout-modal-wrapper lg:w-[500px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl">
|
||||||
<div className="modal-header-con">
|
<div className="modal-header-con">
|
||||||
<h1 className="modal-title">
|
<h1 className="modal-title">Add Fund</h1>
|
||||||
Add Fund
|
<button type="button" className="modal-close-btn" onClick={action}>
|
||||||
</h1>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
className="modal-close-btn"
|
|
||||||
onClick={action}
|
|
||||||
>
|
|
||||||
<svg
|
<svg
|
||||||
width="36"
|
width="36"
|
||||||
height="36"
|
height="36"
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ export default function InputCom({
|
|||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
value={value}
|
value={value}
|
||||||
onChange={inputHandler}
|
onChange={inputHandler}
|
||||||
className={`input-field placeholder:text-base text-dark-gray w-full h-full ${
|
className={`input-field placeholder:text-base text-dark-gray w-full h-full ${iconName && 'pr-6'} ${
|
||||||
inputBg && inputBg} tracking-wide focus:ring-0 focus:outline-none ${fieldClass}`}
|
inputBg && inputBg} tracking-wide focus:ring-0 focus:outline-none ${fieldClass}`}
|
||||||
type={type}
|
type={type}
|
||||||
id={name}
|
id={name}
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ export default function FullAccountDash(props) {
|
|||||||
className="mb-4"
|
className="mb-4"
|
||||||
data={userDetails}
|
data={userDetails}
|
||||||
bannerList={props.bannerList}
|
bannerList={props.bannerList}
|
||||||
nextDueTask={props.nextDueTask}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case "FAMILY_PARENT_DASH":
|
case "FAMILY_PARENT_DASH":
|
||||||
@@ -31,7 +30,6 @@ export default function FullAccountDash(props) {
|
|||||||
className="mb-4"
|
className="mb-4"
|
||||||
data={userDetails}
|
data={userDetails}
|
||||||
bannerList={props.bannerList}
|
bannerList={props.bannerList}
|
||||||
nextDueTask={props.nextDueTask}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case "WORKER_HOME_DASH":
|
case "WORKER_HOME_DASH":
|
||||||
@@ -40,7 +38,6 @@ export default function FullAccountDash(props) {
|
|||||||
className="mb-4"
|
className="mb-4"
|
||||||
data={userDetails}
|
data={userDetails}
|
||||||
bannerList={props.bannerList}
|
bannerList={props.bannerList}
|
||||||
nextDueTask={props.nextDueTask}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case "JOBOWNER_HOME_DASH":
|
case "JOBOWNER_HOME_DASH":
|
||||||
@@ -49,7 +46,6 @@ export default function FullAccountDash(props) {
|
|||||||
className="mb-4"
|
className="mb-4"
|
||||||
data={userDetails}
|
data={userDetails}
|
||||||
bannerList={props.bannerList}
|
bannerList={props.bannerList}
|
||||||
nextDueTask={props.nextDueTask}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
default:
|
default:
|
||||||
@@ -62,16 +58,19 @@ export default function FullAccountDash(props) {
|
|||||||
<div className="home-page-wrapper">
|
<div className="home-page-wrapper">
|
||||||
{renderDashboard()}
|
{renderDashboard()}
|
||||||
{process.env.REACT_APP_SHOW_ACCOUNT_DASH == "1" && (
|
{process.env.REACT_APP_SHOW_ACCOUNT_DASH == "1" && (
|
||||||
<AccountDashboard className="mb-4" bannerList={props.bannerList} />
|
<AccountDashboard className="mb-4" bannerList={props.bannerList} offersList={props.offersList} imageServer={props.imageServer} />
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{props?.dashTypes !== "undefined" &&
|
{
|
||||||
props.offersList?.data?.result_list?.length ? (
|
// props?.dashTypes !== "undefined" &&
|
||||||
<MyOffersTable
|
// props.offersList?.data?.result_list?.length ? (
|
||||||
MyActiveOffersList={props.offersList?.data}
|
// <MyOffersTable
|
||||||
className="mb-10"
|
// MyActiveOffersList={props.offersList?.data}
|
||||||
/>
|
// className="mb-10"
|
||||||
) : props.MyActiveJobList?.data?.length ? (
|
// />
|
||||||
|
// )
|
||||||
|
// :
|
||||||
|
props.MyActiveJobList?.data?.length ? (
|
||||||
<>
|
<>
|
||||||
<div className="w-full mb-5 flex justify-between items-center gap-1">
|
<div className="w-full mb-5 flex justify-between items-center gap-1">
|
||||||
<h1 className="text-26 font-bold text-dark-gray dark:text-white">
|
<h1 className="text-26 font-bold text-dark-gray dark:text-white">
|
||||||
|
|||||||
@@ -5,19 +5,16 @@ import usersService from "../../services/UsersService";
|
|||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import FamilyDash from "./FamilyDash";
|
import FamilyDash from "./FamilyDash";
|
||||||
import FullAccountDash from "./FullAccountDash";
|
import FullAccountDash from "./FullAccountDash";
|
||||||
|
import LoadingSpinner from '../../components/Spinners/LoadingSpinner'
|
||||||
|
|
||||||
export default function Home(props) {
|
export default function Home(props) {
|
||||||
// console.log("PROPS IN HOME->", props);
|
// console.log("PROPS IN HOME->", props);
|
||||||
const userApi = new usersService();
|
const userApi = new usersService();
|
||||||
const { commonHeadBanner } = useSelector((state) => state.commonHeadBanner);
|
const { commonHeadBanner } = useSelector((state) => state.commonHeadBanner);
|
||||||
|
|
||||||
let [nextDueTask, setNextDueTask] = useState({});
|
|
||||||
const [MyOffersList, setMyOffersList] = useState({loading: true, data: []});
|
|
||||||
|
|
||||||
const { userDetails } = useSelector((state) => state?.userDetails);
|
const { userDetails } = useSelector((state) => state?.userDetails);
|
||||||
|
|
||||||
const [MyActiveJobList, setMyActiveJobList] = useState({loading:true, data:[]}); // STATE TO HOLD ACTIVE/CURRENT TASKS
|
const [MyActiveJobList, setMyActiveJobList] = useState({loading:true, data:[]}); // STATE TO HOLD ACTIVE/CURRENT TASKS
|
||||||
// const [MyActiveJobList, setMyActiveJobList] = useState([]); // STATE TO HOLD ACTIVE/CURRENT TASKS
|
|
||||||
|
|
||||||
const getMyActiveJobList = async () => { // FUNCTION TO POPULATE ACTIVE/CURRENT TASK LIST
|
const getMyActiveJobList = async () => { // FUNCTION TO POPULATE ACTIVE/CURRENT TASK LIST
|
||||||
try {
|
try {
|
||||||
@@ -32,41 +29,41 @@ export default function Home(props) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// FUNCTION TO GET DASH DATA TO DETERMINE CURRENT TASK DUE TIME
|
// FUNCTION TO GET DASH DATA TO DETERMINE CURRENT TASK DUE TIME
|
||||||
const getHomeDate = () => {
|
// const getHomeDate = () => {
|
||||||
userApi
|
// userApi
|
||||||
.getHomeDate()
|
// .getHomeDate()
|
||||||
.then((res) => {
|
// .then((res) => {
|
||||||
if (res.status != 200 || res.internal_return < 0) {
|
// if (res.status != 200 || res.internal_return < 0) {
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
setNextDueTask(res.data);
|
// setNextDueTask(res.data);
|
||||||
})
|
// })
|
||||||
.catch((error) => {
|
// .catch((error) => {
|
||||||
console.log(error);
|
// console.log(error);
|
||||||
});
|
// });
|
||||||
};
|
// };
|
||||||
|
|
||||||
const getMyOffersList = async () => {
|
// const getMyOffersList = async () => {
|
||||||
try {
|
// try {
|
||||||
const res = await userApi.getOffersList();
|
// const res = await userApi.getOffersList();
|
||||||
setMyOffersList({loading:false, data:res.data});
|
// setMyOffersList({loading:false, data:res.data});
|
||||||
} catch (error) {
|
// } catch (error) {
|
||||||
setMyOffersList({loading:false, data:[]});
|
// setMyOffersList({loading:false, data:[]});
|
||||||
console.log("Error getting offers", error);
|
// console.log("Error getting offers", error);
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchData = async () => {
|
|
||||||
await Promise.all([getHomeDate(), getMyOffersList(), getMyActiveJobList()]);
|
|
||||||
};
|
|
||||||
if(userDetails?.account_type == 'FULL'){
|
if(userDetails?.account_type == 'FULL'){
|
||||||
fetchData();
|
getMyActiveJobList();
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout>
|
<Layout>
|
||||||
|
{Object.keys(commonHeadBanner).length < 1 ?
|
||||||
|
<LoadingSpinner height='h-48' size='16' />
|
||||||
|
:
|
||||||
<div className="w-full">
|
<div className="w-full">
|
||||||
{userDetails && userDetails?.account_type == "FAMILY" ? (
|
{userDetails && userDetails?.account_type == "FAMILY" ? (
|
||||||
<FamilyDash
|
<FamilyDash
|
||||||
@@ -78,11 +75,12 @@ export default function Home(props) {
|
|||||||
/>
|
/>
|
||||||
) : userDetails && userDetails?.account_type == "FULL" ? (
|
) : userDetails && userDetails?.account_type == "FULL" ? (
|
||||||
<FullAccountDash
|
<FullAccountDash
|
||||||
nextDueTask={nextDueTask}
|
|
||||||
bannerList={props.bannerList}
|
bannerList={props.bannerList}
|
||||||
dashTypes={props.dashTypes}
|
dashTypes={props.dashTypes}
|
||||||
offersList={MyOffersList}
|
// offersList={MyOffersList}
|
||||||
MyActiveJobList={MyActiveJobList}
|
MyActiveJobList={MyActiveJobList}
|
||||||
|
offersList={props.offersList}
|
||||||
|
imageServer={props.imageServer}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<div>
|
<div>
|
||||||
@@ -90,6 +88,7 @@ export default function Home(props) {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
</Layout>
|
</Layout>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,254 +1,283 @@
|
|||||||
import React, {useEffect, useState} from 'react'
|
import React, { useEffect, useState } from "react";
|
||||||
import { PriceFormatter } from "../../Helpers/PriceFormatter";
|
|
||||||
import usersService from "../../../services/UsersService";
|
import usersService from "../../../services/UsersService";
|
||||||
import LoadingSpinner from "../../Spinners/LoadingSpinner";
|
import LoadingSpinner from "../../Spinners/LoadingSpinner";
|
||||||
|
|
||||||
|
export default function LockJob({
|
||||||
|
details,
|
||||||
|
marketPlaceProduct,
|
||||||
|
ManageInterest,
|
||||||
|
manageInt,
|
||||||
|
handleInputChange,
|
||||||
|
MarketDetail,
|
||||||
|
marketMsg,
|
||||||
|
errMsg,
|
||||||
|
textValue,
|
||||||
|
}) {
|
||||||
|
const apiCall = new usersService();
|
||||||
|
|
||||||
export default function LockJob({details, marketPlaceProduct, ManageInterest, manageInt, handleInputChange, MarketDetail, marketMsg, errMsg, textValue}) {
|
const [completedTask, setCompletedTask] = useState({
|
||||||
const apiCall = new usersService()
|
loading: true,
|
||||||
|
data: [],
|
||||||
|
});
|
||||||
|
|
||||||
const [completedTask, setCompletedTask] = useState({
|
let thePrice = PriceFormatter(
|
||||||
loading: true,
|
details?.price * 0.01,
|
||||||
data: []
|
details?.currency_code,
|
||||||
})
|
details?.currency
|
||||||
|
);
|
||||||
|
|
||||||
let thePrice = PriceFormatter(
|
let cleanedText = details?.job_description
|
||||||
details?.price * 0.01,
|
?.replace(/</g, "<")
|
||||||
details?.currency_code,
|
.replace(/>/g, ">")
|
||||||
details?.currency
|
.replace(/"/g, '"')
|
||||||
);
|
.replace(/&/g, "&");
|
||||||
|
|
||||||
let cleanedText = details?.job_description
|
let dependOn = marketPlaceProduct?.filter(
|
||||||
?.replace(/</g, "<")
|
(item) => item?.job_uid == details?.offer_depend_uid
|
||||||
.replace(/>/g, ">")
|
)[0];
|
||||||
.replace(/"/g, '"')
|
|
||||||
.replace(/&/g, "&");
|
|
||||||
|
|
||||||
let dependOn = marketPlaceProduct?.filter(item => item?.job_uid == details?.offer_depend_uid)[0]
|
useEffect(() => {
|
||||||
|
apiCall
|
||||||
|
.getVerifyCompletedTask({ offer_depend_uid: details?.offer_depend_uid })
|
||||||
|
.then((res) => {
|
||||||
|
console.log("RES", res.data);
|
||||||
|
setCompletedTask({ loading: false, data: res?.data?.result_list });
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
setCompletedTask({ loading: false, data: [] });
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(()=>{
|
return (
|
||||||
apiCall.getVerifyCompletedTask({offer_depend_uid:details?.offer_depend_uid}).then(res => {
|
<>
|
||||||
console.log('RES', res.data)
|
{completedTask.loading ? (
|
||||||
setCompletedTask({loading:false, data:res?.data?.result_list})
|
<div className="w-full md:col-span-4 flex justify-center items-center min-h-[500px]">
|
||||||
}).catch(err =>{
|
<LoadingSpinner size="10" />
|
||||||
setCompletedTask({loading:false, data:[]})
|
</div>
|
||||||
})
|
) : (
|
||||||
},[])
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
<>
|
||||||
{completedTask.loading ?
|
<div className="px-4 py-2 w-full md:col-span-3 md:border-r-1">
|
||||||
<div className='w-full md:col-span-4 flex justify-center items-center min-h-[500px]'>
|
<div className="min-h-[200px]">
|
||||||
<LoadingSpinner
|
<h2 className="w-full flex gap-1 items-center font-semibold text-slate-900 dark:text-white tracking-wide">
|
||||||
size='10'
|
{details?.offer_depend_uid && (
|
||||||
/>
|
<i className="fa-solid fa-lock p-1 text-red-500 text-[12px]"></i>
|
||||||
|
)}
|
||||||
|
{details?.title}
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
{/* INPUT SECTION */}
|
||||||
|
{[
|
||||||
|
{
|
||||||
|
name: "Description",
|
||||||
|
content: details.description,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "",
|
||||||
|
content: {
|
||||||
|
text: `Timeline: ${details.timeline_days} day(s) -- `,
|
||||||
|
bold: `Budget: ${thePrice}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// name: "Delivery Detail",
|
||||||
|
// content: cleanedText,
|
||||||
|
// danger: true,
|
||||||
|
// },
|
||||||
|
].map(({ name, content, danger }, idx) => (
|
||||||
|
<div className={`my-1 flex flex-col items-start`} key={idx}>
|
||||||
|
<label className="py-1 job-label w-full">{name}</label>
|
||||||
|
<div
|
||||||
|
className={`w-full p-2 text-slate-900 dark:text-white market-pop rounded-2xl ${
|
||||||
|
name == "Description"
|
||||||
|
? "min-h-[100px] max-h-[100px] h-full overflow-y-auto break-words bg-slate-50"
|
||||||
|
: name == "Delivery Detail"
|
||||||
|
? " overflow-y-auto h-full min-h-[100px] max-h-[100px] bg-slate-50"
|
||||||
|
: "h-full flex items-center"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{danger ? (
|
||||||
|
<p
|
||||||
|
className={`dark:text-black`}
|
||||||
|
dangerouslySetInnerHTML={{
|
||||||
|
__html: danger && content,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<p className={`w-full text-slate-900 dark:text-black`}>
|
||||||
|
{name !== "Delivery Detail" ? (
|
||||||
|
<>
|
||||||
|
{typeof content !== "object" ? content : null}
|
||||||
|
{typeof content === "object" && (
|
||||||
|
<>
|
||||||
|
{/* <hr className="mb-1" /> */}
|
||||||
|
<span className="flex w-full mb-1 h-[1px] bg-slate-500"></span>
|
||||||
|
<span className="flex items-center gap-2 dark:text-white">
|
||||||
|
{content?.text}
|
||||||
|
<strong>{thePrice}</strong>
|
||||||
|
</span>
|
||||||
|
<span className="flex w-full mt-1 h-[1px] bg-slate-500"></span>
|
||||||
|
{/* <hr className="mt-1" /> */}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
""
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
:
|
{/* <hr className='my-3' /> */}
|
||||||
<>
|
{completedTask.loading ? (
|
||||||
<div className="px-4 py-2 w-full md:col-span-3 md:border-r-1">
|
<p className="py-3 w-full text-center text-lg">Loading...</p>
|
||||||
<div className="min-h-[200px]">
|
) : completedTask?.data?.filter(
|
||||||
<h2 className="w-full flex gap-1 items-center font-semibold text-slate-900 dark:text-white tracking-wide">
|
(item) => item?.job_uid == details.offer_depend_uid
|
||||||
{details?.offer_depend_uid && <i className="fa-solid fa-lock p-1 text-red-500 text-[12px]"></i>}
|
).length > 0 ? (
|
||||||
{details?.title}
|
<div className="w-full">
|
||||||
</h2>
|
<label className="job-label w-full flex gap-2 items-center">
|
||||||
|
If you have any questions about this task:
|
||||||
{/* INPUT SECTION */}
|
<span
|
||||||
{[
|
className={`text-sm ${
|
||||||
{
|
marketMsg.state ? "text-[#57cd89]" : "text-red-500"
|
||||||
name: "Description",
|
}`}
|
||||||
content: details.description,
|
>
|
||||||
},
|
{marketMsg.state && "Message Sent!"}
|
||||||
{
|
{errMsg.market && "Failed to send"}
|
||||||
name: "",
|
</span>
|
||||||
content: {
|
</label>
|
||||||
text: `Timeline: ${details.timeline_days} day(s) -- `,
|
<div className="w-full flex items-center gap-3">
|
||||||
bold: `Budget: ${thePrice}`,
|
<div className="w-full">
|
||||||
},
|
<textarea
|
||||||
},
|
className={`p-1 w-full text-sm text-slate-900 dark:text-white ${
|
||||||
// {
|
marketMsg.loading && "italic text-[#9CA3AF]"
|
||||||
// name: "Delivery Detail",
|
} bg-transparent outline-none border-2 border-slate-300 rounded-md`}
|
||||||
// content: cleanedText,
|
rows="3"
|
||||||
// danger: true,
|
style={{ resize: "none" }}
|
||||||
// },
|
placeholder="Enter message here ..."
|
||||||
].map(({ name, content, danger }, idx) => (
|
value={marketMsg.loading ? "Sending..." : textValue}
|
||||||
<div className={`my-1 flex flex-col items-start`} key={idx}>
|
onChange={handleInputChange}
|
||||||
<label className="py-1 job-label w-full">
|
/>
|
||||||
{name}
|
</div>
|
||||||
</label>
|
<div className="relative flex flex-col">
|
||||||
<div
|
|
||||||
className={`w-full p-2 text-slate-900 dark:text-white market-pop rounded-2xl ${
|
|
||||||
name == "Description"
|
|
||||||
? "min-h-[100px] max-h-[100px] h-full overflow-y-auto break-words bg-slate-50"
|
|
||||||
: name == "Delivery Detail" ? " overflow-y-auto h-full min-h-[100px] max-h-[100px] bg-slate-50"
|
|
||||||
: "h-full flex items-center"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{danger ? (
|
|
||||||
<p
|
|
||||||
className={`dark:text-black`}
|
|
||||||
dangerouslySetInnerHTML={{
|
|
||||||
__html: danger && content,
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
) : (
|
|
||||||
<p className={`w-full text-slate-900 dark:text-black`}>
|
|
||||||
{name !== "Delivery Detail" ? (
|
|
||||||
<>
|
|
||||||
{typeof content !== "object" ? content : null}
|
|
||||||
{typeof content === "object" && (
|
|
||||||
<>
|
|
||||||
{/* <hr className="mb-1" /> */}
|
|
||||||
<span className='flex w-full mb-1 h-[1px] bg-slate-500'></span>
|
|
||||||
<span className="flex items-center gap-2 dark:text-white">
|
|
||||||
{content?.text}
|
|
||||||
<strong>{thePrice}</strong>
|
|
||||||
</span>
|
|
||||||
<span className='flex w-full mt-1 h-[1px] bg-slate-500'></span>
|
|
||||||
{/* <hr className="mt-1" /> */}
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
""
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
{/* <hr className='my-3' /> */}
|
|
||||||
{completedTask.loading ?
|
|
||||||
<p className='py-3 w-full text-center text-lg'>Loading...</p>
|
|
||||||
:completedTask?.data?.filter(item => item?.job_uid == details.offer_depend_uid).length > 0 ?
|
|
||||||
<div className='w-full'>
|
|
||||||
<label className="job-label w-full flex gap-2 items-center">
|
|
||||||
If you have any questions about this task:
|
|
||||||
<span className={`text-sm ${marketMsg.state ? 'text-[#57cd89]' : 'text-red-500'}`}>
|
|
||||||
{marketMsg.state && "Message Sent!"}
|
|
||||||
{errMsg.market && "Failed to send"}
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<div className="w-full flex items-center gap-3">
|
|
||||||
<div className="w-full">
|
|
||||||
<textarea
|
|
||||||
className={`p-1 w-full text-sm text-slate-900 dark:text-white ${
|
|
||||||
marketMsg.loading && "italic text-[#9CA3AF]"
|
|
||||||
} bg-transparent outline-none border-2 border-slate-300 rounded-md`}
|
|
||||||
rows="3"
|
|
||||||
style={{ resize: "none" }}
|
|
||||||
placeholder="Enter message here ..."
|
|
||||||
value={marketMsg.loading ? "Sending..." : textValue}
|
|
||||||
onChange={handleInputChange}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="relative flex flex-col">
|
|
||||||
<button
|
|
||||||
className="rounded-full flex justify-center items-center w-12 h-11 bg-yellow-500 text-white"
|
|
||||||
name="market-message"
|
|
||||||
onClick={MarketDetail}
|
|
||||||
disabled={marketMsg.loading}
|
|
||||||
>
|
|
||||||
{marketMsg.loading ? (
|
|
||||||
<LoadingSpinner size={5} color="white" />
|
|
||||||
) : (
|
|
||||||
// "Send Message"
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 11 20"
|
|
||||||
id="Arrow"
|
|
||||||
className="w-[0.7rem]"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
fillRule="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"
|
|
||||||
// fill=""
|
|
||||||
className="color000000 svgShape fill-[#fff]"
|
|
||||||
></path>
|
|
||||||
</svg>
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
:
|
|
||||||
<div className='w-full'>
|
|
||||||
<h1 className='text-red-600 text-lg'>This task depends on the task below</h1>
|
|
||||||
<div className='rounded-2xl bg-red-50'>
|
|
||||||
<div className='my-1 w-full'>
|
|
||||||
<h2 className="p-2 w-full flex gap-1 items-center font-semibold text-slate-900 dark:text-black tracking-wide">
|
|
||||||
{dependOn?.offer_depend_uid && <i className="fa-solid fa-lock p-1 text-red-500 text-[12px]"></i>}
|
|
||||||
{dependOn?.title}
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div className={`p-2 flex flex-col items-start`}>
|
|
||||||
<p className="py-1 job-label w-full dark:text-black">Description</p>
|
|
||||||
<div className={`w-full p-2 text-slate-900 dark:text-black market-pop rounded-2xl bg-white break-words min-h-[100px] max-h-[100px]`}>
|
|
||||||
{dependOn?.description}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="py-2 w-full md:col-span-1 h-full flex flex-col rounded-2xl">
|
|
||||||
<div className="mx-auto bg-[#f1f8ff] dark:bg-[#C2C8D3] px-4 rounded-md w-full h-full md:min-h-[420px] flex flex-col justify-between">
|
|
||||||
<div className="w-full flex flex-col justify-center pb-4 gap-2">
|
|
||||||
<p className="job-label w-full">
|
|
||||||
Interested?
|
|
||||||
</p>
|
|
||||||
<hr />
|
|
||||||
{completedTask.loading ?
|
|
||||||
<p className='py-3 w-full text-center text-lg'>Loading...</p>
|
|
||||||
:completedTask?.data?.filter(item => item?.job_uid == details.offer_depend_uid).length > 0 ?
|
|
||||||
<button
|
<button
|
||||||
className="btn-gradient text-white px-2 py-2 border-4 border-slate-300 text-lg lg:text-xl font-medium rounded-2xl"
|
className="rounded-full flex justify-center items-center w-12 h-11 bg-yellow-500 text-white"
|
||||||
name="market-interest"
|
name="market-message"
|
||||||
onClick={ManageInterest}
|
onClick={MarketDetail}
|
||||||
|
disabled={marketMsg.loading}
|
||||||
>
|
>
|
||||||
{" "}
|
{marketMsg.loading ? (
|
||||||
<div className="flex md:flex-col justify-center gap-2">
|
<LoadingSpinner size={5} color="white" />
|
||||||
<span>Notify</span>
|
) : (
|
||||||
<span>Owner</span>
|
// "Send Message"
|
||||||
</div>
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 11 20"
|
||||||
|
id="Arrow"
|
||||||
|
className="w-[0.7rem]"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fillRule="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"
|
||||||
|
// fill=""
|
||||||
|
className="color000000 svgShape fill-[#fff]"
|
||||||
|
></path>
|
||||||
|
</svg>
|
||||||
|
)}
|
||||||
</button>
|
</button>
|
||||||
:
|
</div>
|
||||||
<h1 className='text-red-600 text-base font-bold'>This task depends on completion of another task</h1>
|
</div>
|
||||||
}
|
</div>
|
||||||
<>
|
) : (
|
||||||
{manageInt.loading ? (
|
<div className="w-full">
|
||||||
<p className="text-sm italic">please wait...</p>
|
<h1 className="text-red-600 text-lg">
|
||||||
) : (
|
This task depends on the task below
|
||||||
<>
|
</h1>
|
||||||
{manageInt?.msg !== "" && (
|
<div className="rounded-2xl bg-red-50">
|
||||||
<p
|
<div className="my-1 w-full">
|
||||||
className={`text-sm italic ${
|
<h2 className="p-2 w-full flex gap-1 items-center font-semibold text-slate-900 dark:text-black tracking-wide">
|
||||||
manageInt?.state ? "text-green-500" : "text-red-500"
|
{dependOn?.offer_depend_uid && (
|
||||||
}`}
|
<i className="fa-solid fa-lock p-1 text-red-500 text-[12px]"></i>
|
||||||
>
|
)}
|
||||||
{manageInt?.msg}
|
{dependOn?.title}
|
||||||
</p>
|
</h2>
|
||||||
)}
|
</div>
|
||||||
</>
|
<div className={`p-2 flex flex-col items-start`}>
|
||||||
)}
|
<p className="py-1 job-label w-full dark:text-black">
|
||||||
</>
|
Description
|
||||||
|
</p>
|
||||||
|
<div
|
||||||
|
className={`w-full p-2 text-slate-900 dark:text-black market-pop rounded-2xl bg-white break-words min-h-[100px] max-h-[100px]`}
|
||||||
|
>
|
||||||
|
{dependOn?.description}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="text-slate-900">
|
<div className="py-2 w-full md:col-span-1 h-full flex flex-col rounded-2xl">
|
||||||
<p className="flex items-center tracking-wide">
|
<div className="mx-auto bg-[#f1f8ff] dark:bg-[#C2C8D3] px-4 rounded-md w-full h-full md:min-h-[420px] flex flex-col justify-between">
|
||||||
<span className="job-label">Interest: </span> <b className="ml-1">{details.interest_count}</b>
|
<div className="w-full flex flex-col justify-center pb-4 gap-2">
|
||||||
</p>
|
<p className="job-label w-full">Interested?</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p className="my-1 flex flex-col">
|
{completedTask.loading ? (
|
||||||
<span className="job-label">Expire: </span>
|
<p className="py-3 w-full text-center text-lg">Loading...</p>
|
||||||
<span> {new Date(details.expire).toLocaleString()} </span>
|
) : completedTask?.data?.filter(
|
||||||
</p>
|
(item) => item?.job_uid == details.offer_depend_uid
|
||||||
|
).length > 0 ? (
|
||||||
|
<button
|
||||||
|
className="btn-gradient text-white px-2 py-2 border-4 border-slate-300 text-lg lg:text-xl font-medium rounded-2xl"
|
||||||
|
name="market-interest"
|
||||||
|
onClick={ManageInterest}
|
||||||
|
>
|
||||||
|
{" "}
|
||||||
|
<div className="flex md:flex-col justify-center gap-2">
|
||||||
|
<span>Notify</span>
|
||||||
|
<span>Owner</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</button>
|
||||||
</div>
|
) : (
|
||||||
</>
|
<h1 className="text-red-600 text-base font-bold">
|
||||||
}
|
This task depends on completion of another task
|
||||||
|
</h1>
|
||||||
|
)}
|
||||||
|
<>
|
||||||
|
{manageInt.loading ? (
|
||||||
|
<p className="text-sm italic">please wait...</p>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
{manageInt?.msg !== "" && (
|
||||||
|
<p
|
||||||
|
className={`text-sm italic ${
|
||||||
|
manageInt?.state ? "text-green-500" : "text-red-500"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{manageInt?.msg}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="text-slate-900">
|
||||||
|
<p className="flex items-center tracking-wide">
|
||||||
|
<span className="job-label">Interest: </span>{" "}
|
||||||
|
<b className="ml-1">{details.interest_count}</b>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
<p className="my-1 flex flex-col">
|
||||||
|
<span className="job-label">Expire: </span>
|
||||||
|
<span> {new Date(details.expire).toLocaleString()} </span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</>
|
</>
|
||||||
)
|
)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useEffect, useMemo, useState } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
import usersService from "../../../services/UsersService";
|
import usersService from "../../../services/UsersService";
|
||||||
import ModalCom from "../../Helpers/ModalCom";
|
import ModalCom from "../../Helpers/ModalCom";
|
||||||
@@ -9,6 +10,11 @@ import LockJob from "./LockJob";
|
|||||||
|
|
||||||
const MarketPopUp = ({ details, onClose, situation, marketInt, marketPlaceProduct }) => {
|
const MarketPopUp = ({ details, onClose, situation, marketInt, marketPlaceProduct }) => {
|
||||||
|
|
||||||
|
let { jobLists } = useSelector((state) => state.jobLists);
|
||||||
|
const interestCount = jobLists?.interest_list?.filter(item => item.job_uid == details.job_uid);
|
||||||
|
// console.log('interestList', interest_count)
|
||||||
|
// console.log('MEMO', jobLists?.interest_list, datas.job_uid)
|
||||||
|
|
||||||
let {sendJobInterestToOwner} = SocketValues() // function to emit job interest request
|
let {sendJobInterestToOwner} = SocketValues() // function to emit job interest request
|
||||||
const emitOfferInterest = () => {
|
const emitOfferInterest = () => {
|
||||||
let message = {
|
let message = {
|
||||||
@@ -326,7 +332,7 @@ const MarketPopUp = ({ details, onClose, situation, marketInt, marketPlaceProduc
|
|||||||
|
|
||||||
<div className="text-slate-900">
|
<div className="text-slate-900">
|
||||||
<p className="flex items-center tracking-wide">
|
<p className="flex items-center tracking-wide">
|
||||||
<span className="job-label">Interest: </span> <b className="ml-1">{details.interest_count}</b>
|
<span className="job-label">Interest: </span> <b className="ml-1">{interestCount.length > 0 ? interestCount[0].interest_count : '0'}</b>
|
||||||
</p>
|
</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p className="my-1 flex flex-col">
|
<p className="my-1 flex flex-col">
|
||||||
|
|||||||
@@ -364,7 +364,7 @@ function ActiveJobs(props) {
|
|||||||
|
|
||||||
<div className="my-1 text-base text-slate-700 tracking-wide flex items-center gap-3">
|
<div className="my-1 text-base text-slate-700 tracking-wide flex items-center gap-3">
|
||||||
<span className="font-semibold text-black dark:text-white">
|
<span className="font-semibold text-black dark:text-white">
|
||||||
Price:{" "}
|
Reward:{" "}
|
||||||
</span>
|
</span>
|
||||||
<span className="">{thePrice}</span>
|
<span className="">{thePrice}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ export default function MyActiveJobTable({ MyJobList, className }) {
|
|||||||
</h1>
|
</h1>
|
||||||
<div>{value.description}</div>
|
<div>{value.description}</div>
|
||||||
<span className="text-sm text-thin-light-gray flex flext-start gap-1">
|
<span className="text-sm text-thin-light-gray flex flext-start gap-1">
|
||||||
Price:{" "}
|
Reward:{" "}
|
||||||
<span className="text-purple">
|
<span className="text-purple">
|
||||||
{thePrice}
|
{thePrice}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ export default function MyPastDueTaskTable({ MyJobList, className }) {
|
|||||||
</h1>
|
</h1>
|
||||||
<div>{value.description}</div>
|
<div>{value.description}</div>
|
||||||
<span className="text-sm text-thin-light-gray flex flext-start gap-1">
|
<span className="text-sm text-thin-light-gray flex flext-start gap-1">
|
||||||
Price:{" "}
|
Reward:{" "}
|
||||||
<span className="text-purple">
|
<span className="text-purple">
|
||||||
{thePrice}
|
{thePrice}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -277,7 +277,7 @@ function myJobTableFeatures(
|
|||||||
</h1>
|
</h1>
|
||||||
<div>{value.description}</div>
|
<div>{value.description}</div>
|
||||||
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
||||||
Price: <span className="text-purple">{thePrice}</span>
|
Reward: <span className="text-purple">{thePrice}</span>
|
||||||
</span>
|
</span>
|
||||||
<span className="text-sm text-thin-light-gray">
|
<span className="text-sm text-thin-light-gray">
|
||||||
Duration:{" "}
|
Duration:{" "}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ export default function MyPendingJobTable({ MyJobList, className }) {
|
|||||||
</h1>
|
</h1>
|
||||||
<div>{value.description}</div>
|
<div>{value.description}</div>
|
||||||
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
||||||
Price:{" "}
|
Reward:{" "}
|
||||||
<span className="text-purple">
|
<span className="text-purple">
|
||||||
{thePrice}
|
{thePrice}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ export default function MyJobTable({ className, ActiveJobList, Account, imageSer
|
|||||||
{task?.description}
|
{task?.description}
|
||||||
</span>
|
</span>
|
||||||
<span className="text-sm text-thin-light-gray flex flext-start gap-1">
|
<span className="text-sm text-thin-light-gray flex flext-start gap-1">
|
||||||
Price:
|
Reward:
|
||||||
<span className="text-purple ml-1">{thePrice}</span>
|
<span className="text-purple ml-1">{thePrice}</span>
|
||||||
</span>
|
</span>
|
||||||
<div className="flex flex-col sm:flex-row items-start gap-1 md:gap-4 md:items-center">
|
<div className="flex flex-col sm:flex-row items-start gap-1 md:gap-4 md:items-center">
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ export default function MyWaitingJobTable({ MyJobList, className }) {
|
|||||||
</h1>
|
</h1>
|
||||||
<div>{value.description}</div>
|
<div>{value.description}</div>
|
||||||
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
<span className="text-sm text-thin-light-gray flex items-start gap-1">
|
||||||
Price:{" "}
|
Reward:{" "}
|
||||||
<span className="text-purple">
|
<span className="text-purple">
|
||||||
{thePrice}
|
{thePrice}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
import { useSelector } from "react-redux";
|
|
||||||
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
|
||||||
import WalletItemCard from "./WalletItemCard";
|
|
||||||
import WalletItemCardFamily from "./WalletItemCardFamily";
|
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
|
||||||
import SearchCom from "../Helpers/SearchCom";
|
|
||||||
import { localImgLoad } from "../../lib";
|
|
||||||
import background from "../../assets/images/bg-sky-blue.jpg";
|
import background from "../../assets/images/bg-sky-blue.jpg";
|
||||||
|
import { localImgLoad } from "../../lib";
|
||||||
|
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
||||||
import FamilyWalletRedeemOptions from "./FamilyWalletRedeemOptions";
|
import FamilyWalletRedeemOptions from "./FamilyWalletRedeemOptions";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -14,29 +9,32 @@ import FamilyWalletRedeemOptions from "./FamilyWalletRedeemOptions";
|
|||||||
*/
|
*/
|
||||||
export default function FamilyWalletBox({ wallet, payment }) {
|
export default function FamilyWalletBox({ wallet, payment }) {
|
||||||
// const { loading, data } = wallet;
|
// const { loading, data } = wallet;
|
||||||
|
|
||||||
// const { userDetails } = useSelector((state) => state.userDetails);
|
// const { userDetails } = useSelector((state) => state.userDetails);
|
||||||
// const accountType = userDetails?.account_type === "FAMILY";
|
// const accountType = userDetails?.account_type === "FAMILY";
|
||||||
|
|
||||||
const [selectedWallet, setSelectedWallet] = useState('')
|
|
||||||
|
|
||||||
const [activeWalletBtn, setActiveWalletBtn] = useState('')
|
const [selectedWallet, setSelectedWallet] = useState("");
|
||||||
|
|
||||||
const handleChangeWallet = ({target:{name}}) => { // FUNCTION TO SWITCH WALLET IF USER HAS MORE THAN TWO WALLETS
|
const [activeWalletBtn, setActiveWalletBtn] = useState("");
|
||||||
const currentWalletSelected = wallet?.data?.filter((item) => item.code == name);
|
|
||||||
setSelectedWallet(currentWalletSelected[0])
|
const handleChangeWallet = ({ target: { name } }) => {
|
||||||
setActiveWalletBtn(name)
|
// FUNCTION TO SWITCH WALLET IF USER HAS MORE THAN TWO WALLETS
|
||||||
|
const currentWalletSelected = wallet?.data?.filter(
|
||||||
|
(item) => item.code == name
|
||||||
|
);
|
||||||
|
setSelectedWallet(currentWalletSelected[0]);
|
||||||
|
setActiveWalletBtn(name);
|
||||||
// console.log(name, currentWalletSelected)
|
// console.log(name, currentWalletSelected)
|
||||||
}
|
};
|
||||||
|
|
||||||
const image = selectedWallet?.code
|
const image = selectedWallet?.code
|
||||||
? `${selectedWallet?.code.toLowerCase()}.svg`
|
? `${selectedWallet?.code.toLowerCase()}.svg`
|
||||||
: "default.png";
|
: "default.png";
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(() => {
|
||||||
setSelectedWallet(wallet.data[0])
|
setSelectedWallet(wallet.data[0]);
|
||||||
setActiveWalletBtn(wallet?.data[0]?.code)
|
setActiveWalletBtn(wallet?.data[0]?.code);
|
||||||
},[wallet])
|
}, [wallet]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full">
|
<div className="w-full">
|
||||||
@@ -44,31 +42,38 @@ export default function FamilyWalletBox({ wallet, payment }) {
|
|||||||
<div className="main-wrapper w-full mb-10">
|
<div className="main-wrapper w-full mb-10">
|
||||||
<div className="w-full mb-10 sm:grid grid-cols-2 gap-4">
|
<div className="w-full mb-10 sm:grid grid-cols-2 gap-4">
|
||||||
<div className="w-full mb-4 sm:mb-0 rounded-2xl bg-white dark:bg-dark-white overflow-hidden">
|
<div className="w-full mb-4 sm:mb-0 rounded-2xl bg-white dark:bg-dark-white overflow-hidden">
|
||||||
{wallet?.loading ?
|
{wallet?.loading ? (
|
||||||
<div className="w-full h-full flex items-center justify-center bg-white">
|
<div className="w-full h-full flex items-center justify-center bg-white">
|
||||||
<LoadingSpinner size="16" color="sky-blue" height='min-h-[240px]' />
|
<LoadingSpinner
|
||||||
|
size="16"
|
||||||
|
color="sky-blue"
|
||||||
|
height="min-h-[240px]"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
: wallet?.data.length > 0 ?
|
) : wallet?.data.length > 0 ? (
|
||||||
<>
|
<>
|
||||||
{wallet?.data?.length > 1 &&
|
{wallet?.data?.length > 1 && (
|
||||||
<div className="wal-selection px-5 py-2 text-black dark:text-white flex items-center gap-2">
|
<div className="wal-selection px-5 py-2 text-black dark:text-white flex items-center gap-2">
|
||||||
{wallet?.data?.map(item =>(
|
{wallet?.data?.map((item) => (
|
||||||
<button
|
<button
|
||||||
className={`py-0.5 px-1 mb-1 rounded-lg border border-orange-500 ${activeWalletBtn == item?.code && 'bg-orange-500'}`}
|
className={`py-0.5 px-1 mb-1 rounded-lg border border-orange-500 ${
|
||||||
key={item?.wallet_uid}
|
activeWalletBtn == item?.code && "bg-orange-500"
|
||||||
name={item?.code}
|
}`}
|
||||||
onClick={handleChangeWallet}
|
key={item?.wallet_uid}
|
||||||
>
|
name={item?.code}
|
||||||
{item?.description}
|
onClick={handleChangeWallet}
|
||||||
</button>
|
>
|
||||||
))}
|
{item?.description}
|
||||||
</div>
|
</button>
|
||||||
}
|
))}
|
||||||
<div className="p-5 bg-white-opacity min-h-[240px]"
|
</div>
|
||||||
style={{
|
)}
|
||||||
background: `url(${background}) 0% 0% / cover no-repeat`,
|
<div
|
||||||
}}
|
className="p-5 bg-white-opacity min-h-[240px]"
|
||||||
>
|
style={{
|
||||||
|
background: `url(${background}) 0% 0% / cover no-repeat`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
{/* image */}
|
{/* image */}
|
||||||
<div className="min-w-[100px] min-h-[100px] max-w-min md:max-w-[100px] max-h-min md:max-h-[100px] rounded-full bg-[#e3e3e3] flex justify-center items-center">
|
<div className="min-w-[100px] min-h-[100px] max-w-min md:max-w-[100px] max-h-min md:max-h-[100px] rounded-full bg-[#e3e3e3] flex justify-center items-center">
|
||||||
<img
|
<img
|
||||||
@@ -77,21 +82,30 @@ export default function FamilyWalletBox({ wallet, payment }) {
|
|||||||
alt="currency-icon"
|
alt="currency-icon"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-base sm:text-lg text-white opacity-[70%] tracking-wide my-3">Current Balance</p>
|
<p className="text-base sm:text-lg text-white opacity-[70%] tracking-wide my-3">
|
||||||
|
Current Balance
|
||||||
|
</p>
|
||||||
<p className="text-[44px] lg:text-[62px] font-bold text-white tracking-wide leading-10">
|
<p className="text-[44px] lg:text-[62px] font-bold text-white tracking-wide leading-10">
|
||||||
{PriceFormatter(selectedWallet?.amount/100, selectedWallet?.code, undefined, "text-[2rem]")}
|
{Formatter(
|
||||||
|
selectedWallet?.amount / 100,
|
||||||
|
selectedWallet?.code,
|
||||||
|
undefined,
|
||||||
|
"text-[2rem]"
|
||||||
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
:
|
) : (
|
||||||
<div className="w-full h-full flex justify-center items-center rounded-2xl bg-white">
|
<div className="w-full h-full flex justify-center items-center rounded-2xl bg-white">
|
||||||
<p>No Wallet Record Found</p>
|
<p>No Wallet Record Found</p>
|
||||||
</div>
|
</div>
|
||||||
}
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="p-5 w-full rounded-2xl bg-white dark:bg-dark-white text-black dark:text-white h-full min-h-[240px] max-h-96">
|
||||||
|
<h1 className="text-xl font-bold text-black dark:text-white">
|
||||||
|
Recent Activities
|
||||||
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<div className="p-5 w-full rounded-2xl bg-white dark:bg-dark-white text-black dark:text-white h-full min-h-[240px] max-h-96">
|
|
||||||
<h1 className="text-xl font-bold text-black dark:text-white">Recent Activities</h1>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-full">
|
<div className="w-full">
|
||||||
@@ -102,7 +116,6 @@ export default function FamilyWalletBox({ wallet, payment }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// data.length>0 && data.map((item) => (
|
// data.length>0 && data.map((item) => (
|
||||||
// <div key={item.wallet_uid} className="w-full h-full mb-10 ">
|
// <div key={item.wallet_uid} className="w-full h-full mb-10 ">
|
||||||
// {/* <WalletItemCardFamily walletItem={item} payment={payment} countries={countries} /> */}
|
// {/* <WalletItemCardFamily walletItem={item} payment={payment} countries={countries} /> */}
|
||||||
|
|||||||
@@ -126,8 +126,8 @@ export default function OffersInterestTable({offerInterestList, className}) {
|
|||||||
)
|
)
|
||||||
:
|
:
|
||||||
(
|
(
|
||||||
<div className="font-bold text-center text-xl md:text-2xl lg:text-4xl text-dark-gray md:flex items-center justify-between">
|
<div className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap">
|
||||||
<p className="mb-4 p-3">No list avaliable.</p>
|
<p className="p-2">No list avaliable.</p>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import LoadingSpinner from "../Spinners/LoadingSpinner";
|
|||||||
import { Form, Formik } from "formik";
|
import { Form, Formik } from "formik";
|
||||||
import * as Yup from "yup";
|
import * as Yup from "yup";
|
||||||
import ReferralTable from "../MyWallet/WalletComponent/ReferralTable";
|
import ReferralTable from "../MyWallet/WalletComponent/ReferralTable";
|
||||||
|
import TabButton from "../customTabs/TabButton";
|
||||||
|
|
||||||
const validationSchema = Yup.object().shape({
|
const validationSchema = Yup.object().shape({
|
||||||
ref_email: Yup.string()
|
ref_email: Yup.string()
|
||||||
@@ -105,13 +106,27 @@ function ReferralDisplay() {
|
|||||||
sendReferralMsg({...values}); // FUNCTION TO SEND REFERRAL MESSAGE
|
sendReferralMsg({...values}); // FUNCTION TO SEND REFERRAL MESSAGE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const [selectedTab, setSelectedTab] = useState("Send Referral");
|
||||||
|
const tabs = [ //STATE FOR SWITCHING BETWEEN TABS
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
title: "Send Referral",
|
||||||
|
iconName: "history",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
title: "Referral List",
|
||||||
|
iconName: "history",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
allReferrals();
|
allReferrals();
|
||||||
}, [refHistoryReload]);
|
}, [refHistoryReload]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="content-wrapper w-full lg:flex xl:space-x-8 bottomMargin">
|
<>
|
||||||
<div className="lg:w-2/2 w-full mb-10 lg:mb-0">
|
<div className='w-full'>
|
||||||
<div className="sm:flex justify-between items-center mb-6">
|
<div className="sm:flex justify-between items-center mb-6">
|
||||||
<div className="mb-5 sm:mb-0">
|
<div className="mb-5 sm:mb-0">
|
||||||
<h1 className="text-26 font-bold inline-flex gap-3 text-dark-gray dark:text-white items-center">
|
<h1 className="text-26 font-bold inline-flex gap-3 text-dark-gray dark:text-white items-center">
|
||||||
@@ -119,111 +134,138 @@ function ReferralDisplay() {
|
|||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div className="referral w-full md:p-8 p-4 bg-white dark:bg-dark-white rounded-2xl shadow">
|
<div className="w-full h-full p-4 bg-white dark:bg-dark-white rounded-2xl section-shadow lg:flex lg:px-10 px-4 justify-between">
|
||||||
<h2 className="mb-4 text-slate-900 dark:text-white text-xl lg:text-2xl font-medium">
|
<div className="content-tab-items lg:w-[230px] w-full mr-2">
|
||||||
Send Referral
|
<div className='overflow-hidden mb-5 lg:mb-0 py-2 lg:py-8'>
|
||||||
</h2>
|
{tabs.map((item) => (
|
||||||
<Formik
|
<div key={item.id} className='w-full'>
|
||||||
initialValues={initialValues}
|
<TabButton
|
||||||
validationSchema={validationSchema}
|
key={item.id}
|
||||||
onSubmit={handleSubmit}
|
item={item.title}
|
||||||
>
|
iconName={item.iconName}
|
||||||
{(props) => (
|
selectedTab={selectedTab}
|
||||||
<Form className="referral-info">
|
setSelectedTab={setSelectedTab}
|
||||||
<div className="block md:mb-6 md:flex gap-10">
|
/>
|
||||||
{/* Firstname */}
|
</div>
|
||||||
<div className="field w-full mb-6 md:mb-0">
|
))}
|
||||||
<InputCom
|
</div>
|
||||||
fieldClass="px-6"
|
|
||||||
label="Firstname"
|
|
||||||
type="text"
|
|
||||||
name="ref_firstname"
|
|
||||||
placeholder="Firstname"
|
|
||||||
value={props.values.ref_firstname}
|
|
||||||
inputHandler={props.handleChange}
|
|
||||||
blurHandler={props.handleBlur}
|
|
||||||
/>
|
|
||||||
{props.errors.ref_firstname &&
|
|
||||||
props.touched.ref_firstname && (
|
|
||||||
<p className="text-sm text-red-500">
|
|
||||||
{props.errors.ref_firstname}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Lastname */}
|
|
||||||
<div className="field w-full mb-6 md:mb-0">
|
|
||||||
<InputCom
|
|
||||||
fieldClass="px-6"
|
|
||||||
label="Lastname"
|
|
||||||
type="text"
|
|
||||||
name="ref_lastname"
|
|
||||||
placeholder="Lastname"
|
|
||||||
value={props.values.ref_lastname}
|
|
||||||
inputHandler={props.handleChange}
|
|
||||||
blurHandler={props.handleBlur}
|
|
||||||
/>
|
|
||||||
{props.errors.ref_lastname &&
|
|
||||||
props.touched.ref_lastname && (
|
|
||||||
<p className="text-sm text-red-500">
|
|
||||||
{props.errors.ref_lastname}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="field w-full mb-6">
|
|
||||||
<InputCom
|
|
||||||
fieldClass="px-6"
|
|
||||||
label="Email"
|
|
||||||
type="text"
|
|
||||||
name="ref_email"
|
|
||||||
placeholder="Email"
|
|
||||||
value={props.values.ref_email}
|
|
||||||
inputHandler={props.handleChange}
|
|
||||||
blurHandler={props.handleBlur}
|
|
||||||
/>
|
|
||||||
{props.errors.ref_email && props.touched.ref_email && (
|
|
||||||
<p className="text-sm text-red-500">
|
|
||||||
{props.errors.ref_email}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr />
|
|
||||||
{error.message != "" && (
|
|
||||||
<p className="text-base text-red-500 py-2">{error.message}</p>
|
|
||||||
)}
|
|
||||||
<div className="referral-btn flex justify-end items-center py-4 border-b-4">
|
|
||||||
{error.loading ? (
|
|
||||||
<LoadingSpinner size="6" color="sky-blue" />
|
|
||||||
) : (
|
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
className="px-2 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
|
||||||
>
|
|
||||||
Send Message
|
|
||||||
</button>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</Form>
|
|
||||||
)}
|
|
||||||
</Formik>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div className="w-[1px] bg-[#E3E4FE] dark:bg-[#a7a9b533] mr-10"></div>
|
||||||
|
<div className="flex-1 overflow-y-auto min-h-[520px]">
|
||||||
|
<>
|
||||||
|
{selectedTab == 'Send Referral' &&
|
||||||
|
<div className="referral w-full p-4">
|
||||||
|
<h2 className="mb-4 text-slate-900 dark:text-white text-xl lg:text-2xl font-medium">
|
||||||
|
Send Referral
|
||||||
|
</h2>
|
||||||
|
<Formik
|
||||||
|
initialValues={initialValues}
|
||||||
|
validationSchema={validationSchema}
|
||||||
|
onSubmit={handleSubmit}
|
||||||
|
>
|
||||||
|
{(props) => (
|
||||||
|
<Form className="referral-info">
|
||||||
|
<div className="block md:mb-6 md:flex gap-10">
|
||||||
|
{/* Firstname */}
|
||||||
|
<div className="field w-full mb-6 md:mb-0">
|
||||||
|
<InputCom
|
||||||
|
fieldClass="px-6"
|
||||||
|
label="Firstname"
|
||||||
|
type="text"
|
||||||
|
name="ref_firstname"
|
||||||
|
placeholder="Firstname"
|
||||||
|
value={props.values.ref_firstname}
|
||||||
|
inputHandler={props.handleChange}
|
||||||
|
blurHandler={props.handleBlur}
|
||||||
|
/>
|
||||||
|
{props.errors.ref_firstname &&
|
||||||
|
props.touched.ref_firstname && (
|
||||||
|
<p className="text-sm text-red-500">
|
||||||
|
{props.errors.ref_firstname}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="w-full md:p-8 p-4 bg-white dark:bg-dark-white rounded-2xl shadow">
|
{/* Lastname */}
|
||||||
<h2 className="mb-2 text-slate-900 dark:text-white text-xl lg:text-2xl font-medium">
|
<div className="field w-full mb-6 md:mb-0">
|
||||||
Referral List
|
<InputCom
|
||||||
</h2>
|
fieldClass="px-6"
|
||||||
{referralList.loading ? (
|
label="Lastname"
|
||||||
<LoadingSpinner size="32" color="sky-blue" />
|
type="text"
|
||||||
) : (
|
name="ref_lastname"
|
||||||
<ReferralTable history={referralList} />
|
placeholder="Lastname"
|
||||||
)}
|
value={props.values.ref_lastname}
|
||||||
|
inputHandler={props.handleChange}
|
||||||
|
blurHandler={props.handleBlur}
|
||||||
|
/>
|
||||||
|
{props.errors.ref_lastname &&
|
||||||
|
props.touched.ref_lastname && (
|
||||||
|
<p className="text-sm text-red-500">
|
||||||
|
{props.errors.ref_lastname}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="field w-full mb-6">
|
||||||
|
<InputCom
|
||||||
|
fieldClass="px-6"
|
||||||
|
label="Email"
|
||||||
|
type="text"
|
||||||
|
name="ref_email"
|
||||||
|
placeholder="Email"
|
||||||
|
value={props.values.ref_email}
|
||||||
|
inputHandler={props.handleChange}
|
||||||
|
blurHandler={props.handleBlur}
|
||||||
|
/>
|
||||||
|
{props.errors.ref_email && props.touched.ref_email && (
|
||||||
|
<p className="text-sm text-red-500">
|
||||||
|
{props.errors.ref_email}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
{error.message != "" && (
|
||||||
|
<p className="text-base text-red-500 py-2">{error.message}</p>
|
||||||
|
)}
|
||||||
|
<div className="referral-btn flex justify-end items-center py-4">
|
||||||
|
{error.loading ? (
|
||||||
|
<LoadingSpinner size="6" color="sky-blue" />
|
||||||
|
) : (
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
className="px-2 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
||||||
|
>
|
||||||
|
Send Message
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</Form>
|
||||||
|
)}
|
||||||
|
</Formik>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{selectedTab == 'Referral List' &&
|
||||||
|
<>
|
||||||
|
<div className="w-full p-4">
|
||||||
|
<h2 className="mb-2 text-slate-900 dark:text-white text-xl lg:text-2xl font-medium">
|
||||||
|
Referral List
|
||||||
|
</h2>
|
||||||
|
{referralList.loading ? (
|
||||||
|
<LoadingSpinner size="22" color="sky-blue" />
|
||||||
|
) : (
|
||||||
|
<ReferralTable history={referralList} />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
</>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ function DeleteJobPopout({ details, onClose, situation }) {
|
|||||||
{details.title}
|
{details.title}
|
||||||
</p>
|
</p>
|
||||||
<p className="text-lg tracking-wide text-dark-gray dark:text-white flex items-start gap-1">
|
<p className="text-lg tracking-wide text-dark-gray dark:text-white flex items-start gap-1">
|
||||||
<span className="job-label">Price: </span>{details.thePrice}
|
<span className="job-label">Reward: </span>{details.thePrice}
|
||||||
</p>
|
</p>
|
||||||
<p className="text-lg tracking-wide text-dark-gray dark:text-white">
|
<p className="text-lg tracking-wide text-dark-gray dark:text-white">
|
||||||
<span className="job-label">Duration: </span>{details.timeline_days} day(s)
|
<span className="job-label">Duration: </span>{details.timeline_days} day(s)
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ const EditJobPopOut = ({
|
|||||||
<div className="field w-full">
|
<div className="field w-full">
|
||||||
<InputCom
|
<InputCom
|
||||||
fieldClass="px-6 text-right"
|
fieldClass="px-6 text-right"
|
||||||
label="Price"
|
label="Reward"
|
||||||
labelClass="tracking-wide"
|
labelClass="tracking-wide"
|
||||||
inputBg="bg-slate-100"
|
inputBg="bg-slate-100"
|
||||||
inputClass="input-curve lg border border-light-purple"
|
inputClass="input-curve lg border border-light-purple"
|
||||||
|
|||||||
@@ -274,7 +274,7 @@ const EditJobPopoutNew = ({
|
|||||||
<div className="field w-full mb-[0.5rem] sm:mb-0">
|
<div className="field w-full mb-[0.5rem] sm:mb-0">
|
||||||
<InputCom
|
<InputCom
|
||||||
fieldClass="px-6 text-right"
|
fieldClass="px-6 text-right"
|
||||||
label="Price"
|
label="Reward"
|
||||||
labelClass="tracking-wide"
|
labelClass="tracking-wide"
|
||||||
inputBg="bg-slate-100"
|
inputBg="bg-slate-100"
|
||||||
inputClass="input-curve lg border border-light-purple"
|
inputClass="input-curve lg border border-light-purple"
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ function FamilyOfferJobPopout({ details, onClose, situation }) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="my-2 md:flex">
|
<div className="my-2 md:flex">
|
||||||
<Detail label="Price" value={details.thePrice} />
|
<Detail label="Reward" value={details.thePrice} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="my-2 md:flex">
|
<div className="my-2 md:flex">
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ function JobListPopout({
|
|||||||
const DetailsComponent = () => {
|
const DetailsComponent = () => {
|
||||||
const detailsArray = [
|
const detailsArray = [
|
||||||
{ label: "Description", value: details.description },
|
{ label: "Description", value: details.description },
|
||||||
{ label: "Price", value: details.thePrice },
|
{ label: "Reward", value: details.thePrice },
|
||||||
{ label: "Timeline", value: `${details.timeline_days} day(s)` },
|
{ label: "Timeline", value: `${details.timeline_days} day(s)` },
|
||||||
{ label: "Created", value: new Date(details?.created).toDateString() },
|
{ label: "Created", value: new Date(details?.created).toDateString() },
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -246,7 +246,7 @@ function NewJobListPopout({
|
|||||||
const DetailsComponent = () => {
|
const DetailsComponent = () => {
|
||||||
const detailsArray = [
|
const detailsArray = [
|
||||||
{ label: "Description", value: details.description },
|
{ label: "Description", value: details.description },
|
||||||
{ label: "Price", value: details.thePrice },
|
{ label: "Reward", value: details.thePrice },
|
||||||
{ label: "Timeline", value: `${details.timeline_days} day(s)` },
|
{ label: "Timeline", value: `${details.timeline_days} day(s)` },
|
||||||
{ label: "Created", value: new Date(details?.created).toDateString() },
|
{ label: "Created", value: new Date(details?.created).toDateString() },
|
||||||
];
|
];
|
||||||
@@ -344,11 +344,11 @@ function NewJobListPopout({
|
|||||||
{selectedTab == 'family' ?
|
{selectedTab == 'family' ?
|
||||||
'Assign to family'
|
'Assign to family'
|
||||||
: selectedTab == 'public' ?
|
: selectedTab == 'public' ?
|
||||||
'Offer this job to public'
|
'Place in Market'
|
||||||
: selectedTab == 'individual' ?
|
: selectedTab == 'individual' ?
|
||||||
'Offer this job to individual'
|
'Assign to individual'
|
||||||
: selectedTab == 'group' ?
|
: selectedTab == 'group' ?
|
||||||
'Offer this job to your Group'
|
'Preferred List'
|
||||||
:
|
:
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ function OfferJobPopout({ details, onClose, situation }) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="my-2 md:flex">
|
<div className="my-2 md:flex">
|
||||||
<Detail label="Price" value={details.thePrice} />
|
<Detail label="Reward" value={details.thePrice} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="my-2 md:flex">
|
<div className="my-2 md:flex">
|
||||||
|
|||||||
@@ -3,13 +3,12 @@ import { useNavigate } from "react-router-dom";
|
|||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
import usersService from "../../services/UsersService";
|
import usersService from "../../services/UsersService";
|
||||||
import ModalCom from "../Helpers/ModalCom";
|
import ModalCom from "../Helpers/ModalCom";
|
||||||
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
|
||||||
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
||||||
import Detail from "./popoutcomponent/Detail";
|
import Detail from "./popoutcomponent/Detail";
|
||||||
|
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch } from "react-redux";
|
||||||
import { tableReload } from "../../store/TableReloads";
|
|
||||||
import { NewDateTimeFormatter } from "../../lib/NewDateTimeFormatter";
|
import { NewDateTimeFormatter } from "../../lib/NewDateTimeFormatter";
|
||||||
|
import { tableReload } from "../../store/TableReloads";
|
||||||
|
|
||||||
const showSuccessToast = (message) => {
|
const showSuccessToast = (message) => {
|
||||||
toast.success(message, {
|
toast.success(message, {
|
||||||
@@ -73,7 +72,7 @@ function PendingJobsPopout({ details, onClose, situation }) {
|
|||||||
setRequestMessage({ status: true, message: res.data.status });
|
setRequestMessage({ status: true, message: res.data.status });
|
||||||
dispatch(tableReload({ type: "PENDINGTABLE" }));
|
dispatch(tableReload({ type: "PENDINGTABLE" }));
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
onClose()
|
onClose();
|
||||||
setPendingJobLoader({ extend: false, offer: false });
|
setPendingJobLoader({ extend: false, offer: false });
|
||||||
setRequestMessage({ status: false, message: "" });
|
setRequestMessage({ status: false, message: "" });
|
||||||
}, 4000);
|
}, 4000);
|
||||||
@@ -140,14 +139,8 @@ function PendingJobsPopout({ details, onClose, situation }) {
|
|||||||
<ModalCom action={onClose} situation={situation}>
|
<ModalCom action={onClose} situation={situation}>
|
||||||
<div className="logout-modal-wrapper w-[90%] md:w-[768px] bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto">
|
<div className="logout-modal-wrapper w-[90%] md:w-[768px] bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto">
|
||||||
<div className="modal-header-con">
|
<div className="modal-header-con">
|
||||||
<h1 className="modal-title">
|
<h1 className="modal-title">Manage Pending Item</h1>
|
||||||
Manage Pending Item
|
<button type="button" className="modal-close-btn" onClick={onClose}>
|
||||||
</h1>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
className="modal-close-btn"
|
|
||||||
onClick={onClose}
|
|
||||||
>
|
|
||||||
<svg
|
<svg
|
||||||
width="36"
|
width="36"
|
||||||
height="36"
|
height="36"
|
||||||
@@ -214,7 +207,7 @@ function PendingJobsPopout({ details, onClose, situation }) {
|
|||||||
|
|
||||||
<div className="my-2 md:flex">
|
<div className="my-2 md:flex">
|
||||||
<Detail
|
<Detail
|
||||||
label="Price"
|
label="Reward"
|
||||||
// value={`${details.price * 0.01} ${details.currency}`}
|
// value={`${details.price * 0.01} ${details.currency}`}
|
||||||
value={PriceFormatter(
|
value={PriceFormatter(
|
||||||
details.price * 0.01,
|
details.price * 0.01,
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ export default function AssignToFamily({
|
|||||||
</div>
|
</div>
|
||||||
<div className="mt-3 mb-1 flex justify-end items-center">
|
<div className="mt-3 mb-1 flex justify-end items-center">
|
||||||
<button
|
<button
|
||||||
className={`px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white`}
|
className={`uppercase px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white`}
|
||||||
type="submit"
|
type="submit"
|
||||||
name='family'
|
name='family'
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -48,14 +48,14 @@ export default function AssignToGroup({
|
|||||||
</div>
|
</div>
|
||||||
<div className="mt-3 mb-1 flex justify-end items-center">
|
<div className="mt-3 mb-1 flex justify-end items-center">
|
||||||
<button
|
<button
|
||||||
className={`px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white`}
|
className={`uppercase px-4 h-11 flex justify-center items-center btn-gradient text-sm rounded-full text-white`}
|
||||||
type="submit"
|
type="submit"
|
||||||
name='group'
|
name='group'
|
||||||
>
|
>
|
||||||
{loader?.jobFields ?
|
{loader?.jobFields ?
|
||||||
<LoadingSpinner size={5} />
|
<LoadingSpinner size={5} />
|
||||||
:
|
:
|
||||||
'Send Order to Group'
|
'Send Task to Group'
|
||||||
}
|
}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ export default function AssignToIndividual({
|
|||||||
</div>
|
</div>
|
||||||
<div className="mt-3 mb-1 flex justify-end items-center">
|
<div className="mt-3 mb-1 flex justify-end items-center">
|
||||||
<button
|
<button
|
||||||
className={`px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white`}
|
className={`uppercase px-4 h-11 flex justify-center items-center btn-gradient text-sm rounded-full text-white`}
|
||||||
type="submit"
|
type="submit"
|
||||||
name='individual'
|
name='individual'
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -102,14 +102,14 @@ export default function AssignToPublic({
|
|||||||
</div>
|
</div>
|
||||||
<div className="mt-3 mb-1 flex justify-end items-center">
|
<div className="mt-3 mb-1 flex justify-end items-center">
|
||||||
<button
|
<button
|
||||||
className={`px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white`}
|
className={`uppercase px-4 h-11 flex justify-center items-center btn-gradient text-sm rounded-full text-white`}
|
||||||
type="submit"
|
type="submit"
|
||||||
name='public'
|
name='public'
|
||||||
>
|
>
|
||||||
{loader?.jobFields ?
|
{loader?.jobFields ?
|
||||||
<LoadingSpinner size={5} />
|
<LoadingSpinner size={5} />
|
||||||
:
|
:
|
||||||
'Show Task to Public'
|
'Place Task to the Market'
|
||||||
}
|
}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+4
-1
@@ -278,5 +278,8 @@ export const apiConst = {
|
|||||||
PAY_MODE_CCARD: 1,
|
PAY_MODE_CCARD: 1,
|
||||||
PAY_MODE_BONUS: 9,
|
PAY_MODE_BONUS: 9,
|
||||||
APPROVED_BALANCE: 5,
|
APPROVED_BALANCE: 5,
|
||||||
DISAPROVE_BALANCE: 3
|
DISAPROVE_BALANCE: 3,
|
||||||
|
|
||||||
|
WRENCHBOARD_VERIFY_PROMO: 55056,
|
||||||
|
WRENCHBOARD_LOGIN_PROMO: 55057,
|
||||||
};
|
};
|
||||||
@@ -208,7 +208,7 @@ class usersService {
|
|||||||
// }
|
// }
|
||||||
getHeroJBanners() {
|
getHeroJBanners() {
|
||||||
var postData = {
|
var postData = {
|
||||||
uuid: 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"),
|
||||||
page: 0,
|
page: 0,
|
||||||
@@ -1493,6 +1493,24 @@ class usersService {
|
|||||||
return this.postAuxEnd("/verifycompleted", postData);
|
return this.postAuxEnd("/verifycompleted", postData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// API FUNCTION TO VERIFY PROMO LINK
|
||||||
|
verifyPromo(reqData) {
|
||||||
|
var postData = {
|
||||||
|
action: apiConst.WRENCHBOARD_VERIFY_PROMO,
|
||||||
|
...reqData
|
||||||
|
};
|
||||||
|
return this.postAuxEnd("/promoverify", postData);
|
||||||
|
}
|
||||||
|
|
||||||
|
// API FUNCTION TO LOGIN USER THROUGH PROMO LINK
|
||||||
|
loginPromo(reqData) {
|
||||||
|
var postData = {
|
||||||
|
action: apiConst.WRENCHBOARD_LOGIN_PROMO,
|
||||||
|
...reqData
|
||||||
|
};
|
||||||
|
return this.postAuxEnd("/loginpromo", postData);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username)
|
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(username)
|
||||||
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(password)
|
- 20:27:30.118 FLOG_MAX [757411]: REQ_STRING(password)
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ export default function HomePages() {
|
|||||||
const bannerOptions = {
|
const bannerOptions = {
|
||||||
bannerList: commonHeadBanner?.result_list,
|
bannerList: commonHeadBanner?.result_list,
|
||||||
dashTypes: commonHeadBanner?.home_dash_type,
|
dashTypes: commonHeadBanner?.home_dash_type,
|
||||||
|
offersList: commonHeadBanner?.offers_list,
|
||||||
|
imageServer: commonHeadBanner?.session_image_server
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import Promo from '../components/AuthPages/Promo/Promo'
|
||||||
|
|
||||||
|
export default function PromoPage() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Promo />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user