Skip to content

Commit bfe28f0

Browse files
authored
fix(core): wrap setFiltersFn with useCallback (#6386) (resolves #6385)
1 parent 58e90f2 commit bfe28f0

File tree

2 files changed

+56
-31
lines changed

2 files changed

+56
-31
lines changed

.changeset/spotty-jokes-swim.md

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
"@refinedev/core": patch
3+
---
4+
5+
fix(core): wrap `setFilters` and `setSorters` methods with `useCallback` to prevent looping re-renders
6+
7+
With this we can use the setFilters as dependencies inside useEffects without infinite loop since state changes in the hook won't cause the functions to be re-assigned
8+
9+
[Fixes #6385](https://github.com/refinedev/refine/issues/6385)

packages/core/src/hooks/useTable/index.ts

+47-31
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect } from "react";
1+
import React, { useState, useEffect, useCallback } from "react";
22

33
import type {
44
QueryObserverResult,
@@ -520,40 +520,56 @@ export function useTable<
520520
dataProviderName,
521521
});
522522

523-
const setFiltersAsMerge = (newFilters: CrudFilter[]) => {
524-
setFilters((prevFilters) =>
525-
unionFilters(preferredPermanentFilters, newFilters, prevFilters),
526-
);
527-
};
523+
const setFiltersAsMerge = useCallback(
524+
(newFilters: CrudFilter[]) => {
525+
setFilters((prevFilters) =>
526+
unionFilters(preferredPermanentFilters, newFilters, prevFilters),
527+
);
528+
},
529+
[preferredPermanentFilters],
530+
);
528531

529-
const setFiltersAsReplace = (newFilters: CrudFilter[]) => {
530-
setFilters(unionFilters(preferredPermanentFilters, newFilters));
531-
};
532+
const setFiltersAsReplace = useCallback(
533+
(newFilters: CrudFilter[]) => {
534+
setFilters(unionFilters(preferredPermanentFilters, newFilters));
535+
},
536+
[preferredPermanentFilters],
537+
);
532538

533-
const setFiltersWithSetter = (
534-
setter: (prevFilters: CrudFilter[]) => CrudFilter[],
535-
) => {
536-
setFilters((prev) => unionFilters(preferredPermanentFilters, setter(prev)));
537-
};
539+
const setFiltersWithSetter = useCallback(
540+
(setter: (prevFilters: CrudFilter[]) => CrudFilter[]) => {
541+
setFilters((prev) =>
542+
unionFilters(preferredPermanentFilters, setter(prev)),
543+
);
544+
},
545+
[preferredPermanentFilters],
546+
);
538547

539-
const setFiltersFn: useTableReturnType<TQueryFnData>["setFilters"] = (
540-
setterOrFilters,
541-
behavior: SetFilterBehavior = prefferedFilterBehavior,
542-
) => {
543-
if (typeof setterOrFilters === "function") {
544-
setFiltersWithSetter(setterOrFilters);
545-
} else {
546-
if (behavior === "replace") {
547-
setFiltersAsReplace(setterOrFilters);
548-
} else {
549-
setFiltersAsMerge(setterOrFilters);
550-
}
551-
}
552-
};
548+
const setFiltersFn: useTableReturnType<TQueryFnData>["setFilters"] =
549+
useCallback(
550+
(
551+
setterOrFilters,
552+
behavior: SetFilterBehavior = prefferedFilterBehavior,
553+
) => {
554+
if (typeof setterOrFilters === "function") {
555+
setFiltersWithSetter(setterOrFilters);
556+
} else {
557+
if (behavior === "replace") {
558+
setFiltersAsReplace(setterOrFilters);
559+
} else {
560+
setFiltersAsMerge(setterOrFilters);
561+
}
562+
}
563+
},
564+
[setFiltersWithSetter, setFiltersAsReplace, setFiltersAsMerge],
565+
);
553566

554-
const setSortWithUnion = (newSorter: CrudSort[]) => {
555-
setSorters(() => unionSorters(preferredPermanentSorters, newSorter));
556-
};
567+
const setSortWithUnion = useCallback(
568+
(newSorter: CrudSort[]) => {
569+
setSorters(() => unionSorters(preferredPermanentSorters, newSorter));
570+
},
571+
[preferredPermanentSorters],
572+
);
557573

558574
const { elapsedTime } = useLoadingOvertime({
559575
isLoading: queryResult.isFetching,

0 commit comments

Comments
 (0)