// GCodeFileSelect.js import PropTypes from 'prop-types' import { TreeSelect, Badge, Space, message } from 'antd' import React, { useEffect, useState, useContext } from 'react' import axios from 'axios' import GCodeFileIcon from '../../Icons/GCodeFileIcon' import { AuthContext } from '../../Auth/AuthContext' const propertyOrder = ['filament.diameter', 'filament.type', 'filament.brand'] const GCodeFileSelect = ({ onChange, filter, useFilter }) => { const [gcodeFilesTreeData, setGCodeFilesTreeData] = useState(null) const [loading, setLoading] = useState(true) const [searchValue, setSearchValue] = useState('') const [messageApi] = message.useMessage() const { authenticated } = useContext(AuthContext) const fetchGCodeFilesData = async (property, filter, search) => { if (!authenticated) { return } setLoading(true) try { const response = await axios.get('http://localhost:8080/gcodefiles', { params: { ...filter, search, property }, headers: { Accept: 'application/json' }, withCredentials: true // Important for including cookies }) setLoading(false) return response.data // setPagination({ ...pagination, total: response.data.totalItems }); // Update total count } catch (error) { if (error.response) { // For other errors, show a message messageApi.error('Error fetching GCode files:', error.response.status) } else { messageApi.error( 'An unexpected error occurred. Please try again later.' ) } } } const getFilter = (node) => { const filter = {} let currentId = node.id while (currentId != 0) { const currentNode = gcodeFilesTreeData.filter( (treeData) => treeData['id'] === currentId )[0] filter[propertyOrder[currentNode.propertyId]] = currentNode.value.split('-')[0] currentId = currentNode.pId } return filter } const generateGCodeFileTreeNodes = async (node = null, filter = null) => { if (!node) { return } if (filter === null) { filter = getFilter(node) } let search = null if (searchValue != '') { search = searchValue } const gcodeFileData = await fetchGCodeFilesData(null, filter, search) let newNodeList = [] for (var i = 0; i < gcodeFileData.length; i++) { const gcodeFile = gcodeFileData[i] const random = Math.random().toString(36).substring(2, 6) const newNode = { id: random, pId: node.id, value: gcodeFile._id, key: gcodeFile._id, title: ( ), isLeaf: true } newNodeList.push(newNode) } return newNodeList } const generateGCodeFileCategoryTreeNodes = async (node = null) => { var filter = {} var propertyId = 0 if (!node) { node = {} node.id = 0 } else { filter = getFilter(node) propertyId = node.propertyId + 1 } const propertyName = propertyOrder[propertyId] const propertyData = await fetchGCodeFilesData(propertyName, filter) const newNodeList = [] for (var i = 0; i < propertyData.length; i++) { const property = propertyData[i][propertyName.split('.')[0]][propertyName.split('.')[1]] const random = Math.random().toString(36).substring(2, 6) const newNode = { id: random, pId: node.id, value: property + '-' + random, key: property + '-' + random, propertyId: propertyId, title: property, isLeaf: false, selectable: false } newNodeList.push(newNode) } return newNodeList } const handleGCodeFilesTreeLoad = async (node) => { if (node) { if (node.propertyId !== propertyOrder.length - 1) { setGCodeFilesTreeData( gcodeFilesTreeData.concat( await generateGCodeFileCategoryTreeNodes(node) ) ) } else { setGCodeFilesTreeData( gcodeFilesTreeData.concat(await generateGCodeFileTreeNodes(node)) ) // End of properties } } else { setGCodeFilesTreeData(await generateGCodeFileCategoryTreeNodes(null)) // First property } } const handleGCodeFilesSearch = (value) => { setSearchValue(value) setGCodeFilesTreeData(null) } useEffect(() => { setGCodeFilesTreeData([]) }, [filter, useFilter]) useEffect(() => { if (gcodeFilesTreeData === null) { if (useFilter === true || searchValue != '') { setGCodeFilesTreeData(generateGCodeFileTreeNodes({ id: 0 }, filter)) } else { handleGCodeFilesTreeLoad(null) } } }, [gcodeFilesTreeData]) return ( ) } GCodeFileSelect.propTypes = { onChange: PropTypes.func.isRequired, filter: PropTypes.string.isRequired, useFilter: PropTypes.bool.isRequired } export default GCodeFileSelect