react-hook-toolkit 1.0.13 → 1.0.15

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/README.md CHANGED
@@ -21,6 +21,10 @@ pnpm add react-hook-toolkit
21
21
  | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
22
22
  | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ |
23
23
 
24
+ ### **Authors**
25
+
26
+ ![NPM](https://img.shields.io/badge/Author-Shivaji_(React_Expert)_&_Shyamal_(JS_Expert)-red)   ![npm](https://img.shields.io/npm/v/react-hook-toolkit?color=1C939D)   ![npm](https://img.shields.io/npm/dt/react-hook-toolkit)   ![NPM](https://img.shields.io/npm/l/react-hook-toolkit)   ![NPM Unpacked Size](https://img.shields.io/npm/unpacked-size/react-hook-toolkit)
27
+
24
28
  ## Features
25
29
  Here's the properly structured documentation with clear purpose explanations:
26
30
 
@@ -595,6 +599,257 @@ useUpdateEffect(() => {
595
599
  }, [value]);
596
600
  ```
597
601
 
602
+ ---
603
+
604
+ 📌 **usePersistedForm**
605
+ Automatically persists form state to localStorage/sessionStorage and restores it on page reload.
606
+
607
+ ```ts
608
+ const { values, setField, reset } = usePersistedForm('form-key', initialValues);
609
+
610
+ // Example
611
+ setField('username', 'john_doe'); // Auto-saves to storage
612
+ reset(); // Clears storage
613
+ ```
614
+
615
+ ---
616
+
617
+ 📌 **useCrossFieldValidation**
618
+ Handles complex validation rules that depend on multiple fields.
619
+
620
+ ```ts
621
+ const { errors, validate } = useCrossFieldValidation({
622
+ rules: {
623
+ password: (val, { confirmPassword }) => val === confirmPassword,
624
+ },
625
+ initialValues
626
+ });
627
+
628
+ // Example
629
+ validate('password', 'secret123', { confirmPassword: 'secret123' });
630
+ ```
631
+
632
+ ---
633
+
634
+ 📌 **useFieldArray**
635
+ Manages dynamic arrays of form fields with add/remove/reorder operations.
636
+
637
+ ```ts
638
+ const { fields, append, remove, move } = useFieldArray(initialItems);
639
+
640
+ // Example
641
+ append({ name: '', email: '' });
642
+ remove(0); // Remove first item
643
+ move(1, 0); // Move second item to first position
644
+ ```
645
+
646
+ ---
647
+
648
+ 📌 **useFormSubmit**
649
+ Handles form submission with loading/error states and success callbacks.
650
+
651
+ ```ts
652
+ const { submit, isLoading, error } = useFormSubmit(apiCall, {
653
+ onSuccess: (data) => console.log('Saved!', data)
654
+ });
655
+
656
+ // Example
657
+ submit(formData);
658
+ ```
659
+
660
+ ---
661
+
662
+ 📌 **useSmartForm**
663
+ Complete form management with validation, submission, and state handling.
664
+
665
+ ```ts
666
+ const { register, handleSubmit, errors } = useSmartForm({
667
+ initialValues,
668
+ validationSchema,
669
+ onSubmit: (data) => console.log(data)
670
+ });
671
+
672
+ // Example
673
+ <input {...register('email') />
674
+ <button onClick={handleSubmit}>Save</button>
675
+ ```
676
+
677
+ ---
678
+
679
+ 📌 **useUndo**
680
+ Provides undo/redo functionality for state changes.
681
+
682
+ ```ts
683
+ const { state, setState, undo, redo } = useUndo(initialState);
684
+
685
+ // Example
686
+ setState({ items: [...] });
687
+ undo(); // Reverts to previous state
688
+ ```
689
+
690
+ ---
691
+
692
+ 📌 **useFormWizard**
693
+ Manages multi-step forms with navigation between steps.
694
+
695
+ ```ts
696
+ const { currentStep, next, prev, goto } = useFormWizard(steps.length);
697
+
698
+ // Example
699
+ next(); // Move to next step
700
+ goto(3); // Jump to step 4
701
+ ```
702
+
703
+ ---
704
+
705
+ 📌 **useWebSocket**
706
+ Manages WebSocket connections with auto-reconnect.
707
+
708
+ ```ts
709
+ const { send, message, status } = useWebSocket('ws://api.example.com');
710
+
711
+ // Example
712
+ send(JSON.stringify({ action: 'ping' }));
713
+ ```
714
+
715
+ ---
716
+
717
+ 📌 **useDragReorder**
718
+ Enables drag-and-drop reordering of lists.
719
+
720
+ ```ts
721
+ const { items, dragStart, dragOver, drop } = useDragReorder(initialItems);
722
+
723
+ // Example
724
+ <div
725
+ draggable
726
+ onDragStart={() => dragStart(index)}
727
+ onDragOver={() => dragOver(index)}
728
+ onDrop={drop}
729
+ />
730
+ ```
731
+
732
+ ---
733
+
734
+ 📌 **useInfiniteScroll**
735
+ Implements infinite scroll pagination.
736
+
737
+ ```ts
738
+ const { items, loadMore, isLoading } = useInfiniteScroll(fetchCallback);
739
+
740
+ // Example
741
+ <div onScroll={loadMore}>...</div>
742
+ ```
743
+
744
+ ---
745
+
746
+ 📌 **useEventListeners**
747
+ Simplifies adding/removing event listeners.
748
+
749
+ ```ts
750
+ useEventListeners({
751
+ click: handleClick,
752
+ resize: handleResize
753
+ });
754
+
755
+ // Example
756
+ useEventListeners({
757
+ keydown: (e) => console.log(e.key)
758
+ });
759
+ ```
760
+
761
+ ---
762
+
763
+ 📌 **useHistoryState**
764
+ Manages state history with undo/redo capabilities.
765
+
766
+ ```ts
767
+ const { state, setState, undo, redo } = useHistoryState(initialState);
768
+
769
+ // Example
770
+ setState({...});
771
+ undo(); // Reverts change
772
+ ```
773
+
774
+ ---
775
+
776
+ 📌 **useIdle**
777
+ Detects when user becomes inactive.
778
+
779
+ ```ts
780
+ const isIdle = useIdle(30000); // 30s timeout
781
+
782
+ // Example
783
+ {isIdle && <ScreenSaver />}
784
+ ```
785
+
786
+ ---
787
+
788
+ 📌 **useIsFirstRender**
789
+ Returns true only on component's first render.
790
+
791
+ ```ts
792
+ const isFirst = useIsFirstRender();
793
+
794
+ // Example
795
+ useEffect(() => {
796
+ if (!isFirst) console.log('Updated!');
797
+ }, [deps]);
798
+ ```
799
+
800
+ ---
801
+
802
+ 📌 **useList**
803
+ Manages array state with utility methods.
804
+
805
+ ```ts
806
+ const { list, push, remove, update } = useList(initialItems);
807
+
808
+ // Example
809
+ push(newItem);
810
+ remove(0); // Remove first item
811
+ ```
812
+
813
+ ---
814
+
815
+ 📌 **useLockBodyScroll**
816
+ Locks scrolling on the document body.
817
+
818
+ ```ts
819
+ useLockBodyScroll(true); // Enable lock
820
+
821
+ // Example
822
+ useLockBodyScroll(modalIsOpen);
823
+ ```
824
+
825
+ ---
826
+
827
+ 📌 **useLongPress**
828
+ Detects long press gestures.
829
+
830
+ ```ts
831
+ const handlers = useLongPress(() => console.log('Long pressed!'), {
832
+ threshold: 1000
833
+ });
834
+
835
+ // Example
836
+ <button {...handlers}>Hold me</button>
837
+ ```
838
+
839
+ ---
840
+
841
+ 📌 **createOptimizedContext**
842
+ Creates optimized React context with selector support.
843
+
844
+ ```ts
845
+ const { Provider, useStore } = createOptimizedContext(initialState);
846
+
847
+ // Example
848
+ const user = useStore(state => state.user);
849
+ ```
850
+
851
+ ---
852
+
598
853
  ------------------------------------------------ **Custom Components** --------------------------------------------
599
854
 
600
855
  ✅ **DynamicLoader**
@@ -749,10 +1004,6 @@ Displays a skeleton placeholder for a pie chart inside a card layout. Includes a
749
1004
 
750
1005
  ---
751
1006
 
752
- ✏️ **Authors**
753
-
754
- ![NPM](https://img.shields.io/badge/Author-React%20Expert-red) &nbsp; ![npm](https://img.shields.io/npm/v/react-hook-toolkit?color=1C939D) &nbsp; ![npm](https://img.shields.io/npm/dt/react-hook-toolkit) &nbsp; ![NPM](https://img.shields.io/npm/l/react-hook-toolkit) &nbsp; ![NPM Unpacked Size](https://img.shields.io/npm/unpacked-size/react-hook-toolkit)
755
-
756
1007
  **License**
757
1008
 
758
1009
  [MIT](https://opensource.org/licenses)
@@ -17,8 +17,8 @@ import { Close, InsertDriveFile, Image, Description, Download, CheckCircleOutlin
17
17
  import NProgress from 'nprogress';
18
18
  import { ErrorBoundary } from 'react-error-boundary';
19
19
  import { promise } from '../utils';
20
- import { getHook } from '../hookExecuter/hookExecuter';
21
- import { useWindowSize } from './hooks';
20
+ import { getHook } from '../hookExecuter/chunk143';
21
+ import { useWindowSize } from './chunk940514';
22
22
  function Fallback(_a) {
23
23
  var error = _a.error;
24
24
  return (_jsxs(Box, { sx: { padding: 2 }, children: [process.env.NODE_ENV === 'production' && (_jsxs(Alert, { sx: { py: 0, borderLeft: '2px solid #00abff !important', border: '1px solid #d0cfcf' }, severity: "info", children: [_jsx(AlertTitle, { children: "Page Loading Error" }), "Please check your network connection..."] })), process.env.NODE_ENV !== 'production' && (_jsxs(Alert, { severity: "error", sx: { py: 0, borderTop: '2px solid #791212ad !important', border: '1px solid #d0cfcf' }, children: [_jsx(AlertTitle, { children: "Error" }), error.message] }))] }));
@@ -0,0 +1,40 @@
1
+ export declare function useHistoryState<T>(initialPresent: T): {
2
+ state: T;
3
+ set: (newPresent: T) => void;
4
+ undo: () => void;
5
+ redo: () => void;
6
+ reset: (newPresent: T) => void;
7
+ clear: () => void;
8
+ canUndo: boolean;
9
+ canRedo: boolean;
10
+ past: T[];
11
+ future: T[];
12
+ };
13
+ export declare function useIdle(ms?: number): boolean;
14
+ export declare function useIsFirstRender(): boolean;
15
+ export declare function useList<T>(initialList?: T[]): {
16
+ list: T[];
17
+ actions: {
18
+ set: (newList: T[]) => void;
19
+ push: (element: T) => void;
20
+ removeAt: (index: number) => void;
21
+ insertAt: (index: number, element: T) => void;
22
+ updateAt: (index: number, element: T) => void;
23
+ clear: () => void;
24
+ };
25
+ };
26
+ export declare function useLockBodyScroll(lock?: boolean): void;
27
+ type LongPressOptions = {
28
+ threshold?: number;
29
+ onStart?: (event: Event) => void;
30
+ onFinish?: (event: Event) => void;
31
+ onCancel?: (event: Event) => void;
32
+ };
33
+ export declare function useLongPress(callback: (event: Event) => void, options?: LongPressOptions): {
34
+ onMouseDown: any;
35
+ onMouseUp: any;
36
+ onMouseLeave: any;
37
+ onTouchStart: any;
38
+ onTouchEnd: any;
39
+ };
40
+ export {};
@@ -0,0 +1,267 @@
1
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
+ if (ar || !(i in from)) {
4
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
+ ar[i] = from[i];
6
+ }
7
+ }
8
+ return to.concat(ar || Array.prototype.slice.call(from));
9
+ };
10
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from "react";
11
+ import { throttle } from '../utils';
12
+ function historyReducer(state, action) {
13
+ switch (action.type) {
14
+ case 'UNDO':
15
+ if (state.past.length === 0)
16
+ return state;
17
+ var _a = state.past, newPresent = _a[0], newPast = _a.slice(1);
18
+ return {
19
+ past: newPast,
20
+ present: newPresent,
21
+ future: __spreadArray([state.present], state.future, true),
22
+ };
23
+ case 'REDO':
24
+ if (state.future.length === 0)
25
+ return state;
26
+ var _b = state.future, nextPresent = _b[0], newFuture = _b.slice(1);
27
+ return {
28
+ past: __spreadArray([state.present], state.past, true),
29
+ present: nextPresent,
30
+ future: newFuture,
31
+ };
32
+ case 'SET':
33
+ if (action.newPresent === state.present)
34
+ return state;
35
+ return {
36
+ past: __spreadArray([state.present], state.past, true),
37
+ present: action.newPresent,
38
+ future: [],
39
+ };
40
+ case 'RESET':
41
+ return {
42
+ past: [],
43
+ present: action.newPresent,
44
+ future: [],
45
+ };
46
+ case 'CLEAR':
47
+ return {
48
+ past: [],
49
+ present: state.present,
50
+ future: [],
51
+ };
52
+ default:
53
+ return state;
54
+ }
55
+ }
56
+ export function useHistoryState(initialPresent) {
57
+ var _a = useReducer((historyReducer), {
58
+ past: [],
59
+ present: initialPresent,
60
+ future: [],
61
+ }), state = _a[0], dispatch = _a[1];
62
+ var canUndo = state.past.length > 0;
63
+ var canRedo = state.future.length > 0;
64
+ var undo = useCallback(function () {
65
+ if (canUndo) {
66
+ dispatch({ type: 'UNDO' });
67
+ }
68
+ }, [canUndo]);
69
+ var redo = useCallback(function () {
70
+ if (canRedo) {
71
+ dispatch({ type: 'REDO' });
72
+ }
73
+ }, [canRedo]);
74
+ var set = useCallback(function (newPresent) {
75
+ dispatch({ type: 'SET', newPresent: newPresent });
76
+ }, []);
77
+ var reset = useCallback(function (newPresent) {
78
+ dispatch({ type: 'RESET', newPresent: newPresent });
79
+ }, []);
80
+ var clear = useCallback(function () {
81
+ dispatch({ type: 'CLEAR' });
82
+ }, []);
83
+ return {
84
+ state: state.present,
85
+ set: set,
86
+ undo: undo,
87
+ redo: redo,
88
+ reset: reset,
89
+ clear: clear,
90
+ canUndo: canUndo,
91
+ canRedo: canRedo,
92
+ past: state.past,
93
+ future: state.future,
94
+ };
95
+ }
96
+ export function useIdle(ms) {
97
+ if (ms === void 0) { ms = 1000 * 60; }
98
+ var _a = useState(false), idle = _a[0], setIdle = _a[1];
99
+ var timeoutIdRef = useRef(null);
100
+ useEffect(function () {
101
+ var handleTimeout = function () {
102
+ setIdle(true);
103
+ };
104
+ var handleEvent = throttle(function () {
105
+ setIdle(false);
106
+ if (timeoutIdRef.current) {
107
+ clearTimeout(timeoutIdRef.current);
108
+ }
109
+ timeoutIdRef.current = setTimeout(handleTimeout, ms);
110
+ }, 500);
111
+ var handleVisibilityChange = function () {
112
+ if (!document.hidden) {
113
+ handleEvent();
114
+ }
115
+ };
116
+ // Initialize
117
+ timeoutIdRef.current = setTimeout(handleTimeout, ms);
118
+ // Events to listen for activity
119
+ var events = [
120
+ 'mousemove',
121
+ 'mousedown',
122
+ 'resize',
123
+ 'keydown',
124
+ 'touchstart',
125
+ 'wheel',
126
+ 'scroll',
127
+ ];
128
+ events.forEach(function (event) { return window.addEventListener(event, handleEvent); });
129
+ document.addEventListener('visibilitychange', handleVisibilityChange);
130
+ return function () {
131
+ events.forEach(function (event) { return window.removeEventListener(event, handleEvent); });
132
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
133
+ if (timeoutIdRef.current) {
134
+ clearTimeout(timeoutIdRef.current);
135
+ }
136
+ };
137
+ }, [ms]);
138
+ return idle;
139
+ }
140
+ export function useIsFirstRender() {
141
+ var isFirstRender = useRef(true);
142
+ useEffect(function () {
143
+ isFirstRender.current = false;
144
+ }, []);
145
+ return isFirstRender.current;
146
+ }
147
+ export function useList(initialList) {
148
+ if (initialList === void 0) { initialList = []; }
149
+ var _a = useState(initialList), list = _a[0], setList = _a[1];
150
+ var set = useCallback(function (newList) {
151
+ setList(newList);
152
+ }, []);
153
+ var push = useCallback(function (element) {
154
+ setList(function (current) { return __spreadArray(__spreadArray([], current, true), [element], false); });
155
+ }, []);
156
+ var removeAt = useCallback(function (index) {
157
+ setList(function (current) { return current.filter(function (_, i) { return i !== index; }); });
158
+ }, []);
159
+ var insertAt = useCallback(function (index, element) {
160
+ setList(function (current) { return __spreadArray(__spreadArray(__spreadArray([], current.slice(0, index), true), [
161
+ element
162
+ ], false), current.slice(index), true); });
163
+ }, []);
164
+ var updateAt = useCallback(function (index, element) {
165
+ setList(function (current) {
166
+ return current.map(function (item, i) { return (i === index ? element : item); });
167
+ });
168
+ }, []);
169
+ var clear = useCallback(function () {
170
+ setList([]);
171
+ }, []);
172
+ return {
173
+ list: list,
174
+ actions: {
175
+ set: set,
176
+ push: push,
177
+ removeAt: removeAt,
178
+ insertAt: insertAt,
179
+ updateAt: updateAt,
180
+ clear: clear,
181
+ },
182
+ };
183
+ }
184
+ export function useLockBodyScroll(lock) {
185
+ if (lock === void 0) { lock = true; }
186
+ useLayoutEffect(function () {
187
+ if (!lock)
188
+ return;
189
+ // Get current body overflow value
190
+ var originalOverflow = document.body.style.overflow;
191
+ var originalPaddingRight = document.body.style.paddingRight;
192
+ // Calculate scrollbar width to prevent layout shift
193
+ var scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
194
+ // Lock body scroll
195
+ document.body.style.overflow = 'hidden';
196
+ // Compensate for scrollbar width if needed
197
+ if (scrollbarWidth > 0) {
198
+ document.body.style.paddingRight = "".concat(scrollbarWidth, "px");
199
+ }
200
+ return function () {
201
+ // Restore original styles
202
+ document.body.style.overflow = originalOverflow;
203
+ document.body.style.paddingRight = originalPaddingRight;
204
+ };
205
+ }, [lock]);
206
+ }
207
+ function isMouseEvent(event) {
208
+ return 'clientX' in event && 'clientY' in event;
209
+ }
210
+ function isTouchEvent(event) {
211
+ return 'touches' in event;
212
+ }
213
+ export function useLongPress(callback, options) {
214
+ if (options === void 0) { options = {}; }
215
+ var _a = options.threshold, threshold = _a === void 0 ? 400 : _a, onStart = options.onStart, onFinish = options.onFinish, onCancel = options.onCancel;
216
+ var isLongPressActive = useRef(false);
217
+ var isPressed = useRef(false);
218
+ var timerId = useRef();
219
+ var start = useCallback(function (event) {
220
+ if (!isMouseEvent(event) && !isTouchEvent(event))
221
+ return;
222
+ if (onStart) {
223
+ onStart(event);
224
+ }
225
+ isPressed.current = true;
226
+ timerId.current = setTimeout(function () {
227
+ if (isPressed.current) {
228
+ callback(event);
229
+ isLongPressActive.current = true;
230
+ }
231
+ }, threshold);
232
+ }, [callback, threshold, onStart]);
233
+ var cancel = useCallback(function (event) {
234
+ if (!isMouseEvent(event) && !isTouchEvent(event))
235
+ return;
236
+ if (isLongPressActive.current) {
237
+ if (onFinish) {
238
+ onFinish(event);
239
+ }
240
+ }
241
+ else if (isPressed.current) {
242
+ if (onCancel) {
243
+ onCancel(event);
244
+ }
245
+ }
246
+ isLongPressActive.current = false;
247
+ isPressed.current = false;
248
+ if (timerId.current) {
249
+ clearTimeout(timerId.current);
250
+ }
251
+ }, [onFinish, onCancel]);
252
+ // Clean up on unmount
253
+ useEffect(function () {
254
+ return function () {
255
+ if (timerId.current) {
256
+ clearTimeout(timerId.current);
257
+ }
258
+ };
259
+ }, []);
260
+ return useMemo(function () { return ({
261
+ onMouseDown: start,
262
+ onMouseUp: cancel,
263
+ onMouseLeave: cancel,
264
+ onTouchStart: start,
265
+ onTouchEnd: cancel,
266
+ }); }, [start, cancel]);
267
+ }
@@ -14,7 +14,7 @@ interface UseAxiosConfig extends AxiosRequestConfig {
14
14
  };
15
15
  }
16
16
  export declare const useAxios: <T>(config?: UseAxiosConfig) => UseAxiosResponse<T>;
17
- export declare const useDrawer: () => import("../contexts/DrowerContexts").DrawerContextValue;
17
+ export declare const useDrawer: () => import("../contexts/chunk158261").DrawerContextValue;
18
18
  export declare const useAdvReducer: <State, Action extends {
19
19
  type: string;
20
20
  }>(initialState: State, actions: Record<string, (state: State, action: Action) => State>) => (state: State | undefined, action: Action) => State;
@@ -192,4 +192,74 @@ interface UseTouch {
192
192
  }
193
193
  export declare const useTouch: UseTouch;
194
194
  export declare const useUpdateEffect: (effect: React.EffectCallback, deps: React.DependencyList) => void;
195
+ export declare const usePersistedForm: <T>(key: string, initialValue: T) => [T, (value: T) => void];
196
+ export declare const useCrossFieldValidation: <T extends Record<string, any>>(validate: (values: T) => Record<keyof T, string | null>) => {
197
+ errors: Record<keyof T, string | null>;
198
+ validateFields: (values: T) => boolean;
199
+ };
200
+ export declare const useFieldArray: <T>(initialValue: T[]) => {
201
+ fields: T[];
202
+ append: (item: T) => void;
203
+ remove: (index: number) => void;
204
+ update: (index: number, item: T) => void;
205
+ };
206
+ type SubmitHandler<T> = (data: T) => Promise<void>;
207
+ export declare const useFormSubmit: <T>(handler: SubmitHandler<T>) => {
208
+ handleSubmit: (data: T) => Promise<void>;
209
+ isSubmitting: boolean;
210
+ submitError: string | null;
211
+ };
212
+ export declare const useSmartForm: <T extends Record<string, any>>(initialValues: T, storageKey?: string) => {
213
+ values: T;
214
+ handleChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
215
+ setValues: import("react").Dispatch<import("react").SetStateAction<T>>;
216
+ dirty: boolean;
217
+ };
218
+ export declare const useUndo: <T>(initialState: T) => {
219
+ state: T;
220
+ setState: (newState: T) => void;
221
+ undo: () => false | void;
222
+ redo: () => false | void;
223
+ canUndo: boolean;
224
+ canRedo: boolean;
225
+ };
226
+ export declare const useFormWizard: <T extends Record<string, any>>(steps: {
227
+ validate?: (values: T) => Record<string, string>;
228
+ component: React.FC<{
229
+ values: T;
230
+ setValues: (v: T) => void;
231
+ }>;
232
+ }[], initialValues: T) => {
233
+ currentStep: number;
234
+ CurrentStep: import("react").FC<{
235
+ values: T;
236
+ setValues: (v: T) => void;
237
+ }>;
238
+ values: T;
239
+ setValues: import("react").Dispatch<import("react").SetStateAction<T>>;
240
+ next: () => void;
241
+ prev: () => void;
242
+ errors: Record<string, string>;
243
+ isFirstStep: boolean;
244
+ isLastStep: boolean;
245
+ };
246
+ export declare const createOptimizedContext: <T>() => readonly [import("react").Provider<T | undefined>, <U>(selector: (value: T) => U) => U];
247
+ export declare const useWebSocket: <T>(url: string, onMessage?: (data: T) => void) => {
248
+ data: T | null;
249
+ send: (message: any) => void;
250
+ isConnected: boolean;
251
+ };
252
+ export declare const useDragReorder: <T>(initialItems: T[]) => {
253
+ items: T[];
254
+ handleDragStart: (index: number) => void;
255
+ handleDragEnter: (index: number) => void;
256
+ handleDrop: () => void;
257
+ };
258
+ export declare const useInfiniteScroll: <T>(fetchData: (page: number) => Promise<T[]>, initialData?: T[]) => {
259
+ data: T[];
260
+ loading: boolean;
261
+ hasMore: boolean;
262
+ lastElementRef: (node: HTMLElement | null) => void;
263
+ };
264
+ export declare const useEventListeners: (eventType: string, handler: (event: Event) => void, element?: HTMLElement | Window, options?: AddEventListenerOptions) => void;
195
265
  export {};
@@ -54,9 +54,9 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
54
54
  }
55
55
  return to.concat(ar || Array.prototype.slice.call(from));
56
56
  };
57
- import { useState, useEffect, useCallback, useRef, useContext } from 'react';
57
+ import { useState, useEffect, useCallback, useRef, useContext, createContext, useMemo } from 'react';
58
58
  import axios, { AxiosError } from 'axios';
59
- import DrawerContext from '../contexts/DrowerContexts';
59
+ import DrawerContext from '../contexts/chunk158261';
60
60
  var isReady = function () {
61
61
  return typeof window !== "undefined" && typeof window.document !== "undefined"
62
62
  ? true
@@ -1155,3 +1155,259 @@ export var useUpdateEffect = function (effect, deps) {
1155
1155
  return effect();
1156
1156
  }, deps);
1157
1157
  };
1158
+ export var usePersistedForm = function (key, initialValue) {
1159
+ var _a = useState(function () {
1160
+ try {
1161
+ var stored = localStorage.getItem(key);
1162
+ return stored ? JSON.parse(stored) : initialValue;
1163
+ }
1164
+ catch (_a) {
1165
+ return initialValue;
1166
+ }
1167
+ }), state = _a[0], setState = _a[1];
1168
+ useEffect(function () {
1169
+ localStorage.setItem(key, JSON.stringify(state));
1170
+ }, [key, state]);
1171
+ return [state, setState];
1172
+ };
1173
+ export var useCrossFieldValidation = function (validate) {
1174
+ var _a = useState({}), errors = _a[0], setErrors = _a[1];
1175
+ var validateFields = function (values) {
1176
+ var newErrors = validate(values);
1177
+ setErrors(newErrors);
1178
+ return Object.values(newErrors).every(function (e) { return !e; });
1179
+ };
1180
+ return { errors: errors, validateFields: validateFields };
1181
+ };
1182
+ export var useFieldArray = function (initialValue) {
1183
+ var _a = useState(initialValue), fields = _a[0], setFields = _a[1];
1184
+ var append = function (item) { return setFields(__spreadArray(__spreadArray([], fields, true), [item], false)); };
1185
+ var remove = function (index) { return setFields(fields.filter(function (_, i) { return i !== index; })); };
1186
+ var update = function (index, item) {
1187
+ return setFields(fields.map(function (f, i) { return (i === index ? item : f); }));
1188
+ };
1189
+ return { fields: fields, append: append, remove: remove, update: update };
1190
+ };
1191
+ export var useFormSubmit = function (handler) {
1192
+ var _a = useState(false), isSubmitting = _a[0], setIsSubmitting = _a[1];
1193
+ var _b = useState(null), submitError = _b[0], setSubmitError = _b[1];
1194
+ var handleSubmit = function (data) { return __awaiter(void 0, void 0, void 0, function () {
1195
+ var err_3;
1196
+ return __generator(this, function (_a) {
1197
+ switch (_a.label) {
1198
+ case 0:
1199
+ _a.trys.push([0, 2, 3, 4]);
1200
+ setIsSubmitting(true);
1201
+ setSubmitError(null);
1202
+ return [4 /*yield*/, handler(data)];
1203
+ case 1:
1204
+ _a.sent();
1205
+ return [3 /*break*/, 4];
1206
+ case 2:
1207
+ err_3 = _a.sent();
1208
+ setSubmitError(err_3 instanceof Error ? err_3.message : 'Submission failed');
1209
+ return [3 /*break*/, 4];
1210
+ case 3:
1211
+ setIsSubmitting(false);
1212
+ return [7 /*endfinally*/];
1213
+ case 4: return [2 /*return*/];
1214
+ }
1215
+ });
1216
+ }); };
1217
+ return { handleSubmit: handleSubmit, isSubmitting: isSubmitting, submitError: submitError };
1218
+ };
1219
+ export var useSmartForm = function (initialValues, storageKey) {
1220
+ var _a = useState(function () {
1221
+ if (!storageKey)
1222
+ return initialValues;
1223
+ try {
1224
+ var saved = localStorage.getItem(storageKey);
1225
+ return saved ? JSON.parse(saved) : initialValues;
1226
+ }
1227
+ catch (_a) {
1228
+ return initialValues;
1229
+ }
1230
+ }), values = _a[0], setValues = _a[1];
1231
+ var _b = useState(false), dirty = _b[0], setDirty = _b[1];
1232
+ useEffect(function () {
1233
+ if (storageKey && dirty) {
1234
+ var timer_1 = setTimeout(function () {
1235
+ localStorage.setItem(storageKey, JSON.stringify(values));
1236
+ }, 500);
1237
+ return function () { return clearTimeout(timer_1); };
1238
+ }
1239
+ }, [values, storageKey, dirty]);
1240
+ var handleChange = function (e) {
1241
+ var _a = e.target, name = _a.name, value = _a.value, type = _a.type, checked = _a.checked;
1242
+ setValues(function (prev) {
1243
+ var _a;
1244
+ return (__assign(__assign({}, prev), (_a = {}, _a[name] = type === 'checkbox' ? checked : value, _a)));
1245
+ });
1246
+ setDirty(true);
1247
+ };
1248
+ return { values: values, handleChange: handleChange, setValues: setValues, dirty: dirty };
1249
+ };
1250
+ export var useUndo = function (initialState) {
1251
+ var _a = useState([initialState]), states = _a[0], setStates = _a[1];
1252
+ var _b = useState(0), index = _b[0], setIndex = _b[1];
1253
+ var present = states[index];
1254
+ var canUndo = index > 0;
1255
+ var canRedo = index < states.length - 1;
1256
+ var updateState = function (newState) {
1257
+ var newStates = states.slice(0, index + 1);
1258
+ setStates(__spreadArray(__spreadArray([], newStates, true), [newState], false));
1259
+ setIndex(newStates.length);
1260
+ };
1261
+ var undo = function () { return canUndo && setIndex(function (i) { return i - 1; }); };
1262
+ var redo = function () { return canRedo && setIndex(function (i) { return i + 1; }); };
1263
+ return { state: present, setState: updateState, undo: undo, redo: redo, canUndo: canUndo, canRedo: canRedo };
1264
+ };
1265
+ export var useFormWizard = function (steps, initialValues) {
1266
+ var _a = useState(0), currentStep = _a[0], setCurrentStep = _a[1];
1267
+ var _b = useState(initialValues), values = _b[0], setValues = _b[1];
1268
+ var _c = useState({}), errors = _c[0], setErrors = _c[1];
1269
+ var next = function () {
1270
+ var _a, _b;
1271
+ var validation = ((_b = (_a = steps[currentStep]).validate) === null || _b === void 0 ? void 0 : _b.call(_a, values)) || {};
1272
+ if (Object.keys(validation).length > 0) {
1273
+ setErrors(validation);
1274
+ return;
1275
+ }
1276
+ setErrors({});
1277
+ setCurrentStep(function (prev) { return Math.min(prev + 1, steps.length - 1); });
1278
+ };
1279
+ var prev = function () {
1280
+ setCurrentStep(function (prev) { return Math.max(prev - 1, 0); });
1281
+ };
1282
+ return {
1283
+ currentStep: currentStep,
1284
+ CurrentStep: steps[currentStep].component,
1285
+ values: values,
1286
+ setValues: setValues,
1287
+ next: next,
1288
+ prev: prev,
1289
+ errors: errors,
1290
+ isFirstStep: currentStep === 0,
1291
+ isLastStep: currentStep === steps.length - 1,
1292
+ };
1293
+ };
1294
+ export var createOptimizedContext = function () {
1295
+ var Context = createContext(undefined);
1296
+ var useOptimizedContext = function (selector) {
1297
+ var value = useContext(Context);
1298
+ if (value === undefined)
1299
+ throw new Error('Missing provider');
1300
+ return useMemo(function () { return selector(value); }, [value, selector]);
1301
+ };
1302
+ return [Context.Provider, useOptimizedContext];
1303
+ };
1304
+ export var useWebSocket = function (url, onMessage) {
1305
+ var _a = useState(null), data = _a[0], setData = _a[1];
1306
+ var _b = useState(false), isConnected = _b[0], setIsConnected = _b[1];
1307
+ var _c = useState(null), socket = _c[0], setSocket = _c[1];
1308
+ var send = useCallback(function (message) {
1309
+ if ((socket === null || socket === void 0 ? void 0 : socket.readyState) === WebSocket.OPEN) {
1310
+ socket.send(JSON.stringify(message));
1311
+ }
1312
+ }, [socket]);
1313
+ useEffect(function () {
1314
+ var ws = new WebSocket(url);
1315
+ setSocket(ws);
1316
+ ws.onopen = function () { return setIsConnected(true); };
1317
+ ws.onclose = function () { return setIsConnected(false); };
1318
+ ws.onmessage = function (event) {
1319
+ var newData = JSON.parse(event.data);
1320
+ setData(newData);
1321
+ onMessage === null || onMessage === void 0 ? void 0 : onMessage(newData);
1322
+ };
1323
+ return function () { return ws.close(); };
1324
+ }, [url, onMessage]);
1325
+ return { data: data, send: send, isConnected: isConnected };
1326
+ };
1327
+ export var useDragReorder = function (initialItems) {
1328
+ var _a = useState(initialItems), items = _a[0], setItems = _a[1];
1329
+ var dragItem = useRef(null);
1330
+ var dragOverItem = useRef(null);
1331
+ var handleDragStart = function (index) {
1332
+ dragItem.current = index;
1333
+ };
1334
+ var handleDragEnter = function (index) {
1335
+ dragOverItem.current = index;
1336
+ };
1337
+ var handleDrop = function () {
1338
+ if (dragItem.current === null || dragOverItem.current === null)
1339
+ return;
1340
+ var newItems = __spreadArray([], items, true);
1341
+ var draggedItem = newItems[dragItem.current];
1342
+ newItems.splice(dragItem.current, 1);
1343
+ newItems.splice(dragOverItem.current, 0, draggedItem);
1344
+ setItems(newItems);
1345
+ dragItem.current = null;
1346
+ dragOverItem.current = null;
1347
+ };
1348
+ return { items: items, handleDragStart: handleDragStart, handleDragEnter: handleDragEnter, handleDrop: handleDrop };
1349
+ };
1350
+ export var useInfiniteScroll = function (fetchData, initialData) {
1351
+ if (initialData === void 0) { initialData = []; }
1352
+ var _a = useState(initialData), data = _a[0], setData = _a[1];
1353
+ var _b = useState(1), page = _b[0], setPage = _b[1];
1354
+ var _c = useState(false), loading = _c[0], setLoading = _c[1];
1355
+ var _d = useState(true), hasMore = _d[0], setHasMore = _d[1];
1356
+ var observer = useRef();
1357
+ var lastElementRef = useCallback(function (node) {
1358
+ if (loading)
1359
+ return;
1360
+ if (observer.current)
1361
+ observer.current.disconnect();
1362
+ observer.current = new IntersectionObserver(function (entries) {
1363
+ if (entries[0].isIntersecting && hasMore) {
1364
+ setPage(function (prev) { return prev + 1; });
1365
+ }
1366
+ });
1367
+ if (node)
1368
+ observer.current.observe(node);
1369
+ }, [loading, hasMore]);
1370
+ useEffect(function () {
1371
+ var loadData = function () { return __awaiter(void 0, void 0, void 0, function () {
1372
+ var newData_1;
1373
+ return __generator(this, function (_a) {
1374
+ switch (_a.label) {
1375
+ case 0:
1376
+ setLoading(true);
1377
+ _a.label = 1;
1378
+ case 1:
1379
+ _a.trys.push([1, , 3, 4]);
1380
+ return [4 /*yield*/, fetchData(page)];
1381
+ case 2:
1382
+ newData_1 = _a.sent();
1383
+ setData(function (prev) { return __spreadArray(__spreadArray([], prev, true), newData_1, true); });
1384
+ setHasMore(newData_1.length > 0);
1385
+ return [3 /*break*/, 4];
1386
+ case 3:
1387
+ setLoading(false);
1388
+ return [7 /*endfinally*/];
1389
+ case 4: return [2 /*return*/];
1390
+ }
1391
+ });
1392
+ }); };
1393
+ loadData();
1394
+ }, [page, fetchData]);
1395
+ return { data: data, loading: loading, hasMore: hasMore, lastElementRef: lastElementRef };
1396
+ };
1397
+ export var useEventListeners = function (eventType, handler, element, options) {
1398
+ if (element === void 0) { element = window; }
1399
+ var savedHandler = useRef(handler);
1400
+ useEffect(function () {
1401
+ savedHandler.current = handler;
1402
+ }, [handler]);
1403
+ useEffect(function () {
1404
+ var isSupported = element && element.addEventListener;
1405
+ if (!isSupported)
1406
+ return;
1407
+ var listener = function (event) { return savedHandler.current(event); };
1408
+ element.addEventListener(eventType, listener, options);
1409
+ return function () {
1410
+ element.removeEventListener(eventType, listener, options);
1411
+ };
1412
+ }, [eventType, element, options]);
1413
+ };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import 'nprogress/nprogress.css';
2
- import { ReactHooksWrapper, getHook, setHook } from "./hookExecuter/hookExecuter";
3
- import { DynamicLoader, AlertMessage, FilePreview, LabeledValue, DetailsCard, UploadFile, DownloadFile } from './hooks/hooksComp';
4
- import { FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton } from './skeletons/skeletons';
5
- import { useAxios, useAdvReducer, useFetch, useLocalStorage, useToggle, useDebounce, useThrottle, usePrevious, useMediaQuery, useClipboard, useInterval, useWindowSize, useKeyPress, useOnlineStatus, useScrollPosition, useTimeout, useDarkMode, useForm, useArray, useStepper, useUpdateEffect, useTouch, useSound, useSessionStorage, usePreferredLanguage, useHistory, useEventListener, useBattery, useDebouncedCallback, useScrollLock, useResizeObserver, useMousePosition, useScrollDirection, useImageLoader, usePersistedState, useReducedMotion, useCookie, useFetchRetry, useDelay, useVisibilityChange, useDebouncedValue, useAsync, useScript, useIndexedDB, useGeoLocation, useTimer, useIsMounted, useCss, useSpeak, useCountUp, useCountDown } from './hooks/hooks';
2
+ import { ReactHooksWrapper, getHook, setHook } from "./hookExecuter/chunk143";
3
+ import { DynamicLoader, AlertMessage, FilePreview, LabeledValue, DetailsCard, UploadFile, DownloadFile } from './hooks/chunk613852';
4
+ import { FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton } from './skeletons/chunk613555';
5
+ import { useHistoryState, useIdle, useIsFirstRender, useList, useLockBodyScroll, useLongPress } from './hooks/chunk726433';
6
+ import { useAxios, useAdvReducer, useFetch, useLocalStorage, useToggle, useDebounce, useThrottle, usePrevious, useMediaQuery, useClipboard, useInterval, useWindowSize, useKeyPress, useOnlineStatus, useScrollPosition, useTimeout, useDarkMode, useForm, useArray, useStepper, useUpdateEffect, useTouch, useSound, useSessionStorage, usePreferredLanguage, useHistory, useEventListener, useBattery, useDebouncedCallback, useScrollLock, useResizeObserver, useMousePosition, useScrollDirection, useImageLoader, usePersistedState, useReducedMotion, useCookie, useFetchRetry, useDelay, useVisibilityChange, useDebouncedValue, useAsync, useScript, useIndexedDB, useGeoLocation, useTimer, useIsMounted, useCss, useSpeak, useCountUp, useCountDown, usePersistedForm, useCrossFieldValidation, useFieldArray, useFormSubmit, useSmartForm, useUndo, useFormWizard, useWebSocket, useDragReorder, useInfiniteScroll, useEventListeners, createOptimizedContext } from './hooks/chunk940514';
6
7
  export default ReactHooksWrapper;
7
- export { getHook, setHook, useAxios, useAdvReducer, useFetch, useLocalStorage, useToggle, useDebounce, useThrottle, usePrevious, useMediaQuery, useClipboard, useInterval, useWindowSize, useKeyPress, useOnlineStatus, useScrollPosition, useTimeout, useDarkMode, useForm, useArray, useStepper, useUpdateEffect, useTouch, useSound, useSessionStorage, usePreferredLanguage, useHistory, useEventListener, useBattery, useDebouncedCallback, useScrollLock, useResizeObserver, useMousePosition, useScrollDirection, useImageLoader, usePersistedState, useReducedMotion, useCookie, useFetchRetry, useDelay, useVisibilityChange, useDebouncedValue, useAsync, useScript, useIndexedDB, useGeoLocation, useTimer, useIsMounted, useCss, useSpeak, useCountUp, useCountDown, DynamicLoader, AlertMessage, FilePreview, FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton, LabeledValue, DetailsCard, UploadFile, DownloadFile };
8
+ export { getHook, setHook, useAxios, useAdvReducer, useFetch, useLocalStorage, useToggle, useDebounce, useThrottle, usePrevious, useMediaQuery, useClipboard, useInterval, useWindowSize, useKeyPress, useOnlineStatus, useScrollPosition, useTimeout, useDarkMode, useForm, useArray, useStepper, useUpdateEffect, useTouch, useSound, useSessionStorage, usePreferredLanguage, useHistory, useEventListener, useBattery, useDebouncedCallback, useScrollLock, useResizeObserver, useMousePosition, useScrollDirection, useImageLoader, usePersistedState, useReducedMotion, useCookie, useFetchRetry, useDelay, useVisibilityChange, useDebouncedValue, useAsync, useScript, useIndexedDB, useGeoLocation, useTimer, useIsMounted, useCss, useSpeak, useCountUp, useCountDown, usePersistedForm, useCrossFieldValidation, useFieldArray, useFormSubmit, useSmartForm, useUndo, useFormWizard, useWebSocket, useDragReorder, useInfiniteScroll, useEventListeners, useHistoryState, useIdle, useIsFirstRender, useList, useLockBodyScroll, useLongPress, createOptimizedContext, DynamicLoader, AlertMessage, FilePreview, FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton, LabeledValue, DetailsCard, UploadFile, DownloadFile };
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import 'nprogress/nprogress.css';
2
- import { ReactHooksWrapper, getHook, setHook } from "./hookExecuter/hookExecuter";
3
- import { DynamicLoader, AlertMessage, FilePreview, LabeledValue, DetailsCard, UploadFile, DownloadFile } from './hooks/hooksComp';
4
- import { FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton } from './skeletons/skeletons';
5
- import { useAxios, useAdvReducer, useFetch, useLocalStorage, useToggle, useDebounce, useThrottle, usePrevious, useMediaQuery, useClipboard, useInterval, useWindowSize, useKeyPress, useOnlineStatus, useScrollPosition, useTimeout, useDarkMode, useForm, useArray, useStepper, useUpdateEffect, useTouch, useSound, useSessionStorage, usePreferredLanguage, useHistory, useEventListener, useBattery, useDebouncedCallback, useScrollLock, useResizeObserver, useMousePosition, useScrollDirection, useImageLoader, usePersistedState, useReducedMotion, useCookie, useFetchRetry, useDelay, useVisibilityChange, useDebouncedValue, useAsync, useScript, useIndexedDB, useGeoLocation, useTimer, useIsMounted, useCss, useSpeak, useCountUp, useCountDown, } from './hooks/hooks';
2
+ import { ReactHooksWrapper, getHook, setHook } from "./hookExecuter/chunk143";
3
+ import { DynamicLoader, AlertMessage, FilePreview, LabeledValue, DetailsCard, UploadFile, DownloadFile } from './hooks/chunk613852';
4
+ import { FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton } from './skeletons/chunk613555';
5
+ import { useHistoryState, useIdle, useIsFirstRender, useList, useLockBodyScroll, useLongPress } from './hooks/chunk726433';
6
+ import { useAxios, useAdvReducer, useFetch, useLocalStorage, useToggle, useDebounce, useThrottle, usePrevious, useMediaQuery, useClipboard, useInterval, useWindowSize, useKeyPress, useOnlineStatus, useScrollPosition, useTimeout, useDarkMode, useForm, useArray, useStepper, useUpdateEffect, useTouch, useSound, useSessionStorage, usePreferredLanguage, useHistory, useEventListener, useBattery, useDebouncedCallback, useScrollLock, useResizeObserver, useMousePosition, useScrollDirection, useImageLoader, usePersistedState, useReducedMotion, useCookie, useFetchRetry, useDelay, useVisibilityChange, useDebouncedValue, useAsync, useScript, useIndexedDB, useGeoLocation, useTimer, useIsMounted, useCss, useSpeak, useCountUp, useCountDown, usePersistedForm, useCrossFieldValidation, useFieldArray, useFormSubmit, useSmartForm, useUndo, useFormWizard, useWebSocket, useDragReorder, useInfiniteScroll, useEventListeners, createOptimizedContext } from './hooks/chunk940514';
6
7
  export default ReactHooksWrapper;
7
- export { getHook, setHook, useAxios, useAdvReducer, useFetch, useLocalStorage, useToggle, useDebounce, useThrottle, usePrevious, useMediaQuery, useClipboard, useInterval, useWindowSize, useKeyPress, useOnlineStatus, useScrollPosition, useTimeout, useDarkMode, useForm, useArray, useStepper, useUpdateEffect, useTouch, useSound, useSessionStorage, usePreferredLanguage, useHistory, useEventListener, useBattery, useDebouncedCallback, useScrollLock, useResizeObserver, useMousePosition, useScrollDirection, useImageLoader, usePersistedState, useReducedMotion, useCookie, useFetchRetry, useDelay, useVisibilityChange, useDebouncedValue, useAsync, useScript, useIndexedDB, useGeoLocation, useTimer, useIsMounted, useCss, useSpeak, useCountUp, useCountDown, DynamicLoader, AlertMessage, FilePreview, FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton, LabeledValue, DetailsCard, UploadFile, DownloadFile };
8
+ export { getHook, setHook, useAxios, useAdvReducer, useFetch, useLocalStorage, useToggle, useDebounce, useThrottle, usePrevious, useMediaQuery, useClipboard, useInterval, useWindowSize, useKeyPress, useOnlineStatus, useScrollPosition, useTimeout, useDarkMode, useForm, useArray, useStepper, useUpdateEffect, useTouch, useSound, useSessionStorage, usePreferredLanguage, useHistory, useEventListener, useBattery, useDebouncedCallback, useScrollLock, useResizeObserver, useMousePosition, useScrollDirection, useImageLoader, usePersistedState, useReducedMotion, useCookie, useFetchRetry, useDelay, useVisibilityChange, useDebouncedValue, useAsync, useScript, useIndexedDB, useGeoLocation, useTimer, useIsMounted, useCss, useSpeak, useCountUp, useCountDown, usePersistedForm, useCrossFieldValidation, useFieldArray, useFormSubmit, useSmartForm, useUndo, useFormWizard, useWebSocket, useDragReorder, useInfiniteScroll, useEventListeners, useHistoryState, useIdle, useIsFirstRender, useList, useLockBodyScroll, useLongPress, createOptimizedContext, DynamicLoader, AlertMessage, FilePreview, FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton, LabeledValue, DetailsCard, UploadFile, DownloadFile };
package/dist/utils.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export declare const promise: (time: number) => Promise<unknown>;
2
+ export declare function throttle<T extends (...args: any[]) => void>(func: T, limit: number): T;
package/dist/utils.js CHANGED
@@ -1 +1,25 @@
1
1
  export var promise = function (time) { return new Promise(function (res) { return setTimeout(res, time); }); };
2
+ export function throttle(func, limit) {
3
+ var lastFunc;
4
+ var lastRan;
5
+ return function () {
6
+ var _this = this;
7
+ var args = [];
8
+ for (var _i = 0; _i < arguments.length; _i++) {
9
+ args[_i] = arguments[_i];
10
+ }
11
+ if (!lastRan) {
12
+ func.apply(this, args);
13
+ lastRan = Date.now();
14
+ }
15
+ else {
16
+ clearTimeout(lastFunc);
17
+ lastFunc = setTimeout(function () {
18
+ if (Date.now() - lastRan >= limit) {
19
+ func.apply(_this, args);
20
+ lastRan = Date.now();
21
+ }
22
+ }, limit - (Date.now() - lastRan));
23
+ }
24
+ };
25
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-hook-toolkit",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "description": "Ultimate package for React developers, offering a powerful collection of hooks and components to enhance their development experience.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
File without changes
File without changes