import PropTypes from 'prop-types' import { Typography, Flex, Badge } from 'antd' import { useState, useEffect, useContext, useCallback } from 'react' import { getModelByName } from '../../../database/ObjectModels' import { ApiServerContext } from '../context/ApiServerContext' import { AuthContext } from '../context/AuthContext' import merge from 'lodash/merge' const { Text } = Typography const ObjectDisplay = ({ object, objectType }) => { const [objectData, setObjectData] = useState(object) const { subscribeToObjectUpdates, connected } = useContext(ApiServerContext) const { token } = useContext(AuthContext) // Update event handler const updateObjectEventHandler = useCallback((value) => { setObjectData((prev) => merge({}, prev, value)) }, []) // Subscribe to object updates when component mounts useEffect(() => { if (object?._id && objectType && connected && token) { const objectUpdatesUnsubscribe = subscribeToObjectUpdates( object._id, objectType, updateObjectEventHandler ) return () => { if (objectUpdatesUnsubscribe) objectUpdatesUnsubscribe() } } }, [ object?._id, objectType, subscribeToObjectUpdates, connected, token, updateObjectEventHandler ]) // Update local state when object prop changes useEffect(() => { setObjectData(object) }, [object]) if (!objectData) { return n/a } const model = getModelByName(objectType) const Icon = model.icon return ( {objectData?.color ? : null} {objectData?.name ? objectData.name : null} ) } ObjectDisplay.propTypes = { object: PropTypes.object, objectType: PropTypes.string, style: PropTypes.object } export default ObjectDisplay