searchBoxUI
sRect 2022-2-18
import React, { memo, useEffect, useContext, useRef, useState } from 'react';
import { ViewpointContext } from './index';
let searchBox = null;
/* global AV */
const SearchBoxUI = () => {
const [searchVal, setSearchVal] = useState('');
const { viewer, treeBackData, setTreeData } = useContext(ViewpointContext);
const searchBoxWrapRef = useRef(null);
if (!searchBox) {
searchBox = new AV.UI.Searchbox('viewpointSearch-Searchbox', viewer, {
excludeRoot: true,
searchFunction(val) {
setSearchVal(val);
requestAnimationFrame(() => {
this.searchResults.setVisible(false);
});
return false;
},
});
}
const searchFn = e => {
let val = e.target.value;
val = val && val.trim();
if (val.length < 3) {
setSearchVal(val);
}
};
useEffect(() => {
treeBackData.length > 0
? searchBox.searchbox.removeAttribute('disabled')
: searchBox.searchbox.setAttribute('disabled', 'disabled');
}, [treeBackData]);
useEffect(() => {
const searchBoxInput = searchBox?.container?.querySelector('input[type=search]');
const searchBoxClose = searchBox?.container?.querySelector('.search-box-close');
const handleSearchCloseClick = () => setSearchVal('');
searchBoxInput?.addEventListener('input', searchFn, false);
searchBoxClose?.addEventListener('click', handleSearchCloseClick, false);
if (!searchBoxWrapRef.current?.hasChildNodes()) {
searchBoxWrapRef.current?.appendChild(searchBox.container);
}
return () => {
searchBoxInput?.removeEventListener('input', searchFn);
searchBoxClose?.removeEventListener('click', handleSearchCloseClick);
};
}, []);
useEffect(() => {
searchVal
? setTreeData([...treeBackData.filter(({ nodeName }) => nodeName.indexOf(searchVal) > -1)])
: setTreeData([...treeBackData]);
}, [searchVal, setTreeData, treeBackData]);
return <div className="searchBoxWrap" ref={searchBoxWrapRef} />;
};
export default memo(SearchBoxUI);