import React from 'react'; // @ts-ignore import 'twin.macro'; import { format } from 'd3'; import debounce from 'lodash/debounce'; const formatNumber = format(','); interface StringFilterProps { value?: string; filteredData: any[]; onChange: (value: string) => void; } export function StringFilter(props: StringFilterProps) { const [localValue, setLocalValue] = React.useState(props.value || ''); const currentValue = React.useRef(''); const updateValue = React.useCallback( debounce(() => { props.onChange(currentValue.current); }, 400), [] ); React.useEffect(() => { updateValue(); currentValue.current = localValue; }, [localValue]); React.useEffect(() => { setLocalValue(props.value || ''); }, [props.value]); return ( setLocalValue(e.target.value)} value={localValue || ''} placeholder={`Filter ${formatNumber(props.filteredData.length)} records`} /> ); }