import { useState, useRef, useEffect, useContext } from 'react' import { useLocation } from 'react-router-dom' import { Space, Flex, Card, Splitter, Divider, Modal } from 'antd' import loglevel from 'loglevel' import config from '../../../../config.js' import useCollapseState from '../../hooks/useCollapseState.js' import NotesPanel from '../../common/NotesPanel.jsx' import InfoCollapse from '../../common/InfoCollapse.jsx' import ViewButton from '../../common/ViewButton.jsx' import NoteIcon from '../../../Icons/NoteIcon.jsx' import ObjectForm from '../../common/ObjectForm.jsx' import EditButtons from '../../common/EditButtons.jsx' import ActionHandler from '../../common/ActionHandler.jsx' import ObjectActions from '../../common/ObjectActions.jsx' import ObjectInfo from '../../common/ObjectInfo.jsx' import PrinterIcon from '../../../Icons/PrinterIcon.jsx' import PrinterTemperaturePanel from '../../common/PrinterTemperaturePanel.jsx' import PrinterPositionPanel from '../../common/PrinterPositionPanel.jsx' import PrinterMovementPanel from '../../common/PrinterMovementPanel.jsx' import JobIcon from '../../../Icons/JobIcon.jsx' import SubJobIcon from '../../../Icons/SubJobIcon.jsx' import FilamentStockIcon from '../../../Icons/FilamentStockIcon.jsx' import MissingPlaceholder from '../../common/MissingPlaceholder.jsx' import { useMediaQuery } from 'react-responsive' import AlertsDisplay from '../../common/AlertsDisplay.jsx' import { ApiServerContext } from '../../context/ApiServerContext.jsx' import LoadFilamentStock from '../../Inventory/FilamentStocks/LoadFilamentStock.jsx' import UnloadFilamentStock from '../../Inventory/FilamentStocks/UnloadFilamentStock.jsx' import ScrollBox from '../../common/ScrollBox.jsx' const log = loglevel.getLogger('ControlPrinter') log.setLevel(config.logLevel) const ControlPrinter = () => { const location = useLocation() const objectFormRef = useRef(null) const actionHandlerRef = useRef(null) const isMobile = useMediaQuery({ maxWidth: 768 }) const printerId = new URLSearchParams(location.search).get('printerId') const [collapseState, updateCollapseState] = useCollapseState( 'ControlPrinter', { printer: true, job: true, subjob: true, filamentStock: true, temperature: true, position: true, movement: true } ) const { connected, sendObjectAction } = useContext(ApiServerContext) const [sideBarVisible, setSideBarVisible] = useState( collapseState.temperature || collapseState.position || collapseState.movement ) const [loadFilamentStockOpen, setLoadFilamentStockOpen] = useState(false) const [unloadFilamentStockOpen, setUnloadFilamentStockOpen] = useState(false) useEffect(() => { setSideBarVisible( collapseState.temperature || collapseState.position || collapseState.movement ) }, [collapseState]) const [objectFormState, setEditFormState] = useState({ isEditing: false, editLoading: false, formValid: false, locked: false, loading: false, objectData: {} }) const actions = { reload: () => { objectFormRef?.current.handleFetchObject() return true }, edit: () => { objectFormRef?.current.startEditing() return false }, cancelEdit: () => { objectFormRef?.current.cancelEditing() return true }, finishEdit: () => { objectFormRef?.current.handleUpdate() return true }, restartFirmware: () => { if (connected == true) { sendObjectAction(printerId, 'printer', { type: 'restartPrinterFirmware' }) } return true }, restartMoonraker: () => { if (connected == true) { sendObjectAction(printerId, 'printer', { type: 'restartMoonraker' }) } return true }, restart: () => { if (connected == true) { sendObjectAction(printerId, 'printer', { type: 'restartPrinter' }) } return true }, startQueue: () => { if (connected == true) { sendObjectAction(printerId, 'printer', { type: 'startQueue' }) } return true }, pauseJob: () => { if (connected == true) { sendObjectAction(printerId, 'printer', { type: 'pauseJob' }) } return true }, resumeJob: () => { if (connected == true) { sendObjectAction(printerId, 'printer', { type: 'resumeJob' }) } return true }, cancelJob: () => { if (connected == true) { sendObjectAction(printerId, 'printer', { type: 'cancelJob' }) } return true }, loadFilamentStock: () => { setLoadFilamentStockOpen(true) return true }, unloadFilamentStock: () => { setUnloadFilamentStockOpen(true) return true } } const sideBarItems = ( {collapseState.temperature && ( )} {collapseState.position && ( )} {collapseState.movement && ( )} ) return ( <> { actionHandlerRef.current.callAction('finishEdit') }} cancelEditing={() => { actionHandlerRef.current.callAction('cancelEdit') }} startEditing={() => { actionHandlerRef.current.callAction('edit') }} editLoading={objectFormState.editLoading} formValid={objectFormState.formValid} disabled={objectFormState.lock?.locked || objectFormState.loading} loading={objectFormState.editLoading} /> } collapseKey='printer' active={collapseState.printer} onToggle={(expanded) => updateCollapseState('printer', expanded) } > { console.log('Got edit form state change', state) setEditFormState((prev) => ({ ...prev, ...state })) }} > {({ loading: printerObjectLoading, objectData: printerObjectData }) => { return ( ) }} } collapseKey='job' active={collapseState.job} onToggle={(expanded) => updateCollapseState('job', expanded) } > {objectFormState.objectData?.currentJob?._id ? ( {}} > {({ loading: jobObjectLoading, objectData: jobObjectData }) => { return ( ) }} ) : ( )} } collapseKey='subJob' active={collapseState.subJob} onToggle={(expanded) => updateCollapseState('subJob', expanded) } > {objectFormState.objectData?.currentSubJob?._id ? ( {}} > {({ loading: subJobObjectLoading, objectData: subJobObjectData }) => { return ( ) }} ) : ( )} } collapseKey='filamentStock' active={collapseState.filamentStock} onToggle={(expanded) => updateCollapseState('filamentStock', expanded) } > {objectFormState.objectData?.currentFilamentStock ?._id ? ( {}} > {({ loading: filamentStockObjectLoading, objectData: filamentStockObjectData }) => { return ( ) }} ) : ( )} {sideBarVisible && !isMobile ? ( {sideBarItems} ) : null} {isMobile ? ( <> {sideBarItems} ) : null} } active={collapseState.notes} onToggle={(expanded) => updateCollapseState('notes', expanded)} collapseKey='notes' > setLoadFilamentStockOpen(false)} footer={null} width='700px' destroyOnHidden={true} > setLoadFilamentStockOpen(false)} reset={false} filamentStockLoaded={false} /> setUnloadFilamentStockOpen(false)} footer={null} width='700px' destroyOnHidden={true} > setUnloadFilamentStockOpen(false)} reset={false} filamentStockLoaded={false} /> ) } export default ControlPrinter