Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c24fbedf2c | |||
| 907dc298ab | |||
| 8095006386 | |||
| d9d28791da | |||
| a98d967ba4 | |||
| 59a5e84ee2 | |||
| 35ed1d48a3 | |||
| f9d385dfec | |||
| 033af03221 | |||
| b3afb94030 | |||
| 0b1aa4e7d9 | |||
| 18c4f31322 | |||
| 97e3344953 | |||
| 9565ca0d35 | |||
| 51cc4edc1d | |||
| 21f1173e66 | |||
| cf5ae81918 |
@@ -63,12 +63,12 @@ function AddJob({ popUpHandler, categories }) {
|
|||||||
message: "",
|
message: "",
|
||||||
}); // Holds state when submit button is pressed
|
}); // Holds state when submit button is pressed
|
||||||
|
|
||||||
const getWalletDetail = (country) => { // A FUNCTION TO GET USER BALANCE BASED ON COUNTRY SELECTED
|
// const getWalletDetail = (country) => { // A FUNCTION TO GET USER BALANCE BASED ON COUNTRY SELECTED
|
||||||
const walletChecker = walletDetails?.data.find(
|
// const walletChecker = walletDetails?.data.find(
|
||||||
(item) => item.country === country
|
// (item) => item.country === country
|
||||||
);
|
// );
|
||||||
return walletChecker ? walletChecker.amount : 0;
|
// return walletChecker ? walletChecker.amount : 0;
|
||||||
};
|
// };
|
||||||
|
|
||||||
const handleAddJob = async (values, helpers) => {
|
const handleAddJob = async (values, helpers) => {
|
||||||
const reqData = {
|
const reqData = {
|
||||||
@@ -81,20 +81,20 @@ function AddJob({ popUpHandler, categories }) {
|
|||||||
category: values.category?.join("@"),
|
category: values.category?.join("@"),
|
||||||
};
|
};
|
||||||
|
|
||||||
const walletAmount = getWalletDetail(reqData.country); // GETTING USER BALANCE BASED ON COUNTRY SELECTED
|
// const walletAmount = getWalletDetail(reqData.country); // GETTING USER BALANCE BASED ON COUNTRY SELECTED
|
||||||
|
|
||||||
if (reqData.price > walletAmount) {
|
// if (reqData.price > walletAmount) {
|
||||||
setRequestStatus({
|
// setRequestStatus({
|
||||||
loading: false,
|
// loading: false,
|
||||||
status: false,
|
// status: false,
|
||||||
message: "Insufficient Balance",
|
// message: "Insufficient Balance",
|
||||||
});
|
// });
|
||||||
|
|
||||||
setTimeout(() => {
|
// setTimeout(() => {
|
||||||
setRequestStatus({ loading: false, status: false, message: "" });
|
// setRequestStatus({ loading: false, status: false, message: "" });
|
||||||
}, 1500);
|
// }, 1500);
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
|
||||||
setRequestStatus({ loading: true, status: false, message: "" });
|
setRequestStatus({ loading: true, status: false, message: "" });
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
const AddFamily = () => {
|
||||||
|
return (
|
||||||
|
<div>Add Family</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default AddFamily
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
import React, { useMemo, useRef, useState } from "react";
|
||||||
|
import usersService from "../../../../services/UsersService";
|
||||||
|
|
||||||
|
const FamilyBanner = ({ imageServer }) => {
|
||||||
|
const uploadedImage = `${imageServer}${localStorage.getItem(
|
||||||
|
"session_token"
|
||||||
|
)}/familybanner/${localStorage.getItem("uid")}`;
|
||||||
|
|
||||||
|
const familyBannerRef = useRef(null);
|
||||||
|
const jobApi = useMemo(() => new usersService(), []);
|
||||||
|
|
||||||
|
const [familyBannerImage, setFamilyBannerImage] = useState(uploadedImage);
|
||||||
|
const [uploadStatus, setUploadStatus] = useState({
|
||||||
|
loading: false,
|
||||||
|
status: false,
|
||||||
|
message: "",
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles the change event of the family image input field.
|
||||||
|
* Checks if the selected file exceeds the maximum file size limit and displays an alert if it does.
|
||||||
|
* If the file is within the size limit, it reads the file using the FileReader API and sets the profile image state with the result.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const familyBannerHandler = (e) => {
|
||||||
|
setUploadStatus({ loading: false, status: false, message: "" });
|
||||||
|
let acceptedFormat = ["jpeg", "jpg", "png", "bmp"]; // ARRAY OF SUPPORTED FORMATS
|
||||||
|
let uploadedFile = e.target.files[0]; //UPLOADED FILE
|
||||||
|
|
||||||
|
const fileFormat = uploadedFile?.type?.split("/")[1]?.toLowerCase();
|
||||||
|
if (!acceptedFormat.includes(fileFormat)) {
|
||||||
|
//CHECKING FOR CORRECT UPLOAD FORMAT
|
||||||
|
const msg = `Please select ${acceptedFormat
|
||||||
|
.slice(0, -1)
|
||||||
|
.join(", ")} or ${acceptedFormat.slice(-1)}`;
|
||||||
|
setUploadStatus({ loading: false, status: false, message: msg });
|
||||||
|
return setTimeout(() => {
|
||||||
|
// profileImgInput.current.value = '' // clear the input
|
||||||
|
setUploadStatus({ loading: false, status: false, message: "" });
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uploadedFile.size > 5 * 1048576) {
|
||||||
|
// CHECKING FOR CORRECT FILE SIZE
|
||||||
|
setUploadStatus({
|
||||||
|
loading: false,
|
||||||
|
status: false,
|
||||||
|
message: "File must not exceed 5MB",
|
||||||
|
});
|
||||||
|
return setTimeout(() => {
|
||||||
|
// profileImgInput.current.value = '' // clear the input
|
||||||
|
setUploadStatus({ loading: false, status: false, message: "" });
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.target.value !== "") {
|
||||||
|
const imgReader = new FileReader();
|
||||||
|
imgReader.onload = (event) => {
|
||||||
|
let base64Img = imgReader.result.split(",")[1];
|
||||||
|
let reqData = {
|
||||||
|
// PAYLOAD FOR API CALL
|
||||||
|
job_uid: localStorage.getItem("uid"),
|
||||||
|
file_name: uploadedFile?.name.slice(0, 19),
|
||||||
|
file_size: uploadedFile?.size,
|
||||||
|
file_type: uploadedFile?.type?.split("/")[0]?.toLowerCase(),
|
||||||
|
file_data: base64Img,
|
||||||
|
msg_type: "FILE",
|
||||||
|
action: 11303,
|
||||||
|
};
|
||||||
|
setUploadStatus({
|
||||||
|
loading: true,
|
||||||
|
status: false,
|
||||||
|
message: "Loading...",
|
||||||
|
});
|
||||||
|
jobApi
|
||||||
|
.sendFiles(reqData)
|
||||||
|
.then((res) => {
|
||||||
|
if (res.status != 200 || res.data.internal_return < 0) {
|
||||||
|
return setUploadStatus({
|
||||||
|
loading: false,
|
||||||
|
status: false,
|
||||||
|
message: "Something went wrong, try again",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
setUploadStatus({
|
||||||
|
loading: false,
|
||||||
|
status: true,
|
||||||
|
message: "Uploaded successfully",
|
||||||
|
});
|
||||||
|
setFamilyBannerImage(event.target.result);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
setUploadStatus({
|
||||||
|
loading: false,
|
||||||
|
status: false,
|
||||||
|
message: "Network error, try again",
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
setUploadStatus({ loading: false, status: false, message: "" });
|
||||||
|
}, 5000);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
imgReader.readAsDataURL(e.target.files[0]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col gap-4">
|
||||||
|
<div className="w-full lg:h-[400px] rounded-2xl">
|
||||||
|
<img
|
||||||
|
src={familyBannerImage}
|
||||||
|
alt="familyBanner"
|
||||||
|
className="w-full h-full object-cover rounded-2xl"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-between w-full">
|
||||||
|
<div>
|
||||||
|
{uploadStatus.message && !uploadStatus.loading && (
|
||||||
|
<p
|
||||||
|
className={`text-center ${
|
||||||
|
uploadStatus.status ? "text-green-500" : "text-red-500"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{uploadStatus.message}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
{uploadStatus.loading && (
|
||||||
|
<p className="text-center">{uploadStatus.message}</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input
|
||||||
|
ref={familyBannerRef}
|
||||||
|
className="hidden"
|
||||||
|
type="file"
|
||||||
|
accept="image/*"
|
||||||
|
onChange={familyBannerHandler}
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
className="btn-gradient w-[153px] h-[46px] rounded-full text-white lg:flex hidden justify-center items-center"
|
||||||
|
onClick={() => familyBannerRef.current.click()}
|
||||||
|
>
|
||||||
|
Change Banner
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FamilyBanner;
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
const Relatives = () => {
|
||||||
|
return (
|
||||||
|
<div>Relatives</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Relatives
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import AddFamily from "./AddFamily";
|
||||||
|
import FamilyBanner from "./FamilyBanner";
|
||||||
|
import Relatives from "./Relatives";
|
||||||
|
|
||||||
|
export {AddFamily, FamilyBanner, Relatives}
|
||||||
@@ -1,8 +1,56 @@
|
|||||||
import React from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { Link, useLocation } from "react-router-dom";
|
||||||
|
import Icons from "../../Helpers/Icons";
|
||||||
import Layout from "../../Partials/Layout";
|
import Layout from "../../Partials/Layout";
|
||||||
import { Link } from "react-router-dom";
|
import { AddFamily, FamilyBanner, Relatives } from "./Tabs";
|
||||||
|
|
||||||
const FamilySettings = () => {
|
const FamilySettings = () => {
|
||||||
|
let {state} = useLocation()
|
||||||
|
const tabs = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
name: "add_family",
|
||||||
|
title: "Add Family",
|
||||||
|
iconName: "new-family",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
name: "relatives",
|
||||||
|
title: "Relatives",
|
||||||
|
iconName: "people-hover",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
name: "family_banner",
|
||||||
|
title: "Family Banner",
|
||||||
|
iconName: "people-hover",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const [tab, setTab] = useState(() => {
|
||||||
|
// Retrieve the active tab from local storage or use the default tab
|
||||||
|
return localStorage.getItem("activeTab") || tabs[0].name;
|
||||||
|
});
|
||||||
|
|
||||||
|
const tabHandler = (value) => {
|
||||||
|
setTab(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Update local storage when the tab changes
|
||||||
|
useEffect(() => {
|
||||||
|
localStorage.setItem("activeTab", tab);
|
||||||
|
}, [tab]);
|
||||||
|
|
||||||
|
const tabComponents = {
|
||||||
|
add_family: <AddFamily />,
|
||||||
|
relatives: <Relatives />,
|
||||||
|
family_banner: <FamilyBanner imageServer={state.imageServer} />,
|
||||||
|
};
|
||||||
|
|
||||||
|
const defaultTabComponent = Array(tabComponents)[0].add_family;
|
||||||
|
|
||||||
|
const selectedComponent = tabComponents[tab] || defaultTabComponent;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout>
|
<Layout>
|
||||||
<div className="notification-page w-full mb-10">
|
<div className="notification-page w-full mb-10">
|
||||||
@@ -19,7 +67,32 @@ const FamilySettings = () => {
|
|||||||
{/* Something Here */}
|
{/* Something Here */}
|
||||||
{/* <form className="logout-modal-body w-full flex flex-col items-center px-10 py-8 gap-4"></form> */}
|
{/* <form className="logout-modal-body w-full flex flex-col items-center px-10 py-8 gap-4"></form> */}
|
||||||
<div className="w-full bg-white dark:bg-dark-white overflow-y-auto rounded-2xl section-shadow h-full ">
|
<div className="w-full bg-white dark:bg-dark-white overflow-y-auto rounded-2xl section-shadow h-full ">
|
||||||
<div className="update-table w-full h-full p-4 bg-white dark:bg-dark-white overflow-y-auto rounded-2xl section-shadow min-h-[520px] flex flex-col justify-between "></div>
|
<div className="update-table w-full h-full p-4 bg-white dark:bg-dark-white overflow-y-auto rounded-2xl section-shadow min-h-[520px] lg:flex lg:px-10 px-4 justify-between">
|
||||||
|
<div className="content-tab-items lg:w-[230px] w-full mr-2">
|
||||||
|
<ul className="overflow-hidden mb-10 lg:mb-0 py-8">
|
||||||
|
{tabs.map(({ name, id, title, iconName }) => (
|
||||||
|
<li
|
||||||
|
onClick={() => tabHandler(name)}
|
||||||
|
key={id}
|
||||||
|
className={`flex lg:space-x-4 space-x-2 hover:text-purple transition-all duration-300 ease-in-out items-center cursor-pointer lg:mb-11 mb-2 mr-6 lg:mr-0 float-left lg:float-none overflow-hidden ${
|
||||||
|
tab === name ? "text-purple" : " text-thin-light-gray"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<Icons name={iconName} />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p className="text-18 tracking-wide">{title}</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div className="w-[1px] bg-[#E3E4FE] dark:bg-[#a7a9b533] mr-10"></div>
|
||||||
|
<div className="flex-1">
|
||||||
|
<div className="tab-item">{selectedComponent}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ export default function FamilyTable({
|
|||||||
className="w-[0.7rem]"
|
className="w-[0.7rem]"
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
fill-rule="evenodd"
|
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"
|
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=""
|
// fill=""
|
||||||
className="color000000 svgShape fill-[#fff]"
|
className="color000000 svgShape fill-[#fff]"
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ export default function FamilyAcc() {
|
|||||||
</div>
|
</div>
|
||||||
<Link
|
<Link
|
||||||
to={`/familysettings`}
|
to={`/familysettings`}
|
||||||
|
state={{ imageServer: familyList?.session_image_server }}
|
||||||
className="slider-btns flex space-x-4 w-12 h-12 rounded-md shadow-sm justify-center items-center cursor-pointer dark:bg-[linear-gradient(134.38deg,#f539f8_0%,#c342f9_43.55%,#5356fb_104.51%)]"
|
className="slider-btns flex space-x-4 w-12 h-12 rounded-md shadow-sm justify-center items-center cursor-pointer dark:bg-[linear-gradient(134.38deg,#f539f8_0%,#c342f9_43.55%,#5356fb_104.51%)]"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
|
|||||||
@@ -30,21 +30,26 @@ export default function ActiveJobMessage({ activeJobMesList }) {
|
|||||||
{activeJobMesList?.data?.length ?
|
{activeJobMesList?.data?.length ?
|
||||||
(
|
(
|
||||||
<tbody>
|
<tbody>
|
||||||
{activeJobMesList.data.map((item, index) => (
|
{activeJobMesList.data.map((item, index) =>
|
||||||
<tr key={index} className='text-slate-500'>
|
{
|
||||||
<td>
|
let imageLink = `${activeJobMesList?.image}${localStorage.getItem('session_token')}/contracts/${item.msg_uid}`
|
||||||
<div className={`msg_box ${item.who}`}>
|
return (
|
||||||
<div className="msg_header">{item.msg_date} {item.msg_firstname}</div>
|
<tr key={index} className='text-slate-500'>
|
||||||
{item.msg_type == 'FILE' ?
|
<td>
|
||||||
<a href='' className="p-2" dangerouslySetInnerHTML={{__html: item.message}}></a>
|
<div className={`msg_box ${item.who}`}>
|
||||||
:
|
<div className="msg_header">{item.msg_date} {item.msg_firstname}</div>
|
||||||
<span className="p-2" dangerouslySetInnerHTML={{__html: item.message}}></span>
|
{item.msg_type == 'FILE' ?
|
||||||
}
|
<a href={imageLink} target="_blank" className="p-2" dangerouslySetInnerHTML={{__html: item.message}}></a>
|
||||||
</div>
|
:
|
||||||
|
<span className="p-2" dangerouslySetInnerHTML={{__html: item.message}}></span>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
)
|
||||||
|
}
|
||||||
|
)}
|
||||||
</tbody>
|
</tbody>
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
|
|||||||
@@ -64,17 +64,21 @@ const initialValues = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function AddFundDollars(props) {
|
function AddFundDollars(props) {
|
||||||
let MaxNoOfCards = process.env.REACT_APP_MAX_CREDIT_CARDS // HOLDS THE VALUE OF THE MAX NUMBER OF CARDS USER CAN ADD
|
let MaxNoOfCards = process.env.REACT_APP_MAX_CREDIT_CARDS; // HOLDS THE VALUE OF THE MAX NUMBER OF CARDS USER CAN ADD
|
||||||
|
|
||||||
const apiCall = new usersService();
|
const apiCall = new usersService();
|
||||||
let countryWallet = props.walletItem.country;
|
let countryWallet = props.walletItem.country;
|
||||||
const [tab, setTab] = useState("previous");
|
const [selectedOption, setSelectedOption] = useState("previous");
|
||||||
const { userDetails } = useSelector((state) => state?.userDetails);
|
const { userDetails } = useSelector((state) => state?.userDetails);
|
||||||
const [prevCardDetails, setPrevCardDetails] = useState({});
|
const [prevCardDetails, setPrevCardDetails] = useState({});
|
||||||
const [payListCards, setPayListCards] = useState({ loading: true, data: [] });
|
const [payListCards, setPayListCards] = useState({ loading: true, data: [] });
|
||||||
const [cardIcons, setCardIcons] = useState("atm-card");
|
const [cardIcons, setCardIcons] = useState("atm-card");
|
||||||
const [prevCardError, setPrevCardError] = useState("");
|
const [prevCardError, setPrevCardError] = useState("");
|
||||||
|
|
||||||
|
const handleOptionChange = (event) => {
|
||||||
|
setSelectedOption(event.target.value);
|
||||||
|
};
|
||||||
|
|
||||||
const { firstname, lastname } = userDetails;
|
const { firstname, lastname } = userDetails;
|
||||||
|
|
||||||
// Handling Card Icons
|
// Handling Card Icons
|
||||||
@@ -144,7 +148,12 @@ function AddFundDollars(props) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tab === "previous") {
|
let stateData = {
|
||||||
|
amount: Number(props.input) * 100,
|
||||||
|
currency: props.walletItem?.code,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (selectedOption === "previous") {
|
||||||
// To check if card is empty
|
// To check if card is empty
|
||||||
if (Object.keys(prevCardDetails).length === 0) {
|
if (Object.keys(prevCardDetails).length === 0) {
|
||||||
setPrevCardError("No card selected!");
|
setPrevCardError("No card selected!");
|
||||||
@@ -158,10 +167,26 @@ function AddFundDollars(props) {
|
|||||||
show: { awaitConfirm: { loader: true } },
|
show: { awaitConfirm: { loader: true } },
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let stateData = {
|
// Extracting card_uid from the previous card details
|
||||||
amount: Number(props.input) * 100,
|
const paymentCardValue = prevCardDetails["payment-card"];
|
||||||
currency: props.walletItem?.code,
|
|
||||||
};
|
if (paymentCardValue) {
|
||||||
|
try {
|
||||||
|
const paymentCardObject = JSON.parse(paymentCardValue);
|
||||||
|
stateData = {
|
||||||
|
...stateData,
|
||||||
|
card_uid: paymentCardObject.card_uid,
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error parsing JSON:", error);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// For the new card details
|
||||||
|
stateData = {
|
||||||
|
...stateData,
|
||||||
|
card_uid: "",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await apiCall.getStartCredit(stateData);
|
const res = await apiCall.getStartCredit(stateData);
|
||||||
@@ -171,12 +196,11 @@ function AddFundDollars(props) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const _response = res.data;
|
const _response = res.data;
|
||||||
stateData.amount = Number(props.input);
|
|
||||||
stateData.card =
|
stateData.card =
|
||||||
tab === "previous"
|
selectedOption === "previous"
|
||||||
? prevCardDetails["payment-card"]
|
? prevCardDetails["payment-card"]
|
||||||
: { ...values, cvv: values.cvv };
|
: { ...values, cvv: values.cvv };
|
||||||
stateData.cardType = tab === "previous" ? "prev" : "new";
|
stateData.cardType = selectedOption === "previous" ? "prev" : "new";
|
||||||
stateData = { ...stateData, ..._response };
|
stateData = { ...stateData, ..._response };
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -224,36 +248,45 @@ function AddFundDollars(props) {
|
|||||||
</h1>
|
</h1>
|
||||||
<div className="my-1 flex items-center gap-2">
|
<div className="my-1 flex items-center gap-2">
|
||||||
<label
|
<label
|
||||||
onClick={() => setTab("previous")}
|
|
||||||
htmlFor="previous"
|
htmlFor="previous"
|
||||||
className="cursor-pointer flex items-center gap-1"
|
className="cursor-pointer flex items-center gap-1"
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
type="radio"
|
type="radio"
|
||||||
id="previous"
|
id="previous"
|
||||||
|
value="previous"
|
||||||
name="card-option"
|
name="card-option"
|
||||||
checked={tab === "previous"}
|
onChange={handleOptionChange}
|
||||||
|
checked={selectedOption === "previous"}
|
||||||
className={`p-2 text-lg font-bold text-slate-600 dark:text-white border pointer-events-none w-7 h-7 ${
|
className={`p-2 text-lg font-bold text-slate-600 dark:text-white border pointer-events-none w-7 h-7 ${
|
||||||
tab == "previous" ? "" : ""
|
selectedOption == "previous" ? "" : ""
|
||||||
} tracking-wide transition duration-200`}
|
} tracking-wide transition duration-200`}
|
||||||
/>
|
/>
|
||||||
Previous Cards
|
Previous Cards
|
||||||
</label>
|
</label>
|
||||||
<label
|
<label
|
||||||
onClick={() => setTab("new")}
|
|
||||||
htmlFor="new"
|
htmlFor="new"
|
||||||
className={`cursor-pointer flex items-center gap-1 ${payListCards.data.length >= MaxNoOfCards ? 'pointer-events-none':''}`}
|
className={`cursor-pointer flex items-center gap-1 ${
|
||||||
|
payListCards.data.length >= MaxNoOfCards
|
||||||
|
? "pointer-events-none"
|
||||||
|
: ""
|
||||||
|
}`}
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
id="new"
|
id="new"
|
||||||
type="radio"
|
type="radio"
|
||||||
name="card-option"
|
name="card-option"
|
||||||
checked={tab === "new"}
|
value="new"
|
||||||
|
onChange={handleOptionChange}
|
||||||
|
checked={selectedOption === "new"}
|
||||||
className={`p-2 text-lg font-bold text-slate-600 dark:text-white border pointer-events-none w-7 h-7 ${
|
className={`p-2 text-lg font-bold text-slate-600 dark:text-white border pointer-events-none w-7 h-7 ${
|
||||||
tab == "new" ? "" : ""
|
selectedOption == "new" ? "" : ""
|
||||||
} tracking-wide transition duration-200`}
|
} tracking-wide transition duration-200`}
|
||||||
/>
|
/>
|
||||||
Add New Card {payListCards.data.length >= MaxNoOfCards && <span className="text-[14px] text-red-500">Max Reached</span>}
|
Add New Card{" "}
|
||||||
|
{payListCards.data.length >= MaxNoOfCards && (
|
||||||
|
<span className="text-[14px] text-red-500">Max Reached</span>
|
||||||
|
)}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@@ -261,8 +294,8 @@ function AddFundDollars(props) {
|
|||||||
<hr />
|
<hr />
|
||||||
{/* END OF switch button */}
|
{/* END OF switch button */}
|
||||||
|
|
||||||
{/* previous tab */}
|
{/* previous selectedOption */}
|
||||||
{tab === "previous" && (
|
{selectedOption === "previous" && (
|
||||||
<div className="p-4 previous-details w-full min-h-[16.5rem] flex flex-col">
|
<div className="p-4 previous-details w-full min-h-[16.5rem] flex flex-col">
|
||||||
{payListCards.loading ? (
|
{payListCards.loading ? (
|
||||||
<LoadingSpinner size="10" color="sky-blue" />
|
<LoadingSpinner size="10" color="sky-blue" />
|
||||||
@@ -278,10 +311,11 @@ function AddFundDollars(props) {
|
|||||||
{currentPreviousCards.map((item, index) => (
|
{currentPreviousCards.map((item, index) => (
|
||||||
<option
|
<option
|
||||||
key={index}
|
key={index}
|
||||||
className={index !== 0 && "border-t-2"}
|
className={index !== 0 ? "border-t-2" : undefined}
|
||||||
value={JSON.stringify(item)}
|
value={JSON.stringify(item)}
|
||||||
|
title={`${item.description} Card\nBank **************${item.digits}`}
|
||||||
>
|
>
|
||||||
<div className="my-2 flex items-center gap-5">
|
{/* <div className="my-2 flex items-center gap-5">
|
||||||
<div className="card-details">
|
<div className="card-details">
|
||||||
<h1 className="text-lg font-bold text-dark-gray dark:text-white tracking-wide">
|
<h1 className="text-lg font-bold text-dark-gray dark:text-white tracking-wide">
|
||||||
{item.description} Card
|
{item.description} Card
|
||||||
@@ -290,7 +324,8 @@ function AddFundDollars(props) {
|
|||||||
Bank **************{item.digits}
|
Bank **************{item.digits}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> */}
|
||||||
|
{item.description} Card - Bank **************{item.digits}
|
||||||
</option>
|
</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
@@ -300,7 +335,7 @@ function AddFundDollars(props) {
|
|||||||
No Previous Card Found!
|
No Previous Card Found!
|
||||||
</p>
|
</p>
|
||||||
<button
|
<button
|
||||||
onClick={() => setTab("new")}
|
onClick={() => setSelectedOption("new")}
|
||||||
type="button"
|
type="button"
|
||||||
className="my-5 px-2 py-1 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
className="my-5 px-2 py-1 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
||||||
>
|
>
|
||||||
@@ -314,13 +349,13 @@ function AddFundDollars(props) {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{tab === "new" && (
|
{selectedOption === "new" && (
|
||||||
<div className="new-details w-full max-h-[22rem]">
|
<div className="new-details w-full max-h-[22rem]">
|
||||||
{payListCards.loading ?
|
{payListCards.loading ? (
|
||||||
<div className="pt-10 flex w-full h-full justify-center items-center">
|
<div className="pt-10 flex w-full h-full justify-center items-center">
|
||||||
<LoadingSpinner size='10' color='sky-blue' />
|
<LoadingSpinner size="10" color="sky-blue" />
|
||||||
</div>
|
</div>
|
||||||
:payListCards.data.length < MaxNoOfCards ?
|
) : payListCards.data.length < MaxNoOfCards ? (
|
||||||
<div className="w-full flex flex-col justify-between">
|
<div className="w-full flex flex-col justify-between">
|
||||||
<Formik
|
<Formik
|
||||||
initialValues={initialValues}
|
initialValues={initialValues}
|
||||||
@@ -379,7 +414,8 @@ function AddFundDollars(props) {
|
|||||||
*
|
*
|
||||||
</span>
|
</span>
|
||||||
<span className="text-[12px] text-red-500 ml-1">
|
<span className="text-[12px] text-red-500 ml-1">
|
||||||
{props.errors.expirationMonth && "**"}
|
{props.errors.expirationMonth &&
|
||||||
|
"**"}
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -431,7 +467,8 @@ function AddFundDollars(props) {
|
|||||||
*
|
*
|
||||||
</span>
|
</span>
|
||||||
<span className="text-[12px] text-red-500 italic">
|
<span className="text-[12px] text-red-500 italic">
|
||||||
{props.errors.expirationYear && "**"}
|
{props.errors.expirationYear &&
|
||||||
|
"**"}
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -560,14 +597,12 @@ function AddFundDollars(props) {
|
|||||||
}}
|
}}
|
||||||
</Formik>
|
</Formik>
|
||||||
</div>
|
</div>
|
||||||
:
|
) : null}
|
||||||
null
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{tab == "previous" && (
|
{selectedOption == "previous" && (
|
||||||
<div className="md:py-8 add-fund-btn flex justify-end items-center gap-2 py-4">
|
<div className="md:py-8 add-fund-btn flex justify-end items-center gap-2 py-4">
|
||||||
<button
|
<button
|
||||||
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center bg-[#f5a430] text-black items-center text-base rounded-full"
|
className="px-4 py-1 h-11 max-w-[100px] w-full flex justify-center bg-[#f5a430] text-black items-center text-base rounded-full"
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ function AddFundPop({
|
|||||||
// Prepare state data for API call
|
// Prepare state data for API call
|
||||||
let stateData = {
|
let stateData = {
|
||||||
amount: Number(input) * 100,
|
amount: Number(input) * 100,
|
||||||
|
card_uid: "", //added card_uid as empty string
|
||||||
currency: walletItem?.code,
|
currency: walletItem?.code,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ function ThePaymentText({ value, type }) {
|
|||||||
* @returns {JSX.Element} - The rendered component.
|
* @returns {JSX.Element} - The rendered component.
|
||||||
*/
|
*/
|
||||||
function AmountSection({ currency, amount, country }) {
|
function AmountSection({ currency, amount, country }) {
|
||||||
const formattedAmount = amount?.toFixed(2);
|
const formattedAmount = (+amount * 0.01)?.toFixed(2);
|
||||||
const gapClassName = country === "US" ? "gap-14" : "gap-4";
|
const gapClassName = country === "US" ? "gap-14" : "gap-4";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -87,7 +87,7 @@ function TransactionFeeSection({ currency, fee, country }) {
|
|||||||
*/
|
*/
|
||||||
function TotalSection({ currency, amount, fee, country }) {
|
function TotalSection({ currency, amount, fee, country }) {
|
||||||
const total = Number(amount) + Number(fee);
|
const total = Number(amount) + Number(fee);
|
||||||
const formattedTotal = total?.toFixed(2);
|
const formattedTotal = (total * 0.01)?.toFixed(2);
|
||||||
|
|
||||||
const gap = country === "US" ? "gap-[8rem]" : "gap-[6.3rem]";
|
const gap = country === "US" ? "gap-[8rem]" : "gap-[6.3rem]";
|
||||||
|
|
||||||
|
|||||||
@@ -358,7 +358,7 @@ const EditJobPopOut = ({
|
|||||||
/>
|
/>
|
||||||
{taskImage ?
|
{taskImage ?
|
||||||
<div className="w-full absolute -top-5">
|
<div className="w-full absolute -top-5">
|
||||||
<img src={taskImage} className="max-h-[150px] min-h-[150px] w-full object-cover" alt="uplaoded task image" />
|
<img src={taskImage} className="max-h-[150px] min-h-[150px] w-full object-cover" alt="uploaded task" />
|
||||||
<span onClick={()=>setTaskImage('')} className="p-2 absolute text-sm top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-white/80 hover:bg-white hover:shadow-md transition-all duration-500 cursor-pointer text-slate-800">Remove Image</span>
|
<span onClick={()=>setTaskImage('')} className="p-2 absolute text-sm top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-white/80 hover:bg-white hover:shadow-md transition-all duration-500 cursor-pointer text-slate-800">Remove Image</span>
|
||||||
</div>
|
</div>
|
||||||
:
|
:
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ function ManageActiveJobs() {
|
|||||||
loading: false,
|
loading: false,
|
||||||
error: false,
|
error: false,
|
||||||
data: res.data.result_list,
|
data: res.data.result_list,
|
||||||
|
image: res.data.session_image_server
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user