import React, { useEffect, useState } from "react"; import { useSelector } from "react-redux"; import Layout from "../Partials/Layout"; import { useNavigate } from "react-router-dom"; import ActiveJobMessage from "./ActiveJobMessage"; import LoadingSpinner from "../Spinners/LoadingSpinner"; import usersService from "../../services/UsersService"; function ActiveJobs(props) { const ApiCall = new usersService() let { userDetails } = useSelector((state) => state.userDetails); let navigate = useNavigate() let [messageToSend, setMessageToSend] = useState('') // State to hold the value of message to be sent let [filesToSend, setFilesToSend] = useState([]) // State to hold the value of files to be sent let [tab, setTab] = useState('message') let [requestStatus, setRequestStatus] = useState({loading: false, status: false, message: ''}) // FUNCTION TO HANDLE MESSAGE CHANGE const handleMessageChange = ({target:{value}}) => { setMessageToSend(value) } // FUNCTION TO HANDLE FILE UPlOAD CHANGE const handleFileChange = ({target:{files}}) => { setRequestStatus({loading: false, status: false, message: ''}) // State to determine error state if(!files[0]) { // IF NO FILE SELECTED RETURN return } if(files[0].size > Number(process.env.REACT_APP_MAX_FILE_SIZE)){ setRequestStatus({loading: false, status: false, message: 'File must be <= 1mb'}) setTimeout(()=>{ setRequestStatus({loading: false, status: false, message: ''}) }, 5000) return } if(filesToSend.length >= Number(process.env.REACT_APP_TOTAL_NUM_FILE)){ setRequestStatus({loading: false, status: false, message: `Total number of attachment is ${Number(process.env.REACT_APP_TOTAL_NUM_FILE)}`}) setTimeout(()=>{ setRequestStatus({loading: false, status: false, message: ''}) }, 5000) return } // INCLUDE FILE IF NO ERROR setFilesToSend(prev => ([...prev, files[0]])) } // FUNCTION TO CLEAR ALL TYPED MESSAGE OR FILES const handleClearAll = ({target:{name}}) => { if(tab == 'message'){ setMessageToSend('') }else if(tab=='files'){ setFilesToSend([]) }else{ return } } // FUNCTION TO REMOVE AND IMAGE const handleRemoveImage = (imageToDelete) => { setFilesToSend(prev => prev.filter(item => item.name != imageToDelete.name)) } // FUNCTION TO SEND TASK MESSAGE const sendTaskMessage = () => { let reqData={message: messageToSend, msg_type: 'TEXT', contract:props.details.contract} if(!reqData.message){ setRequestStatus({loading: false, status: false, message: 'Message is empty'}) return setTimeout(()=>{ setRequestStatus({loading: false, status: false, message: ''}) }, 5000) } setRequestStatus({loading: true, status: false, message: ''}) ApiCall.sendTaskMessage(reqData).then((res)=>{ if(res.status != 200 || res.data.internal_return < 0){ setRequestStatus({loading: false, status: false, message: 'Message could not be sent, try again later'}) return } setRequestStatus({loading: false, status: true, message: 'Message Sent Successfully'}) props.reloadActiveJobList(prev => !prev) // MAKES ACTIVE JOB MESSAGE LIST TO RELOAD setMessageToSend('') // SENDS MESSAGE TO SEND BACK TO EMPTY STRINGS }).catch(error => { setRequestStatus({loading: false, status: false, message: 'Opps! something went wrong'}) }).finally(()=>{ setTimeout(()=>{ setRequestStatus({loading: false, status: false, message: ''}) }, 5000) }) } // FUNCTION TO SEND FILES const sendFile = async () => { setRequestStatus({loading: true, status: false, message: ''}) if(!filesToSend.length){ // checks if file to send is empty setRequestStatus({loading: false, status: false, message: 'No File(s) selected'}) return setTimeout(()=>{ setRequestStatus({loading: false, status: false, message: ''}) }, 5000) } // let reqData = new FormData() // for(let files of filesToSend){ // reqData.append(files.name, files) // } // let reqData={file_size: filesToSend[0].size, file_type: 'image/png', file_data: filesToSend[0], msg_type: 'FILE', contract:props.details.contract} // for(let files of filesToSend){ // reqData[files.name] = files // } const fileToBase64 = async () =>{ try { const base64String = await convertFileToBase64(filesToSend[0]); return base64String; } catch (error) { return false; } } if(await !fileToBase64()){ return } let reqData={file_name: filesToSend[0].name, file_size: filesToSend[0].size, file_type: 'image/png', file_data: await fileToBase64(), msg_type: 'FILE', contract:props.details.contract} console.log(reqData) ApiCall.sendFiles(reqData).then((res)=>{ if(res.status != 200 || res.data.internal_return < 0){ setRequestStatus({loading: false, status: false, message: 'Files(s) could not be sent, try again later'}) return } setRequestStatus({loading: false, status: true, message: 'File(s) Uploaded Successfully'}) props.reloadActiveJobList(prev => !prev) // MAKES ACTIVE JOB MESSAGE LIST TO RELOAD setFilesToSend([]) // SETS FILES TO SEND TO SEND BACK TO EMPTY ARRAY }).catch(error => { setRequestStatus({loading: false, status: false, message: 'Opps! something went wrong'}) }).finally(()=>{ setTimeout(()=>{ setRequestStatus({loading: false, status: false, message: ''}) }, 5000) }) } return (
{/* job title */}

{props.details?.title && props.details.title}

{props.details?.contract && props.details.contract}

{userDetails.firstname && userDetails.firstname}

Description: {props.details?.description && props.details.description}

{/* end of job title */} {/* job details */}

Delivery Detail

Due: {props.details?.delivery_date && props.details.delivery_date.split(" ")[0]}

{props.details?.delivery_date && props.details.delivery_date.split(" ")[1]}

{props.details?.timeline_days && props.details.timeline_days} day(s)

{/* end of job details */}

Actions

Waiting for the completion message from the client before you can approve.

{/* TEXTAREA SECTION */}
{/*

Message(s)

*/}
{tab == 'message' ? (