import { useContext, useEffect, useState } from 'react' import { Divider, Flex, Layout, Typography, Button, Badge, Modal } from 'antd' import { LoadingOutlined } from '@ant-design/icons' import { useLocation } from 'react-router-dom' import ControlPrinter from './ControlPrinter.jsx' import SlicerUploadFlow from './SlicerUploadFlow.jsx' import PrinterIcon from '../../../Icons/PrinterIcon.jsx' import ObjectForm from '../../common/ObjectForm.jsx' import FileIcon from '../../../Icons/FileIcon.jsx' import ObjectProperty from '../../common/ObjectProperty.jsx' import { getModelProperty } from '../../../../database/ObjectModels.js' import { ApiServerContext } from '../../context/ApiServerContext.jsx' import { useThemeContext } from '../../context/ThemeContext.jsx' const { Content } = Layout const { Title } = Typography const SlicerIntegration = () => { const location = useLocation() const printerId = new URLSearchParams(location.search).get('printerId') const { updateObject } = useContext(ApiServerContext) const [pendingSlicerUploads, setPendingSlicerUploads] = useState([]) const [currentPendingSlicerUpload, setCurrentPendingSlicerUpload] = useState(null) const { setPrimaryColorOverride } = useThemeContext() useEffect(() => { setPrimaryColorOverride('#00baa8') }, [setPrimaryColorOverride]) const [objectFormState, setEditFormState] = useState({ isEditing: false, editLoading: false, formValid: false, activities: [], loading: false, objectData: { pendingSlicerUploads: [] } }) const [showSlicerUploadFlow, setShowSlicerUploadFlow] = useState(false) useEffect(() => { setPendingSlicerUploads( objectFormState.objectData?.pendingSlicerUploads || [] ) }, [objectFormState.objectData?.pendingSlicerUploads]) useEffect(() => { const nextUpload = pendingSlicerUploads.find( (upload) => upload.new === true ) if (nextUpload) { setCurrentPendingSlicerUpload(nextUpload) setShowSlicerUploadFlow(true) } else { setCurrentPendingSlicerUpload(null) setShowSlicerUploadFlow(false) } }, [pendingSlicerUploads]) const showPendingSlicerUpload = () => { const upload = pendingSlicerUploads.find( (pendingUpload) => pendingUpload.new === true ) || pendingSlicerUploads[0] if (upload) { setCurrentPendingSlicerUpload(upload) setShowSlicerUploadFlow(true) } } const handleGCodeFileCreated = async (gcodeFile) => { const updatedUploads = pendingSlicerUploads.map((upload) => upload._id === currentPendingSlicerUpload?._id ? { ...upload, gcodeFile: gcodeFile } : upload ) setPendingSlicerUploads(updatedUploads) setCurrentPendingSlicerUpload((previous) => ({ ...previous, gcodeFile })) await updateObject(printerId, 'printer', { ...objectFormState.objectData, pendingSlicerUploads: updatedUploads }) } const handleJobCreated = async (job) => { const updatedUploads = pendingSlicerUploads.map((upload) => upload._id === currentPendingSlicerUpload?._id ? { ...upload, job } : upload ) setPendingSlicerUploads(updatedUploads) setCurrentPendingSlicerUpload((previous) => ({ ...previous, job })) await updateObject(printerId, 'printer', { ...objectFormState.objectData, pendingSlicerUploads: updatedUploads }) } const handleSlicerUploadComplete = async () => { const updatedUploads = pendingSlicerUploads.filter( (upload) => upload._id !== currentPendingSlicerUpload?._id ) setPendingSlicerUploads(updatedUploads) await updateObject(printerId, 'printer', { ...objectFormState.objectData, pendingSlicerUploads: updatedUploads }) } const handleSlicerUploadFlowClosed = async () => { const updatedUploads = pendingSlicerUploads.map((upload) => upload._id === currentPendingSlicerUpload?._id ? { ...upload, new: false } : upload ) setPendingSlicerUploads(updatedUploads) await updateObject(printerId, 'printer', { ...objectFormState.objectData, pendingSlicerUploads: updatedUploads }) } const slicerUploadsButton = () => { if (pendingSlicerUploads.length > 0) { return (