@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 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 v(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 } = {}) {
188
- let h = a(t), g = a(n), v = a(!1), y = m && "current" in m && m.current || window;
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 (!y) return;
195
- let t = _.includes(s) ? s : "keydown";
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") && (v.current = !1);
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 && v.current) return;
206
- v.current = !0, h.current(t), i && t.preventDefault(), o && t.stopPropagation();
336
+ if (c && _.current) return;
337
+ _.current = !0, h.current(t), i && t.preventDefault(), o && t.stopPropagation();
207
338
  }
208
339
  }
209
- return y.addEventListener(t, r), y.addEventListener("keyup", n), () => {
210
- y.removeEventListener(t, r), y.removeEventListener("keyup", n);
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
- y
354
+ v
224
355
  ]);
225
356
  }
226
357
  //#endregion
227
358
  //#region src/hooks/usePagination.ts
228
- function y(e, n, r = 0) {
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 b(e, t, n = {}) {
276
- let { sortUndefined: r, desc: i = !1 } = n, a = D(e, t, r, i);
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 x(e, t, n = {}) {
282
- let { sortUndefined: r, desc: i = !1 } = n, a = D(e, t, r, i);
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 ? D(c ? void 0 : o, l ? void 0 : s, r, i) ?? 0 : o - s;
416
+ return c || l ? k(c ? void 0 : o, l ? void 0 : s, r, i) ?? 0 : o - s;
286
417
  }
287
- function S(e, t, n = {}) {
288
- let { desc: r = !1, sortUndefined: i, caseSensitive: a = !1 } = n, o = D(e, t, i, r);
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 C(e, t, n = {}) {
294
- let { desc: r = !1, sortUndefined: i, caseSensitive: a = !1 } = n, o = D(e, t, i, r);
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 w(e, t, n = {}) {
303
- let { desc: r = !1, sortUndefined: i } = n, a = D(e, t, i, r);
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 T(e, t, n = {}) {
309
- let { desc: r = !1, sortUndefined: i } = n, a = D(e, t, i, r);
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 E(e, t, n = {}) {
313
- let { desc: r = !1, sortUndefined: i, compare: a } = n, o = D(e, t, i, r);
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 D(e, t, n = !1, r) {
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 O(e, n = []) {
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 = x(c, l, n);
473
+ u = C(c, l, n);
343
474
  break;
344
475
  case "alphabetical":
345
- u = S(c, l, n);
476
+ u = w(c, l, n);
346
477
  break;
347
478
  case "alphanumeric":
348
- u = C(c, l, n);
479
+ u = T(c, l, n);
349
480
  break;
350
481
  case "boolean":
351
- u = b(c, l, n);
482
+ u = S(c, l, n);
352
483
  break;
353
484
  case "date":
354
- u = w(c, l, n);
485
+ u = E(c, l, n);
355
486
  break;
356
487
  case "basic":
357
- u = T(c, l, n);
488
+ u = D(c, l, n);
358
489
  break;
359
490
  case "custom":
360
- u = E(c, l, n);
491
+ u = O(c, l, n);
361
492
  break;
362
- default: u = T(c, l, n);
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
- export { d as ModalLayout, f as useDebounce, p as useDebouncedValue, g as useFilter, v as useKey, u as useModal, y as usePagination, O as useSort };
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@himanshu-sorathiya/react-kit",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "An opinionated collection of react hooks, and reusable UI components.",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",