next-data-kit 9.3.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.
- package/dist/chunk-5WNOUBGK.js +358 -0
- package/dist/chunk-5WNOUBGK.js.map +1 -0
- package/dist/chunk-CGB4WIAS.cjs +2657 -0
- package/dist/chunk-CGB4WIAS.cjs.map +1 -0
- package/dist/chunk-FDSJZI3C.cjs +369 -0
- package/dist/chunk-FDSJZI3C.cjs.map +1 -0
- package/dist/chunk-WYWJGLGD.js +2613 -0
- package/dist/chunk-WYWJGLGD.js.map +1 -0
- package/dist/client/components/data-kit-infinity.d.ts +1 -0
- package/dist/client/components/data-kit-infinity.d.ts.map +1 -1
- package/dist/client/components/data-kit-table.d.ts +1 -0
- package/dist/client/components/data-kit-table.d.ts.map +1 -1
- package/dist/client/components/data-kit.d.ts +1 -0
- package/dist/client/components/data-kit.d.ts.map +1 -1
- package/dist/client.cjs +75 -2947
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +4 -2
- package/dist/client.d.ts +0 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -2912
- package/dist/client.js.map +1 -1
- package/dist/index-DUVfK8q6.d.ts +284 -0
- package/dist/index-qXbjvUTB.d.cts +284 -0
- package/dist/index.cjs +97 -2904
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +4 -2847
- package/dist/index.js.map +1 -1
- package/dist/internal/hooks.cjs +12 -0
- package/dist/internal/hooks.cjs.map +1 -0
- package/dist/internal/hooks.d.cts +1 -0
- package/dist/internal/hooks.d.ts +1 -0
- package/dist/internal/hooks.js +3 -0
- package/dist/internal/hooks.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/useDataKit-XFp3_mUc.d.cts +276 -0
- package/dist/useDataKit-XFp3_mUc.d.ts +276 -0
- package/package.json +4 -1
- package/dist/index-CzDzNX62.d.cts +0 -558
- 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"]}
|