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 +255 -4
- package/dist/hooks/{hooksComp.js → chunk613852.js} +2 -2
- package/dist/hooks/chunk726433.d.ts +40 -0
- package/dist/hooks/chunk726433.js +267 -0
- package/dist/hooks/{hooks.d.ts → chunk940514.d.ts} +71 -1
- package/dist/hooks/{hooks.js → chunk940514.js} +258 -2
- package/dist/index.d.ts +6 -5
- package/dist/index.js +6 -5
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +24 -0
- package/package.json +1 -1
- /package/dist/contexts/{DrowerContexts.d.ts → chunk158261.d.ts} +0 -0
- /package/dist/contexts/{DrowerContexts.js → chunk158261.js} +0 -0
- /package/dist/hookExecuter/{hookExecuter.d.ts → chunk143.d.ts} +0 -0
- /package/dist/hookExecuter/{hookExecuter.js → chunk143.js} +0 -0
- /package/dist/hooks/{hooksComp.d.ts → chunk613852.d.ts} +0 -0
- /package/dist/skeletons/{skeletons.d.ts → chunk613555.d.ts} +0 -0
- /package/dist/skeletons/{skeletons.js → chunk613555.js} +0 -0
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
|
+
_&_Shyamal_(JS_Expert)-red)    
|
|
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
|
-
    
|
|
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/
|
|
21
|
-
import { useWindowSize } from './
|
|
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/
|
|
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/
|
|
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/
|
|
3
|
-
import { DynamicLoader, AlertMessage, FilePreview, LabeledValue, DetailsCard, UploadFile, DownloadFile } from './hooks/
|
|
4
|
-
import { FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton } from './skeletons/
|
|
5
|
-
import {
|
|
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/
|
|
3
|
-
import { DynamicLoader, AlertMessage, FilePreview, LabeledValue, DetailsCard, UploadFile, DownloadFile } from './hooks/
|
|
4
|
-
import { FileSkeleton, TableSkeleton, PieChartSkeleton, CardSkeleton, LineChartSkeleton, FieldSkeleton } from './skeletons/
|
|
5
|
-
import {
|
|
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
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|