import PropTypes from 'prop-types' import { Badge, Progress, Flex, Space, Tag, Typography } from 'antd' import { green, red } from '@ant-design/colors' import React, { useState, useContext, useEffect } from 'react' import { SocketContext } from '../context/SocketContext' const FilamentStockState = ({ filamentStock, showProgress = true, showStatus = true, showFilamentStockName = true }) => { const { socket } = useContext(SocketContext) const [badgeStatus, setBadgeStatus] = useState('unknown') const [badgeText, setBadgeText] = useState('Unknown') const [currentState, setCurrentState] = useState( filamentStock?.state || { type: 'unknown', progress: 0 } ) const [initialized, setInitialized] = useState(false) const { Text } = Typography useEffect(() => { if (socket && !initialized && filamentStock?._id) { setInitialized(true) socket.on('notify_filamentstock_update', (statusUpdate) => { if (statusUpdate?.id === filamentStock._id && statusUpdate?.state) { setCurrentState(statusUpdate.state) } }) } return () => { if (socket && initialized) { socket.off('notify_filamentstock_update') } } }, [socket, initialized, filamentStock?._id]) useEffect(() => { switch (currentState.type) { case 'unconsumed': setBadgeStatus('success') setBadgeText('Unconsumed') break case 'partiallyconsumed': setBadgeStatus('warning') setBadgeText('Partially Consumed') break case 'fullyconsumed': setBadgeStatus('error') setBadgeText('Fully Consumed') break case 'error': setBadgeStatus('error') setBadgeText('Error') break default: setBadgeStatus('default') setBadgeText(currentState.type) } }, [currentState]) return ( {showFilamentStockName && {filamentStock.name}} {showStatus && ( {badgeText} )} {showProgress && currentState.type === 'partiallyconsumed' ? ( ) : null} ) } FilamentStockState.propTypes = { filamentStock: PropTypes.shape({ _id: PropTypes.string, name: PropTypes.string, state: PropTypes.shape({ type: PropTypes.oneOf([ 'unconsumed', 'partiallyconsumed', 'fullyconsumed', 'error', 'unknown' ]), progress: PropTypes.number }) }), showProgress: PropTypes.bool, showStatus: PropTypes.bool, showFilamentStockName: PropTypes.bool } export default FilamentStockState