import { useState, useRef, useEffect, useContext, useMemo } from 'react'
import { useLocation } from 'react-router-dom'
import { Space, Flex, Card, Splitter, Divider } from 'antd'
import loglevel from 'loglevel'
import config from '../../../../config.js'
import useCollapseState from '../../hooks/useCollapseState.jsx'
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 ActionHandler from '../../common/ActionHandler.jsx'
import ObjectActions from '../../common/ObjectActions.jsx'
import { useActions } from '../../context/ActionsContext'
import { useDashboardObjectTools } from '../../context/DashboardObjectToolsContext'
import PropTypes from 'prop-types'
import ObjectInfo from '../../common/ObjectInfo.jsx'
import PrinterIcon from '../../../Icons/PrinterIcon.jsx'
import MultiMotionIcon from '../../../Icons/MultiMotionIcon.jsx'
import SettingsIcon from '../../../Icons/SettingsIcon.jsx'
import PrinterTemperaturePanel from '../../common/PrinterTemperaturePanel.jsx'
import PrinterPositionPanel from '../../common/PrinterPositionPanel.jsx'
import PrinterMovementPanel from '../../common/PrinterMovementPanel.jsx'
import PrinterMiscPanel from '../../common/PrinterMiscPanel.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 ScrollBox from '../../common/ScrollBox.jsx'
import ObjectTableNavigationButtons from '../../common/ObjectTableNavigationButtons.jsx'
import PrinterControlButtons from '../../common/PrinterControlButtons.jsx'
const log = loglevel.getLogger('ControlPrinter')
log.setLevel(config.logLevel)
const ControlPrinter = ({ slicerIntegration = false }) => {
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,
misc: true
}
)
const { connected, sendObjectAction } = useContext(ApiServerContext)
const { setCurrentObject, setCurrentObjectType, setOnModalOk } = useActions()
const [sideBarVisible, setSideBarVisible] = useState(
collapseState.temperature ||
collapseState.position ||
collapseState.movement ||
collapseState.misc
)
const [objectFormState, setEditFormState] = useState({
isEditing: false,
editLoading: false,
formValid: false,
activities: [],
loading: false,
objectData: {}
})
useEffect(() => {
setSideBarVisible(
collapseState.temperature ||
collapseState.position ||
collapseState.movement ||
collapseState.misc
)
}, [collapseState])
useEffect(() => {
setCurrentObjectType('printer')
return () => {
setCurrentObject(null)
setCurrentObjectType(null)
}
}, [setCurrentObject, setCurrentObjectType])
useEffect(() => {
if (objectFormState.objectData?._id) {
setCurrentObject(objectFormState.objectData)
}
}, [objectFormState.objectData, setCurrentObject])
useEffect(() => {
setOnModalOk(() => () => {
objectFormRef.current?.handleFetchObject?.()
})
return () => setOnModalOk(null)
}, [setOnModalOk])
const currentObjectTools = useMemo(
() =>
!slicerIntegration ? (
) : null,
[objectFormState.loading, printerId, slicerIntegration]
)
useDashboardObjectTools(currentObjectTools)
const actions = {
edit: () => {
objectFormRef?.current.startEditing()
return false
},
cancelEdit: () => {
objectFormRef?.current.cancelEditing()
return true
},
finishEdit: () => {
objectFormRef?.current.handleUpdate()
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
}
}
const sideBarItems = (
}
collapseKey='temperature'
active={collapseState.temperature}
onToggle={(expanded) => updateCollapseState('temperature', expanded)}
>
}
collapseKey='position'
active={collapseState.position}
onToggle={(expanded) => updateCollapseState('position', expanded)}
>
}
collapseKey='movement'
active={collapseState.movement}
onToggle={(expanded) => updateCollapseState('movement', expanded)}
>
}
collapseKey='misc'
active={collapseState.misc}
onToggle={(expanded) => updateCollapseState('misc', expanded)}
>
)
return (
<>
actionHandlerRef.current?.callAction(action)
}
objectData={objectFormState.objectData}
disabled={
!objectFormState.objectData?.online || objectFormState.loading
}
loading={objectFormState.loading}
/>
}
collapseKey='printer'
active={collapseState.printer}
onToggle={(expanded) =>
updateCollapseState('printer', expanded)
}
>
{
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'
>
>
)
}
ControlPrinter.propTypes = {
slicerIntegration: PropTypes.bool
}
export default ControlPrinter