Compare commits

...

10 Commits

Author SHA1 Message Date
Ebube 9139f637cf . 2023-05-31 10:54:08 +01:00
Ebube 16401cc3a2 . 2023-05-31 10:35:08 +01:00
Ebube ced9c523ad added suspense to familymanagetabs 2023-05-31 09:39:54 +01:00
Ebube 759269cd74 . 2023-05-31 05:59:45 +01:00
Ebube fb27a0d156 Merge branch 'master' of https://gitlab.chiefsoft.net/WrenchBoard/Users-Wrench into enable-and-active-jobs 2023-05-31 05:53:57 +01:00
Ebube 03da0e211b added qr code and print function 2023-05-31 05:53:31 +01:00
CHIEFSOFT\ameye c00d702a6b slider styles 2023-05-30 20:47:26 -04:00
CHIEFSOFT\ameye 206f292dd9 slider cards 2023-05-30 20:14:48 -04:00
CHIEFSOFT\ameye abb2329795 package added 2023-05-30 12:09:28 -04:00
ameye a92a9f961d Merge branch 'sliderCom-fix' of WrenchBoard/Users-Wrench into master 2023-05-30 14:07:54 +00:00
9 changed files with 146 additions and 125 deletions
+8 -6
View File
@@ -14,17 +14,19 @@
"chartjs": "^0.3.24", "chartjs": "^0.3.24",
"cors": "^2.8.5", "cors": "^2.8.5",
"faker": "^6.6.6", "faker": "^6.6.6",
"flutterwave-react-v3": "^1.3.0",
"formik": "^2.2.9", "formik": "^2.2.9",
"react": "^18.2.0",
"react-chartjs-2": "^4.1.0", "react-chartjs-2": "^4.1.0",
"react-countup": "^6.2.0", "react-countup": "^6.2.0",
"react-router-dom": "^6.0.2",
"react-slick": "^0.29.0",
"react-toastify": "^9.0.1",
"flutterwave-react-v3": "^1.3.0",
"react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-qr-code": "^2.0.11",
"react-redux": "^8.0.5", "react-redux": "^8.0.5",
"react-router-dom": "^6.0.2",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"react-slick": "^0.29.0",
"react-to-print": "^2.14.12",
"react-toastify": "^9.0.1",
"redux": "^4.2.0", "redux": "^4.2.0",
"slick-carousel": "^1.8.1", "slick-carousel": "^1.8.1",
"web-vitals": "^1.0.1", "web-vitals": "^1.0.1",
@@ -54,4 +56,4 @@
"last 1 safari version" "last 1 safari version"
] ]
} }
} }
+12 -5
View File
@@ -3,24 +3,31 @@ import { Link } from "react-router-dom";
import localImgLoad from "../../lib/localImgLoad"; import localImgLoad from "../../lib/localImgLoad";
export default function HomeBannerOffersCard(props) { export default function HomeBannerOffersCard(props) {
console.log("HomeBannerOffersCard->",props.itemData) console.log("HomeBannerOffersCard-> ##->",props)
const link_result = "/" + props.itemData.link_path;
return ( return (
<Link <Link
to="/my-collection/collection-item" to={link_result}
className="item w-full block group banner-630-340" className="item w-full block group banner-630-340"
> >
<div className="flex flex-col justify-between h-full"> <div className="flex flex-col justify-between h-full">
<div className="content flex justify-between items-center mb-5"> <div className="content flex justify-between items-center mb-5">
<div> <div className="siderCardHeader">
<h1 className="text-xl font-bold text-dark-gray dark:text-white tracking-wide"> <h1 className="text-2xl font-bold text-dark-gray dark:text-white tracking-wide">
<>{props.itemData.title}</> <>{props.itemData.title}</>
</h1> </h1>
</div> </div>
{/*<SelectBox datas={filterDatas} action={dataSetHandler} />*/} {/*<SelectBox datas={filterDatas} action={dataSetHandler} />*/}
</div> </div>
<div className="h-[233px]"> <div className="h-[233px]">
{props.itemData.description} <div className="siderCardDescription">
{props.itemData.description}
</div>
<div className="siderCardButton">
[BUTTON HERE]
</div>
</div> </div>
</div> </div>
</Link> </Link>
); );
+49 -63
View File
@@ -4,12 +4,15 @@ import React, {
useMemo, useMemo,
useRef, useRef,
useState, useState,
forwardRef,
Suspense,
} from "react"; } from "react";
import LoadingSpinner from "../Spinners/LoadingSpinner"; import LoadingSpinner from "../Spinners/LoadingSpinner";
import profile from "../../assets/images/profile-info-profile.png"; import profile from "../../assets/images/profile-info-profile.png";
import qrSample from "../../assets/images/qr-sample.png";
import usersService from "../../services/UsersService"; import usersService from "../../services/UsersService";
import FamilyTasks from "./FamilyTasks"; import FamilyTasks from "./FamilyTasks";
import QRCode from "react-qr-code";
import { useReactToPrint } from "react-to-print";
export default function FamilyManageTabs({ export default function FamilyManageTabs({
className, className,
@@ -35,7 +38,6 @@ export default function FamilyManageTabs({
}, },
]; ];
const [tab, setTab] = useState(tabs[0].name); const [tab, setTab] = useState(tabs[0].name);
const [manageLoader, setManageLoader] = useState(false);
const tabHandler = (value) => { const tabHandler = (value) => {
setTab(value); setTab(value);
}; };
@@ -59,7 +61,6 @@ export default function FamilyManageTabs({
const apiCall = useMemo(() => new usersService(), []); const apiCall = useMemo(() => new usersService(), []);
// function for manage family // function for manage family
const familyManageHandler = useCallback(async () => { const familyManageHandler = useCallback(async () => {
setManageLoader(true);
try { try {
let { family_uid } = accountDetails; let { family_uid } = accountDetails;
let reqData = { family_uid }; let reqData = { family_uid };
@@ -67,7 +68,6 @@ export default function FamilyManageTabs({
let { data } = await res; let { data } = await res;
if (data?.internal_return < 0) return; if (data?.internal_return < 0) return;
setFamilyDetails(data); setFamilyDetails(data);
setManageLoader(false);
} catch (error) { } catch (error) {
setErrMsg("An error occurred"); setErrMsg("An error occurred");
throw new Error(error); throw new Error(error);
@@ -78,6 +78,12 @@ export default function FamilyManageTabs({
familyManageHandler(); familyManageHandler();
}, [tab]); }, [tab]);
const accountRef = useRef();
// to handle printing
const useHandlePrint = useReactToPrint({
content: () => accountRef.current,
});
return ( return (
<div <div
className={`update-table w-full bg-white dark:bg-dark-white overflow-y-auto rounded-2xl section-shadow min-h-[520px] max-h-[600px] ${ className={`update-table w-full bg-white dark:bg-dark-white overflow-y-auto rounded-2xl section-shadow min-h-[520px] max-h-[600px] ${
@@ -85,11 +91,13 @@ export default function FamilyManageTabs({
}`} }`}
> >
<div className="relative w-full overflow-x-auto sm:rounded-lg"> <div className="relative w-full overflow-x-auto sm:rounded-lg">
{loader ? ( <Suspense
<div className="h-full min-h-[500px] w-full overflow-hidden flex justify-center items-center"> fallback={
<LoadingSpinner size="16" color="sky-blue" /> <div className="h-full min-h-[500px] w-full overflow-hidden flex justify-center items-center">
</div> <LoadingSpinner size="16" color="sky-blue" />
) : ( </div>
}
>
<div className="w-full h-full text-sm text-left text-gray-500 dark:text-gray-400 relative grid grid-cols-4 min-h-[520px]"> <div className="w-full h-full text-sm text-left text-gray-500 dark:text-gray-400 relative grid grid-cols-4 min-h-[520px]">
<div className="border-r border-[#E3E4FE] dark:border-[#a7a9b533] p-6 h-full"> <div className="border-r border-[#E3E4FE] dark:border-[#a7a9b533] p-6 h-full">
<ProfileInfo <ProfileInfo
@@ -127,22 +135,17 @@ export default function FamilyManageTabs({
} h-full p-4 border border-[#dbd9d9]`} } h-full p-4 border border-[#dbd9d9]`}
key={id} key={id}
> >
{manageLoader ? ( {name === "Tasks" && (
<LoadingSpinner size="8" color="sky-blue" /> <FamilyTasks className={className} loader={loader} />
) : (
<>
{name === "Tasks" && (
<FamilyTasks
className={className}
loader={loader}
/>
)}
{name === "Account" && (
<Account familyDetails={familyDetails} />
)}
{name === "Profile" && <Profile />}
</>
)} )}
{name === "Account" && (
<Account
familyDetails={familyDetails}
myRef={accountRef}
handlePrint={useHandlePrint}
/>
)}
{name === "Profile" && <Profile />}
</div> </div>
); );
})} })}
@@ -150,7 +153,7 @@ export default function FamilyManageTabs({
</div> </div>
</div> </div>
</div> </div>
)} </Suspense>
</div> </div>
</div> </div>
); );
@@ -217,49 +220,28 @@ function ProfileInfo({
); );
} }
function Account({ familyDetails }) { const Account = forwardRef(({ familyDetails, myRef, handlePrint }) => {
const handlePrint = () => {
const printableContent = `
<html>
<head>
<style>
/* Add your desired styles here */
</style>
</head>
<body>
<div class"update-table w-full lg:min-h-[450px] h-full p-8 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow"></div>
<h1>Family member details</h1>
<p>Username: ${familyDetails?.username}</p>
<p>Password: ${familyDetails?.pin}</p>
<img src="${qrSample}" alt="QR Code" />
</body>
</html>
`;
const printWindow = window.open('', '', 'width=800,height=700');
printWindow.document.open();
printWindow.document.write(printableContent);
printWindow.document.close();
printWindow.onload = () => {
printWindow.print();
};
};
return ( return (
<div className="w-full lg:min-h-[500px] h-full flex flex-col items-center justify-center"> <div
className="w-full lg:min-h-[500px] h-full flex flex-col items-center justify-center"
ref={myRef}
>
<div className="update-table w-full lg:min-h-[450px] h-full p-8 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow "> <div className="update-table w-full lg:min-h-[450px] h-full p-8 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow ">
<div className="flex items-center justify-around h-[380px]"> <div className="flex items-center justify-around h-[380px]">
<div className="flex flex-col"> <div className="flex flex-col">
<h2 className="font-bold text-lg tracking-wide line-clamp-1 text-dark-gray dark:text-white capitalize"> <h2 className="font-bold text-lg tracking-wide line-clamp-1 text-dark-gray dark:text-white capitalize">
Username:{" "} Username:{" "}
<span className="ml-2 normal-case"> <span className="ml-2 normal-case">
{familyDetails?.username} {familyDetails?.username
? familyDetails?.username
: "please wait..."}
</span> </span>
</h2> </h2>
<h2 className="font-bold text-lg tracking-wide line-clamp-1 text-dark-gray dark:text-white capitalize"> <h2 className="font-bold text-lg tracking-wide line-clamp-1 text-dark-gray dark:text-white capitalize">
Pin:{" "} Pin:{" "}
<span className="ml-2 normal-case">{familyDetails?.pin}</span> <span className="ml-2 normal-case">
{familyDetails?.pin ? familyDetails?.pin : "please wait..."}
</span>
</h2> </h2>
</div> </div>
@@ -271,22 +253,26 @@ function Account({ familyDetails }) {
<p className="text-xl tracking-wide mb-[15px] text-center font-bold text-dark-gray dark:text-white"> <p className="text-xl tracking-wide mb-[15px] text-center font-bold text-dark-gray dark:text-white">
Scan the code from mobile app Scan the code from mobile app
</p> </p>
<img <QRCode
src={qrSample} size={256}
alt="qr-sample" style={{ height: "auto", maxWidth: "100%", width: "100%" }}
className="h-[200px] w-[200px]" value={`https://www.google.com`}
viewBox={`0 0 256 256`}
/> />
</div> </div>
</div> </div>
<div className="h-[50px] w-full flex justify-center items-center"> <div className="h-[50px] w-full flex justify-center items-center">
<button className="btn-shine w-[116px] h-[46px] text-white rounded-full text-base bg-pink flex justify-center items-center" onClick={handlePrint}> <button
className="btn-shine w-[116px] h-[46px] text-white rounded-full text-base bg-pink flex justify-center items-center"
onClick={handlePrint}
>
Print Print
</button> </button>
</div> </div>
</div> </div>
</div> </div>
); );
} });
function Profile() { function Profile() {
return <>Profile</>; return <>Profile</>;
+3 -3
View File
@@ -19,9 +19,9 @@ export default function HomeSliders(props) {
<div className="item w-full h-full bg-white dark:bg-dark-white rounded-2xl overflow-hidden"> <div className="item w-full h-full bg-white dark:bg-dark-white rounded-2xl overflow-hidden">
<img src={slider2} alt="slider" className="w-full h-full" /> <img src={slider2} alt="slider" className="w-full h-full" />
</div> </div>
<div className="item w-full h-full bg-white dark:bg-dark-white rounded-2xl overflow-hidden"> {/*<div className="item w-full h-full bg-white dark:bg-dark-white rounded-2xl overflow-hidden">*/}
<img src={slider3} alt="slider" className="w-full h-full" /> {/* <img src={slider3} alt="slider" className="w-full h-full" />*/}
</div> {/*</div>*/}
{props.bannerList.map((item, index) => ( {props.bannerList.map((item, index) => (
<div className="item w-full h-full bg-white dark:bg-dark-white rounded-2xl overflow-hidden"> <div className="item w-full h-full bg-white dark:bg-dark-white rounded-2xl overflow-hidden">
<HomeBannerOffersCard <HomeBannerOffersCard
+3 -3
View File
@@ -51,9 +51,9 @@ export default function MyOffersTable({ className, MyActiveOffersList}) {
// } // }
}; };
if ( !MyActiveOffersList || MyActiveOffersList?.result_list?.length == 0 ){ // if ( !MyActiveOffersList || MyActiveOffersList?.result_list?.length == 0 ){
return(''); // want blank or no appear when no items // return(''); // want blank or no appear when no items
} // }
return ( return (
<> <>
+12 -4
View File
@@ -6,7 +6,11 @@ import CommonHead from "../UserHeader/CommonHead";
import TopSellerTopBuyerSliderSection from "../Home/TopSellerTopBuyerSliderSection"; import TopSellerTopBuyerSliderSection from "../Home/TopSellerTopBuyerSliderSection";
import MyOffersTable from "./MyOffersTable"; import MyOffersTable from "./MyOffersTable";
export default function MyTasks({MyActiveOffersList, ActiveJobList, commonHeadData}) { export default function MyTasks({
MyActiveOffersList,
ActiveJobList,
commonHeadData,
}) {
const [selectTab, setValue] = useState("today"); const [selectTab, setValue] = useState("today");
const filterHandler = (value) => { const filterHandler = (value) => {
setValue(value); setValue(value);
@@ -34,9 +38,13 @@ export default function MyTasks({MyActiveOffersList, ActiveJobList, commonHeadDa
></div> ></div>
</div> </div>
</div> </div>
<MyOffersTable {MyActiveOffersList &&
MyActiveOffersList={MyActiveOffersList} MyActiveOffersList?.result_list?.length >= 0 && (
className="mb-10" /> <MyOffersTable
MyActiveOffersList={MyActiveOffersList}
className="mb-10"
/>
)}
<MyJobTable ActiveJobList={ActiveJobList} /> <MyJobTable ActiveJobList={ActiveJobList} />
</div> </div>
</div> </div>
-1
View File
@@ -12,7 +12,6 @@ export default function Sidebar({ sidebar, action, logoutModalHandler, myJobList
const darkMode = useContext(DarkModeContext); const darkMode = useContext(DarkModeContext);
let { userDetails } = useSelector((state) => state.userDetails); let { userDetails } = useSelector((state) => state.userDetails);
console.log('user-details for job',userDetails);
//const jobLists = getJobList(); // pass from upper - we need in a lot of places //const jobLists = getJobList(); // pass from upper - we need in a lot of places
let { jobLists } = useSelector((state) => state.jobLists); let { jobLists } = useSelector((state) => state.jobLists);
const marketData = jobLists?.result_list; const marketData = jobLists?.result_list;
+12 -1
View File
@@ -9,7 +9,18 @@
font-family: "Product Sans"; font-family: "Product Sans";
src: url("./assets/fonts/Product Sans Bold.ttf"); src: url("./assets/fonts/Product Sans Bold.ttf");
} }
.siderCardHeader{
margin: 40px 40px 10px 40px;
}
.siderCardDescription{
margin: 30px;
font-size: 24px;
}
.siderCardButton{
margin-top: 10px;
width: 100%;
text-align: center;
}
.offer-slide-item{ .offer-slide-item{
background: rgb(2,0,36); background: rgb(2,0,36);
background: radial-gradient(circle, rgba(2,0,36,1) 0%, rgba(3,51,2,0.782125350140056) 0%, rgba(0,212,255,0.07904411764705888) 0%, rgba(153,182,201,1) 99%); background: radial-gradient(circle, rgba(2,0,36,1) 0%, rgba(3,51,2,0.782125350140056) 0%, rgba(0,212,255,0.07904411764705888) 0%, rgba(153,182,201,1) 99%);
+47 -39
View File
@@ -1,4 +1,4 @@
import React, { useContext,useState, useEffect } from "react"; import React, { useContext, useState, useEffect } from "react";
import MyTasks from "../components/MyTasks"; import MyTasks from "../components/MyTasks";
// import UsersService from "../services/UsersService"; // import UsersService from "../services/UsersService";
import usersService from "../services/UsersService"; import usersService from "../services/UsersService";
@@ -6,46 +6,54 @@ import usersService from "../services/UsersService";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
export default function MyTaskPage() { export default function MyTaskPage() {
const {myTaskTable} = useSelector((state) => state.tableReload) const { myTaskTable } = useSelector((state) => state.tableReload);
const [MyActiveJobList, setMyActiveJobList] = useState({loading: true, status:false, data:[]}); const [MyActiveJobList, setMyActiveJobList] = useState({
const [MyActiveOffersList, setMyActiveOffersList] = useState([]); loading: true,
const api = new usersService(); status: false,
const commonHeadData =()=>{ data: [],
console.log("COMMON HEAD DATA ----------------=====---------------------"); });
const [MyActiveOffersList, setMyActiveOffersList] = useState([]);
const api = new usersService();
const commonHeadData = () => {
console.log("COMMON HEAD DATA ----------------=====---------------------");
return 0; return 0;
};
const getMyActiveJobList = async () => {
setMyActiveJobList({ loading: true, status: false, data: [] });
try {
const res = await api.getMyActiveTaskList();
setMyActiveJobList({
loading: false,
status: true,
data: res.data.result_list,
});
} catch (error) {
setMyActiveJobList({ loading: false, status: false, data: [] });
console.log("Error getting tasks");
} }
const getMyActiveJobList = async () => { };
setMyActiveJobList({loading: true, status:false, data:[]}); const getMyActiveOffersList = async () => {
try { // setMyActiveOffersList({loading: true, status:false, data:[]});
const res = await api.getMyActiveTaskList(); try {
setMyActiveJobList({loading: false, status:true, data:res.data.result_list}); const res = await api.getOffersList();
} catch (error) { setMyActiveOffersList(res.data);
setMyActiveJobList({loading: false, status:false, data:[]}); } catch (error) {
console.log("Error getting tasks"); // setMyActiveOffersList({loading: false, status:false, data:[]});
} console.log("Error getting offers");
}; }
const getMyActiveOffersList = async () => { };
// setMyActiveOffersList({loading: true, status:false, data:[]}); useEffect(() => {
try { getMyActiveJobList();
const res = await api.getOffersList(); getMyActiveOffersList();
setMyActiveOffersList(res.data); }, [myTaskTable]);
} catch (error) {
// setMyActiveOffersList({loading: false, status:false, data:[]});
console.log("Error getting offers");
}
};
useEffect(() => {
getMyActiveJobList();
getMyActiveOffersList();
}, [myTaskTable]);
//debugger; //debugger;
return ( return (
<> <MyTasks
<MyTasks ActiveJobList={MyActiveJobList} ActiveJobList={MyActiveJobList}
MyActiveOffersList={MyActiveOffersList} MyActiveOffersList={MyActiveOffersList}
commonHeadData={commonHeadData}/> commonHeadData={commonHeadData}
</> />
); );
} }