import React, { useMemo, FC, useImperativeHandle, useRef } from 'react' import _ from 'lodash' import { flatListFilterWithGroupSelected } from './util' import { FixedSizeList, ListChildComponentProps } from 'react-window' import { ListProps, TreeListItem, ListApi } from './types' import Item from './item' const List = React.forwardRef( ( { flatList, groupSelected, onGroupSelect, selectedValues, onSelectValues, listHeight, listWidth, renderLeafItem, renderGroupItem, activeValue, onActiveValue, findValue, checkboxStatusMap, disabledCheckbox, }, ref ) => { const refList = useRef(null) const showFlatList = useMemo(() => { return flatListFilterWithGroupSelected(flatList, groupSelected) }, [flatList, groupSelected]) useImperativeHandle( ref, () => { return { apiDoScrollToValue: (value: any) => { const index = _.findIndex(showFlatList, (v) => v.data.value === value) if (refList.current) { refList.current.scrollToItem(index) } }, } }, [showFlatList] ) const Row: FC = ({ index, style }) => { const flatItem = showFlatList[index] const status = checkboxStatusMap[flatItem.value] const handleActive = (item: TreeListItem) => { onActiveValue && onActiveValue(item.value, item) } const handleExpand = () => { let newGroupSelected = [] if (groupSelected.includes(flatItem.value)) { newGroupSelected = _.difference( groupSelected, [flatItem.value].concat(flatItem.unLeafValues) ) } else { newGroupSelected = groupSelected.concat([flatItem.value]) } onGroupSelect(newGroupSelected) } const handleCheck = () => { if (flatItem.isLeaf) { if (!status.checked) { onSelectValues(_.uniq(selectedValues.concat([flatItem.value]))) } else { onSelectValues(_.difference(selectedValues, [flatItem.value])) } } else { if (!status.checked) { onSelectValues(_.uniq(selectedValues.concat(flatItem.leafValues))) } else { onSelectValues(_.difference(selectedValues, flatItem.leafValues)) } } } return ( ) } return ( {Row} ) } ) export default List