import React, { useState, useEffect } from "react"
import TreeNodes from "./TreeNodes"
import PropTypes from "prop-types"
import SearchInput from "../SearchInput"
import styles from "./styles.css"
const mapNodes = (filter, nodes) => {
filter = filter.toLowerCase()
return nodes.map(node => {
const label = node.label.toLowerCase()
const hidden = label.indexOf(filter) < 0
return { ...node, props: { hidden } }
})
}
const TreeSelect = React.memo(props => {
const [nodes, setNodes] = useState(props.nodes)
const [visibleNodes, setVisibleNodes] = useState(props.nodes)
const [filter, setFilter] = useState(props.filter || "")
useEffect(
() => {
setFilter(props.filter || "")
},
[props.filter]
)
useEffect(
() => {
const mappedNodes = mapNodes(filter, props.nodes)
setNodes(mappedNodes)
setVisibleNodes(mappedNodes.filter(n => !n.props.hidden))
},
[props.nodes, filter]
)
return (
<div className={styles.root}>
<SearchInput value={filter} onChange={setFilter} />
{!!visibleNodes.length && (
<TreeNodes
nodes={nodes}
onChange={props.onChange}
values={props.values}
unremovableValues={props.unremovableValues}
/>
)}
</div>
)
})
TreeSelect.propTypes = {
nodes: PropTypes.array.isRequired,
values: PropTypes.array
}
export default TreeSelect
|