// PrinterTemperaturePanel.js import { useContext, useState, useEffect } from 'react' import { Progress, Typography, Spin, Flex, Space, Collapse, InputNumber, Button } from 'antd' import { LoadingOutlined, CaretRightOutlined } from '@ant-design/icons' import styled from 'styled-components' import PropTypes from 'prop-types' import { ApiServerContext } from '../context/ApiServerContext' import merge from 'lodash/merge' const { Text } = Typography const { Panel } = Collapse const CustomCollapse = styled(Collapse)` .ant-collapse-header { padding: 0 !important; } .ant-collapse-content-box { padding-left: 0 !important; padding-right: 0 !important; padding-bottom: 0 !important; } ` const PrinterTemperaturePanel = ({ id, showExtruderControls = true, showBedControls = true, showExtruder = true, showBed = true, showMoreInfo = true }) => { const [temperatureData, setTemperatureData] = useState({ extruder: { current: 0, target: 0, power: 0 }, bed: { current: 0, target: 0, power: 0 }, pinda: 0, ambiant: 0 }) const { subscribeToObjectEvent, connected, sendObjectAction } = useContext(ApiServerContext) // Sync input values with actual temperature targets useEffect(() => { if (temperatureData.extruder?.target !== undefined) { setExtruderTarget(temperatureData.extruder.target) } }, [temperatureData.extruder?.target]) useEffect(() => { if (temperatureData.bed?.target !== undefined) { setBedTarget(temperatureData.bed.target) } }, [temperatureData.bed?.target]) useEffect(() => { if (id && connected) { const temperatureEventUnsubscribe = subscribeToObjectEvent( id, 'printer', 'temperature', (event) => { setTemperatureData((prev) => { const merged = merge({}, prev, event.data) return merged }) } ) return () => { if (temperatureEventUnsubscribe) temperatureEventUnsubscribe() } } }, [id, connected]) const [extruderTarget, setExtruderTarget] = useState(0) const [bedTarget, setBedTarget] = useState(0) const handleSetTemperature = async (data) => { if (id && connected == true) { await sendObjectAction( id, 'printer', { type: 'setTemperature', data }, (result) => { console.log('setTemperatureResult', result) } ) } } const moreInfoItems = [ { key: '1', label: 'More Temperature Data', children: ( <> Hot End Power:{' '} {Math.round((temperatureData.extruder.power || 0) * 100)}% Bed Power: {Math.round((temperatureData.bed.power || 0) * 100)}% {typeof temperatureData.pinda !== 'undefined' && ( Pinda Temp: {temperatureData.pindaTemp}°C )} {typeof temperatureData.ambiant !== 'undefined' && ( Ambient Actual: {temperatureData.ambiant}°C )} ) } ] return (
{temperatureData ? ( {temperatureData.extruder && showExtruder && ( Hot End: {temperatureData.extruder.current}°C /{' '} {temperatureData.extruder.target}°C {showExtruderControls && ( setExtruderTarget(value || 0)} onPressEnter={() => handleSetTemperature({ extruder: { target: extruderTarget } }) } /> )} )} {temperatureData.bed && showBed && ( Heated Bed: {temperatureData.bed.current}°C /{' '} {temperatureData.bed.target}°C {showBedControls && ( setBedTarget(value || 0)} onPressEnter={() => handleSetTemperature({ bed: { target: bedTarget } }) } /> )} )} {showMoreInfo === true && ( ( )} /> )} ) : ( } size='large' /> )}
) } PrinterTemperaturePanel.propTypes = { id: PropTypes.string.isRequired, showExtruderControls: PropTypes.bool, showBedControls: PropTypes.bool, showExtruder: PropTypes.bool, showBed: PropTypes.bool, showMoreInfo: PropTypes.bool, shouldUnsubscribe: PropTypes.bool } export default PrinterTemperaturePanel