import React, { Suspense, useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { useLocation, useOutletContext } from "react-router-dom"; import usersService from "../../../services/UsersService"; import { tableReload } from "../../../store/TableReloads"; import ModalCom from "../../Helpers/ModalCom"; import { PriceFormatter } from "../../Helpers/PriceFormatter"; import LoadingSpinner from "../../Spinners/LoadingSpinner"; import Detail from "../../jobPopout/popoutcomponent/Detail"; import { NewTasks } from "./forms"; import { SocketValues } from "../../Contexts/SocketIOContext"; import { errorMsg } from "../../../lib/errorMsg"; import AssignPrevNewTask from "./AssignPrevNewTask"; import AssignMediaTask from "./AssignMediaTask"; const AssignTaskPopout = ({ action, details, situation, familyDetailsData, jobList, activeTask, setActiveTask, setUpdatePage, familyList }) => { const newJobList = {...jobList, data:jobList?.data?.filter(item => item?.job_mode == 'FAMILY')} const {parentAssignJobToKid} = SocketValues() const { walletDetails } = useSelector((state) => state?.walletDetails); // WALLET STORE const apiCall = new usersService(); let { pathname, state } = useLocation(); const {userDetails} = useSelector((state) => state?.userDetails); // CHECKS IF USER Details are avaliable, to determine if user is active const [selectedFamilyUid, setSelectedFamilyUid] = useState(''); const handleFamChange = (event) => { setSelectedFamilyUid(event.target.value); }; const dispatch = useDispatch(); // const getFamilySession = JSON.parse(sessionStorage.getItem("family_list")); const famList = familyList?.map((member) => ( )); let [requestStatus, setRequestStatus] = useState({ loading: false, status: false, message: "", }); // HOLDS RESPONSE FOR SENDING API REQUEST let [commonMedia, setCommonMedia] = useState({loading: true, data: [], image: ''}) // HOLDS COMMON MEDIA DATA let [activeMedia, setActiveMedia] = useState({}) // HOLDS ACTIVE COMMON MEDIA DATA const handleActiveMedia = (data = {}) => { // FUNCTION TO CHANGE SELECTED ACTIVE MEDIA setActiveMedia({...data}); }; let [assignType, setAssignType] = useState("task"); // SWITCHES BTW TASK AND MEDIA ASSIGNMENT const switchAssignType = ({ target: { name } }) => { // FUNCTION TO CHANGE ASSIGN TASK TYPE setAssignType(name); }; let [taskType, setTaskType] = useState(details ? "new" : "select"); // SWITCHES BTW SELECT TASK AND NEW TASK const switchTaskType = ({ target: { value } }) => { // FUNCTION TO CHANGE SELECTED ACTIVE TASK setTaskType(value); }; const handleActiveTask = (id = 0, data = {}) => { // FUNCTION TO CHANGE SELECTED ACTIVE TASK setActiveTask({ id, data }); }; // New Task const [formState, setFormState] = useState({ // Initialize form state with desired fields banner: details?.banner || "default.jpg", country: details?.country ? details?.country : walletDetails?.data?.length == 1 ? walletDetails?.data[0].country : '', price: details?.price || "", title: details?.title || "", description: details?.description || "", job_detail: details?.job_detail || "", timeline_days: details?.timeline_days || "", category: details?.category || "", }); const assignFamilyTask = () => { setRequestStatus({ loading: true, status: false, message: "" }); if(!selectedFamilyUid){ // If no family found, throw error setRequestStatus({ loading: false, status: false, message: "Please Select a Kid" }); return setTimeout(() => { setRequestStatus({ loading: false, status: false, message: "" }); }, 3000); } let reqData = {}; if (taskType == "select" && assignType == 'task') { // RUNS HERE IF TASK TYPE IS SELECT if (!Object.keys(activeTask.data)?.length) { setRequestStatus({ loading: false, status: false, message: "No Task is selected", }); return setTimeout(() => { setRequestStatus({ loading: false, status: false, message: "" }); }, 3000); } reqData = { // API PAYLOADS job_id: activeTask.data?.job_id, job_uid: activeTask.data?.job_uid, family_uid: selectedFamilyUid ? selectedFamilyUid : familyDetailsData?.uid || details?.family_uid, job_description: activeTask.data?.description, assign_mode: 110011, }; } if (taskType === "new" && assignType == 'task') { const { banner, category, country, description, job_detail, price, timeline_days, title, } = formState; const requiredFields = { banner, // category, currency: country, description, "job detail": job_detail, price, timeline: timeline_days, title, }; for (let field in requiredFields) { if (requiredFields[field] == "") { // let currencyErrMsg = field == "country" && "currency" setRequestStatus({ loading: false, status: false, message: `${ field[0].toUpperCase() + field.slice(1).toLowerCase() } is empty`, }); return setTimeout(() => { setRequestStatus({ loading: false, status: false, message: "" }); }, 3000); } } reqData = { banner, category, country, description, job_detail, price: price * 100, timeline_days, title, assign_mode: 110055, family_uid: selectedFamilyUid ? selectedFamilyUid : familyDetailsData?.uid || details?.family_uid, }; } apiCall .assignFamilyTask(reqData) .then((res) => { if (res.status != 200 || res.data.internal_return < 0) { let error = errorMsg[res?.data?.error_msg] || '' setRequestStatus({ loading: false, status: false, message: error? error : "failed to assign task", }); return setTimeout(() => { setRequestStatus({ loading: false, status: false, message: "" }); }, 5000); } if (res.status === 200) { setRequestStatus({ loading: false, status: true, message: "Task Assigned successfully", }); setUpdatePage(prev => !prev); // Updates family task page by calling the useeffect hook dispatch(tableReload({ type: "WALLETTABLE" })); // RELOADS USER WALLET //SENDS MESSAGE TO SOCKET TO UPDATE CHILD ACCOUNT // message, room let socketMsg = { "audience": "MEMBER", "action": "REFRESH_OFFER", "family_uid": reqData.family_uid, } let socketRoom = `FAMILY-${userDetails.uid}` parentAssignJobToKid(socketMsg, socketRoom) //SENDS MESSAGE TO SOCKET TO UPDATE CHILD ACCOUNT setTimeout(() => { setRequestStatus({ loading: false, status: false, message: "" }); action(); // FUNCTION THAT CLOSES THE MODAL BOX }, 5000); } }) .catch((err) => { setRequestStatus({ loading: false, status: false, message: "An Error occured, try again", }); setTimeout(() => { setRequestStatus({ loading: false, status: false, message: "" }); }, 5000); }); }; const closeModal = () => { // FOR CLOSING ASSIGN TASK MODAL action() } const assignMediaTask = (values, helpers) => { // FUNCTION TO HANDLE ASSIGNING MEDIA TASK setRequestStatus({ loading: true, status: false, message: "" }); if(!selectedFamilyUid){ // If no family found, throw error setRequestStatus({ loading: false, status: false, message: "Please Select a Kid" }); return setTimeout(() => { setRequestStatus({ loading: false, status: false, message: "" }); }, 3000); } let reqData = {...values, assign_mode:'110012', family_uid:selectedFamilyUid, media_uid:activeMedia.uid, amount:values.amount * 100} apiCall.parentAssignMediaTask(reqData).then(res => { // API CALL TO ASSIGN MEDIA TASK if(res.status != 200 || res.data.internal_return < 0){ let error = errorMsg[res?.data?.error_msg] || '' setRequestStatus({ loading: false, status: false, message: error? error : "failed to assign task", }); return setTimeout(()=>{ setRequestStatus({ loading: false, status: false, message: "" }); }, 3000) } setRequestStatus({ loading: false, status: true, message: "Task Assigned Successfully" }); return setTimeout(()=>{ setRequestStatus({ loading: false, status: false, message: "" }); closeModal() // FOR CLOSING ASSIGN MODAL }, 3000) }).catch(err => { setRequestStatus({ loading: false, status: false, message: "Failed, something went wrong. Try Again" }); return setTimeout(()=>{ setRequestStatus({ loading: false, status: false, message: "" }); }, 3000) }) } useEffect(()=>{ // effect to update family UID when components mounts if(familyDetailsData?.uid){ setSelectedFamilyUid(familyDetailsData?.uid) }else if(details?.family_uid){ setSelectedFamilyUid(details?.family_uid) }else{ setSelectedFamilyUid('') } },[]) useEffect(()=>{ apiCall.getParentCommonMedia().then((res)=>{ // console.log('RESPONSE', res) setCommonMedia({loading: false, data: res?.data?.result, image: ''}) setActiveMedia(res?.data?.result[0]) }).catch(err => { setCommonMedia({loading: false, data: [], image: ''}) }) },[]) return ( <>

{details ? ( ` Assign ${details?.firstname}'s Task` ) : familyDetailsData ? ( ` Assign ${familyDetailsData.firstname}'s Task` ) : (
Assign task to{" "}
)}

{assignType == 'task' ? : }
); }; export default AssignTaskPopout;