@axzydev/axzy_ui_system 1.2.14 → 1.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "packageManager": "pnpm@10.34.0",
5
5
  "private": false,
6
6
  "license": "MIT",
7
- "version": "1.2.14",
7
+ "version": "1.2.16",
8
8
  "type": "module",
9
9
  "sideEffects": [
10
10
  "*.css"
@@ -87,42 +87,56 @@ export default function ITDataTable<T extends Record<string, unknown>>({
87
87
  } = useTableState({ defaultItemsPerPage });
88
88
 
89
89
  const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
90
+ const hasFetchedRef = useRef(false);
91
+ const fetchDataRef = useRef(fetchData);
92
+ fetchDataRef.current = fetchData;
93
+ const externalFiltersRef = useRef(externalFilters);
94
+ externalFiltersRef.current = externalFilters;
95
+
96
+ // Snapshot JSON para re-fetch solo cuando los valores cambian (no por nueva
97
+ // identidad del objeto que el padre pase en cada render).
98
+ const externalKey = JSON.stringify(externalFilters);
90
99
 
91
100
  const computedTotalPages = Math.ceil(totalItems / itemsPerPage) || 1;
92
101
 
93
102
  const performFetch = useCallback(async () => {
94
103
  setIsLoading(true);
95
104
  try {
96
- const response = await fetchData({
105
+ const response = await fetchDataRef.current({
97
106
  page: currentPage,
98
107
  limit: itemsPerPage,
99
- filters: { ...filters, ...externalFilters },
108
+ filters: { ...filters, ...externalFiltersRef.current },
100
109
  sort: sortConfig || undefined,
101
110
  });
102
111
  setData(response.data || []);
103
112
  setTotalItems(response.total || 0);
113
+ hasFetchedRef.current = true;
104
114
  } catch (error) {
105
115
  console.error("ITDataTable: Error fetching data", error);
106
116
  setData([]);
107
117
  setTotalItems(0);
118
+ hasFetchedRef.current = true;
108
119
  } finally {
109
120
  setIsLoading(false);
110
121
  }
111
- }, [currentPage, itemsPerPage, filters, sortConfig, fetchData, externalFilters]);
122
+ }, [currentPage, itemsPerPage, filters, sortConfig]);
123
+
124
+ const performFetchRef = useRef(performFetch);
125
+ performFetchRef.current = performFetch;
112
126
 
113
127
  useEffect(() => {
114
- if (!fetchOnMount && data.length === 0 && !isLoading) return;
128
+ if (!fetchOnMount && !hasFetchedRef.current) return;
115
129
 
116
130
  if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
117
131
 
118
132
  debounceTimerRef.current = setTimeout(() => {
119
- performFetch();
133
+ performFetchRef.current();
120
134
  }, debounceMs);
121
135
 
122
136
  return () => {
123
137
  if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
124
138
  };
125
- }, [currentPage, itemsPerPage, sortConfig, filters, externalFilters, reloadTrigger, fetchOnMount, performFetch, data.length, isLoading, debounceMs]);
139
+ }, [currentPage, itemsPerPage, sortConfig, filters, externalKey, reloadTrigger, fetchOnMount, debounceMs]);
126
140
 
127
141
  const renderFilterInput = (col: Column<T>) => {
128
142
  if (!col.filter) return null;