next-data-kit 9.4.0 → 9.5.0

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.
Files changed (40) hide show
  1. package/dist/chunk-5WNOUBGK.js +358 -0
  2. package/dist/chunk-5WNOUBGK.js.map +1 -0
  3. package/dist/chunk-CGB4WIAS.cjs +2657 -0
  4. package/dist/chunk-CGB4WIAS.cjs.map +1 -0
  5. package/dist/chunk-FDSJZI3C.cjs +369 -0
  6. package/dist/chunk-FDSJZI3C.cjs.map +1 -0
  7. package/dist/chunk-WYWJGLGD.js +2613 -0
  8. package/dist/chunk-WYWJGLGD.js.map +1 -0
  9. package/dist/client/components/data-kit-infinity.d.ts +1 -0
  10. package/dist/client/components/data-kit-infinity.d.ts.map +1 -1
  11. package/dist/client/components/data-kit-table.d.ts +1 -0
  12. package/dist/client/components/data-kit-table.d.ts.map +1 -1
  13. package/dist/client/components/data-kit.d.ts +1 -0
  14. package/dist/client/components/data-kit.d.ts.map +1 -1
  15. package/dist/client.cjs +75 -2941
  16. package/dist/client.cjs.map +1 -1
  17. package/dist/client.d.cts +4 -2
  18. package/dist/client.d.ts +0 -1
  19. package/dist/client.d.ts.map +1 -1
  20. package/dist/client.js +2 -2906
  21. package/dist/client.js.map +1 -1
  22. package/dist/index-DUVfK8q6.d.ts +284 -0
  23. package/dist/index-qXbjvUTB.d.cts +284 -0
  24. package/dist/index.cjs +97 -2898
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +3 -2
  27. package/dist/index.d.ts +3 -2
  28. package/dist/index.js +4 -2841
  29. package/dist/index.js.map +1 -1
  30. package/dist/internal/hooks.cjs +12 -0
  31. package/dist/internal/hooks.cjs.map +1 -0
  32. package/dist/internal/hooks.d.cts +1 -0
  33. package/dist/internal/hooks.d.ts +1 -0
  34. package/dist/internal/hooks.js +3 -0
  35. package/dist/internal/hooks.js.map +1 -0
  36. package/dist/useDataKit-XFp3_mUc.d.cts +276 -0
  37. package/dist/useDataKit-XFp3_mUc.d.ts +276 -0
  38. package/package.json +4 -1
  39. package/dist/index-CzDzNX62.d.cts +0 -558
  40. package/dist/index-CzDzNX62.d.ts +0 -558
