Skip to content

Commit 51c0e67

Browse files
committed
feat(ProductTable): use startTransition and useDeferredValue for smoother filter updates
1 parent 0c6dd2c commit 51c0e67

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

src/components/ProductTable/index.tsx

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { useCallback, useEffect, useMemo, useState } from "react"
1+
import {
2+
startTransition,
3+
useCallback,
4+
useDeferredValue,
5+
useEffect,
6+
useMemo,
7+
useState,
8+
} from "react"
29
import { useSearchParams } from "next/navigation"
310

411
import type { FilterOption, TPresetFilters } from "@/lib/types"
@@ -77,23 +84,27 @@ const ProductTable = <T extends { id: string }>({
7784

7885
const updateFilters = useCallback(
7986
(filters: FilterOption | FilterOption[]) => {
80-
setFilters((prevFilters) => {
81-
return prevFilters.map((prevFilter) => {
82-
const filter = Array.isArray(filters)
83-
? filters.find((f) => f.title === prevFilter.title)
84-
: filters.title === prevFilter.title
85-
? filters
86-
: prevFilter
87-
if (!filter) return prevFilter
88-
return filter
87+
startTransition(() => {
88+
setFilters((prevFilters) => {
89+
return prevFilters.map((prevFilter) => {
90+
const filter = Array.isArray(filters)
91+
? filters.find((f) => f.title === prevFilter.title)
92+
: filters.title === prevFilter.title
93+
? filters
94+
: prevFilter
95+
if (!filter) return prevFilter
96+
return filter
97+
})
8998
})
9099
})
91100
},
92101
[]
93102
)
94103

95104
const resetFilters = useCallback(() => {
96-
setFilters(initialFilters)
105+
startTransition(() => {
106+
setFilters(initialFilters)
107+
})
97108
onResetFilters?.()
98109
}, [initialFilters, onResetFilters])
99110

@@ -114,10 +125,7 @@ const ProductTable = <T extends { id: string }>({
114125
})
115126
}, [filteredData, presetFilters])
116127

117-
const activeFiltersCount = useMemo(
118-
() => getActiveFiltersCount(filters),
119-
[filters]
120-
)
128+
const activeFiltersCount = useDeferredValue(getActiveFiltersCount(filters))
121129

122130
return (
123131
<div>

0 commit comments

Comments
 (0)