import React, { useState, useEffect } from 'react' import { useLocation } from 'react-router-dom' import axios from 'axios' import { Descriptions, Spin, Space, Button, message, Badge, Form, Typography, Flex, Input, Card, Collapse } from 'antd' import { LoadingOutlined, CaretRightOutlined } from '@ant-design/icons' import IdText from '../../common/IdText.jsx' import { capitalizeFirstLetter } from '../../utils/Utils.js' import FilamentSelect from '../../common/FilamentSelect' import useCollapseState from '../../hooks/useCollapseState' import FilamentIcon from '../../../Icons/FilamentIcon' import TimeDisplay from '../../common/TimeDisplay.jsx' import ReloadIcon from '../../../Icons/ReloadIcon' import EditIcon from '../../../Icons/EditIcon.jsx' import XMarkIcon from '../../../Icons/XMarkIcon.jsx' import CheckIcon from '../../../Icons/CheckIcon.jsx' import config from '../../../../config.js' const { Title } = Typography const GCodeFileInfo = () => { const [gcodeFileData, setGCodeFileData] = useState(null) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const location = useLocation() const [messageApi, contextHolder] = message.useMessage() const gcodeFileId = new URLSearchParams(location.search).get('gcodeFileId') const [isEditing, setIsEditing] = useState(false) const [form] = Form.useForm() const [fetchLoading, setFetchLoading] = useState(true) const [collapseState, updateCollapseState] = useCollapseState( 'GCodeFileInfo', { info: true, preview: true } ) useEffect(() => { if (gcodeFileId) { fetchGCodeFileDetails() } }, [gcodeFileId]) useEffect(() => { if (gcodeFileData) { form.setFieldsValue({ name: gcodeFileData.name || '', filament: gcodeFileData.filament || { id: null, name: '' } }) } }, [gcodeFileData, form]) const fetchGCodeFileDetails = async () => { try { setFetchLoading(true) const response = await axios.get( `${config.backendUrl}/gcodefiles/${gcodeFileId}`, { headers: { Accept: 'application/json' }, withCredentials: true } ) setGCodeFileData(response.data) setError(null) } catch (err) { setError('Failed to fetch GCodeFile details') messageApi.error('Failed to fetch GCodeFile details') } finally { setFetchLoading(false) } } const startEditing = () => { setIsEditing(true) updateCollapseState('info', true) } const cancelEditing = () => { form.setFieldsValue({ name: gcodeFileData?.name || '', filament: gcodeFileData?.filament || { id: null, name: '' } }) setIsEditing(false) } const updateInfo = async () => { try { const values = await form.validateFields() setLoading(true) await axios.put( `${config.backendUrl}/gcodefiles/${gcodeFileId}`, values, { headers: { 'Content-Type': 'application/json' }, withCredentials: true } ) setGCodeFileData({ ...gcodeFileData, ...values }) setIsEditing(false) messageApi.success('GCode File information updated successfully') } catch (err) { if (err.errorFields) { return } console.error('Failed to update gcode file information:', err) messageApi.error('Failed to update gcode file information') } finally { fetchGCodeFileDetails() setLoading(false) } } if (error || !gcodeFileData) { return (

{error || 'GCodeFile not found'}

) } if (fetchLoading) { return (
} />
) } return (
{contextHolder} updateCollapseState('info', keys.length > 0)} expandIcon={({ isActive }) => ( )} className='no-h-padding-collapse no-t-padding-collapse' > GCode File Information {isEditing ? ( <>
) } export default GCodeFileInfo