@himanshu-sorathiya/react-kit 1.0.8 → 1.0.10
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/index.d.ts +23 -0
- package/dist/index.js +204 -38
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -62,6 +62,18 @@ export interface UseFilterReturn<T> {
|
|
|
62
62
|
isFilterActive: (id: string) => boolean;
|
|
63
63
|
}
|
|
64
64
|
export declare function useFilter<T>(data: T[], initialFilters?: FilterState): UseFilterReturn<T>;
|
|
65
|
+
export interface FuzzySearchOptions {
|
|
66
|
+
threshold?: number;
|
|
67
|
+
caseSensitive?: boolean;
|
|
68
|
+
matchStrategy?: "any" | "all";
|
|
69
|
+
exactPhraseBonus?: boolean;
|
|
70
|
+
}
|
|
71
|
+
export type UseFuzzySearchFields = [
|
|
72
|
+
string,
|
|
73
|
+
number
|
|
74
|
+
][];
|
|
75
|
+
export type UseFuzzySearchReturn<T> = T[];
|
|
76
|
+
export declare function useFuzzySearch<T>(data: T[], query: string, fields: UseFuzzySearchFields, options?: FuzzySearchOptions): UseFuzzySearchReturn<T>;
|
|
65
77
|
declare const validKeyEventTypes: readonly [
|
|
66
78
|
"keydown",
|
|
67
79
|
"keyup",
|
|
@@ -146,5 +158,16 @@ export interface UseSortReturn<T> {
|
|
|
146
158
|
getSortIndex: (id: string) => number | undefined;
|
|
147
159
|
}
|
|
148
160
|
export declare function useSort<T>(data: T[], initialSorts?: SortState): UseSortReturn<T>;
|
|
161
|
+
export interface ThrottleOptions {
|
|
162
|
+
leading?: boolean;
|
|
163
|
+
trailing?: boolean;
|
|
164
|
+
}
|
|
165
|
+
export interface UseThrottleReturn<Args extends any[]> {
|
|
166
|
+
throttledFunc: (...args: Args) => void;
|
|
167
|
+
cancel: () => void;
|
|
168
|
+
flush: () => void;
|
|
169
|
+
isPending: boolean;
|
|
170
|
+
}
|
|
171
|
+
export declare function useThrottle<Args extends any[]>(func: (...args: Args) => void, delay: number, options?: ThrottleOptions): UseThrottleReturn<Args>;
|
|
149
172
|
|
|
150
173
|
export {};
|
package/dist/index.js
CHANGED
|
@@ -176,38 +176,169 @@ function g(e, n = []) {
|
|
|
176
176
|
};
|
|
177
177
|
}
|
|
178
178
|
//#endregion
|
|
179
|
+
//#region src/utils/fuzzySearchUtils.ts
|
|
180
|
+
function _(e, t, n = !1) {
|
|
181
|
+
let r = e.trim(), i = t.trim(), a = r.length > 1 && r === r.toUpperCase() && /^[A-Z]+$/.test(r);
|
|
182
|
+
if (n || (r = r.toLowerCase(), i = i.toLowerCase()), r === i) return 1;
|
|
183
|
+
if (r === "" || i === "") return 0;
|
|
184
|
+
if (a) {
|
|
185
|
+
let e = i.split(/[^a-z0-9]+/i).filter((e) => e.length > 0);
|
|
186
|
+
if (e.length >= r.length) {
|
|
187
|
+
let t = 0, n = 0;
|
|
188
|
+
for (let i = 0; i < r.length; i++) {
|
|
189
|
+
let a = r[i];
|
|
190
|
+
for (; n < e.length;) {
|
|
191
|
+
if ((e[n] ?? "")[0] === a) {
|
|
192
|
+
t++, n++;
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
n++;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (t === r.length) return .85;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
let o = !1;
|
|
202
|
+
for (let e = 0; e < r.length; e++) if (i.includes(r[e] ?? "")) {
|
|
203
|
+
o = !0;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
if (!o) return 0;
|
|
207
|
+
let s = i.indexOf(r);
|
|
208
|
+
if (s !== -1) {
|
|
209
|
+
let e = s === 0, t = s / i.length * (e ? .01 : .1), n = (i.length - r.length) / i.length * (e ? .01 : .05);
|
|
210
|
+
return Math.max(.7, .95 - t - n);
|
|
211
|
+
}
|
|
212
|
+
let c = 0, l = -1, u = 0, d = 0, f = 0;
|
|
213
|
+
for (let e = 0; e < r.length; e++) {
|
|
214
|
+
let t = r[e];
|
|
215
|
+
if (!t) continue;
|
|
216
|
+
let n = i.indexOf(t, f);
|
|
217
|
+
if (n !== -1) c++, l !== -1 && (n > l ? u += n - l : (d++, u += 1)), l = n, f = n + 1, f >= i.length && (f = 0);
|
|
218
|
+
else {
|
|
219
|
+
let e = i.indexOf(t);
|
|
220
|
+
e !== -1 && (c++, d++, l = e, f = e + 1);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (c < r.length / 2) return 0;
|
|
224
|
+
let p = c / r.length, m = .6 ** d, h = c > 1 ? u / (c - 1) : 1, g = Math.max(.4, 1 - h / i.length), _ = p * m * g;
|
|
225
|
+
return Math.max(0, _ * .45);
|
|
226
|
+
}
|
|
227
|
+
//#endregion
|
|
228
|
+
//#region src/hooks/useFuzzySearch.ts
|
|
229
|
+
function v(e, t, n, r = {}) {
|
|
230
|
+
let a = r.threshold ?? .01, o = r.caseSensitive ?? !1, s = r.matchStrategy ?? "any", c = r.exactPhraseBonus ?? !0, l = i(() => n.length === 0 || e.length === 0 ? [] : e.map((e, t) => {
|
|
231
|
+
let r = [], i = [];
|
|
232
|
+
for (let [t, a] of n) {
|
|
233
|
+
let n = h(e, t);
|
|
234
|
+
if (Array.isArray(n)) {
|
|
235
|
+
for (let e of n) if (e != null && e !== "" && typeof e != "object") {
|
|
236
|
+
let t = String(e);
|
|
237
|
+
i.push(t);
|
|
238
|
+
let n = t.split(/[^a-z0-9]+/i).filter((e) => e.length > 0);
|
|
239
|
+
for (let e of n) r.push({
|
|
240
|
+
text: e,
|
|
241
|
+
weight: a
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
} else if (n != null && n !== "" && typeof n != "object") {
|
|
245
|
+
let e = String(n);
|
|
246
|
+
i.push(e);
|
|
247
|
+
let t = e.split(/[^a-z0-9]+/i).filter((e) => e.length > 0);
|
|
248
|
+
for (let e of t) r.push({
|
|
249
|
+
text: e,
|
|
250
|
+
weight: a
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
item: e,
|
|
256
|
+
index: t,
|
|
257
|
+
tokens: r,
|
|
258
|
+
combinedFlatText: i.join(" ")
|
|
259
|
+
};
|
|
260
|
+
}), [e, n]);
|
|
261
|
+
return i(() => {
|
|
262
|
+
let n = t.trim();
|
|
263
|
+
if (!n || l.length === 0) return e;
|
|
264
|
+
let r = n.split(/\s+/).filter((e) => e.length > 0);
|
|
265
|
+
if (r.length === 0) return e;
|
|
266
|
+
let i = [], u = .3;
|
|
267
|
+
for (let e of l) {
|
|
268
|
+
let t = 0, n = 0, l = !1;
|
|
269
|
+
for (let i of r) {
|
|
270
|
+
let r = 0, a = o ? i : i.toLowerCase();
|
|
271
|
+
for (let t of e.tokens) {
|
|
272
|
+
let e = (o ? t.text : t.text.toLowerCase()).split(/\s+/).filter((e) => e.length > 0);
|
|
273
|
+
for (let n of e) {
|
|
274
|
+
if (!n.includes(a)) {
|
|
275
|
+
if (n.length < i.length / 2) continue;
|
|
276
|
+
let e = Math.abs(i.length - n.length), t = Math.max(i.length, n.length);
|
|
277
|
+
if (t > 0 && (t - e) / t < u) continue;
|
|
278
|
+
}
|
|
279
|
+
let e = _(i, n, o) * t.weight;
|
|
280
|
+
e > r && (r = e);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
r >= u && n++, t += r;
|
|
284
|
+
}
|
|
285
|
+
if (s === "all" && n < r.length && (l = !0), !l) {
|
|
286
|
+
let n = t / r.length;
|
|
287
|
+
if (c && r.length > 1) {
|
|
288
|
+
let t = r.map((e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("\\s+");
|
|
289
|
+
new RegExp(t, o ? "g" : "gi").test(e.combinedFlatText) && (n += .15);
|
|
290
|
+
}
|
|
291
|
+
n >= a && i.push({
|
|
292
|
+
item: e.item,
|
|
293
|
+
score: n,
|
|
294
|
+
index: e.index
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return i.toSorted((e, t) => t.score === e.score ? e.index - t.index : t.score - e.score).map((e) => e.item);
|
|
299
|
+
}, [
|
|
300
|
+
l,
|
|
301
|
+
e,
|
|
302
|
+
t,
|
|
303
|
+
a,
|
|
304
|
+
o,
|
|
305
|
+
s,
|
|
306
|
+
c
|
|
307
|
+
]);
|
|
308
|
+
}
|
|
309
|
+
//#endregion
|
|
179
310
|
//#region src/constants/keyConstants.ts
|
|
180
|
-
var
|
|
311
|
+
var y = [
|
|
181
312
|
"keydown",
|
|
182
313
|
"keyup",
|
|
183
314
|
"keypress"
|
|
184
315
|
];
|
|
185
316
|
//#endregion
|
|
186
317
|
//#region src/hooks/useKey.ts
|
|
187
|
-
function
|
|
188
|
-
let h = a(t), g = a(n),
|
|
318
|
+
function b(e, t, { enabled: n = !0, preventDefault: i = !0, stopPropagation: o = !0, eventType: s = "keydown", requireReset: c = !1, ignoreInputs: l = !0, ctrlKey: u = !1, shiftKey: d = !1, altKey: f = !1, metaKey: p = !1, target: m = window } = {}) {
|
|
319
|
+
let h = a(t), g = a(n), _ = a(!1), v = m && "current" in m && m.current || window;
|
|
189
320
|
r(() => {
|
|
190
321
|
h.current = t;
|
|
191
322
|
}, [t]), r(() => {
|
|
192
323
|
g.current = n;
|
|
193
324
|
}, [n]), r(() => {
|
|
194
|
-
if (!
|
|
195
|
-
let t =
|
|
325
|
+
if (!v) return;
|
|
326
|
+
let t = y.includes(s) ? s : "keydown";
|
|
196
327
|
function n(t) {
|
|
197
328
|
if (!(t instanceof KeyboardEvent)) return;
|
|
198
329
|
let n = t.key.toLowerCase();
|
|
199
|
-
(n === e.toLowerCase() || u && n === "control" || d && n === "shift" || f && n === "alt" || p && n === "meta") && (
|
|
330
|
+
(n === e.toLowerCase() || u && n === "control" || d && n === "shift" || f && n === "alt" || p && n === "meta") && (_.current = !1);
|
|
200
331
|
}
|
|
201
332
|
function r(t) {
|
|
202
333
|
if (!(t instanceof KeyboardEvent) || !g.current) return;
|
|
203
334
|
let n = t.target;
|
|
204
335
|
if (!(l && n instanceof HTMLElement && (n instanceof HTMLInputElement || n instanceof HTMLTextAreaElement || n instanceof HTMLSelectElement || n.isContentEditable)) && t.ctrlKey === u && t.shiftKey === d && t.altKey === f && t.metaKey === p && e.toLowerCase() === t.key.toLowerCase()) {
|
|
205
|
-
if (c &&
|
|
206
|
-
|
|
336
|
+
if (c && _.current) return;
|
|
337
|
+
_.current = !0, h.current(t), i && t.preventDefault(), o && t.stopPropagation();
|
|
207
338
|
}
|
|
208
339
|
}
|
|
209
|
-
return
|
|
210
|
-
|
|
340
|
+
return v.addEventListener(t, r), v.addEventListener("keyup", n), () => {
|
|
341
|
+
v.removeEventListener(t, r), v.removeEventListener("keyup", n);
|
|
211
342
|
};
|
|
212
343
|
}, [
|
|
213
344
|
e,
|
|
@@ -220,12 +351,12 @@ function v(e, t, { enabled: n = !0, preventDefault: i = !0, stopPropagation: o =
|
|
|
220
351
|
d,
|
|
221
352
|
f,
|
|
222
353
|
p,
|
|
223
|
-
|
|
354
|
+
v
|
|
224
355
|
]);
|
|
225
356
|
}
|
|
226
357
|
//#endregion
|
|
227
358
|
//#region src/hooks/usePagination.ts
|
|
228
|
-
function
|
|
359
|
+
function x(e, n, r = 0) {
|
|
229
360
|
let [a, s] = o(n), [c, l] = o(r), u = Math.max(1, Math.ceil(e.length / Math.max(1, a))), d = Math.min(Math.max(0, c), u - 1);
|
|
230
361
|
return c !== d && l(d), {
|
|
231
362
|
currentItems: i(() => typeof a != "number" || a < 1 ? [] : e.slice(c * a, (c + 1) * a), [
|
|
@@ -272,26 +403,26 @@ function y(e, n, r = 0) {
|
|
|
272
403
|
}
|
|
273
404
|
//#endregion
|
|
274
405
|
//#region src/utils/sortUtils.ts
|
|
275
|
-
function
|
|
276
|
-
let { sortUndefined: r, desc: i = !1 } = n, a =
|
|
406
|
+
function S(e, t, n = {}) {
|
|
407
|
+
let { sortUndefined: r, desc: i = !1 } = n, a = k(e, t, r, i);
|
|
277
408
|
if (a !== null) return a;
|
|
278
409
|
let o = !!e;
|
|
279
410
|
return o === !!t ? 0 : o ? 1 : -1;
|
|
280
411
|
}
|
|
281
|
-
function
|
|
282
|
-
let { sortUndefined: r, desc: i = !1 } = n, a =
|
|
412
|
+
function C(e, t, n = {}) {
|
|
413
|
+
let { sortUndefined: r, desc: i = !1 } = n, a = k(e, t, r, i);
|
|
283
414
|
if (a !== null) return a;
|
|
284
415
|
let o = e === "" || e === null ? NaN : Number(e), s = t === "" || t === null ? NaN : Number(t), c = Number.isNaN(o), l = Number.isNaN(s);
|
|
285
|
-
return c || l ?
|
|
416
|
+
return c || l ? k(c ? void 0 : o, l ? void 0 : s, r, i) ?? 0 : o - s;
|
|
286
417
|
}
|
|
287
|
-
function
|
|
288
|
-
let { desc: r = !1, sortUndefined: i, caseSensitive: a = !1 } = n, o =
|
|
418
|
+
function w(e, t, n = {}) {
|
|
419
|
+
let { desc: r = !1, sortUndefined: i, caseSensitive: a = !1 } = n, o = k(e, t, i, r);
|
|
289
420
|
if (o !== null) return o;
|
|
290
421
|
let s = String(e), c = String(t);
|
|
291
422
|
return s.localeCompare(c, void 0, { sensitivity: a ? "variant" : "base" });
|
|
292
423
|
}
|
|
293
|
-
function
|
|
294
|
-
let { desc: r = !1, sortUndefined: i, caseSensitive: a = !1 } = n, o =
|
|
424
|
+
function T(e, t, n = {}) {
|
|
425
|
+
let { desc: r = !1, sortUndefined: i, caseSensitive: a = !1 } = n, o = k(e, t, i, r);
|
|
295
426
|
if (o !== null) return o;
|
|
296
427
|
let s = String(e), c = String(t);
|
|
297
428
|
return s.localeCompare(c, void 0, {
|
|
@@ -299,21 +430,21 @@ function C(e, t, n = {}) {
|
|
|
299
430
|
sensitivity: a ? "variant" : "base"
|
|
300
431
|
});
|
|
301
432
|
}
|
|
302
|
-
function
|
|
303
|
-
let { desc: r = !1, sortUndefined: i } = n, a =
|
|
433
|
+
function E(e, t, n = {}) {
|
|
434
|
+
let { desc: r = !1, sortUndefined: i } = n, a = k(e, t, i, r);
|
|
304
435
|
if (a !== null) return a;
|
|
305
436
|
let o = new Date(e).getTime(), s = new Date(t).getTime();
|
|
306
437
|
return (Number.isNaN(o) ? 0 : o) - (Number.isNaN(s) ? 0 : s);
|
|
307
438
|
}
|
|
308
|
-
function
|
|
309
|
-
let { desc: r = !1, sortUndefined: i } = n, a =
|
|
439
|
+
function D(e, t, n = {}) {
|
|
440
|
+
let { desc: r = !1, sortUndefined: i } = n, a = k(e, t, i, r);
|
|
310
441
|
return a === null ? e < t ? -1 : +(e > t) : a;
|
|
311
442
|
}
|
|
312
|
-
function
|
|
313
|
-
let { desc: r = !1, sortUndefined: i, compare: a } = n, o =
|
|
443
|
+
function O(e, t, n = {}) {
|
|
444
|
+
let { desc: r = !1, sortUndefined: i, compare: a } = n, o = k(e, t, i, r);
|
|
314
445
|
return o === null ? typeof a == "function" ? a(e, t) : e < t ? -1 : +(e > t) : o;
|
|
315
446
|
}
|
|
316
|
-
function
|
|
447
|
+
function k(e, t, n = !1, r) {
|
|
317
448
|
let i = e ?? void 0, a = t ?? void 0;
|
|
318
449
|
if (i !== void 0 && a !== void 0) return null;
|
|
319
450
|
if (i === void 0 && a === void 0 || n === !1) return 0;
|
|
@@ -331,7 +462,7 @@ function D(e, t, n = !1, r) {
|
|
|
331
462
|
}
|
|
332
463
|
//#endregion
|
|
333
464
|
//#region src/hooks/useSort.ts
|
|
334
|
-
function
|
|
465
|
+
function A(e, n = []) {
|
|
335
466
|
let [r, a] = o(n);
|
|
336
467
|
return {
|
|
337
468
|
sortedItems: i(() => e.toSorted((e, t) => {
|
|
@@ -339,27 +470,27 @@ function O(e, n = []) {
|
|
|
339
470
|
let { type: r, field: i, id: a, desc: o = !1, invertSorting: s = !1 } = n, c = h(e, i, a), l = h(t, i, a), u;
|
|
340
471
|
switch (r) {
|
|
341
472
|
case "numeric":
|
|
342
|
-
u =
|
|
473
|
+
u = C(c, l, n);
|
|
343
474
|
break;
|
|
344
475
|
case "alphabetical":
|
|
345
|
-
u =
|
|
476
|
+
u = w(c, l, n);
|
|
346
477
|
break;
|
|
347
478
|
case "alphanumeric":
|
|
348
|
-
u =
|
|
479
|
+
u = T(c, l, n);
|
|
349
480
|
break;
|
|
350
481
|
case "boolean":
|
|
351
|
-
u =
|
|
482
|
+
u = S(c, l, n);
|
|
352
483
|
break;
|
|
353
484
|
case "date":
|
|
354
|
-
u =
|
|
485
|
+
u = E(c, l, n);
|
|
355
486
|
break;
|
|
356
487
|
case "basic":
|
|
357
|
-
u =
|
|
488
|
+
u = D(c, l, n);
|
|
358
489
|
break;
|
|
359
490
|
case "custom":
|
|
360
|
-
u =
|
|
491
|
+
u = O(c, l, n);
|
|
361
492
|
break;
|
|
362
|
-
default: u =
|
|
493
|
+
default: u = D(c, l, n);
|
|
363
494
|
}
|
|
364
495
|
if (u !== 0) return u * (o === s ? 1 : -1);
|
|
365
496
|
}
|
|
@@ -420,4 +551,39 @@ function O(e, n = []) {
|
|
|
420
551
|
};
|
|
421
552
|
}
|
|
422
553
|
//#endregion
|
|
423
|
-
|
|
554
|
+
//#region src/hooks/useThrottle.ts
|
|
555
|
+
function j(e, n, i = {}) {
|
|
556
|
+
let [s, c] = o(!1), l = i.leading ?? !0, u = i.trailing ?? !0, d = a(e), f = a(null), p = a(-1), m = a(null);
|
|
557
|
+
r(() => {
|
|
558
|
+
d.current = e;
|
|
559
|
+
}, [e]);
|
|
560
|
+
let h = t(() => {
|
|
561
|
+
f.current &&= (clearTimeout(f.current), null), p.current = -1, m.current = null, c(!1);
|
|
562
|
+
}, []), g = t(() => {
|
|
563
|
+
m.current && (f.current &&= (clearTimeout(f.current), null), d.current(...m.current), p.current = l ? Date.now() : -1, m.current = null, c(!1));
|
|
564
|
+
}, [l]);
|
|
565
|
+
return r(() => () => {
|
|
566
|
+
h();
|
|
567
|
+
}, [h]), {
|
|
568
|
+
throttledFunc: t((...e) => {
|
|
569
|
+
c(!0);
|
|
570
|
+
let t = Date.now();
|
|
571
|
+
if (m.current = e, p.current === -1 ? l : t - p.current >= n) f.current &&= (clearTimeout(f.current), null), d.current(...e), p.current = t, m.current = null, c(!1);
|
|
572
|
+
else if (!f.current) {
|
|
573
|
+
let e = n - (p.current === -1 ? 0 : t - p.current);
|
|
574
|
+
f.current = setTimeout(() => {
|
|
575
|
+
u && m.current ? (d.current(...m.current), p.current = l ? Date.now() : -1) : p.current = -1, m.current = null, f.current = null, c(!1);
|
|
576
|
+
}, e);
|
|
577
|
+
}
|
|
578
|
+
}, [
|
|
579
|
+
n,
|
|
580
|
+
l,
|
|
581
|
+
u
|
|
582
|
+
]),
|
|
583
|
+
cancel: h,
|
|
584
|
+
flush: g,
|
|
585
|
+
isPending: s
|
|
586
|
+
};
|
|
587
|
+
}
|
|
588
|
+
//#endregion
|
|
589
|
+
export { d as ModalLayout, f as useDebounce, p as useDebouncedValue, g as useFilter, v as useFuzzySearch, b as useKey, u as useModal, x as usePagination, A as useSort, j as useThrottle };
|