improve perf of filter bar

This commit is contained in:
henrygd
2025-11-07 22:29:59 -05:00
parent 1af7ff600f
commit 9a61ea8356

View File

@@ -42,7 +42,6 @@ import {
chartTimeData, chartTimeData,
cn, cn,
compareSemVer, compareSemVer,
debounce,
decimalString, decimalString,
formatBytes, formatBytes,
secondsToString, secondsToString,
@@ -1042,32 +1041,51 @@ function GpuEnginesChart({ chartData }: { chartData: ChartData }) {
} }
function FilterBar({ store = $containerFilter }: { store?: typeof $containerFilter }) { function FilterBar({ store = $containerFilter }: { store?: typeof $containerFilter }) {
const containerFilter = useStore(store) const storeValue = useStore(store)
const [inputValue, setInputValue] = useState(storeValue)
const { t } = useLingui() const { t } = useLingui()
const debouncedStoreSet = useMemo(() => debounce((value: string) => store.set(value), 80), [store]) useEffect(() => {
setInputValue(storeValue)
}, [storeValue])
useEffect(() => {
if (inputValue === storeValue) {
return
}
const handle = window.setTimeout(() => store.set(inputValue), 80)
return () => clearTimeout(handle)
}, [inputValue, storeValue, store])
const handleChange = useCallback( const handleChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => debouncedStoreSet(e.target.value), (e: React.ChangeEvent<HTMLInputElement>) => {
[debouncedStoreSet] const value = e.target.value
setInputValue(value)
},
[]
) )
const handleClear = useCallback(() => {
setInputValue("")
store.set("")
}, [store])
return ( return (
<> <>
<Input <Input
placeholder={t`Filter...`} placeholder={t`Filter...`}
className="ps-4 pe-8 w-full sm:w-44" className="ps-4 pe-8 w-full sm:w-44"
onChange={handleChange} onChange={handleChange}
value={containerFilter} value={inputValue}
/> />
{containerFilter && ( {inputValue && (
<Button <Button
type="button" type="button"
variant="ghost" variant="ghost"
size="icon" size="icon"
aria-label="Clear" aria-label="Clear"
className="absolute right-1 top-1/2 -translate-y-1/2 h-7 w-7 text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-100" className="absolute right-1 top-1/2 -translate-y-1/2 h-7 w-7 text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-100"
onClick={() => store.set("")} onClick={handleClear}
> >
<XIcon className="h-4 w-4" /> <XIcon className="h-4 w-4" />
</Button> </Button>