Compare commits

...

14 Commits

17 changed files with 396 additions and 316 deletions
+2 -2
View File
@@ -79,7 +79,7 @@ REACT_APP_ANDROID_APP='https://play.google.com/store/apps/details?id=com.wrenchb
REACT_APP_APPLE_APP='https://itunes.apple.com/us/app/wrenchboard/id1435718367?ls=1&mt=8' REACT_APP_APPLE_APP='https://itunes.apple.com/us/app/wrenchboard/id1435718367?ls=1&mt=8'
# Displays the new family dashboard with boxes # Displays the new family dashboard with boxes
REACT_APP_SHOW_NEW_FAMILY_DASH=0 REACT_APP_SHOW_NEW_FAMILY_DASH=1
# Displays the account dashboard # Displays the account dashboard
REACT_APP_SHOW_ACCOUNT_DASH=0 REACT_APP_SHOW_ACCOUNT_DASH=1
+2 -4
View File
@@ -5,7 +5,6 @@ import MarketPopUp from "../MarketPlace/PopUp/MarketPopUp";
export default function AvailableJobsCard({ export default function AvailableJobsCard({
className, className,
datas, datas,
key,
hidden = false, hidden = false,
contentDisplay, contentDisplay,
image_server, image_server,
@@ -38,7 +37,6 @@ export default function AvailableJobsCard({
className={`card-style-two w-full h-[426px] p-[20px] bg-white dark:bg-dark-white rounded-2xl section-shadow ${ className={`card-style-two w-full h-[426px] p-[20px] bg-white dark:bg-dark-white rounded-2xl section-shadow ${
className || "" className || ""
}`} }`}
key={key}
> >
<div <div
onClick={() => { onClick={() => {
@@ -57,7 +55,7 @@ export default function AvailableJobsCard({
Added Added
</p> </p>
<p className="text-base text-dark-gray dark:text-white"> <p className="text-base text-dark-gray dark:text-white">
{datas.offer_added} {new Date(datas.offer_added).toLocaleDateString()}
</p> </p>
</div> </div>
</div> </div>
@@ -68,7 +66,7 @@ export default function AvailableJobsCard({
Expires Expires
</p> </p>
<p className="text-base text-dark-gray dark:text-white text-right"> <p className="text-base text-dark-gray dark:text-white text-right">
{datas.expire} {new Date(datas.expire).toLocaleDateString()}
</p> </p>
</div> </div>
</div> </div>
@@ -85,7 +85,7 @@ const TopBanner = ({ image, title = "", desc = "", btn, link_path, key }) => {
</Link> </Link>
</div> </div>
<div className="flex justify-between w-full px-2 items-center"> <div className="flex justify-between w-full px-2 items-center">
<Link to={link_path} className="text-slate-300 font-semibold"> <Link to={link_path} className="text-slate-300 font-semibold text-sm">
{btn} {btn}
</Link> </Link>
<button className="flex items-center justify-center gap-2"> <button className="flex items-center justify-center gap-2">
@@ -125,7 +125,7 @@ const LowerBanner = ({ image, title = "", desc = "", btn, link_path, key }) => {
</Link> </Link>
</div> </div>
<div className="flex justify-between w-full px-2 items-center"> <div className="flex justify-between w-full px-2 items-center">
<Link to={link_path} className="text-slate-300 font-semibold"> <Link to={link_path} className="text-slate-300 font-semibold text-sm">
{btn} {btn}
</Link> </Link>
<button className="flex items-center justify-center gap-2"> <button className="flex items-center justify-center gap-2">
@@ -1,31 +1,22 @@
import React, { useState } from "react"; import React from "react";
import { Link } from "react-router-dom";
import { toast } from "react-toastify";
import heroBg from "../../assets/images/bg-sky-blue.jpg"; //hero-bg.svg";
import heroUser from "../../assets/images/hero-user.png";
import CountDown from "../Helpers/CountDown"; import CountDown from "../Helpers/CountDown";
// import HomeSliders from "./HomeSliders"; // import HomeSliders from "./HomeSliders";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import HomeSliders from "../Home/HomeSliders";
export default function FamilyParentDashboard({ className, bannerList, nextDueTask }) { export default function JobOwnerDashboard({
const settings = { className,
autoplay: true, bannerList,
dots: true, nextDueTask,
arrows: false, }) {
infinite: true,
swipe: true,
};
const sildeData = null;
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];
let { firstname, lastname, email, profile_pic } = userDetails; let { firstname, lastname, email } = userDetails;
let userEmail = email.split("@")[0]; let userEmail = email.split("@")[0];
return ( return (
<div <div
className={`w-full min-h-[400px] md:grid grid-cols-2 lg:p-8 p-4 justify-between items-center gap-2 rounded-2xl overflow-hidden bg-blue-500 ${ className={`w-full h-[75px] flex p-4 justify-between items-center gap-2 rounded-2xl overflow-hidden bg-sky-blue ${
className || "" className || ""
}`} }`}
style={{ style={{
@@ -34,64 +25,56 @@ export default function FamilyParentDashboard({ className, bannerList, nextDueTa
backgroundSize: "cover", backgroundSize: "cover",
}} }}
> >
<div className="h-full flex flex-col justify-between mb-5 lg:mb-0"> <div className="h-full flex w-full justify-between mb-5 lg:mb-0">
{/* heading */} {/* heading */}
<div> <div className="flex gap-8">
<h1 className="lg:text-2xl text-xl font-medium text-white tracking-wide"> <h1 className="text-base ng font-medium text-white tracking-wide">
Welcome Welcome
</h1> </h1>
<span className="text-[18px] font-thin tracking-wide text-white"> {/* user */}
Last Login : {loginDate}
</span>
</div>
{/* user */}
<div className="flex items-center space-x-3">
<div className="w-14 h-14 flex justify-center items-center rounded-full overflow-hidden">
<img src={profile_pic != "" ? profile_pic : heroUser} alt="" />
</div>
<div> <div>
<p className="text-xl tracking-wide font-bold antise text-white"> <p className="text-base tracking-wide font-bold antise text-white">
{`${firstname} ${lastname}`} {`${firstname} ${lastname}`}
</p> </p>
<p className="text-sm tracking-wide text-white">@{userEmail}</p> <p className="text-sm tracking-wide text-white">@{userEmail}</p>
</div> </div>
</div> </div>
{/* countdown */} {/* countdown */}
{nextDueTask?.next_due && Object.keys(nextDueTask.next_due)?.length != 0 && ( {nextDueTask?.next_due &&
<div className="w-full h-32 flex justify-evenly items-center sm:p-6 p-1 rounded-2xl border back-dark1 border-white-opacity"> Object.keys(nextDueTask.next_due)?.length != 0 && (
<div className="flex flex-col justify-between"> <div className="w-full h-32 flex justify-evenly items-center sm:p-6 p-1 rounded-2xl border back-dark1 border-white-opacity">
<p className="text-base text-white tracking-wide">Current Task</p> <div className="flex flex-col justify-between">
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white"> <p className="text-base text-white tracking-wide">
{(nextDueTask.next_due.item_code).substr(0,4)+'...'} Current Task
</p> </p>
<p className="text-base text-white tracking-wide"> <p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
{nextDueTask.next_due.price * 0.01} Naira {nextDueTask.next_due.item_code.substr(0, 4) + "..."}
</p> </p>
</div> <p className="text-base text-white tracking-wide">
<div className="w-[1px] h-full bg-white-opacity"></div> {nextDueTask.next_due.price * 0.01} Naira
<div className="flex flex-col justify-between"> </p>
<p className="text-base text-white tracking-wide">Next due in</p> </div>
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white"> <div className="w-[1px] h-full bg-white-opacity"></div>
{/* <CountDown lastDate="2023-04-26 4:00:00" /> */} <div className="flex flex-col justify-between">
<CountDown lastDate={nextDueTask.next_due.due_date} /> <p className="text-base text-white tracking-wide">
</p> Next due in
<div className="text-base text-white tracking-wide flex gap-[23px]"> </p>
<span>Hrs</span> <p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
<span>Min</span> {/* <CountDown lastDate="2023-04-26 4:00:00" /> */}
<span>Sec</span> <CountDown lastDate={nextDueTask.next_due.due_date} />
</p>
<div className="text-base text-white tracking-wide flex gap-[23px]">
<span>Hrs</span>
<span>Min</span>
<span>Sec</span>
</div>
</div> </div>
</div> </div>
</div> )}
)} <span className="text-base font-thin tracking-wide text-white flex items-end">
{/* action */} Last Login : {loginDate}
<div className="flex lg:space-x-3 space-x-1 items-center"> </span>
<Link to="/mytask" className="text-white text-base">
<span className=" border-b dark:border-[#5356fb29] border-white">
{" "}
View All Task(s)
</span>
</Link>
</div>
</div> </div>
</div> </div>
); );
+47 -64
View File
@@ -1,97 +1,80 @@
import React, { useState } from "react"; import React from "react";
import { Link } from "react-router-dom";
import { toast } from "react-toastify";
import heroBg from "../../assets/images/bg-sky-blue.jpg"; //hero-bg.svg";
import heroUser from "../../assets/images/hero-user.png";
import CountDown from "../Helpers/CountDown"; import CountDown from "../Helpers/CountDown";
// import HomeSliders from "./HomeSliders"; // import HomeSliders from "./HomeSliders";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import HomeSliders from "../Home/HomeSliders";
export default function HomeDashboard({ className, bannerList, nextDueTask }) { export default function JobOwnerDashboard({
const settings = { className,
autoplay: true, bannerList,
dots: true, nextDueTask,
arrows: false, }) {
infinite: true,
swipe: true,
};
const sildeData = null;
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];
let { firstname, lastname, email, profile_pic } = userDetails; let { firstname, lastname, email } = userDetails;
let userEmail = email.split("@")[0]; let userEmail = email.split("@")[0];
return ( return (
<div <div
className={`w-full min-h-[400px] md:grid grid-cols-2 lg:p-8 p-4 justify-between items-center gap-2 rounded-2xl overflow-hidden ${ className={`w-full h-[75px] flex p-4 justify-between items-center gap-2 rounded-2xl overflow-hidden bg-sky-blue ${
className || "" className || ""
}`} }`}
style={{ style={{
background: `url(${heroBg})`, // background: `url(${heroBg})`,
backgroundRepeat: "no-repeat", backgroundRepeat: "no-repeat",
backgroundSize: "cover", backgroundSize: "cover",
}} }}
> >
<div className="h-full flex flex-col justify-between mb-5 lg:mb-0"> <div className="h-full flex w-full justify-between mb-5 lg:mb-0">
{/* heading */} {/* heading */}
<div> <div className="flex gap-8">
<h1 className="lg:text-2xl text-xl font-medium text-white tracking-wide"> <h1 className="text-base ng font-medium text-white tracking-wide">
Welcome Welcome
</h1> </h1>
<span className="text-[18px] font-thin tracking-wide text-white"> {/* user */}
Last Login : {loginDate}
</span>
</div>
{/* user */}
<div className="flex items-center space-x-3">
<div className="w-14 h-14 flex justify-center items-center rounded-full overflow-hidden">
<img src={profile_pic != "" ? profile_pic : heroUser} alt="" />
</div>
<div> <div>
<p className="text-xl tracking-wide font-bold antise text-white"> <p className="text-base tracking-wide font-bold antise text-white">
{`${firstname} ${lastname}`} {`${firstname} ${lastname}`}
</p> </p>
<p className="text-sm tracking-wide text-white">@{userEmail}</p> <p className="text-sm tracking-wide text-white">@{userEmail}</p>
</div> </div>
</div> </div>
{/* countdown */} {/* countdown */}
{nextDueTask?.next_due && Object.keys(nextDueTask.next_due)?.length != 0 && ( {nextDueTask?.next_due &&
<div className="w-full h-32 flex justify-evenly items-center sm:p-6 p-1 rounded-2xl border back-dark1 border-white-opacity"> Object.keys(nextDueTask.next_due)?.length != 0 && (
<div className="flex flex-col justify-between"> <div className="w-full h-32 flex justify-evenly items-center sm:p-6 p-1 rounded-2xl border back-dark1 border-white-opacity">
<p className="text-base text-white tracking-wide">Current Task</p> <div className="flex flex-col justify-between">
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white"> <p className="text-base text-white tracking-wide">
{(nextDueTask.next_due.item_code).substr(0,4)+'...'} Current Task
</p> </p>
<p className="text-base text-white tracking-wide"> <p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
{nextDueTask.next_due.price * 0.01} Naira {nextDueTask.next_due.item_code.substr(0, 4) + "..."}
</p> </p>
</div> <p className="text-base text-white tracking-wide">
<div className="w-[1px] h-full bg-white-opacity"></div> {nextDueTask.next_due.price * 0.01} Naira
<div className="flex flex-col justify-between"> </p>
<p className="text-base text-white tracking-wide">Next due in</p> </div>
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white"> <div className="w-[1px] h-full bg-white-opacity"></div>
{/* <CountDown lastDate="2023-04-26 4:00:00" /> */} <div className="flex flex-col justify-between">
<CountDown lastDate={nextDueTask.next_due.due_date} /> <p className="text-base text-white tracking-wide">
</p> Next due in
<div className="text-base text-white tracking-wide flex gap-[23px]"> </p>
<span>Hrs</span> <p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
<span>Min</span> {/* <CountDown lastDate="2023-04-26 4:00:00" /> */}
<span>Sec</span> <CountDown lastDate={nextDueTask.next_due.due_date} />
</p>
<div className="text-base text-white tracking-wide flex gap-[23px]">
<span>Hrs</span>
<span>Min</span>
<span>Sec</span>
</div>
</div> </div>
</div> </div>
</div> )}
)} <span className="text-base font-thin tracking-wide text-white flex items-end">
{/* action */} Last Login : {loginDate}
<div className="flex lg:space-x-3 space-x-1 items-center"> </span>
<Link to="/mytask" className="text-white text-base">
<span className=" border-b dark:border-[#5356fb29] border-white">
{" "}
View All Task(s)
</span>
</Link>
</div>
</div> </div>
</div> </div>
); );
+46 -68
View File
@@ -1,31 +1,22 @@
import React, { useState } from "react"; import React from "react";
import { Link } from "react-router-dom";
import { toast } from "react-toastify";
import heroBg from "../../assets/images/bg-sky-blue.jpg"; //hero-bg.svg";
import heroUser from "../../assets/images/hero-user.png";
import CountDown from "../Helpers/CountDown"; import CountDown from "../Helpers/CountDown";
// import HomeSliders from "./HomeSliders"; // import HomeSliders from "./HomeSliders";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import HomeSliders from "../Home/HomeSliders";
export default function JobOwnerDashboard({ className, bannerList, nextDueTask }) { export default function JobOwnerDashboard({
const settings = { className,
autoplay: true, bannerList,
dots: true, nextDueTask,
arrows: false, }) {
infinite: true,
swipe: true,
};
const sildeData = null;
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];
let { firstname, lastname, email, profile_pic } = userDetails; let { firstname, lastname, email } = userDetails;
let userEmail = email.split("@")[0]; let userEmail = email.split("@")[0];
return ( return (
<div <div
className={`w-full min-h-[400px] md:grid grid-cols-2 lg:p-8 p-4 justify-between items-center gap-2 rounded-2xl overflow-hidden bg-blue-800 ${ className={`w-full h-[75px] flex p-4 justify-between items-center gap-2 rounded-2xl overflow-hidden bg-sky-blue ${
className || "" className || ""
}`} }`}
style={{ style={{
@@ -34,70 +25,57 @@ export default function JobOwnerDashboard({ className, bannerList, nextDueTask }
backgroundSize: "cover", backgroundSize: "cover",
}} }}
> >
<div className="h-full flex flex-col justify-between mb-5 lg:mb-0"> <div className="h-full flex w-full justify-between mb-5 lg:mb-0">
{/* heading */} {/* heading */}
<div> <div className="flex gap-8">
<h1 className="lg:text-2xl text-xl font-medium text-white tracking-wide"> <h1 className="text-base font-medium text-white tracking-wide">
Welcome Welcome
</h1> </h1>
<span className="text-[18px] font-thin tracking-wide text-white"> {/* user */}
Last Login : {loginDate}
</span>
</div>
{/* user */}
<div className="flex items-center space-x-3">
<div className="w-14 h-14 flex justify-center items-center rounded-full overflow-hidden">
<img src={profile_pic != "" ? profile_pic : heroUser} alt="" />
</div>
<div> <div>
<p className="text-xl tracking-wide font-bold antise text-white"> <p className="text-base tracking-wide font-bold antise text-white">
{`${firstname} ${lastname}`} {`${firstname} ${lastname}`}
</p> </p>
<p className="text-sm tracking-wide text-white">@{userEmail}</p> <p className="text-sm tracking-wide text-white">@{userEmail}</p>
</div> </div>
</div> </div>
{/* countdown */} {/* countdown */}
{nextDueTask?.next_due && Object.keys(nextDueTask.next_due)?.length != 0 && ( {nextDueTask?.next_due &&
<div className="w-full h-32 flex justify-evenly items-center sm:p-6 p-1 rounded-2xl border back-dark1 border-white-opacity"> Object.keys(nextDueTask.next_due)?.length != 0 && (
<div className="flex flex-col justify-between"> <div className="w-full h-32 flex justify-evenly items-center sm:p-6 p-1 rounded-2xl border back-dark1 border-white-opacity">
<p className="text-base text-white tracking-wide">Current Task</p> <div className="flex flex-col justify-between">
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white"> <p className="text-base text-white tracking-wide">
{(nextDueTask.next_due.item_code).substr(0,4)+'...'} Current Task
</p> </p>
<p className="text-base text-white tracking-wide"> <p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
{nextDueTask.next_due.price * 0.01} Naira {nextDueTask.next_due.item_code.substr(0, 4) + "..."}
</p> </p>
</div> <p className="text-base text-white tracking-wide">
<div className="w-[1px] h-full bg-white-opacity"></div> {nextDueTask.next_due.price * 0.01} Naira
<div className="flex flex-col justify-between"> </p>
<p className="text-base text-white tracking-wide">Next due in</p> </div>
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white"> <div className="w-[1px] h-full bg-white-opacity"></div>
{/* <CountDown lastDate="2023-04-26 4:00:00" /> */} <div className="flex flex-col justify-between">
<CountDown lastDate={nextDueTask.next_due.due_date} /> <p className="text-base text-white tracking-wide">
</p> Next due in
<div className="text-base text-white tracking-wide flex gap-[23px]"> </p>
<span>Hrs</span> <p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
<span>Min</span> {/* <CountDown lastDate="2023-04-26 4:00:00" /> */}
<span>Sec</span> <CountDown lastDate={nextDueTask.next_due.due_date} />
</p>
<div className="text-base text-white tracking-wide flex gap-[23px]">
<span>Hrs</span>
<span>Min</span>
<span>Sec</span>
</div>
</div> </div>
</div> </div>
</div> )}
)} <span className="text-base font-thin tracking-wide text-white flex items-end">
{/* action */} Last Login : {loginDate}
<div className="flex lg:space-x-3 space-x-1 items-center"> </span>
<Link to="/mytask" className="text-white text-base">
<span className=" border-b dark:border-[#5356fb29] border-white">
{" "}
View All Task(s)
</span>
</Link>
</div>
</div> </div>
<HomeSliders
settings={settings}
sideData={sildeData}
bannerList={bannerList}
/>
</div> </div>
); );
} }
+103
View File
@@ -0,0 +1,103 @@
import React, { useState } from "react";
import { Link } from "react-router-dom";
import { toast } from "react-toastify";
import heroBg from "../../assets/images/bg-sky-blue.jpg"; //hero-bg.svg";
import heroUser from "../../assets/images/hero-user.png";
import CountDown from "../Helpers/CountDown";
// import HomeSliders from "./HomeSliders";
import { useSelector } from "react-redux";
import HomeSliders from "../Home/HomeSliders";
export default function WorkerDashboard({ className, bannerList, nextDueTask }) {
const settings = {
autoplay: true,
dots: true,
arrows: false,
infinite: true,
swipe: true,
};
const sildeData = null;
const { userDetails } = useSelector((state) => state?.userDetails);
let loginDate = userDetails?.last_login.split(" ")[0];
let { firstname, lastname, email, profile_pic } = userDetails;
let userEmail = email.split("@")[0];
return (
<div
className={`w-full min-h-[400px] md:grid grid-cols-2 lg:p-8 p-4 justify-between items-center gap-2 rounded-2xl overflow-hidden bg-blue-900 ${
className || ""
}`}
style={{
// background: `url(${heroBg})`,
backgroundRepeat: "no-repeat",
backgroundSize: "cover",
}}
>
<div className="h-full flex flex-col justify-between mb-5 lg:mb-0">
{/* heading */}
<div>
<h1 className="lg:text-2xl text-xl font-medium text-white tracking-wide">
Welcome
</h1>
<span className="text-[18px] font-thin tracking-wide text-white">
Last Login : {loginDate}
</span>
</div>
{/* user */}
<div className="flex items-center space-x-3">
<div className="w-14 h-14 flex justify-center items-center rounded-full overflow-hidden">
<img src={profile_pic != "" ? profile_pic : heroUser} alt="" />
</div>
<div>
<p className="text-xl tracking-wide font-bold antise text-white">
{`${firstname} ${lastname}`}
</p>
<p className="text-sm tracking-wide text-white">@{userEmail}</p>
</div>
</div>
{/* countdown */}
{nextDueTask?.next_due && Object.keys(nextDueTask.next_due)?.length != 0 && (
<div className="w-full h-32 flex justify-evenly items-center sm:p-6 p-1 rounded-2xl border back-dark1 border-white-opacity">
<div className="flex flex-col justify-between">
<p className="text-base text-white tracking-wide">Current Task</p>
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
{(nextDueTask.next_due.item_code).substr(0,4)+'...'}
</p>
<p className="text-base text-white tracking-wide">
{nextDueTask.next_due.price * 0.01} Naira
</p>
</div>
<div className="w-[1px] h-full bg-white-opacity"></div>
<div className="flex flex-col justify-between">
<p className="text-base text-white tracking-wide">Next due in</p>
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
{/* <CountDown lastDate="2023-04-26 4:00:00" /> */}
<CountDown lastDate={nextDueTask.next_due.due_date} />
</p>
<div className="text-base text-white tracking-wide flex gap-[23px]">
<span>Hrs</span>
<span>Min</span>
<span>Sec</span>
</div>
</div>
</div>
)}
{/* action */}
<div className="flex lg:space-x-3 space-x-1 items-center">
<Link to="/mytask" className="text-white text-base">
<span className=" border-b dark:border-[#5356fb29] border-white">
{" "}
View All Task(s)
</span>
</Link>
</div>
</div>
<HomeSliders
settings={settings}
sideData={sildeData}
bannerList={bannerList}
/>
</div>
);
}
+46 -68
View File
@@ -1,31 +1,22 @@
import React, { useState } from "react"; import React from "react";
import { Link } from "react-router-dom";
import { toast } from "react-toastify";
import heroBg from "../../assets/images/bg-sky-blue.jpg"; //hero-bg.svg";
import heroUser from "../../assets/images/hero-user.png";
import CountDown from "../Helpers/CountDown"; import CountDown from "../Helpers/CountDown";
// import HomeSliders from "./HomeSliders"; // import HomeSliders from "./HomeSliders";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import HomeSliders from "../Home/HomeSliders";
export default function WorkerDashboard({ className, bannerList, nextDueTask }) { export default function JobOwnerDashboard({
const settings = { className,
autoplay: true, bannerList,
dots: true, nextDueTask,
arrows: false, }) {
infinite: true,
swipe: true,
};
const sildeData = null;
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];
let { firstname, lastname, email, profile_pic } = userDetails; let { firstname, lastname, email } = userDetails;
let userEmail = email.split("@")[0]; let userEmail = email.split("@")[0];
return ( return (
<div <div
className={`w-full min-h-[400px] md:grid grid-cols-2 lg:p-8 p-4 justify-between items-center gap-2 rounded-2xl overflow-hidden bg-blue-900 ${ className={`w-full h-[75px] flex p-4 justify-between items-center gap-2 rounded-2xl overflow-hidden bg-sky-blue ${
className || "" className || ""
}`} }`}
style={{ style={{
@@ -34,70 +25,57 @@ export default function WorkerDashboard({ className, bannerList, nextDueTask })
backgroundSize: "cover", backgroundSize: "cover",
}} }}
> >
<div className="h-full flex flex-col justify-between mb-5 lg:mb-0"> <div className="h-full flex w-full justify-between mb-5 lg:mb-0">
{/* heading */} {/* heading */}
<div> <div className="flex gap-8">
<h1 className="lg:text-2xl text-xl font-medium text-white tracking-wide"> <h1 className="text-base ng font-medium text-white tracking-wide">
Welcome Welcome
</h1> </h1>
<span className="text-[18px] font-thin tracking-wide text-white"> {/* user */}
Last Login : {loginDate}
</span>
</div>
{/* user */}
<div className="flex items-center space-x-3">
<div className="w-14 h-14 flex justify-center items-center rounded-full overflow-hidden">
<img src={profile_pic != "" ? profile_pic : heroUser} alt="" />
</div>
<div> <div>
<p className="text-xl tracking-wide font-bold antise text-white"> <p className="text-base tracking-wide font-bold antise text-white">
{`${firstname} ${lastname}`} {`${firstname} ${lastname}`}
</p> </p>
<p className="text-sm tracking-wide text-white">@{userEmail}</p> <p className="text-sm tracking-wide text-white">@{userEmail}</p>
</div> </div>
</div> </div>
{/* countdown */} {/* countdown */}
{nextDueTask?.next_due && Object.keys(nextDueTask.next_due)?.length != 0 && ( {nextDueTask?.next_due &&
<div className="w-full h-32 flex justify-evenly items-center sm:p-6 p-1 rounded-2xl border back-dark1 border-white-opacity"> Object.keys(nextDueTask.next_due)?.length != 0 && (
<div className="flex flex-col justify-between"> <div className="w-full h-32 flex justify-evenly items-center sm:p-6 p-1 rounded-2xl border back-dark1 border-white-opacity">
<p className="text-base text-white tracking-wide">Current Task</p> <div className="flex flex-col justify-between">
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white"> <p className="text-base text-white tracking-wide">
{(nextDueTask.next_due.item_code).substr(0,4)+'...'} Current Task
</p> </p>
<p className="text-base text-white tracking-wide"> <p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
{nextDueTask.next_due.price * 0.01} Naira {nextDueTask.next_due.item_code.substr(0, 4) + "..."}
</p> </p>
</div> <p className="text-base text-white tracking-wide">
<div className="w-[1px] h-full bg-white-opacity"></div> {nextDueTask.next_due.price * 0.01} Naira
<div className="flex flex-col justify-between"> </p>
<p className="text-base text-white tracking-wide">Next due in</p> </div>
<p className="lg:text-2xl text-lg font-bold tracking-wide text-white"> <div className="w-[1px] h-full bg-white-opacity"></div>
{/* <CountDown lastDate="2023-04-26 4:00:00" /> */} <div className="flex flex-col justify-between">
<CountDown lastDate={nextDueTask.next_due.due_date} /> <p className="text-base text-white tracking-wide">
</p> Next due in
<div className="text-base text-white tracking-wide flex gap-[23px]"> </p>
<span>Hrs</span> <p className="lg:text-2xl text-lg font-bold tracking-wide text-white">
<span>Min</span> {/* <CountDown lastDate="2023-04-26 4:00:00" /> */}
<span>Sec</span> <CountDown lastDate={nextDueTask.next_due.due_date} />
</p>
<div className="text-base text-white tracking-wide flex gap-[23px]">
<span>Hrs</span>
<span>Min</span>
<span>Sec</span>
</div>
</div> </div>
</div> </div>
</div> )}
)} <span className="text-base font-thin tracking-wide text-white flex items-end">
{/* action */} Last Login : {loginDate}
<div className="flex lg:space-x-3 space-x-1 items-center"> </span>
<Link to="/mytask" className="text-white text-base">
<span className=" border-b dark:border-[#5356fb29] border-white">
{" "}
View All Task(s)
</span>
</Link>
</div>
</div> </div>
<HomeSliders
settings={settings}
sideData={sildeData}
bannerList={bannerList}
/>
</div> </div>
); );
} }
+31 -29
View File
@@ -18,6 +18,8 @@ export default function FamilyDash({ familyOffers, MyActiveJobList }) {
const { familyBannersList } = useSelector((state) => state.familyBannersList); const { familyBannersList } = useSelector((state) => state.familyBannersList);
const { familyResources:{ tab_categories } } = useSelector((state) => state.familyResources);
const { userDetails } = useSelector((state) => state?.userDetails); const { userDetails } = useSelector((state) => state?.userDetails);
let [reloadBanner, setReloadBanner] = useState(0) let [reloadBanner, setReloadBanner] = useState(0)
@@ -61,12 +63,11 @@ export default function FamilyDash({ familyOffers, MyActiveJobList }) {
{/* <CommonHead commonHeadData={props.commonHeadData} /> */} {/* <CommonHead commonHeadData={props.commonHeadData} /> */}
{/* Header */} {/* Header */}
<div className="text-white mb-4 p-2 w-full rounded-xl grid grid-cols-1 sm:grid-cols-2 bg-sky-blue place-content-center"> <div className="text-white mb-4 p-2 w-full rounded-xl bg-sky-blue place-content-center">
<div className="w-full flex gap-4"> <div className="w-full flex flex-wrap gap-x-4">
<p className="text-lg font-normal">Welcome</p> <p className="text-lg font-normal">Welcome</p>
<div className="self-center"> <div className="">
<h1 className="m-0 text-lg font-normal">{`${userDetails?.firstname} ${userDetails?.lastname}`}</h1> <h1 className="text-lg font-normal">{`${userDetails?.firstname} ${userDetails?.lastname}`}</h1>
<p className="-mt-1 text-sm">Email</p>
</div> </div>
</div> </div>
<div className="w-full text-sm flex justify-end items-end"> <div className="w-full text-sm flex justify-end items-end">
@@ -87,12 +88,10 @@ export default function FamilyDash({ familyOffers, MyActiveJobList }) {
<div className="h-full w-full"> <div className="h-full w-full">
<img className="w-full h-[12rem] object-cover object-left rounded-t-xl" src={content.banner.image} alt='banner image' /> <img className="w-full h-[12rem] object-cover object-left rounded-t-xl" src={content.banner.image} alt='banner image' />
<div className="h-[7rem] flex flex-col justify-between"> <div className="h-[7rem] flex flex-col justify-between">
<div className="px-2 py-1 border-b border-slate-300 h-[5.4rem] flex flex-col gap-2"> <div className="px-2 py-1 border-b border-slate-300 h-[5.4rem] overflow-hidden flex flex-col gap-2">
<h1 className="text-lg text-[#083e21] dark:text-white font-bold tracking-wide">{content.banner.text}</h1> <h1 className="text-lg text-[#083e21] dark:text-white font-bold tracking-wide">{content.banner.text}</h1>
<p className="text-sm text-black dark:text-white">{content.banner.description}</p> <p className="text-sm text-black dark:text-white">{content.banner.description}</p>
</div> </div>
{/* Horizontal Line */}
{/* <div className="w-full h-[1px] bg-slate-300"></div> */}
<div className="px-2 py-1 flex justify-between items-center"> <div className="px-2 py-1 flex justify-between items-center">
<span className="text-slate-400 dark:text-slate-200 text-sm">6w ago</span> <span className="text-slate-400 dark:text-slate-200 text-sm">6w ago</span>
@@ -111,36 +110,39 @@ export default function FamilyDash({ familyOffers, MyActiveJobList }) {
</div> </div>
} }
{tab_categories?.data &&
<div className="mb-4"> <div className="mb-4">
<h1 className="my-4 text-26 font-bold text-dark-gray dark:text-white tracking-wide">Resources</h1> <h1 className="my-4 text-26 font-bold text-dark-gray dark:text-white tracking-wide">Resources</h1>
<div className="w-full grid grid-cols-2 md:grid-cols-3 gap-2 md:gap-4"> <div className="w-full grid grid-cols-2 md:grid-cols-3 gap-2 md:gap-4">
{[1,2,3,4,5].map((item, index) => ( {tab_categories.data.map((item) => {
<Link key={item} to={`/`} className={`rounded-xl bg-white dark:bg-dark-white shadow-md flex justify-center items-center transition-all duration-300 hover:shadow-sm`}> if(item.enabled){
<div className="h-full w-full"> return (
<img className="w-full h-[12rem] object-cover object-left rounded-t-xl" src={''} alt='banner image' /> <Link key={item.uid} to={item?.action} className={`rounded-xl bg-white dark:bg-dark-white shadow-md flex justify-center items-center transition-all duration-300 hover:shadow-sm`}>
<div className="h-[7rem] flex flex-col justify-between"> <div className="h-full w-full">
<div className="px-2 py-1 border-b border-slate-300 h-[5.4rem] flex flex-col gap-2"> <img className="w-full h-[12rem] object-cover rounded-t-xl" src={item?.banner} alt='banner image' />
<h1 className="text-lg text-[#083e21] dark:text-white font-bold tracking-wide">{'Heading'}</h1> <div className="h-[7rem] flex flex-col justify-between">
<p className="text-sm text-black dark:text-white">{'Description'}</p> <div className="px-2 py-1 border-b border-slate-300 h-[5.4rem] overflow-hidden flex flex-col gap-2">
</div> <h1 className="text-lg text-[#083e21] dark:text-white font-bold tracking-wide">{item?.content}</h1>
{/* Horizontal Line */} {/* <p className="text-sm text-black dark:text-white">{'Description'}</p> */}
{/* <div className="w-full h-[1px] bg-slate-300"></div> */} </div>
<div className="px-2 py-1 flex justify-between items-center"> <div className="px-2 py-1 flex justify-between items-center">
<span className="text-slate-400 dark:text-slate-200 text-sm">6w ago</span> <span className="text-slate-400 dark:text-slate-200 text-sm">6w ago</span>
{/* Dots */} {/* Dots */}
<div className="flex justify-center gap-1"> <div className="flex justify-center gap-1">
<div className="w-1 h-1 bg-slate-400 rounded-full"></div> <div className="w-1 h-1 bg-slate-400 rounded-full"></div>
<div className="w-1 h-1 bg-slate-400 rounded-full"></div> <div className="w-1 h-1 bg-slate-400 rounded-full"></div>
<div className="w-1 h-1 bg-slate-400 rounded-full"></div> <div className="w-1 h-1 bg-slate-400 rounded-full"></div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </Link>
</Link> )}
))} })}
</div> </div>
</div> </div>
}
</> </>
} }
+5 -5
View File
@@ -21,7 +21,7 @@ export default function FullAccountDash(props) {
case "DEFAULT_HOME_DASH": case "DEFAULT_HOME_DASH":
return ( return (
<HomeDashboard <HomeDashboard
className="mb-10" className="mb-4"
data={userDetails} data={userDetails}
bannerList={props.bannerList} bannerList={props.bannerList}
nextDueTask={props.nextDueTask} nextDueTask={props.nextDueTask}
@@ -30,7 +30,7 @@ export default function FullAccountDash(props) {
case "FAMILY_PARENT_DASH": case "FAMILY_PARENT_DASH":
return ( return (
<FamilyParentDashboard <FamilyParentDashboard
className="mb-10" className="mb-4"
data={userDetails} data={userDetails}
bannerList={props.bannerList} bannerList={props.bannerList}
nextDueTask={props.nextDueTask} nextDueTask={props.nextDueTask}
@@ -39,7 +39,7 @@ export default function FullAccountDash(props) {
case "WORKER_HOME_DASH": case "WORKER_HOME_DASH":
return ( return (
<WorkerDashboard <WorkerDashboard
className="mb-10" className="mb-4"
data={userDetails} data={userDetails}
bannerList={props.bannerList} bannerList={props.bannerList}
nextDueTask={props.nextDueTask} nextDueTask={props.nextDueTask}
@@ -48,7 +48,7 @@ export default function FullAccountDash(props) {
case "JOBOWNER_HOME_DASH": case "JOBOWNER_HOME_DASH":
return ( return (
<JobOwnerDashboard <JobOwnerDashboard
className="mb-10" className="mb-4"
data={userDetails} data={userDetails}
bannerList={props.bannerList} bannerList={props.bannerList}
nextDueTask={props.nextDueTask} nextDueTask={props.nextDueTask}
@@ -62,10 +62,10 @@ export default function FullAccountDash(props) {
return ( return (
<> <>
<div className="home-page-wrapper"> <div className="home-page-wrapper">
{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} />
)} )}
{renderDashboard()}
{props?.dashTypes !== "undefined" && {props?.dashTypes !== "undefined" &&
props.offersList?.data?.result_list?.length ? ( props.offersList?.data?.result_list?.length ? (
+7 -6
View File
@@ -109,12 +109,13 @@ export default function MainSection({
endLength={products?.length} endLength={products?.length}
> >
{({ datas }) => ( {({ datas }) => (
<AvailableJobsCard <div key={datas.job_uid}>
contentDisplay={contentDisplay} <AvailableJobsCard
image_server={image_server} contentDisplay={contentDisplay}
key={datas.job_uid} image_server={image_server}
datas={datas} datas={datas}
/> />
</div>
)} )}
</DataIteration> </DataIteration>
</div> </div>
+1 -1
View File
@@ -157,7 +157,7 @@ export default function RightSideBar({myJobList}) {
</div> </div>
{/*JOB LINKS*/} {/*JOB LINKS*/}
{myJobList?.data?.result_list?.length > 0 && {(userDetails?.account_type !== "FAMILY" && myJobList?.data?.result_list?.length > 0) &&
<div className="top-platform mt-6 bg-white dark:bg-dark-white rounded-2xl py-8 2xl:w-[268px] w-full 2xl:mb-10 2xl:border-none border "> <div className="top-platform mt-6 bg-white dark:bg-dark-white rounded-2xl py-8 2xl:w-[268px] w-full 2xl:mb-10 2xl:border-none border ">
{/* heading */} {/* heading */}
<div className="px-8 heading flex justify-between items-center mb-3.5"> <div className="px-8 heading flex justify-between items-center mb-3.5">
+1
View File
@@ -133,6 +133,7 @@ export const apiConst = {
WRENCHBOARD_ACCOUNT_HOMEBANNERS: 11200, WRENCHBOARD_ACCOUNT_HOMEBANNERS: 11200,
WRENCHBOARD_ACCOUNT_PLAYGROUND: 11201, WRENCHBOARD_ACCOUNT_PLAYGROUND: 11201,
WRENCHBOARD_ACCOUNT_FAMILY_BANNERS: 22005, WRENCHBOARD_ACCOUNT_FAMILY_BANNERS: 22005,
WRENCHBOARD_ACCOUNT_FAMILY_RESOURCES: 22017,
WRENCHBOARD_ACCOUNT_RECENTS: 11202, WRENCHBOARD_ACCOUNT_RECENTS: 11202,
WRENCHBOARD_ACCOUNT_NOTIFICATIONS: 11205, WRENCHBOARD_ACCOUNT_NOTIFICATIONS: 11205,
+18
View File
@@ -12,6 +12,7 @@ import { updateNotifications } from "../store/notifications";
import { updateUserJobList } from "../store/userJobList"; import { updateUserJobList } from "../store/userJobList";
import { updateWalletDetails } from "../store/walletDetails"; import { updateWalletDetails } from "../store/walletDetails";
import { familyBannersList } from "../store/FamilyBannerList"; import { familyBannersList } from "../store/FamilyBannerList";
import { familyResources } from "../store/FamilyResources";
const AuthRoute = ({ redirectPath = "/login", children }) => { const AuthRoute = ({ redirectPath = "/login", children }) => {
const apiCall = useMemo(() => new usersService(), []); const apiCall = useMemo(() => new usersService(), []);
@@ -271,6 +272,23 @@ const AuthRoute = ({ redirectPath = "/login", children }) => {
getFamilyBanners() getFamilyBanners()
}, [isLogin.status, familyBannersListTable]); }, [isLogin.status, familyBannersListTable]);
//FUNCTION TO GET FAMILY RESOURCES
useEffect(() => {
if((!loggedIn && !isLogin.status) || account_type == 'FULL'){ // DO NOT CALL THIS, IF USER ACCOUNT TYPE IS FULL
return
}
const getFamilyResourcesList = async () => { // FUNCTION TO GET FAMILY BANNERS
try {
const res = await apiCall.getFamilyResources();
dispatch(familyResources(res?.data?.result_list))
// console.log('RESPONSE', res?.data?.result_list)
} catch (error) {
console.log("Error getting tasks");
}
};
getFamilyResourcesList()
}, [isLogin.status, familyBannersListTable]);
// useEffect(() => { // useEffect(() => {
// apiCall // apiCall
// .getHeroJBanners() // .getHeroJBanners()
+16 -3
View File
@@ -1245,11 +1245,11 @@ class usersService {
member_id: localStorage.getItem("member_id"), member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
action: apiConst.WRENCHBOARD_RELATIVE_INVITE, action: apiConst.WRENCHBOARD_RELATIVE_INVITE,
...reqData ...reqData,
}; };
return this.postAuxEnd("/familyrelinvite", postData); return this.postAuxEnd("/familyrelinvite", postData);
} }
// API FUNCTION TO FAMILY BANNERS // API FUNCTION TO FAMILY BANNERS
getFamilyBannersList() { getFamilyBannersList() {
var postData = { var postData = {
@@ -1258,10 +1258,23 @@ class usersService {
sessionid: localStorage.getItem("session_token"), sessionid: localStorage.getItem("session_token"),
action: apiConst.WRENCHBOARD_ACCOUNT_FAMILY_BANNERS, action: apiConst.WRENCHBOARD_ACCOUNT_FAMILY_BANNERS,
limit: 20, limit: 20,
offset: 1 offset: 1,
}; };
return this.postAuxEnd("/familybanners", postData); return this.postAuxEnd("/familybanners", postData);
} }
// API FUNCTION TO FAMILY RESOURCES
getFamilyResources() {
var postData = {
uid: localStorage.getItem("uid"),
member_id: localStorage.getItem("member_id"),
sessionid: localStorage.getItem("session_token"),
action: apiConst.WRENCHBOARD_ACCOUNT_FAMILY_RESOURCES,
limit: 20,
offset: 1,
};
return this.postAuxEnd("/familyresources", 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)
+20
View File
@@ -0,0 +1,20 @@
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
familyResources: {}
};
export const familyResourcesSlice = createSlice({
name: "familyResources",
initialState,
reducers: {
familyResources: (state,action) => {
state.familyResources = {...action.payload}
},
},
});
// Action creators are generated for each case reducer function
export const { familyResources } = familyResourcesSlice.actions;
export default familyResourcesSlice.reducer;
+3 -1
View File
@@ -9,6 +9,7 @@ import notificationsReducer from "./notifications";
import userJobListReducer from "./userJobList"; import userJobListReducer from "./userJobList";
import walletDetails from "./walletDetails"; import walletDetails from "./walletDetails";
import familyBannerListReducer from "./FamilyBannerList" import familyBannerListReducer from "./FamilyBannerList"
import familyResourcesReducer from './FamilyResources'
export default configureStore({ export default configureStore({
reducer: { reducer: {
@@ -20,6 +21,7 @@ export default configureStore({
commonHeadBanner: commonHeadBannerReducer, commonHeadBanner: commonHeadBannerReducer,
notifications: notificationsReducer, notifications: notificationsReducer,
walletDetails: walletDetails, walletDetails: walletDetails,
familyBannersList: familyBannerListReducer familyBannersList: familyBannerListReducer,
familyResources: familyResourcesReducer
}, },
}); });