import React, { useState, useEffect, useContext } from 'react' import { useLocation } from 'react-router-dom' import axios from 'axios' import { Descriptions, Spin, Space, Button, message, Progress, Typography, Collapse } from 'antd' import { LoadingOutlined, CaretRightOutlined } from '@ant-design/icons' import TimeDisplay from '../../common/TimeDisplay' import JobState from '../../common/JobState' import IdText from '../../common/IdText' import SubJobsTree from '../../common/SubJobsTree' import { SocketContext } from '../../context/SocketContext' import GCodeFileIcon from '../../../Icons/GCodeFileIcon' import ReloadIcon from '../../../Icons/ReloadIcon' import useCollapseState from '../../hooks/useCollapseState' import config from '../../../../config' const { Title } = Typography const PrintJobInfo = () => { const [printJobData, setPrintJobData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const location = useLocation() const [messageApi] = message.useMessage() const printJobId = new URLSearchParams(location.search).get('printJobId') const { socket } = useContext(SocketContext) const [collapseState, updateCollapseState] = useCollapseState( 'PrintJobInfo', { info: true, subJobs: true } ) useEffect(() => { if (printJobId) { fetchPrintJobDetails() } }, [printJobId]) useEffect(() => { if (socket && printJobId) { socket.on('notify_job_update', (updateData) => { if (updateData._id === printJobId) { setPrintJobData((prevData) => { if (!prevData) return prevData return { ...prevData, state: updateData.state, ...updateData } }) } }) } return () => { if (socket) { socket.off('notify_job_update') } } }, [socket, printJobId]) const fetchPrintJobDetails = async () => { try { setLoading(true) const response = await axios.get( `${config.backendUrl}/printjobs/${printJobId}`, { headers: { Accept: 'application/json' }, withCredentials: true // Important for including cookies } ) setPrintJobData(response.data) setError(null) } catch (err) { setError('Failed to fetch print job details') messageApi.error('Failed to fetch print job details') } finally { setLoading(false) } } if (loading) { return (
} />
) } if (error || !printJobData) { return (

{error || 'Print job not found'}

) } return (
updateCollapseState('info', keys.length > 0)} expandIcon={({ isActive }) => ( )} className='no-h-padding-collapse no-t-padding-collapse' > Print Job Information } key='1' > {printJobData.gcodeFile?.name || 'Not specified'} {printJobData.quantity || 1} {printJobData.startedAt ? ( ) : ( 'n/a' )} {printJobData.state.type === 'printing' && ( )} {printJobData.printers?.length > 0 ? ( {printJobData.printers.length} printers assigned ) : ( 'Any available printer' )} updateCollapseState('subJobs', keys.length > 0)} expandIcon={({ isActive }) => ( )} className='no-h-padding-collapse' > Sub Job Information } key='2' >
) } export default PrintJobInfo