Compare commits

...

8 Commits

24 changed files with 399 additions and 416 deletions
+1 -1
View File
@@ -117,4 +117,4 @@ REACT_APP_SHOW_ACCOUNT_DASH=1
REACT_APP_SHOW_SLIDER_BANNERS=0 REACT_APP_SHOW_SLIDER_BANNERS=0
# FOR MEDIA LINK # FOR MEDIA LINK
REACT_APP_MEDIA_LINK='https://dev-media.wrenchboard.com ' REACT_APP_MEDIA_LINK='https://dev-media.wrenchboard.com'
+1 -1
View File
@@ -85,4 +85,4 @@ REACT_APP_SHOW_ACCOUNT_DASH=1
REACT_APP_SHOW_SLIDER_BANNERS=0 REACT_APP_SHOW_SLIDER_BANNERS=0
# FOR MEDIA LINK # FOR MEDIA LINK
REACT_APP_MEDIA_LINK='https://dev-media.wrenchboard.com ' REACT_APP_MEDIA_LINK='https://dev-media.wrenchboard.com'
+1 -1
View File
@@ -91,4 +91,4 @@ REACT_APP_SHOW_ACCOUNT_DASH=1
REACT_APP_SHOW_SLIDER_BANNERS=0 REACT_APP_SHOW_SLIDER_BANNERS=0
# FOR MEDIA LINK # FOR MEDIA LINK
REACT_APP_MEDIA_LINK='https://media.wrenchboard.com ' REACT_APP_MEDIA_LINK='https://media.wrenchboard.com'
+101 -101
View File
@@ -14,6 +14,7 @@ import LoadingSpinner from "../Spinners/LoadingSpinner";
import AssignTaskPopout from "./FamilyPopout/AssignTaskPopout"; import AssignTaskPopout from "./FamilyPopout/AssignTaskPopout";
import FamilyWallet from "./Tabs/FamilyWallet"; import FamilyWallet from "./Tabs/FamilyWallet";
import { apiConst } from "../../lib/apiConst"; import { apiConst } from "../../lib/apiConst";
import { useSelector } from "react-redux";
// Lazy Imports for components // Lazy Imports for components
const FamilyWaitlist = lazy(() => import("./Tabs/FamilyWaitlist")); const FamilyWaitlist = lazy(() => import("./Tabs/FamilyWaitlist"));
@@ -29,43 +30,32 @@ export default function FamilyManageTabs({
listReload, listReload,
loader, loader,
}) { }) {
const { jobListTable, pendingListTable, parentFamilyTaskList } = useSelector((state) => state.tableReload); // TABLE RELOAD TRIGGERS
// Initial state for family details // Initial state for family details
const initialDetailState = { const initialDetailState = {
loading: false, loading: false,
data: null, data: [],
}; };
// console.log('accountDetails',accountDetails)
// State for family details, tasks, waitlist, and pending
const [details, setDetails] = useState({
familyDetails: { ...initialDetailState },
familyTasks: { ...initialDetailState },
familyWaitList: { ...initialDetailState },
familyPending: { ...initialDetailState },
});
// Function to reset family details, tasks, waitlist, and pending // State for family details, tasks, waitlist, and pending
const resetDetails = () => { let [familyDetails, setFamilyDetails] = useState({loading: false, data: {}})
setDetails({ let [familyTasks, setFamilyTasks] = useState({...initialDetailState})
familyDetails: { ...initialDetailState }, let [familyWaitList, setFamilyWaitList] = useState({...initialDetailState})
familyTasks: { ...initialDetailState }, let [familyPending, setFamilyPending] = useState({...initialDetailState})
familyWaitList: { ...initialDetailState },
familyPending: { ...initialDetailState },
});
};
const [updatePage, setUpdatePage] = useState(false) // State to determine when to update the page const [updatePage, setUpdatePage] = useState(false) // State to determine when to update the page
// State for family task data // State for list of created jobs by FULL USER
const [familyTask, setFamilyTask] = useState({ loading: false, data: [] }); const [jobList, setJobList] = useState({ loading: false, data: [] });
// State for active task // State for active/selected job
const [activeTask, setActiveTask] = useState({ id: 0, data: {} }); const [activeTask, setActiveTask] = useState({ id: 0, data: {} });
// State for error messages
const [errMsg, setErrMsg] = useState("");
// State for family task popout // State for family task popout
const [familyTaskPopout, setFamilyTaskPopout] = useState(false); const [assignTaskPopout, setAssignTaskPopout] = useState(false);
let [uploadStatus, setUploadStatus] = useState({loading: false, status: false, message:''}) // HOLDS STATE FOR UPLOAD PROFILE PICTURE STATUS let [uploadStatus, setUploadStatus] = useState({loading: false, status: false, message:''}) // HOLDS STATE FOR UPLOAD PROFILE PICTURE STATUS
@@ -79,8 +69,8 @@ export default function FamilyManageTabs({
const apiCall = useMemo(() => new usersService(), []); const apiCall = useMemo(() => new usersService(), []);
// Function to handle toggling the family task popout // Function to handle toggling the family task popout
const familyPopUpHandler = () => { const familyAssignPopUpHandler = () => {
setFamilyTaskPopout((prev) => !prev); setAssignTaskPopout((prev) => !prev);
}; };
// Function to trigger a click on the hidden profile image input // Function to trigger a click on the hidden profile image input
@@ -177,45 +167,40 @@ export default function FamilyManageTabs({
Tasks: ( Tasks: (
<FamilyTasks <FamilyTasks
className={className} className={className}
loader={details.familyTasks.loading} familyData={familyTasks}
familyData={details.familyTasks.data}
accountDetails={accountDetails} accountDetails={accountDetails}
/> />
), ),
Waiting: ( Waiting: (
<FamilyWaitlist <FamilyWaitlist
familyData={details.familyWaitList.data} familyData={familyWaitList}
accountDetails={accountDetails} accountDetails={accountDetails}
loader={details.familyWaitList.loading}
setUpdatePage={setUpdatePage} setUpdatePage={setUpdatePage}
/> />
), ),
Pending: ( Pending: (
<FamilyPending <FamilyPending
familyData={details.familyPending.data} familyData={familyPending}
accountDetails={accountDetails} accountDetails={accountDetails}
loader={details.familyPending.loading}
setUpdatePage={setUpdatePage} setUpdatePage={setUpdatePage}
/> />
), ),
Account: ( Account: (
<FamilyAccount <FamilyAccount
familyData={details.familyDetails.data} familyData={familyDetails}
myRef={accountRef} myRef={accountRef}
loader={details.familyDetails.loading}
handlePrint={useHandlePrint} handlePrint={useHandlePrint}
/> />
), ),
Profile: <FamilyProfile familyData={details.familyDetails.data} />, Profile: <FamilyProfile familyData={familyDetails.data} />,
wallet: <FamilyWallet familyData={details.familyDetails.data} />, wallet: <FamilyWallet familyData={familyDetails.data} />,
}; };
// Default tab component // Default tab component
const defaultTabComponent = ( const defaultTabComponent = (
<FamilyTasks <FamilyTasks
className={className} className={className}
loader={details.familyTasks.loading} familyData={familyTasks}
familyData={details.familyTasks.data}
accountDetails={accountDetails} accountDetails={accountDetails}
/> />
); );
@@ -223,67 +208,90 @@ export default function FamilyManageTabs({
// Selected tab component based on the current 'tab' // Selected tab component based on the current 'tab'
const selectedTabComponent = tabComponents[tab] || defaultTabComponent; const selectedTabComponent = tabComponents[tab] || defaultTabComponent;
// Effect to manage family details and related data // Effect to manage family details
useEffect(() => { useEffect(() => {
const manageFamily = async () => { const manageFamily = async () => {
setFamilyDetails({loading:true, data: {}})
try { try {
resetDetails();
setDetails({
familyDetails: { loading: true },
familyTasks: { loading: true },
familyWaitList: { loading: true },
familyPending: { loading: true },
});
const { family_uid } = accountDetails; const { family_uid } = accountDetails;
const reqData = { family_uid }; const reqData = { family_uid };
const [familyRes, tasksRes, familyWaitRes, familyPending] = const response = await apiCall.ManageFamily(reqData)
await Promise.all([ if(response.status != 200 || !response?.data){
apiCall.ManageFamily(reqData), return setFamilyDetails({loading:false, data: {}})
apiCall.ManageTasks(reqData),
apiCall.ManageFamilyWaitlist(),
apiCall.ManageFamilyPending(),
]);
const familyData = familyRes.data;
const tasksData = tasksRes.data;
const familyWaitData = familyWaitRes.data;
const familyPendingData = familyPending.data;
// Function to check for errors in data
const checkDataError = (data) => data?.internal_return < 0;
if (
checkDataError(familyData) ||
checkDataError(tasksData) ||
checkDataError(familyWaitData) ||
checkDataError(familyPendingData)
) {
return;
} }
setFamilyDetails({loading:false, data: response?.data})
setDetails({
familyDetails: { loading: false, data: familyData },
familyTasks: { loading: false, data: tasksData },
familyWaitList: { loading: false, data: familyWaitData },
familyPending: { loading: false, data: familyPendingData },
});
} catch (error) { } catch (error) {
resetDetails();
setErrMsg("An error occurred");
throw new Error(error); throw new Error(error);
setFamilyDetails({loading:false, data: {}})
} }
}; };
// Invoke the manageFamily function when the component mounts // Invoke the manageFamily function when the component mounts
manageFamily(); manageFamily();
}, []);
// Effect to manage active family task details
useEffect(() => {
const manageTasks = async () => {
setFamilyTasks({loading:true, data: []})
try {
const { family_uid } = accountDetails;
const reqData = { family_uid };
const response = await apiCall.ManageTasks(reqData)
if(response.status != 200 || !response?.data){
return setFamilyTasks({loading:false, data: []})
}
setFamilyTasks({loading:false, data: response?.data})
} catch (error) {
throw new Error(error);
setFamilyTasks({loading:false, data: []})
}
};
// Invoke the manageFamily function when the component mounts
manageTasks();
}, [updatePage, parentFamilyTaskList]);
// Effect to manage family wait task details
useEffect(() => {
const manageFamilyWaitlist = async () => {
setFamilyWaitList({loading:true, data: []})
try {
const response = await apiCall.ManageFamilyWaitlist()
if(response.status != 200 || !response?.data){
return setFamilyWaitList({loading:false, data: []})
}
setFamilyWaitList({loading:false, data: response?.data})
} catch (error) {
throw new Error(error);
setFamilyWaitList({loading:false, data: []})
}
};
// Invoke the manageFamily function when the component mounts
manageFamilyWaitlist();
}, [updatePage]); }, [updatePage]);
// Effect to manage family tasks // Effect to manage family pending task details
useEffect(() => {
const manageFamilyPending = async () => {
setFamilyPending({loading:true, data: []})
try {
const response = await apiCall.ManageFamilyPending()
if(response.status != 200 || !response?.data){
return setFamilyPending({loading:false, data: []})
}
setFamilyPending({loading:false, data: response?.data})
} catch (error) {
throw new Error(error);
setFamilyPending({loading:false, data: []})
}
};
// Invoke the manageFamily function when the component mounts
manageFamilyPending();
}, [updatePage, pendingListTable]);
// Effect to get all parent job list
useEffect(() => { useEffect(() => {
let checkFamilyTask = true;
const reqData = { const reqData = {
limit: 30, limit: 30,
offset: 0, offset: 0,
@@ -291,12 +299,11 @@ export default function FamilyManageTabs({
action: apiConst.WRENCHBOARD_PICTURE_FAMMEMBER, action: apiConst.WRENCHBOARD_PICTURE_FAMMEMBER,
}; };
if (checkFamilyTask) { setJobList({ loading: true });
setFamilyTask({ loading: true });
apiCall apiCall
.getMyJobList(reqData) .getMyJobList(reqData)
.then((res) => { .then((res) => {
setFamilyTask({ loading: false, data: res?.data?.result_list }); setJobList({ loading: false, data: res?.data?.result_list });
if (res?.data?.result_list?.length) { if (res?.data?.result_list?.length) {
setActiveTask((prev) => ({ setActiveTask((prev) => ({
...prev, ...prev,
@@ -305,15 +312,9 @@ export default function FamilyManageTabs({
} }
}) })
.catch((err) => { .catch((err) => {
setFamilyTask({ loading: false, data: [] }); setJobList({ loading: false, data: [] });
console.log("Error", err); console.log("Error", err);
}); });
}
// Cleanup function to prevent memory leaks
return () => {
checkFamilyTask = false;
};
}, []); }, []);
return ( return (
@@ -396,7 +397,7 @@ export default function FamilyManageTabs({
</ul> </ul>
<button <button
type="button" type="button"
onClick={familyPopUpHandler} onClick={familyAssignPopUpHandler}
className="p-1 my-1 w-[100px] flex justify-center items-center btn-gradient text-base rounded-full text-white" className="p-1 my-1 w-[100px] flex justify-center items-center btn-gradient text-base rounded-full text-white"
> >
Add task Add task
@@ -418,15 +419,14 @@ export default function FamilyManageTabs({
</Suspense> </Suspense>
</div> </div>
{familyTaskPopout && ( {assignTaskPopout && (
<AssignTaskPopout <AssignTaskPopout
action={familyPopUpHandler} action={familyAssignPopUpHandler}
situation={familyTaskPopout} situation={assignTaskPopout}
familyTask={familyTask} jobList={jobList}
setFamilyTask={setFamilyTask}
setActiveTask={setActiveTask} setActiveTask={setActiveTask}
activeTask={activeTask} activeTask={activeTask}
familyDetailsData={details.familyDetails.data} familyDetailsData={familyDetails.data}
setUpdatePage={setUpdatePage} setUpdatePage={setUpdatePage}
/> />
)} )}
@@ -5,7 +5,7 @@ import { PriceFormatter } from '../../Helpers/PriceFormatter'
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
export default function AssignPrevNewTask({ export default function AssignPrevNewTask({
familyTask, jobList,
requestStatus, requestStatus,
assignFamilyTask, assignFamilyTask,
taskType, taskType,
@@ -25,7 +25,7 @@ export default function AssignPrevNewTask({
return ( return (
<> <>
{familyTask?.loading ? ( {jobList?.loading ? (
<div className="h-[30rem] w-full flex justify-center items-center"> <div className="h-[30rem] w-full flex justify-center items-center">
<LoadingSpinner color="sky-blue" size="16" /> <LoadingSpinner color="sky-blue" size="16" />
</div> </div>
@@ -64,8 +64,8 @@ export default function AssignPrevNewTask({
{/* Task Type === select */} {/* Task Type === select */}
{taskType == "select" && ( {taskType == "select" && (
<div className="p-4 w-full h-[400px] overflow-y-auto bg-slate-100 rounded-md dark:bg-[#11131f] dark:text-white"> <div className="p-4 w-full h-[400px] overflow-y-auto bg-slate-100 rounded-md dark:bg-[#11131f] dark:text-white">
{familyTask?.data?.length ? ( {jobList?.data?.length ? (
familyTask?.data?.map((item, index) => ( jobList?.data?.map((item, index) => (
<div <div
key={item.job_uid} key={item.job_uid}
className="mb-2 flex justify-start items-center gap-2 text-sky-blue text-base cursor-pointer" className="mb-2 flex justify-start items-center gap-2 text-sky-blue text-base cursor-pointer"
@@ -108,7 +108,7 @@ export default function AssignPrevNewTask({
{/*Right Hand Side for details && Task Type === select */} {/*Right Hand Side for details && Task Type === select */}
{taskType == "select" && ( {taskType == "select" && (
<> <>
{familyTask?.data?.length > 0 ? ( {jobList?.data?.length > 0 ? (
<div className="p-4 pt-0 h-full"> <div className="p-4 pt-0 h-full">
<div className="w-full"> <div className="w-full">
<p className="text-lg font-bold text-dark-gray dark:text-white tracking-wide border-b-2"> <p className="text-lg font-bold text-dark-gray dark:text-white tracking-wide border-b-2">
@@ -19,12 +19,10 @@ const AssignTaskPopout = ({
details, details,
situation, situation,
familyDetailsData, familyDetailsData,
familyTask, jobList,
activeTask, activeTask,
setActiveTask, setActiveTask,
setUpdatePage, setUpdatePage,
// assignTaskChecker,
}) => { }) => {
const {parentAssignJobToKid} = SocketValues() const {parentAssignJobToKid} = SocketValues()
@@ -379,7 +377,7 @@ const AssignTaskPopout = ({
<div className=""> <div className="">
{assignType == 'task' ? {assignType == 'task' ?
<AssignPrevNewTask <AssignPrevNewTask
familyTask={familyTask} jobList={jobList}
requestStatus={requestStatus} requestStatus={requestStatus}
assignFamilyTask={assignFamilyTask} assignFamilyTask={assignFamilyTask}
taskType={taskType} taskType={taskType}
+78 -128
View File
@@ -13,59 +13,42 @@ const FamilyPending = lazy(() => import("./Tabs/FamilyNewPending"));
export default function FamilyTableNew() { export default function FamilyTableNew() {
const { parentFamilyTaskList } = useSelector((state) => state.tableReload); const { jobListTable, pendingListTable, parentFamilyTaskList } = useSelector((state) => state.tableReload); // TABLE RELOAD TRIGGERS
console.log('parentFamilyTaskList', parentFamilyTaskList)
let { pathname } = useLocation(); let { pathname } = useLocation();
// Initial state for family details // Initial state for family details
const initialDetailState = { const initialDetailState = {
loading: true, loading: false,
data: null, data: [],
link: "",
}; };
const [assignTaskChecker, setAssignTaskChecker] = useState(false);
// console.log('accountDetails',accountDetails)
// State for family details, tasks, waitlist, and pending // State for family details, tasks, waitlist, and pending
const [details, setDetails] = useState({ let [familyTasks, setFamilyTasks] = useState({...initialDetailState})
familyDetails: { ...initialDetailState },
familyTasks: { ...initialDetailState },
familyWaitList: { ...initialDetailState },
familyPending: { ...initialDetailState },
});
// Function to reset family details, tasks, waitlist, and pending let [familyPending, setFamilyPending] = useState({...initialDetailState})
const resetDetails = () => {
setDetails({ let [familyWaitList, setFamilyWaitList] = useState({...initialDetailState})
familyDetails: { ...initialDetailState },
familyTasks: { ...initialDetailState },
familyWaitList: { ...initialDetailState },
familyPending: { ...initialDetailState },
});
};
const [updatePage, setUpdatePage] = useState(false); // State to determine when to update the page const [updatePage, setUpdatePage] = useState(false); // State to determine when to update the page
// State for family task data // State for list of created jobs by FULL USER
const [familyTask, setFamilyTask] = useState({ loading: false, data: [] }); const [jobList, setJobList] = useState({ loading: false, data: [] });
// State for active task // State for active/selected job
const [activeTask, setActiveTask] = useState({ id: 0, data: {} }); const [activeTask, setActiveTask] = useState({ id: 0, data: {} });
// State for error messages
const [errMsg, setErrMsg] = useState("");
// State for family task popout // State for family task popout
const [familyTaskPopout, setFamilyTaskPopout] = useState(false); const [assignTaskPopout, setAssignTaskPopout] = useState(false);
// Create an instance of the usersService class // Create an instance of the usersService class
const apiCall = useMemo(() => new usersService(), []); const apiCall = useMemo(() => new usersService(), []);
// Function to handle toggling the family task popout // Function to handle toggling the family task popout
const familyPopUpHandler = () => { const familyAssignPopUpHandler = () => {
setFamilyTaskPopout((prev) => !prev); setAssignTaskPopout((prev) => !prev);
}; };
// Array of tab names // Array of tab names
@@ -87,26 +70,19 @@ export default function FamilyTableNew() {
const tabComponents = { const tabComponents = {
Tasks: ( Tasks: (
<FamilyTasks <FamilyTasks
image_link={details.familyTasks.link} familyData={familyTasks}
loader={details.familyTasks.loading} action={familyAssignPopUpHandler}
familyData={details.familyTasks.data}
action={familyPopUpHandler}
setAssignTaskChecker={setAssignTaskChecker}
/> />
), ),
Waiting: ( Waiting: (
<FamilyWaitlist <FamilyWaitlist
image_link={details.familyWaitList.link} familyData={familyWaitList}
familyData={details.familyWaitList.data}
loader={details.familyWaitList.loading}
setUpdatePage={setUpdatePage} setUpdatePage={setUpdatePage}
/> />
), ),
Pending: ( Pending: (
<FamilyPending <FamilyPending
image_link={details.familyPending.link} familyData={familyPending}
familyData={details.familyPending.data}
loader={details.familyPending.loading}
/> />
), ),
}; };
@@ -116,83 +92,66 @@ export default function FamilyTableNew() {
// Selected tab component based on the current 'tab' // Selected tab component based on the current 'tab'
const selectedTabComponent = tabComponents[tab] || defaultTabComponent; const selectedTabComponent = tabComponents[tab] || defaultTabComponent;
// Effect to manage family details and related data
// Effect to manage active family task details
useEffect(() => { useEffect(() => {
const manageFamily = async () => { const manageTasks = async () => {
setFamilyTasks({loading:true, data: []})
try { try {
// resetDetails(); const response = await apiCall.getMyActiveJobList()
if(response.status != 200 || !response?.data){
// setDetails({ return setFamilyTasks({loading:false, data: []})
// familyTasks: { loading: true },
// familyWaitList: { loading: true },
// familyPending: { loading: true },
// });
// const { family_uid } = accountDetails;
// const reqData = { family_uid };
const [familyTasksData, familyWaitingRes, familyPendingRes] =
await Promise.all([
apiCall.getMyActiveJobList(),
apiCall.ManageFamilyNewWaitlist(),
apiCall.ManageFamilyPending(),
]);
let tasksData = familyTasksData?.data?.result_list;
let _familyWaitData = familyWaitingRes?.data?.result_list;
let familyPendingData = familyPendingRes?.data?.result_list;
// Getting the image server link
let imageServerLink = familyWaitingRes.data?.session_image_server;
// Function to check for errors in data
const checkDataError = (data) => data?.internal_return < 0;
if (
checkDataError(tasksData) ||
checkDataError(_familyWaitData) ||
checkDataError(familyPendingData)
) {
return;
} }
setFamilyTasks({loading:false, data: response?.data})
setDetails({
familyTasks: {
loading: false,
data: tasksData,
link: imageServerLink,
},
familyWaitList: {
loading: false,
data: _familyWaitData,
link: imageServerLink,
},
familyPending: {
loading: false,
data: familyPendingData,
link: imageServerLink,
},
});
} catch (error) { } catch (error) {
// resetDetails();
setDetails({
familyDetails: { ...initialDetailState, loading: false, },
familyTasks: { ...initialDetailState, loading: false, },
familyWaitList: { ...initialDetailState, loading: false,},
familyPending: { ...initialDetailState, loading: false, },
})
setErrMsg("An error occurred");
throw new Error(error); throw new Error(error);
setFamilyTasks({loading:false, data: []})
} }
}; };
// Invoke the manageFamily function when the component mounts // Invoke the manageFamily function when the component mounts
manageFamily(); manageTasks();
}, [updatePage, parentFamilyTaskList]); }, [updatePage, parentFamilyTaskList]);
// Effect to manage family tasks // Effect to manage family wait task details
useEffect(() => {
const manageFamilyWaitlist = async () => {
setFamilyWaitList({loading:true, data: []})
try {
const response = await apiCall.ManageFamilyWaitlist()
if(response.status != 200 || !response?.data){
return setFamilyWaitList({loading:false, data: []})
}
setFamilyWaitList({loading:false, data: response?.data})
} catch (error) {
throw new Error(error);
setFamilyWaitList({loading:false, data: []})
}
};
// Invoke the manageFamily function when the component mounts
manageFamilyWaitlist();
}, [updatePage]);
// Effect to manage family pending task details
useEffect(() => {
const manageFamilyPending = async () => {
setFamilyPending({loading:true, data: []})
try {
const response = await apiCall.ManageFamilyPending()
if(response.status != 200 || !response?.data){
return setFamilyPending({loading:false, data: []})
}
setFamilyPending({loading:false, data: response?.data})
} catch (error) {
throw new Error(error);
setFamilyPending({loading:false, data: []})
}
};
// Invoke the manageFamily function when the component mounts
manageFamilyPending();
}, [updatePage, pendingListTable]);
// Effect to get all parent job list
useEffect(() => { useEffect(() => {
let checkFamilyTask = true;
const reqData = { const reqData = {
limit: 30, limit: 30,
offset: 0, offset: 0,
@@ -200,12 +159,11 @@ export default function FamilyTableNew() {
action: apiConst.WRENCHBOARD_PICTURE_FAMMEMBER, action: apiConst.WRENCHBOARD_PICTURE_FAMMEMBER,
}; };
if (checkFamilyTask) { setJobList({ loading: true });
setFamilyTask({ loading: true });
apiCall apiCall
.getMyJobList(reqData) .getMyJobList(reqData)
.then((res) => { .then((res) => {
setFamilyTask({ loading: false, data: res?.data?.result_list }); setJobList({ loading: false, data: res?.data?.result_list });
if (res?.data?.result_list?.length) { if (res?.data?.result_list?.length) {
setActiveTask((prev) => ({ setActiveTask((prev) => ({
...prev, ...prev,
@@ -214,15 +172,9 @@ export default function FamilyTableNew() {
} }
}) })
.catch((err) => { .catch((err) => {
setFamilyTask({ loading: false, data: [] }); setJobList({ loading: false, data: [] });
console.log("Error", err); console.log("Error", err);
}); });
}
// Cleanup function to prevent memory leaks
return () => {
checkFamilyTask = false;
};
}, []); }, []);
// console.log(updatePage); // console.log(updatePage);
@@ -260,7 +212,7 @@ export default function FamilyTableNew() {
</ul> </ul>
<button <button
type="button" type="button"
onClick={familyPopUpHandler} onClick={familyAssignPopUpHandler}
className="p-1 my-1 w-[100px] flex justify-center items-center btn-gradient text-base rounded-full text-white" className="p-1 my-1 w-[100px] flex justify-center items-center btn-gradient text-base rounded-full text-white"
> >
Add task Add task
@@ -282,20 +234,18 @@ export default function FamilyTableNew() {
</Suspense> </Suspense>
</div> </div>
{familyTaskPopout && ( {assignTaskPopout && (
<AssignTaskPopout <AssignTaskPopout
action={familyPopUpHandler} action={familyAssignPopUpHandler}
situation={familyTaskPopout} situation={assignTaskPopout}
familyTask={familyTask} jobList={jobList}
setFamilyTask={setFamilyTask}
setActiveTask={setActiveTask} setActiveTask={setActiveTask}
activeTask={activeTask} activeTask={activeTask}
familyDetailsData={''}
setUpdatePage={setUpdatePage} setUpdatePage={setUpdatePage}
// updateFamilyPendingTable={updateFamilyPendingTable}
pathname={pathname}
assignTaskChecker={assignTaskChecker}
/> />
)} )}
</div> </div>
); );
} }
@@ -3,7 +3,7 @@ import QRCode from "react-qr-code";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import LoadingSpinner from "../../Spinners/LoadingSpinner"; import LoadingSpinner from "../../Spinners/LoadingSpinner";
const FamilyAccount = forwardRef(({ familyData, myRef, handlePrint, loader }, ref) => { const FamilyAccount = forwardRef(({ familyData, myRef, handlePrint}, ref) => {
const { userDetails } = useSelector((state) => state.userDetails); const { userDetails } = useSelector((state) => state.userDetails);
return ( return (
<div <div
@@ -16,13 +16,13 @@ const FamilyAccount = forwardRef(({ familyData, myRef, handlePrint, loader }, re
<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">
{familyData?.username ? familyData?.username : "please wait..."} {familyData?.data?.username ? familyData?.data?.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"> <span className="ml-2 normal-case">
{familyData?.pin ? familyData?.pin : "please wait..."} {familyData?.data?.pin ? familyData?.data?.pin : "please wait..."}
</span> </span>
</h2> </h2>
</div> </div>
@@ -35,7 +35,7 @@ const FamilyAccount = forwardRef(({ familyData, myRef, handlePrint, loader }, re
<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>
{loader ? {familyData.loading ?
<div className="w-full"> <div className="w-full">
<LoadingSpinner size='8' color='sky-blue' /> <LoadingSpinner size='8' color='sky-blue' />
</div> </div>
@@ -44,7 +44,7 @@ const FamilyAccount = forwardRef(({ familyData, myRef, handlePrint, loader }, re
size={256} size={256}
style={{ height: "auto", maxWidth: "100%", width: "100%" }} style={{ height: "auto", maxWidth: "100%", width: "100%" }}
// value={`https://www.google.com`} // value={`https://www.google.com`}
value={`${userDetails?.uid}@${familyData?.username}@${familyData?.uid}`} value={`${userDetails?.uid}@${familyData?.data?.username}@${familyData?.data?.uid}`}
viewBox={`0 0 256 256`} viewBox={`0 0 256 256`}
/> />
} }
@@ -2,13 +2,14 @@ import { useMemo, useState } from "react";
import { PriceFormatter } from "../../Helpers/PriceFormatter"; import { PriceFormatter } from "../../Helpers/PriceFormatter";
import { PaginatedList, handlePagingFunc } from "../../Pagination"; import { PaginatedList, handlePagingFunc } from "../../Pagination";
import PendingJobsPopout from "../../jobPopout/PendingJobsPopout"; import PendingJobsPopout from "../../jobPopout/PendingJobsPopout";
import LoadingSpinner from "../../Spinners/LoadingSpinner";
export default function FamilyPending({ familyData, image_link, loader }) { export default function FamilyPending({ familyData }) {
let [jobPopout, setJobPopout] = useState({ show: false, data: {} }); // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW let [jobPopout, setJobPopout] = useState({ show: false, data: {} }); // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW
let filteredFamilyData = useMemo( let filteredFamilyData = useMemo(
() => familyData?.filter((data) => data.family_uid !== ""), () => familyData?.data?.result_list?.filter((data) => data.family_uid !== ""),
[familyData] [familyData?.data?.result_list]
); );
const [currentPage, setCurrentPage] = useState(0); const [currentPage, setCurrentPage] = useState(0);
@@ -25,13 +26,18 @@ export default function FamilyPending({ familyData, image_link, loader }) {
handlePagingFunc(e, setCurrentPage); handlePagingFunc(e, setCurrentPage);
}; };
console.log(image_link);
return ( return (
<div <div
className={`update-table w-full p-3 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow lg:min-h-[538px]`} className={`update-table w-full p-3 bg-white dark:bg-dark-white overflow-hidden rounded-2xl section-shadow lg:min-h-[538px]`}
> >
{familyData && ( {familyData.loading ?
(<div className="w-full h-full flex justify-center items-center">
<LoadingSpinner size={16} color="sky-blue" height='h-[30rem]' />
</div>
):
<>
{familyData?.data?.result_list && (
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full"> <div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full">
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400"> <table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<tbody> <tbody>
@@ -45,7 +51,7 @@ export default function FamilyPending({ familyData, image_link, loader }) {
value?.currency_code, value?.currency_code,
value?.currency value?.currency
); );
let image = `${image_link}${localStorage.getItem( let image = `${familyData?.data?.session_image_server}${localStorage.getItem(
"session_token" "session_token"
)}/job/${value.job_uid}`; )}/job/${value.job_uid}`;
return ( return (
@@ -137,7 +143,8 @@ export default function FamilyPending({ familyData, image_link, loader }) {
{/* END OF PAGINATION BUTTON */} {/* END OF PAGINATION BUTTON */}
</div> </div>
)} )}
</>
}
{/* Active Job Popout */} {/* Active Job Popout */}
{jobPopout.show && ( {jobPopout.show && (
<PendingJobsPopout <PendingJobsPopout
@@ -9,17 +9,15 @@ import LoadingSpinner from "../../Spinners/LoadingSpinner";
export default function FamilyNewTasks({ export default function FamilyNewTasks({
familyData, familyData,
className, className,
loader,
action, action,
image_link,
}) { }) {
let navigate = useNavigate(); let navigate = useNavigate();
let { pathname } = useLocation(); let { pathname } = useLocation();
// ... // ...
let filteredFamilyData = useMemo( let filteredFamilyData = useMemo(
() => familyData?.filter((data) => data.family_uid !== ""), () => familyData?.data?.result_list?.filter((data) => data.family_uid !== ""),
[familyData] [familyData?.data?.result_list]
); );
const [currentPage, setCurrentPage] = useState(0); const [currentPage, setCurrentPage] = useState(0);
@@ -36,22 +34,22 @@ export default function FamilyNewTasks({
return ( return (
<div <div
className={`update-table w-full bg-white dark:bg-dark-white h-full lg:min-h-[538px] overflow-hidden rounded-2xl section-shadow p-3 ${ className={`update-table w-full bg-white dark:bg-dark-white h-full lg:min-h-[538px] overflow-hidden rounded-2xl section-shadow p-3 ${
familyData?.length <= 0 && "flex items-center justify-center" familyData?.data?.result_list?.length <= 0 && "flex items-center justify-center"
}`} }`}
> >
{loader ? ( {familyData.loading ? (
<div className="w-full h-full flex justify-center items-center lg:min-h-[470px]"> <div className="w-full h-full flex justify-center items-center">
<LoadingSpinner size={16} color="sky-blue" /> <LoadingSpinner size={16} color="sky-blue" height='h-[30rem]' />
</div> </div>
) : ( ) : (
<> <>
{familyData && ( {familyData?.data?.result_list && (
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full"> <div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full">
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400"> <table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<tbody> <tbody>
{ {
<> <>
{familyData?.length <= 0 ? ( {familyData?.data?.result_list?.length <= 0 ? (
<tr> <tr>
<td <td
colSpan="2" colSpan="2"
@@ -76,7 +74,7 @@ export default function FamilyNewTasks({
value?.currency_code, value?.currency_code,
value?.currency value?.currency
); );
let image = `${image_link}${localStorage.getItem( let image = `${familyData?.data?.result_list}${localStorage.getItem(
"session_token" "session_token"
)}/job/${value.job_uid}`; )}/job/${value.job_uid}`;
return ( return (
@@ -8,8 +8,6 @@ import Icons from "../../Helpers/Icons";
const FamilyNewWaitlist = ({ const FamilyNewWaitlist = ({
familyData, familyData,
className, className,
accountDetails,
loader,
setUpdatePage setUpdatePage
}) => { }) => {
const [popUp, setPopUp] = useState({ show: false, data: {} }); const [popUp, setPopUp] = useState({ show: false, data: {} });
@@ -22,7 +20,7 @@ const FamilyNewWaitlist = ({
const itemsPerPage = Number(process.env.REACT_APP_ITEM_PER_PAGE); const itemsPerPage = Number(process.env.REACT_APP_ITEM_PER_PAGE);
const indexOfFirstItem = currentPage; const indexOfFirstItem = currentPage;
const indexOfLastItem = currentPage + itemsPerPage; const indexOfLastItem = currentPage + itemsPerPage;
const currentTask = familyData?.slice( const currentTask = familyData?.data?.result_list?.slice(
indexOfFirstItem, indexOfFirstItem,
indexOfLastItem indexOfLastItem
); );
@@ -53,13 +51,13 @@ const FamilyNewWaitlist = ({
className || "" className || ""
}`} }`}
> >
{loader ? ( {familyData.loading ? (
<div className="w-full h-full flex justify-center items-center lg:min-h-[470px]"> <div className="w-full h-full flex justify-center items-center">
<LoadingSpinner size={16} color="sky-blue" /> <LoadingSpinner size={16} color="sky-blue" height='h-[30rem]' />
</div> </div>
) : ( ) : (
<> <>
{familyData && ( {familyData?.data?.result_list && (
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full"> <div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full">
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400"> <table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<tbody> <tbody>
@@ -69,7 +67,7 @@ const FamilyNewWaitlist = ({
value?.banner || "default.jpg" value?.banner || "default.jpg"
}`); }`);
// console.log("VALUE", value); // console.log("VALUE", value);
// let image = `${familyData.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}` // let image = `${familyData?.data?.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
return ( return (
<tr <tr
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50" className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
@@ -121,8 +119,8 @@ const FamilyNewWaitlist = ({
<PaginatedList <PaginatedList
onClick={handlePagination} onClick={handlePagination}
prev={currentPage === 0} prev={currentPage === 0}
next={currentPage + itemsPerPage >= familyData?.length} next={currentPage + itemsPerPage >= familyData?.data?.result_list?.length}
data={familyData} data={familyData?.data?.result_list}
start={indexOfFirstItem} start={indexOfFirstItem}
stop={indexOfLastItem} stop={indexOfLastItem}
/> />
@@ -3,6 +3,7 @@ import localImgLoad from "../../../lib/localImgLoad";
import { PriceFormatter } from "../../Helpers/PriceFormatter"; import { PriceFormatter } from "../../Helpers/PriceFormatter";
import { PaginatedList, handlePagingFunc } from "../../Pagination"; import { PaginatedList, handlePagingFunc } from "../../Pagination";
import PendingJobsPopout from "../../jobPopout/PendingJobsPopout"; import PendingJobsPopout from "../../jobPopout/PendingJobsPopout";
import LoadingSpinner from "../../Spinners/LoadingSpinner";
export default function FamilyPending({ export default function FamilyPending({
familyData, familyData,
@@ -15,10 +16,10 @@ export default function FamilyPending({
let filteredFamilyData = useMemo( let filteredFamilyData = useMemo(
() => () =>
familyData?.result_list?.filter( familyData?.data?.result_list?.filter(
(data) => data?.family_uid === accountDetails?.family_uid (data) => data?.family_uid === accountDetails?.family_uid
), ),
[accountDetails?.family_uid, familyData?.result_list] [accountDetails?.family_uid, familyData?.data?.result_list]
); );
const [currentPage, setCurrentPage] = useState(0); const [currentPage, setCurrentPage] = useState(0);
@@ -41,6 +42,12 @@ export default function FamilyPending({
className || "" className || ""
}`} }`}
> >
{familyData.loading ?
(<div className="w-full h-full flex justify-center items-center">
<LoadingSpinner size={16} color="sky-blue" height='h-[30rem]' />
</div>
):
<>
{filteredFamilyData && ( {filteredFamilyData && (
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full"> <div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full">
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400"> <table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
@@ -55,7 +62,7 @@ export default function FamilyPending({
value?.currency_code, value?.currency_code,
value?.currency value?.currency
); );
let image = `${familyData.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}` let image = `${familyData.data.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
return ( return (
<tr <tr
key={index} key={index}
@@ -145,6 +152,8 @@ export default function FamilyPending({
{/* END OF PAGINATION BUTTON */} {/* END OF PAGINATION BUTTON */}
</div> </div>
)} )}
</>
}
{/* Active Job Popout */} {/* Active Job Popout */}
{jobPopout.show && ( {jobPopout.show && (
+13 -14
View File
@@ -10,7 +10,6 @@ import LoadingSpinner from "../../Spinners/LoadingSpinner";
export default function FamilyTasks({ export default function FamilyTasks({
familyData, familyData,
className, className,
loader,
accountDetails, accountDetails,
}) { }) {
let navigate = useNavigate(); let navigate = useNavigate();
@@ -19,17 +18,17 @@ export default function FamilyTasks({
// ... // ...
const filteredFamilyData = useMemo( const filteredFamilyData = useMemo(
() => () =>
familyData?.result_list?.filter( familyData?.data?.result_list?.filter(
(data) => data?.family_uid === accountDetails?.family_uid (data) => data?.family_uid === accountDetails?.family_uid
), ),
[familyData, accountDetails] [familyData?.data, accountDetails]
); );
const [currentPage, setCurrentPage] = useState(0); const [currentPage, setCurrentPage] = useState(0);
const indexOfFirstItem = Number(currentPage); const indexOfFirstItem = Number(currentPage);
const indexOfLastItem = const indexOfLastItem =
Number(indexOfFirstItem) + Number(process.env.REACT_APP_ITEM_PER_PAGE); Number(indexOfFirstItem) + Number(process.env.REACT_APP_ITEM_PER_PAGE);
const currentTask = familyData?.result_list.slice( const currentTask = familyData?.data?.result_list?.slice(
indexOfFirstItem, indexOfFirstItem,
indexOfLastItem indexOfLastItem
); );
@@ -43,21 +42,21 @@ export default function FamilyTasks({
className || "" className || ""
}`} }`}
> >
{loader ? ( {familyData.loading ? (
<div className="w-full h-full flex justify-center items-center lg:min-h-[470px]"> <div className="w-full h-full flex justify-center items-center">
<LoadingSpinner size={16} color="sky-blue" /> <LoadingSpinner size={16} color="sky-blue" height='h-[30rem]' />
</div> </div>
) : ( ) : (
<> <>
{familyData && familyData?.result_list && ( {familyData?.data && familyData?.data?.result_list && (
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full"> <div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between h-full">
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400"> <table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<tbody> <tbody>
{ {
<> <>
{familyData && {familyData?.data &&
familyData?.result_list && familyData?.data?.result_list &&
familyData.result_list.length > 0 ? ( familyData?.data.result_list.length > 0 ? (
currentTask.map((value, index) => { currentTask.map((value, index) => {
// find due date // find due date
const dueDate = value?.delivery_date.split(" ")[0]; const dueDate = value?.delivery_date.split(" ")[0];
@@ -67,7 +66,7 @@ export default function FamilyTasks({
value?.currency_code, value?.currency_code,
value?.currency value?.currency
); );
let image = `${familyData.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}` let image = `${familyData?.data?.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
return ( return (
<tr <tr
key={index} key={index}
@@ -149,11 +148,11 @@ export default function FamilyTasks({
prev={currentPage == 0 ? true : false} prev={currentPage == 0 ? true : false}
next={ next={
currentPage + Number(process.env.REACT_APP_ITEM_PER_PAGE) >= currentPage + Number(process.env.REACT_APP_ITEM_PER_PAGE) >=
familyData?.result_list.length familyData?.data?.result_list.length
? true ? true
: false : false
} }
data={familyData?.result_list} data={familyData?.data?.result_list}
start={indexOfFirstItem} start={indexOfFirstItem}
stop={indexOfLastItem} stop={indexOfLastItem}
/> />
@@ -5,7 +5,7 @@ import LoadingSpinner from "../../Spinners/LoadingSpinner";
import AssignTaskPopout from "../FamilyPopout/AssignTaskPopout"; import AssignTaskPopout from "../FamilyPopout/AssignTaskPopout";
const FamilyWaitlist = memo( const FamilyWaitlist = memo(
({ familyData, className, accountDetails, loader, setUpdatePage }) => { ({ familyData, className, accountDetails, setUpdatePage }) => {
const [popUp, setPopUp] = useState({ show: false, data: {} }); const [popUp, setPopUp] = useState({ show: false, data: {} });
const [continueTaskPopup, setContinueTaskPopup] = useState({ const [continueTaskPopup, setContinueTaskPopup] = useState({
show: false, show: false,
@@ -13,10 +13,10 @@ const FamilyWaitlist = memo(
}); });
const filteredFamilyData = useMemo( const filteredFamilyData = useMemo(
() => () =>
familyData?.result_list?.filter( familyData?.data?.result_list?.filter(
(data) => data?.family_uid === accountDetails?.family_uid (data) => data?.family_uid === accountDetails?.family_uid
), ),
[familyData, accountDetails] [familyData.data, accountDetails]
); );
const [currentPage, setCurrentPage] = useState(0); const [currentPage, setCurrentPage] = useState(0);
@@ -52,9 +52,9 @@ const FamilyWaitlist = memo(
className || "" className || ""
}`} }`}
> >
{loader ? ( {familyData.loading ? (
<div className="w-full h-full flex justify-center items-center lg:min-h-[470px]"> <div className="w-full h-full flex justify-center items-center">
<LoadingSpinner size={16} color="sky-blue" /> <LoadingSpinner size={16} color="sky-blue" height='h-[30rem]' />
</div> </div>
) : ( ) : (
<> <>
@@ -67,8 +67,7 @@ const FamilyWaitlist = memo(
const selectedImage = require(`../../../assets/images/family/${ const selectedImage = require(`../../../assets/images/family/${
value?.banner || "default.jpg" value?.banner || "default.jpg"
}`); }`);
console.log('VALUE', value) // let image = `${familyData.data.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
// let image = `${familyData.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
return ( return (
<tr <tr
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50" className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
@@ -17,8 +17,6 @@ function FamilyWallet({familyData}) {
setFamilyWallet({loading:true, data: []}) setFamilyWallet({loading:true, data: []})
apiUrl.getKidWallets({family_uid:familyData?.uid}).then(res => { apiUrl.getKidWallets({family_uid:familyData?.uid}).then(res => {
setFamilyWallet({loading:false, data: res?.data?.result_list || []}) setFamilyWallet({loading:false, data: res?.data?.result_list || []})
console.log('familyData', familyData, res?.data?.result_list)
}).catch(error => { }).catch(error => {
setFamilyWallet({loading:false, data: []}) setFamilyWallet({loading:false, data: []})
}) })
@@ -80,8 +80,6 @@ const SuggestTask = ({ details, onClose, situation, continuePopupData }) => {
} }
}; };
console.log(details);
return ( return (
<ModalCom action={onClose} situation={situation}> <ModalCom action={onClose} situation={situation}>
<div className="logout-modal-wrapper lw-[90%] md:w-[48rem] min-h-[500px] bg-white dark:bg-dark-white lg:rounded-2xl"> <div className="logout-modal-wrapper lw-[90%] md:w-[48rem] min-h-[500px] bg-white dark:bg-dark-white lg:rounded-2xl">
+9
View File
@@ -0,0 +1,9 @@
import React from 'react'
export default function ImageElement({className, src, alt}) {
return (
<div className='w-full h-full flex justify-center items-center'>
<img src={src} alt={alt} className={`object-cover w-auto h-full ${className && className}`} />
</div>
)
}
@@ -8,7 +8,7 @@ import SelectBox from "../Helpers/SelectBox";
export default function ActiveJobMessageMedia({ activeJobMesList }) { export default function ActiveJobMessageMedia({ activeJobMesList }) {
return ( return (
<div className='flex flex-col justify-between'> <div className='flex flex-col justify-between'>
<div className="w-full h-full min-h-[200px] max-h-[200px] overflow-y-auto"> <div className="w-full h-full min-h-[250px] max-h-[250px] overflow-y-auto">
<table className="wallet-activity w-full table-auto border-collapse text-left"> <table className="wallet-activity w-full table-auto border-collapse text-left">
<thead className='border-b-2'> <thead className='border-b-2'>
<tr className='text-slate-600'> <tr className='text-slate-600'>
+65 -63
View File
@@ -312,21 +312,23 @@ function ActiveJobsMedia(props) {
<div className="w-full mb-4 border-b pb-4 lg:pb-0 lg:mb-0 lg:border-b-0"> <div className="w-full mb-4 border-b pb-4 lg:pb-0 lg:mb-0 lg:border-b-0">
<div className="mb-4 w-full h-auto"> <div className="mb-4 w-full h-auto">
<VideoElement videoId={''} /> <VideoElement videoId={props?.details?.media_uid} />
</div> </div>
<div className="w-full p-4 bg-white dark:bg-black rounded-2xl shadow-md md:flex md:justify-between gap-2"> <div className="w-full p-4 bg-white dark:bg-black rounded-2xl shadow-md md:flex md:justify-between gap-2">
<div className="w-full"> <div className="w-full flex flex-col justify-between">
<p className="w-full text-base text-right text-sky-blue"> <div className="w-full">
{props?.details && props.details.job_to} <p className="w-full text-base text-right text-sky-blue">
</p> {props?.details && props.details.job_to}
<div className="text-base text-slate-700 dark:text-white tracking-wide"> </p>
<p className="font-semibold text-black dark:text-white"> <div className="text-base text-slate-700 dark:text-white tracking-wide">
Description:{" "} <p className="font-semibold text-black dark:text-white">
</p> Description:{" "}
<p className="p-2 border border-sky-blue"> </p>
{props?.details && props.details.description} <p className="p-2 border border-sky-blue">
</p> {props?.details && props.details.description}
</p>
</div>
</div> </div>
<div className="my-2"> <div className="my-2">
<IndexJobActions details={props.details} /> <IndexJobActions details={props.details} />
@@ -395,15 +397,15 @@ function ActiveJobsMedia(props) {
</div> </div>
</div> </div>
<div className="w-full lg:w-2/5 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-1"> <div className="w-full lg:w-2/5 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-1 gap-4">
{/* TEXTAREA SECTION */} {/* TEXTAREA SECTION */}
<div className="mb-5"> <div className="w-full mb-3">
<div className="w-full"> <div className="w-full">
<div className="pl-7 mb-2 flex items-center border-b border-slate-300 gap-3"> <div className="pl-7 mb-2 flex items-center border-b border-slate-300 gap-3">
<button <button
name="message" name="message"
onClick={(e) => setTab(e.target.name)} onClick={(e) => setTab(e.target.name)}
className={`px-4 py-1 rounded-t-2xl ${ className={`px-4 xl:px-1 xxl:px-4 text-sm py-1 rounded-t-2xl ${
tab == "message" tab == "message"
? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white" ? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white"
: "bg-white text-[#000] border-t-[2px]" : "bg-white text-[#000] border-t-[2px]"
@@ -414,7 +416,7 @@ function ActiveJobsMedia(props) {
<button <button
name="files" name="files"
onClick={(e) => setTab(e.target.name)} onClick={(e) => setTab(e.target.name)}
className={`px-4 py-1 rounded-t-2xl ${ className={`px-4 xl:px-1 xxl:px-4 text-sm py-1 rounded-t-2xl ${
tab == "files" tab == "files"
? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white" ? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white"
: "bg-white text-[#000] border-t-[2px]" : "bg-white text-[#000] border-t-[2px]"
@@ -438,7 +440,7 @@ function ActiveJobsMedia(props) {
<div className="files"> <div className="files">
<label <label
htmlFor="file" htmlFor="file"
className="btn-gradient text-base tracking-wide px-4 py-2 rounded-full text-white cursor-pointer" className="custom-btn btn-gradient text-base text-white"
> >
Select Files to Upload Select Files to Upload
</label> </label>
@@ -450,7 +452,7 @@ function ActiveJobsMedia(props) {
onChange={handleFileChange} onChange={handleFileChange}
/> />
</div> </div>
<div className="selected_file my-2"> <div className="selected_file my-2 overflow-y-auto">
{filesToSend.length > 0 && {filesToSend.length > 0 &&
filesToSend.map((item, index) => ( filesToSend.map((item, index) => (
<p key={index} className="flex items-center space-x-2"> <p key={index} className="flex items-center space-x-2">
@@ -492,52 +494,52 @@ function ActiveJobsMedia(props) {
{/* End of error or success display */} {/* End of error or success display */}
{/* Buttons Sections */} {/* Buttons Sections */}
<div className="py-2 sm:flex sm:justify-end sm:items-center"> <div className="py-1 sm:flex sm:justify-end sm:items-center">
<div className="w-full sm:w-3/4 flex justify-between items-center space-x-2"> <div className="w-full flex justify-center items-center gap-4">
<button
type="button"
onClick={handleClearAll}
className="border-gradient text-base tracking-wide px-4 py-2 rounded-full"
>
<span className="text-gradient">Clear</span>
</button>
{tab == "files" ? (
<button <button
onClick={sendFile} type="button"
type="button" onClick={handleClearAll}
className="btn-gradient text-base tracking-wide px-4 py-2 rounded-full text-white cursor-pointer flex justify-center items-center" className="custom-btn border-gradient"
> >
{requestStatus.loading ? ( <span className="text-gradient">Clear</span>
<LoadingSpinner size="6" color="sky-blue" /> </button>
) : ( {tab == "files" ? (
<> <button
<svg onClick={sendFile}
xmlns="http://www.w3.org/2000/svg" type="button"
viewBox="0 0 24 24" className="custom-btn btn-gradient text-white"
width="24"
height="24"
fill="white"
> >
<path d="M12 2L2 12h3v8h14v-8h3L12 2zm0 16v-6h-2v6H7l5-5 5 5h-3z" /> {requestStatus.loading ? (
</svg> <LoadingSpinner size="6" color="sky-blue" />
) : (
<>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
width="20"
height="20"
fill="white"
>
<path d="M12 2L2 12h3v8h14v-8h3L12 2zm0 16v-6h-2v6H7l5-5 5 5h-3z" />
</svg>
<span className="text-white">Upload Files</span> <span className="text-white">Upload Files</span>
</> </>
)} )}
</button> </button>
) : (
<button
onClick={sendTaskMessage}
type="button"
className="btn-gradient text-base tracking-wide px-4 py-2 rounded-full text-white cursor-pointer"
>
{requestStatus.loading ? (
<LoadingSpinner size="6" color="sky-blue" />
) : ( ) : (
<span className="text-white">Send</span> <button
onClick={sendTaskMessage}
type="button"
className="custom-btn btn-gradient text-white"
>
{requestStatus.loading ? (
<LoadingSpinner size="6" color="sky-blue" />
) : (
<span className="text-white">Send</span>
)}
</button>
)} )}
</button>
)}
</div> </div>
</div> </div>
{/* end of Buttons Sections */} {/* end of Buttons Sections */}
@@ -618,13 +620,13 @@ const PopModal = ({
ref={myRef} ref={myRef}
className="message-modal-wrapper w-11/12 min-w-[350px] max-w-[700px] bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto" className="message-modal-wrapper w-11/12 min-w-[350px] max-w-[700px] bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto"
> >
<div className="message-modal-header w-full flex items-center justify-between lg:px-10 lg:py-8 px-[30px] py-[23px] border-b dark:border-[#5356fb29] border-light-purple"> <div className="modal-header-con">
<h1 className="text-26 font-bold text-dark-gray dark:text-white tracking-wide"> <h1 className="modal-title">
{details?.contract} {details?.contract}
</h1> </h1>
<button <button
type="button" type="button"
className="text-[#374557] dark:text-red-500" className="modal-close-btn"
onClick={popUpHandler} onClick={popUpHandler}
> >
<svg <svg
@@ -708,14 +710,14 @@ const PopModal = ({
<button <button
onClick={handlePrint} onClick={handlePrint}
type="button" type="button"
className="w-20 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white" className="custom-btn btn-gradient text-white"
> >
<span className="text-white">Print</span> <span className="text-white">Print</span>
</button> </button>
<button <button
onClick={popUpHandler} onClick={popUpHandler}
type="button" type="button"
className="w-20 h-11 flex justify-center items-center border-gradient text-base rounded-full text-white" className="custom-btn border-gradient text-white"
> >
<span className="text-gradient">Cancel</span> <span className="text-gradient">Cancel</span>
</button> </button>
@@ -60,20 +60,30 @@ function CurrentTaskAction({jobDetails}) {
} }
return ( return (
<div className='job-action dark:bg-black'> <div className='dark:bg-black'>
<div className="w-full text-sm text-left text-gray-500 active-worker ">
<div className="flex space-x-2 items-center w-full task_action_panel">
<div>
I completed this task and ready for review and acceptance.
</div>
</div>
<div className="w-full text-sm text-left text-gray-500">
{jobDetails.job_type == 'MEDIA' ?
<div className="flex justify-center items-center"> <div className="flex justify-center items-center">
<button onClick={popUpHandler} type="button" className="w-[150px] h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"> <button onClick={popUpHandler} type="button" className="custom-btn btn-gradient text-white">
Send for Review I have completed this task
</button> </button>
</div> </div>
:
<div className='job-action active-worker'>
<div className="flex space-x-2 items-center w-full task_action_panel">
<div>
I completed this task and ready for review and acceptance.
</div>
</div>
<div className="flex justify-center items-center">
<button onClick={popUpHandler} type="button" className="custom-btn btn-gradient text-white">
Send for Review
</button>
</div>
</div>
}
</div> </div>
{popUp && ( {popUp && (
+6 -2
View File
@@ -10,6 +10,8 @@ import RightSideBar from "./RightSideBar";
import Sidebar from "./Sidebar"; import Sidebar from "./Sidebar";
export default function Layout({ children }) { export default function Layout({ children }) {
const { userDetails } = useSelector((state) => state?.userDetails); // CHECKS FOR USER Details
const { drawer } = useSelector((state) => state.drawer); const { drawer } = useSelector((state) => state.drawer);
const { userJobList } = useSelector((state) => state.userJobList); const { userJobList } = useSelector((state) => state.userJobList);
const dispatch = useDispatch(); const dispatch = useDispatch();
@@ -52,7 +54,7 @@ export default function Layout({ children }) {
return ( return (
<> <>
<div className="nft-main-wrapper-layout"> <div className="nft-main-wrapper-layout w-full mx-auto">
<div className={`nft-wrapper-layout-container 2xl:pr-20 md:pr-10 pr-2 pl-2 md:pl-0 w-full min-h-screen flex`}> <div className={`nft-wrapper-layout-container 2xl:pr-20 md:pr-10 pr-2 pl-2 md:pl-0 w-full min-h-screen flex`}>
{/* sidebar */} {/* sidebar */}
<div className={`nft-sidebar xl:block hidden section-shadow ${drawer ? "2xl:w-[335px] w-[280px] 2xl:pl-20 pl-10 pr-6 " : "w-[70px]"} bg-white dark:bg-dark-white h-full overflow-y-scroll overflow-style-none fixed left-0 top-0 pt-[30px]`}> <div className={`nft-sidebar xl:block hidden section-shadow ${drawer ? "2xl:w-[335px] w-[280px] 2xl:pl-20 pl-10 pr-6 " : "w-[70px]"} bg-white dark:bg-dark-white h-full overflow-y-scroll overflow-style-none fixed left-0 top-0 pt-[30px]`}>
@@ -72,12 +74,14 @@ export default function Layout({ children }) {
</div> </div>
{/* container */} {/* container */}
<div className="nft-container 2xl:flex 2xl:space-x-8 h-full mb-12 lg:mt-[140px] mt-24 xl:mt-10 flex flex-col xl:flex-row items-start justify-center gap-4"> <div className="nft-container 2xl:flex 2xl:space-x-8 h-full mb-12 lg:mt-[140px] mt-24 xl:mt-10 flex flex-col xl:flex-row items-start justify-center gap-4">
<div className="nft-main-container flex-[80%] w-full"> <div className="flex-[80%] w-full">
{children && children} {children && children}
</div> </div>
{userDetails.account_type == 'FULL' &&
<div className="nft-right-side-content 2xl:w-[270px] w-full h-full 2xl:flex justify-center relative flex-[20%]"> <div className="nft-right-side-content 2xl:w-[270px] w-full h-full 2xl:flex justify-center relative flex-[20%]">
<RightSideBar myJobList={userJobList} /> <RightSideBar myJobList={userJobList} />
</div> </div>
}
</div> </div>
</div> </div>
</div> </div>
+1 -1
View File
@@ -14,7 +14,7 @@ export default function VideoElement({videoId}) {
return ( return (
<video ref={videoRef} className='w-full h-full' controls> <video ref={videoRef} className='w-full h-full' controls>
<source src={`https://dev-media.wrenchboard.com/videos/${videoId}`} type='video/mp4'></source> <source src={`${process.env.REACT_APP_MEDIA_LINK}/videos/${videoId}`} type='video/mp4'></source>
Your browser does not support the video tag. Your browser does not support the video tag.
</video> </video>
) )
@@ -1,4 +1,4 @@
import React, { useState } from "react"; import React, { Suspense, lazy, useState } from "react";
import Detail from "./popoutcomponent/Detail"; import Detail from "./popoutcomponent/Detail";
import ModalCom from "../Helpers/ModalCom"; import ModalCom from "../Helpers/ModalCom";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
@@ -12,6 +12,9 @@ import { useDispatch } from "react-redux";
import { SocketValues } from "../Contexts/SocketIOContext"; import { SocketValues } from "../Contexts/SocketIOContext";
const VideoElement = lazy(() => import("../VideoCom/VideoElement"));
const ImageElement = lazy(() => import("../ImageCon/ImageElement"));
function FamilyOfferJobPopout({ details, onClose, situation }) { function FamilyOfferJobPopout({ details, onClose, situation }) {
const {parentAssignJobToKid} = SocketValues() const {parentAssignJobToKid} = SocketValues()
@@ -118,8 +121,6 @@ function FamilyOfferJobPopout({ details, onClose, situation }) {
}); });
}; };
console.log(details)
return ( return (
<ModalCom action={onClose} situation={situation}> <ModalCom action={onClose} situation={situation}>
<div className="logout-modal-wrapper w-[90%] md:w-[768px] bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto"> <div className="logout-modal-wrapper w-[90%] md:w-[768px] bg-white dark:bg-dark-white lg:rounded-2xl overflow-y-auto">
@@ -153,12 +154,9 @@ function FamilyOfferJobPopout({ details, onClose, situation }) {
</svg> </svg>
</button> </button>
</div> </div>
<div className="md:flex bg-white rounded-lg"> <div className="md:flex bg-white rounded-lg h-[450px] overflow-y-auto">
<div className="p-4 w-full md:w-3/4 md:border-r-2"> <div className="p-4 w-full md:w-3/5 md:border-r-2">
<div className="flex gap-2"> <div className="flex gap-2">
<div className="image-wrapper w-32">
<img className="w-full h-auto" src={details?.image} alt='banner' />
</div>
<div className="details-wrapper"> <div className="details-wrapper">
<p className="text-lg my-5 font-semibold text-slate-900 tracking-wide"> <p className="text-lg my-5 font-semibold text-slate-900 tracking-wide">
{details.title} {details.title}
@@ -208,7 +206,22 @@ function FamilyOfferJobPopout({ details, onClose, situation }) {
</div> </div>
{/* ACTION SECTION */} {/* ACTION SECTION */}
<div className="p-4 w-full md:w-1/4 h-full"> <div className="p-4 w-full md:w-2/5 h-full flex flex-col justify-between">
{ details.job_type == 'TASK' ?
<div className="image-wrapper w-full h-40 flex justify-center items-center">
<Suspense fallback={<p className="w-full text-center">Loading...</p>}>
<ImageElement src={details?.image} alt='banner' className='w-auto h-full' />
</Suspense>
</div>
:
<div className="w-full flex justify-center">
<div className="w-full max-w-xs">
<Suspense fallback={<p className="w-full text-center">Loading...</p>}>
<VideoElement videoId={details.media_uid} />
</Suspense>
</div>
</div>
}
<div className="my-3 md:flex md:justify-center"> <div className="my-3 md:flex md:justify-center">
{requestStatus.loading && requestStatus.trigger == "offer" ? ( {requestStatus.loading && requestStatus.trigger == "offer" ? (
<LoadingSpinner size={8} color="sky-blue" /> <LoadingSpinner size={8} color="sky-blue" />
@@ -238,30 +251,19 @@ function FamilyOfferJobPopout({ details, onClose, situation }) {
</button> </button>
)} )}
</div> */} </div> */}
{/* ERROR DISPLAY AND SUBMIT BUTTON */}
{requestStatus.message != "" &&
(!requestStatus.status ? (
<div
className={`relative p-4 my-4 text-[#912741] bg-[#fcd9e2] border-[#fbc6d3] mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
) : (
requestStatus.status && (
<div
className={`relative p-4 my-4 text-green-700 bg-slate-200 border-slate-800 mb-4 rounded-[0.475rem] text-md font-light leading-[19.5px] text-[13px]`}
>
{requestStatus.message}
</div>
)
))}
{/* End of error or success display */}
</div> </div>
</div> </div>
{/* close button */} {/* close button */}
<div className="modal-footer-wrapper flex justify-end"> <div className="modal-footer-wrapper flex justify-between">
{/* ERROR DISPLAY AND SUBMIT BUTTON */}
<div
className={`relative text-md font-light leading-[19.5px] text-[13px] ${requestStatus.status ? 'text-green-700' : 'text-[#912741]'}`}
>
{requestStatus.message}
</div>
{/* End of error or success display */}
<button <button
onClick={onClose} onClick={onClose}
disabled={requestStatus.loading} disabled={requestStatus.loading}
+8 -6
View File
@@ -61,22 +61,24 @@ function ManageActiveJobs() {
setDetails(state); setDetails(state);
getActiveJobMesList(); getActiveJobMesList();
}, [activeJobMesListReload, chatMessageList]); }, [activeJobMesListReload, chatMessageList]);
console.log('Opps', details)
return ( return (
<> <>
{/* {details.job_type == 'TASK' ? */} {details.job_type == 'MEDIA' ?
<ActiveJobs <ActiveJobsMedia
details={state} details={state}
activeJobMesList={activeJobMesList} activeJobMesList={activeJobMesList}
reloadActiveJobList={setActiveJobMesListReload} reloadActiveJobList={setActiveJobMesListReload}
/> />
{/* : : details.job_type == 'TASK' ?
<ActiveJobsMedia <ActiveJobs
details={state} details={state}
activeJobMesList={activeJobMesList} activeJobMesList={activeJobMesList}
reloadActiveJobList={setActiveJobMesListReload} reloadActiveJobList={setActiveJobMesListReload}
/> />
} */} :
null
}
</> </>
); );
} }