@@ -0,0 +1,358 @@
1
+ import { useState, useRef, useCallback, useEffect } from 'react';
2
+
3
+ // src/client/hooks/useDataKit.ts
4
+
5
+ // src/client/utils/cn.ts
6
+ var toClassString = (input) => {
7
+ if (!input) return "";
8
+ if (typeof input === "string" || typeof input === "number") return String(input);
9
+ if (Array.isArray(input)) {
10
+ return input.map(toClassString).filter(Boolean).join(" ");
11
+ }
12
+ if (typeof input === "object") {
13
+ return Object.entries(input).filter(([, value]) => Boolean(value)).map(([key]) => key).join(" ");
14
+ }
15
+ return "";
16
+ };
17
+ var cn = (...inputs) => inputs.map(toClassString).filter(Boolean).join(" ");
18
+
19
+ // src/client/utils/index.ts
20
+ var getColumnValue = (item, column) => {
21
+ const { accessor } = column;
22
+ return typeof accessor === "function" ? accessor(item) : item[accessor];
23
+ };
24
+ var getSortValue = (sorts, path) => {
25
+ const sort = sorts.find((s) => s.path === path);
26
+ return sort?.value ?? null;
27
+ };
28
+ var getNextSortValue = (current) => {
29
+ if (current === null) return 1;
30
+ if (current === 1) return -1;
31
+ return null;
32
+ };
33
+ var formatNumber = (num) => num.toLocaleString();
34
+ var debounce = (fn, delay) => {
35
+ let timeoutId;
36
+ return (...args) => {
37
+ clearTimeout(timeoutId);
38
+ timeoutId = setTimeout(() => fn(...args), delay);
39
+ };
40
+ };
41
+ var throttle = (fn, limit) => {
42
+ let inThrottle = false;
43
+ return (...args) => {
44
+ if (!inThrottle) {
45
+ fn(...args);
46
+ inThrottle = true;
47
+ setTimeout(() => {
48
+ inThrottle = false;
49
+ }, limit);
50
+ }
51
+ };
52
+ };
53
+ var sortEntriesToKey = (sorts) => sorts.map((s) => `${s.path}:${s.value}`).join(",");
54
+ var keyToSortEntries = (key) => {
55
+ if (!key) return [];
56
+ return key.split(",").map((part) => {
57
+ const [path, value] = part.split(":");
58
+ return { path: path ?? "", value: parseInt(value ?? "1", 10) };
59
+ });
60
+ };
61
+ var parseUrlParams = (search) => {
62
+ const params = new URLSearchParams(search);
63
+ const state = {};
64
+ const page = params.get("page");
65
+ if (page) state.page = parseInt(page, 10);
66
+ const limit = params.get("limit");
67
+ if (limit) state.limit = parseInt(limit, 10);
68
+ const sort = params.get("sort");
69
+ if (sort) state.sorts = keyToSortEntries(sort);
70
+ const filter = {};
71
+ const query = {};
72
+ params.forEach((value, key) => {
73
+ if (key.startsWith("f_")) filter[key.slice(2)] = value;
74
+ else if (key.startsWith("q_")) query[key.slice(2)] = value;
75
+ });
76
+ if (Object.keys(filter).length > 0) state.filter = filter;
77
+ if (Object.keys(query).length > 0) state.query = query;
78
+ return state;
79
+ };
80
+ var stateToUrlParams = (state) => {
81
+ const params = new URLSearchParams();
82
+ if (state.page && state.page > 1) params.set("page", state.page.toString());
83
+ if (state.limit) params.set("limit", state.limit.toString());
84
+ if (state.sorts && state.sorts.length > 0) params.set("sort", sortEntriesToKey(state.sorts));
85
+ if (state.filter) {
86
+ Object.entries(state.filter).forEach(([key, value]) => {
87
+ if (value !== void 0 && value !== null && value !== "") {
88
+ params.set(`f_${key}`, String(value));
89
+ }
90
+ });
91
+ }
92
+ if (state.query) {
93
+ Object.entries(state.query).forEach(([key, value]) => {
94
+ if (value !== void 0 && value !== null && value !== "") {
95
+ params.set(`q_${key}`, String(value));
96
+ }
97
+ });
98
+ }
99
+ return params;
100
+ };
101
+
102
+ // src/client/hooks/useDataKit.ts
103
+ var useDataKit = (props) => {
104
+ const { initial = {}, memory: memoryMode = "memory", filters, action, onSuccess, onError, autoFetch = true, debounce: debounceDelay = 300 } = props;
105
+ const { page: initialPage = 1, limit: initialLimit = 10, sorts: initialSorts = [], filter: initialFilter = {}, query: initialQuery = {} } = initial;
106
+ const [page, setPageState] = useState(initialPage);
107
+ const [limit, setLimitState] = useState(initialLimit);
108
+ const [sorts, setSortsState] = useState(initialSorts);
109
+ const [filter, setFilterState] = useState(initialFilter);
110
+ const [debouncedFilter, setDebouncedFilter] = useState(initialFilter);
111
+ const [query, setQueryState] = useState(initialQuery);
112
+ const [isLoading, setIsLoading] = useState(false);
113
+ const [error, setError] = useState(null);
114
+ const [items, setItems] = useState([]);
115
+ const [total, setTotal] = useState(0);
116
+ const mounted = useRef(true);
117
+ const fetchIdRef = useRef(0);
118
+ const debounceTimerRef = useRef(null);
119
+ const actionRef = useRef(action);
120
+ const onSuccessRef = useRef(onSuccess);
121
+ const onErrorRef = useRef(onError);
122
+ const filtersRef = useRef(filters);
123
+ actionRef.current = action;
124
+ onSuccessRef.current = onSuccess;
125
+ onErrorRef.current = onError;
126
+ filtersRef.current = filters;
127
+ const getInput = useCallback(() => {
128
+ const input = {
129
+ action: "FETCH",
130
+ page,
131
+ limit,
132
+ sorts,
133
+ filter: debouncedFilter,
134
+ query
135
+ };
136
+ if (filtersRef.current) {
137
+ input.filterConfig = filtersRef.current.reduce((acc, f) => {
138
+ if (f.configuration) acc[f.id] = f.configuration;
139
+ return acc;
140
+ }, {});
141
+ }
142
+ return input;
143
+ }, [page, limit, sorts, debouncedFilter, query]);
144
+ const fetchData = useCallback(async () => {
145
+ const fetchId = ++fetchIdRef.current;
146
+ setIsLoading(true);
147
+ setError(null);
148
+ try {
149
+ const input = getInput();
150
+ const result = await actionRef.current(input);
151
+ if (fetchId !== fetchIdRef.current || !mounted.current) return;
152
+ setItems(result.items);
153
+ setTotal(result.documentTotal);
154
+ onSuccessRef.current?.(result);
155
+ } catch (err) {
156
+ if (fetchId !== fetchIdRef.current || !mounted.current) return;
157
+ const fetchError = err instanceof Error ? err : new Error(String(err));
158
+ setError(fetchError);
159
+ onErrorRef.current?.(fetchError);
160
+ } finally {
161
+ if (fetchId === fetchIdRef.current && mounted.current) {
162
+ setIsLoading(false);
163
+ }
164
+ }
165
+ }, [getInput]);
166
+ useEffect(() => {
167
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
168
+ debounceTimerRef.current = setTimeout(() => {
169
+ setDebouncedFilter(filter);
170
+ }, debounceDelay);
171
+ return () => {
172
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
173
+ };
174
+ }, [filter, debounceDelay]);
175
+ const setPage = useCallback((newPage) => setPageState(newPage), []);
176
+ const setLimit = useCallback((newLimit) => {
177
+ setLimitState(newLimit);
178
+ setPageState(1);
179
+ }, []);
180
+ const setSort = useCallback((path, value, append = false) => {
181
+ setSortsState((prev) => {
182
+ if (value === null) return prev.filter((s) => s.path !== path);
183
+ if (!append) return [{ path, value }];
184
+ const existing = prev.find((s) => s.path === path);
185
+ if (existing) return prev.map((s) => s.path === path ? { ...s, value } : s);
186
+ return [...prev, { path, value }];
187
+ });
188
+ }, []);
189
+ const setSorts = useCallback((newSorts) => setSortsState(newSorts), []);
190
+ const setFilter = useCallback((key, value) => {
191
+ setFilterState((prev) => ({ ...prev, [key]: value }));
192
+ setPageState(1);
193
+ }, []);
194
+ const setFilters = useCallback((filters2) => {
195
+ setFilterState((prev) => ({ ...prev, ...filters2 }));
196
+ setPageState(1);
197
+ }, []);
198
+ const clearFilters = useCallback(() => {
199
+ setFilterState({});
200
+ setPageState(1);
201
+ }, []);
202
+ const setQuery = useCallback((key, value) => {
203
+ setQueryState((prev) => ({ ...prev, [key]: value }));
204
+ setPageState(1);
205
+ }, []);
206
+ const refresh = useCallback(async () => {
207
+ await fetchData();
208
+ }, [fetchData]);
209
+ const setItemsAction = useCallback((nextItems) => {
210
+ setItems(nextItems);
211
+ }, []);
212
+ const setItemAt = useCallback((index, item) => {
213
+ setItems((prev) => {
214
+ if (index < 0 || index >= prev.length) return prev;
215
+ const next = [...prev];
216
+ next[index] = item;
217
+ return next;
218
+ });
219
+ }, []);
220
+ const itemUpdate = useCallback((props2) => {
221
+ setItems((prev) => {
222
+ if ("index" in props2) {
223
+ const { index, data } = props2;
224
+ if (index < 0 || index >= prev.length) return prev;
225
+ const next = [...prev];
226
+ next[index] = { ...next[index], ...data };
227
+ return next;
228
+ } else {
229
+ const { id, data } = props2;
230
+ const index = prev.findIndex((item) => {
231
+ const itemWithId = item;
232
+ return itemWithId.id === id;
233
+ });
234
+ if (index === -1) return prev;
235
+ const next = [...prev];
236
+ next[index] = { ...next[index], ...data };
237
+ return next;
238
+ }
239
+ });
240
+ }, []);
241
+ const deleteItemAt = useCallback((index) => {
242
+ setItems((prev) => prev.filter((_, i) => i !== index));
243
+ }, []);
244
+ const itemDelete = useCallback((props2) => {
245
+ setItems((prev) => {
246
+ if ("index" in props2) {
247
+ const { index } = props2;
248
+ if (index < 0 || index >= prev.length) return prev;
249
+ return prev.filter((_, i) => i !== index);
250
+ } else {
251
+ const { id } = props2;
252
+ return prev.filter((item) => {
253
+ const itemWithId = item;
254
+ return itemWithId.id !== id;
255
+ });
256
+ }
257
+ });
258
+ }, []);
259
+ const itemPush = useCallback((item, position = 1) => {
260
+ setItems((prev) => position === 0 ? [item, ...prev] : [...prev, item]);
261
+ }, []);
262
+ const deleteBulk = useCallback((itemsToDelete) => {
263
+ if (itemsToDelete.length === 0) return;
264
+ const toDelete = new Set(itemsToDelete);
265
+ setItems((prev) => prev.filter((it) => !toDelete.has(it)));
266
+ }, []);
267
+ const reset = useCallback(() => {
268
+ setPageState(initialPage);
269
+ setLimitState(initialLimit);
270
+ setSortsState(initialSorts);
271
+ setFilterState(initialFilter);
272
+ setDebouncedFilter(initialFilter);
273
+ setQueryState(initialQuery);
274
+ }, [initialPage, initialLimit, initialSorts, initialFilter, initialQuery]);
275
+ useEffect(() => {
276
+ if (memoryMode !== "search-params" || typeof window === "undefined") return;
277
+ const urlState = parseUrlParams(window.location.search);
278
+ if (Object.keys(urlState).length > 0) {
279
+ if (urlState.page) setPageState(urlState.page);
280
+ if (urlState.limit) setLimitState(urlState.limit);
281
+ if (urlState.sorts) setSortsState(urlState.sorts);
282
+ if (urlState.filter) {
283
+ setFilterState((prev) => ({ ...prev, ...urlState.filter }));
284
+ setDebouncedFilter((prev) => ({ ...prev, ...urlState.filter }));
285
+ }
286
+ if (urlState.query) setQueryState((prev) => ({ ...prev, ...urlState.query }));
287
+ }
288
+ const handlePopState = () => {
289
+ const newUrlState = parseUrlParams(window.location.search);
290
+ setPageState(newUrlState.page ?? initialPage);
291
+ setLimitState(newUrlState.limit ?? initialLimit);
292
+ setSortsState(newUrlState.sorts ?? initialSorts);
293
+ setFilterState({ ...initialFilter, ...newUrlState.filter });
294
+ setDebouncedFilter({ ...initialFilter, ...newUrlState.filter });
295
+ setQueryState({ ...initialQuery, ...newUrlState.query });
296
+ };
297
+ window.addEventListener("popstate", handlePopState);
298
+ return () => window.removeEventListener("popstate", handlePopState);
299
+ }, [memoryMode, initialPage, initialLimit, initialSorts, initialFilter, initialQuery]);
300
+ useEffect(() => {
301
+ if (memoryMode !== "search-params" || typeof window === "undefined") return;
302
+ const params = stateToUrlParams({ page, limit, sorts, filter, query });
303
+ const newSearch = params.toString();
304
+ const currentSearch = window.location.search.slice(1);
305
+ if (newSearch !== currentSearch) {
306
+ const newUrl = newSearch ? `?${newSearch}` : window.location.pathname;
307
+ window.history.pushState(null, "", newUrl);
308
+ }
309
+ }, [page, limit, sorts, filter, query, memoryMode]);
310
+ useEffect(() => {
311
+ if (autoFetch) fetchData();
312
+ }, [page, limit, sorts, debouncedFilter, query, autoFetch, fetchData]);
313
+ useEffect(() => {
314
+ mounted.current = true;
315
+ return () => {
316
+ mounted.current = false;
317
+ };
318
+ }, []);
319
+ const hasNextPage = page * limit < total;
320
+ return {
321
+ page,
322
+ limit,
323
+ sorts,
324
+ filter,
325
+ filterConfig: filters?.reduce((acc, f) => {
326
+ if (f.configuration) acc[f.id] = f.configuration;
327
+ return acc;
328
+ }, {}),
329
+ query,
330
+ items,
331
+ total,
332
+ state: { isLoading, error, hasNextPage },
333
+ actions: {
334
+ setPage,
335
+ setLimit,
336
+ setSort,
337
+ setSorts,
338
+ setFilter,
339
+ setFilters,
340
+ clearFilters,
341
+ setQuery,
342
+ refresh,
343
+ reset,
344
+ getInput,
345
+ setItems: setItemsAction,
346
+ setItemAt,
347
+ itemUpdate,
348
+ deleteItemAt,
349
+ itemDelete,
350
+ itemPush,
351
+ deleteBulk
352
+ }
353
+ };
354
+ };
355
+
356
+ export { cn, debounce, formatNumber, getColumnValue, getNextSortValue, getSortValue, keyToSortEntries, sortEntriesToKey, throttle, useDataKit };
357
+ //# sourceMappingURL=chunk-5WNOUBGK.js.map
358
+ //# sourceMappingURL=chunk-5WNOUBGK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/utils/cn.ts","../src/client/utils/index.ts","../src/client/hooks/useDataKit.ts"],"names":["filters","props"],"mappings":"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","file":"chunk-5WNOUBGK.js","sourcesContent":["'use client';\n\ntype ClassPrimitive = string | number | boolean | null | undefined;\ntype ClassDictionary = Record<string, boolean | undefined | null>;\ntype ClassArray = ClassValue[];\nexport type ClassValue = ClassPrimitive | ClassDictionary | ClassArray;\n\nconst toClassString = (input: ClassValue): string => {\n if (!input) return '';\n\n if (typeof input === 'string' || typeof input === 'number') return String(input);\n\n if (Array.isArray(input)) {\n return input.map(toClassString).filter(Boolean).join(' ');\n }\n\n if (typeof input === 'object') {\n return Object.entries(input)\n .filter(([, value]) => Boolean(value))\n .map(([key]) => key)\n .join(' ');\n }\n\n return '';\n};\n\n/**\n * Minimal `cn` helper (shadcn-style) without external deps.\n */\nexport const cn = (...inputs: ClassValue[]): string => inputs.map(toClassString).filter(Boolean).join(' ');\n","/**\n * next-data-kit - Utility Functions\n *\n * Helper utilities for client-side operations.\n */\n\nimport type { TDataKitColumn, TSortEntry } from '../../types';\n\nexport { cn, type ClassValue } from './cn';\n\n\n/**\n * Get the value from an item using a column accessor\n */\nexport const getColumnValue = <T>(item: T, column: TDataKitColumn<T>): unknown => {\n const { accessor } = column;\n return typeof accessor === 'function' ? accessor(item) : item[accessor as keyof T];\n};\n\n/**\n * Get the sort value for a column\n */\nexport const getSortValue = (sorts: TSortEntry[], path: string): 1 | -1 | null => {\n const sort = sorts.find((s) => s.path === path);\n return sort?.value ?? null;\n};\n\n/**\n * Get the next sort value in the cycle: null -> 1 -> -1 -> null\n */\nexport const getNextSortValue = (current: 1 | -1 | null): 1 | -1 | null => {\n if (current === null) return 1;\n if (current === 1) return -1;\n return null;\n};\n\n\n/**\n * Format a number with commas\n */\nexport const formatNumber = (num: number): string => num.toLocaleString();\n\n\n/**\n * Debounce a function\n */\nexport const debounce = <T extends (...args: unknown[]) => unknown>(\n fn: T,\n delay: number\n): ((...args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n return (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n};\n\n/**\n * Throttle a function\n */\nexport const throttle = <T extends (...args: unknown[]) => unknown>(\n fn: T,\n limit: number\n): ((...args: Parameters<T>) => void) => {\n let inThrottle = false;\n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n fn(...args);\n inThrottle = true;\n setTimeout(() => { inThrottle = false; }, limit);\n }\n };\n};\n\n\n/**\n * Create a stable object key from sort entries\n */\nexport const sortEntriesToKey = (sorts: TSortEntry[]): string =>\n sorts.map((s) => `${s.path}:${s.value}`).join(',');\n\n/**\n * Parse a sort key back to sort entries\n */\nexport const keyToSortEntries = (key: string): TSortEntry[] => {\n if (!key) return [];\n return key.split(',').map((part) => {\n const [path, value] = part.split(':');\n return { path: path ?? '', value: parseInt(value ?? '1', 10) as 1 | -1 };\n });\n};\n\n\n/**\n * Parse URL search params into tabler state\n */\nexport const parseUrlParams = (search: string): {\n page?: number;\n limit?: number;\n sorts?: TSortEntry[];\n filter?: Record<string, unknown>;\n query?: Record<string, unknown>;\n} => {\n const params = new URLSearchParams(search);\n const state: ReturnType<typeof parseUrlParams> = {};\n\n // ** Page\n const page = params.get('page');\n if (page) state.page = parseInt(page, 10);\n\n // ** Limit\n const limit = params.get('limit');\n if (limit) state.limit = parseInt(limit, 10);\n\n // ** Sorts\n const sort = params.get('sort');\n if (sort) state.sorts = keyToSortEntries(sort);\n\n // ** Filter (f_key) and Query (q_key)\n const filter: Record<string, unknown> = {};\n const query: Record<string, unknown> = {};\n\n params.forEach((value, key) => {\n if (key.startsWith('f_')) filter[key.slice(2)] = value;\n else if (key.startsWith('q_')) query[key.slice(2)] = value;\n });\n\n if (Object.keys(filter).length > 0) state.filter = filter;\n if (Object.keys(query).length > 0) state.query = query;\n\n return state;\n};\n\n/**\n * Convert tabler state to URL search params\n */\nexport const stateToUrlParams = (state: {\n page?: number;\n limit?: number;\n sorts?: TSortEntry[];\n filter?: Record<string, unknown>;\n query?: Record<string, unknown>;\n}): URLSearchParams => {\n const params = new URLSearchParams();\n\n if (state.page && state.page > 1) params.set('page', state.page.toString());\n if (state.limit) params.set('limit', state.limit.toString());\n if (state.sorts && state.sorts.length > 0) params.set('sort', sortEntriesToKey(state.sorts));\n\n if (state.filter) {\n Object.entries(state.filter).forEach(([key, value]) => {\n if (value !== undefined && value !== null && value !== '') {\n params.set(`f_${key}`, String(value));\n }\n });\n }\n\n if (state.query) {\n Object.entries(state.query).forEach(([key, value]) => {\n if (value !== undefined && value !== null && value !== '') {\n params.set(`q_${key}`, String(value));\n }\n });\n }\n\n return params;\n};\n","/**\n * next-data-kit - useDataKit Hook\n *\n * React hook for managing next-data-kit state and actions.\n */\n\n'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { TDataKitInput, TDataKitResult, TUseDataKitOptions, TSortEntry, TUseDataKitReturn, TFilterConfig } from '../../types';\nimport { parseUrlParams, stateToUrlParams } from '../utils';\n\nexport const useDataKit = <T = unknown, R = unknown>(props: Readonly<TUseDataKitOptions<T, R>>): TUseDataKitReturn<T, R> => {\n\t// ** Deconstruct Props\n\tconst { initial = {}, memory: memoryMode = 'memory', filters, action, onSuccess, onError, autoFetch = true, debounce: debounceDelay = 300 } = props;\n\n\tconst { page: initialPage = 1, limit: initialLimit = 10, sorts: initialSorts = [], filter: initialFilter = {}, query: initialQuery = {} } = initial;\n\n\t// ** State\n\tconst [page, setPageState] = useState(initialPage);\n\tconst [limit, setLimitState] = useState(initialLimit);\n\tconst [sorts, setSortsState] = useState<TSortEntry[]>(initialSorts);\n\tconst [filter, setFilterState] = useState<Record<string, unknown>>(initialFilter);\n\tconst [debouncedFilter, setDebouncedFilter] = useState<Record<string, unknown>>(initialFilter);\n\tconst [query, setQueryState] = useState<Record<string, unknown>>(initialQuery);\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst [items, setItems] = useState<R[]>([]);\n\tconst [total, setTotal] = useState(0);\n\n\t// ** Refs\n\tconst mounted = useRef(true);\n\tconst fetchIdRef = useRef(0);\n\tconst debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t// ** Refs for props to prevent infinite loops and stale closures\n\tconst actionRef = useRef(action);\n\tconst onSuccessRef = useRef(onSuccess);\n\tconst onErrorRef = useRef(onError);\n\tconst filtersRef = useRef(filters);\n\n\t// ** Update refs on every render\n\tactionRef.current = action;\n\tonSuccessRef.current = onSuccess;\n\tonErrorRef.current = onError;\n\tfiltersRef.current = filters;\n\n\t// ** Get current input\n\tconst getInput = useCallback((): TDataKitInput<T> => {\n\t\tconst input: TDataKitInput<T> = {\n\t\t\taction: 'FETCH',\n\t\t\tpage,\n\t\t\tlimit,\n\t\t\tsorts,\n\t\t\tfilter: debouncedFilter as Record<string, string | number | boolean | null>,\n\t\t\tquery: query as Record<string, string | number | boolean>,\n\t\t};\n\n\t\tif (filtersRef.current) {\n\t\t\tinput.filterConfig = filtersRef.current.reduce<TFilterConfig>((acc, f) => {\n\t\t\t\tif (f.configuration) acc[f.id] = f.configuration;\n\t\t\t\treturn acc;\n\t\t\t}, {});\n\t\t}\n\n\t\treturn input;\n\t}, [page, limit, sorts, debouncedFilter, query]);\n\n\t// ** Fetch data\n\tconst fetchData = useCallback(async () => {\n\t\tconst fetchId = ++fetchIdRef.current;\n\t\tsetIsLoading(true);\n\t\tsetError(null);\n\n\t\ttry {\n\t\t\tconst input = getInput();\n\t\t\tconst result = (await actionRef.current(input)) as TDataKitResult<R>;\n\n\t\t\t// ** Check if this is still the latest fetch\n\t\t\tif (fetchId !== fetchIdRef.current || !mounted.current) return;\n\n\t\t\tsetItems(result.items);\n\t\t\tsetTotal(result.documentTotal);\n\t\t\tonSuccessRef.current?.(result);\n\t\t} catch (err) {\n\t\t\tif (fetchId !== fetchIdRef.current || !mounted.current) return;\n\n\t\t\tconst fetchError = err instanceof Error ? err : new Error(String(err));\n\t\t\tsetError(fetchError);\n\t\t\tonErrorRef.current?.(fetchError);\n\t\t} finally {\n\t\t\tif (fetchId === fetchIdRef.current && mounted.current) {\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t}\n\t}, [getInput]);\n\n\t// ** Debounce filter changes\n\tuseEffect(() => {\n\t\tif (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);\n\n\t\tdebounceTimerRef.current = setTimeout(() => {\n\t\t\tsetDebouncedFilter(filter);\n\t\t}, debounceDelay);\n\n\t\treturn () => {\n\t\t\tif (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);\n\t\t};\n\t}, [filter, debounceDelay]);\n\n\t// ** Actions\n\tconst setPage = useCallback((newPage: number) => setPageState(newPage), []);\n\n\tconst setLimit = useCallback((newLimit: number) => {\n\t\tsetLimitState(newLimit);\n\t\tsetPageState(1);\n\t}, []);\n\n\tconst setSort = useCallback((path: string, value: 1 | -1 | null, append = false) => {\n\t\tsetSortsState(prev => {\n\t\t\tif (value === null) return prev.filter(s => s.path !== path);\n\t\t\tif (!append) return [{ path, value }];\n\n\t\t\tconst existing = prev.find(s => s.path === path);\n\t\t\tif (existing) return prev.map(s => (s.path === path ? { ...s, value } : s));\n\t\t\treturn [...prev, { path, value }];\n\t\t});\n\t}, []);\n\n\tconst setSorts = useCallback((newSorts: TSortEntry[]) => setSortsState(newSorts), []);\n\n\tconst setFilter = useCallback((key: string, value: unknown) => {\n\t\tsetFilterState(prev => ({ ...prev, [key]: value }));\n\t\tsetPageState(1);\n\t}, []);\n\n\tconst setFilters = useCallback((filters: Record<string, unknown>) => {\n\t\tsetFilterState(prev => ({ ...prev, ...filters }));\n\t\tsetPageState(1);\n\t}, []);\n\n\tconst clearFilters = useCallback(() => {\n\t\tsetFilterState({});\n\t\tsetPageState(1);\n\t}, []);\n\n\tconst setQuery = useCallback((key: string, value: unknown) => {\n\t\tsetQueryState(prev => ({ ...prev, [key]: value }));\n\t\tsetPageState(1);\n\t}, []);\n\n\tconst refresh = useCallback(async () => {\n\t\tawait fetchData();\n\t}, [fetchData]);\n\n\t// ** Item mutations (optional helpers)\n\tconst setItemsAction = useCallback((nextItems: R[]) => {\n\t\tsetItems(nextItems);\n\t}, []);\n\n\tconst setItemAt = useCallback((index: number, item: R) => {\n\t\tsetItems(prev => {\n\t\t\tif (index < 0 || index >= prev.length) return prev;\n\t\t\tconst next = [...prev];\n\t\t\tnext[index] = item;\n\t\t\treturn next;\n\t\t});\n\t}, []);\n\n\tconst itemUpdate = useCallback((props: { index: number; data: Partial<R> } | { id: string | number; data: Partial<R> }) => {\n\t\tsetItems(prev => {\n\t\t\tif ('index' in props) {\n\t\t\t\t// Update by index\n\t\t\t\tconst { index, data } = props;\n\t\t\t\tif (index < 0 || index >= prev.length) return prev;\n\t\t\t\tconst next = [...prev];\n\t\t\t\tnext[index] = { ...next[index], ...data } as R;\n\t\t\t\treturn next;\n\t\t\t} else {\n\t\t\t\t// Update by id\n\t\t\t\tconst { id, data } = props;\n\t\t\t\tconst index = prev.findIndex((item) => {\n\t\t\t\t\tconst itemWithId = item as R & { id?: string | number };\n\t\t\t\t\treturn itemWithId.id === id;\n\t\t\t\t});\n\t\t\t\tif (index === -1) return prev;\n\t\t\t\tconst next = [...prev];\n\t\t\t\tnext[index] = { ...next[index], ...data } as R;\n\t\t\t\treturn next;\n\t\t\t}\n\t\t});\n\t}, []);\n\n\tconst deleteItemAt = useCallback((index: number) => {\n\t\tsetItems(prev => prev.filter((_, i) => i !== index));\n\t}, []);\n\n\tconst itemDelete = useCallback((props: { index: number } | { id: string | number }) => {\n\t\tsetItems(prev => {\n\t\t\tif ('index' in props) {\n\t\t\t\t// Delete by index\n\t\t\t\tconst { index } = props;\n\t\t\t\tif (index < 0 || index >= prev.length) return prev;\n\t\t\t\treturn prev.filter((_, i) => i !== index);\n\t\t\t} else {\n\t\t\t\t// Delete by id\n\t\t\t\tconst { id } = props;\n\t\t\t\treturn prev.filter((item) => {\n\t\t\t\t\tconst itemWithId = item as R & { id?: string | number };\n\t\t\t\t\treturn itemWithId.id !== id;\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}, []);\n\n\tconst itemPush = useCallback((item: R, position: 0 | 1 = 1) => {\n\t\tsetItems(prev => (position === 0 ? [item, ...prev] : [...prev, item]));\n\t}, []);\n\n\tconst deleteBulk = useCallback((itemsToDelete: R[]) => {\n\t\tif (itemsToDelete.length === 0) return;\n\t\tconst toDelete = new Set(itemsToDelete);\n\t\tsetItems(prev => prev.filter(it => !toDelete.has(it)));\n\t}, []);\n\n\tconst reset = useCallback(() => {\n\t\tsetPageState(initialPage);\n\t\tsetLimitState(initialLimit);\n\t\tsetSortsState(initialSorts);\n\t\tsetFilterState(initialFilter);\n\t\tsetDebouncedFilter(initialFilter);\n\t\tsetQueryState(initialQuery);\n\t}, [initialPage, initialLimit, initialSorts, initialFilter, initialQuery]);\n\n\t// ** Sync with URL if memoryMode is 'search-params'\n\tuseEffect(() => {\n\t\tif (memoryMode !== 'search-params' || typeof window === 'undefined') return;\n\n\t\t// ** Initial load from URL\n\t\tconst urlState = parseUrlParams(window.location.search);\n\n\t\tif (Object.keys(urlState).length > 0) {\n\t\t\tif (urlState.page) setPageState(urlState.page);\n\t\t\tif (urlState.limit) setLimitState(urlState.limit);\n\t\t\tif (urlState.sorts) setSortsState(urlState.sorts);\n\t\t\tif (urlState.filter) {\n\t\t\t\tsetFilterState(prev => ({ ...prev, ...urlState.filter }));\n\t\t\t\tsetDebouncedFilter(prev => ({ ...prev, ...urlState.filter }));\n\t\t\t}\n\t\t\tif (urlState.query) setQueryState(prev => ({ ...prev, ...urlState.query }));\n\t\t}\n\n\t\t// ** Listen for popstate (back/forward)\n\t\tconst handlePopState = () => {\n\t\t\tconst newUrlState = parseUrlParams(window.location.search);\n\n\t\t\tsetPageState(newUrlState.page ?? initialPage);\n\t\t\tsetLimitState(newUrlState.limit ?? initialLimit);\n\t\t\tsetSortsState(newUrlState.sorts ?? initialSorts);\n\t\t\tsetFilterState({ ...initialFilter, ...newUrlState.filter });\n\t\t\tsetDebouncedFilter({ ...initialFilter, ...newUrlState.filter });\n\t\t\tsetQueryState({ ...initialQuery, ...newUrlState.query });\n\t\t};\n\n\t\twindow.addEventListener('popstate', handlePopState);\n\t\treturn () => window.removeEventListener('popstate', handlePopState);\n\t}, [memoryMode, initialPage, initialLimit, initialSorts, initialFilter, initialQuery]);\n\n\t// ** Update URL when state changes\n\tuseEffect(() => {\n\t\tif (memoryMode !== 'search-params' || typeof window === 'undefined') return;\n\n\t\tconst params = stateToUrlParams({ page, limit, sorts, filter, query });\n\t\tconst newSearch = params.toString();\n\t\tconst currentSearch = window.location.search.slice(1);\n\n\t\tif (newSearch !== currentSearch) {\n\t\t\tconst newUrl = newSearch ? `?${newSearch}` : window.location.pathname;\n\t\t\twindow.history.pushState(null, '', newUrl);\n\t\t}\n\t}, [page, limit, sorts, filter, query, memoryMode]);\n\n\t// ** Auto-fetch on mount and when dependencies change\n\tuseEffect(() => {\n\t\tif (autoFetch) fetchData();\n\t}, [page, limit, sorts, debouncedFilter, query, autoFetch, fetchData]);\n\n\t// ** Cleanup\n\tuseEffect(() => {\n\t\tmounted.current = true;\n\t\treturn () => {\n\t\t\tmounted.current = false;\n\t\t};\n\t}, []);\n\n\t// ** Calculate hasNextPage\n\tconst hasNextPage = page * limit < total;\n\n\treturn {\n\t\tpage,\n\t\tlimit,\n\t\tsorts,\n\t\tfilter,\n\t\tfilterConfig: filters?.reduce<TFilterConfig>((acc, f) => {\n\t\t\tif (f.configuration) acc[f.id] = f.configuration;\n\t\t\treturn acc;\n\t\t}, {}),\n\t\tquery,\n\t\titems,\n\t\ttotal,\n\t\tstate: { isLoading, error, hasNextPage },\n\t\tactions: {\n\t\t\tsetPage,\n\t\t\tsetLimit,\n\t\t\tsetSort,\n\t\t\tsetSorts,\n\t\t\tsetFilter,\n\t\t\tsetFilters,\n\t\t\tclearFilters,\n\t\t\tsetQuery,\n\t\t\trefresh,\n\t\t\treset,\n\t\t\tgetInput,\n\t\t\tsetItems: setItemsAction,\n\t\t\tsetItemAt,\n\t\t\titemUpdate,\n\t\t\tdeleteItemAt,\n\t\t\titemDelete,\n\t\t\titemPush,\n\t\t\tdeleteBulk,\n\t\t},\n\t};\n};\n\nexport type { TUseDataKitOptions };\n"]}