@chaomingd/hooks 0.0.34

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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/dist/esm/index.d.ts +10 -0
  4. package/dist/esm/index.js +10 -0
  5. package/dist/esm/useDragAndDrop/index.d.ts +35 -0
  6. package/dist/esm/useDragAndDrop/index.js +193 -0
  7. package/dist/esm/useDragAndDrop/index.less +29 -0
  8. package/dist/esm/useEditModal/index.d.ts +56 -0
  9. package/dist/esm/useEditModal/index.js +166 -0
  10. package/dist/esm/useEffectWithTarget/index.d.ts +2 -0
  11. package/dist/esm/useEffectWithTarget/index.js +36 -0
  12. package/dist/esm/useLatestState/index.d.ts +8 -0
  13. package/dist/esm/useLatestState/index.js +36 -0
  14. package/dist/esm/useListLayout/index.d.ts +20 -0
  15. package/dist/esm/useListLayout/index.js +112 -0
  16. package/dist/esm/usePagination/constant.d.ts +2 -0
  17. package/dist/esm/usePagination/constant.js +2 -0
  18. package/dist/esm/usePagination/index.d.ts +14 -0
  19. package/dist/esm/usePagination/index.js +184 -0
  20. package/dist/esm/usePagination/type.d.ts +68 -0
  21. package/dist/esm/usePagination/type.js +1 -0
  22. package/dist/esm/usePagination/utils.d.ts +1 -0
  23. package/dist/esm/usePagination/utils.js +8 -0
  24. package/dist/esm/useResizer/index.d.ts +37 -0
  25. package/dist/esm/useResizer/index.js +173 -0
  26. package/dist/esm/useResponsive/index.d.ts +44 -0
  27. package/dist/esm/useResponsive/index.js +94 -0
  28. package/dist/esm/useSelectionList/index.d.ts +13 -0
  29. package/dist/esm/useSelectionList/index.js +49 -0
  30. package/dist/lib/index.d.ts +10 -0
  31. package/dist/lib/index.js +112 -0
  32. package/dist/lib/useDragAndDrop/index.d.ts +35 -0
  33. package/dist/lib/useDragAndDrop/index.js +191 -0
  34. package/dist/lib/useDragAndDrop/index.less +29 -0
  35. package/dist/lib/useEditModal/index.d.ts +56 -0
  36. package/dist/lib/useEditModal/index.js +160 -0
  37. package/dist/lib/useEffectWithTarget/index.d.ts +2 -0
  38. package/dist/lib/useEffectWithTarget/index.js +37 -0
  39. package/dist/lib/useLatestState/index.d.ts +8 -0
  40. package/dist/lib/useLatestState/index.js +29 -0
  41. package/dist/lib/useListLayout/index.d.ts +20 -0
  42. package/dist/lib/useListLayout/index.js +116 -0
  43. package/dist/lib/usePagination/constant.d.ts +2 -0
  44. package/dist/lib/usePagination/constant.js +8 -0
  45. package/dist/lib/usePagination/index.d.ts +14 -0
  46. package/dist/lib/usePagination/index.js +157 -0
  47. package/dist/lib/usePagination/type.d.ts +68 -0
  48. package/dist/lib/usePagination/type.js +5 -0
  49. package/dist/lib/usePagination/utils.d.ts +1 -0
  50. package/dist/lib/usePagination/utils.js +14 -0
  51. package/dist/lib/useResizer/index.d.ts +37 -0
  52. package/dist/lib/useResizer/index.js +168 -0
  53. package/dist/lib/useResponsive/index.d.ts +44 -0
  54. package/dist/lib/useResponsive/index.js +88 -0
  55. package/dist/lib/useSelectionList/index.d.ts +13 -0
  56. package/dist/lib/useSelectionList/index.js +45 -0
  57. package/package.json +39 -0
@@ -0,0 +1,37 @@
1
+ import { MutableRefObject } from 'react';
2
+ declare class ResizerStore {
3
+ updator: (state: IResizeStoreState) => void;
4
+ state: IResizeStoreState;
5
+ constructor(updator: (state: IResizeStoreState) => void, baseDelta?: IResizerStoreConfig);
6
+ setState(state: Partial<IResizeStoreState>): void;
7
+ }
8
+ type TMinMaxDelta = Pick<IConfig, 'minDeltaX' | 'maxDeltaX' | 'minDeltaY' | 'maxDeltaY'>;
9
+ export interface IConfig {
10
+ firstUpdate?: boolean;
11
+ baseDeltaX?: number;
12
+ baseDeltaY?: number;
13
+ minDeltaX?: number;
14
+ maxDeltaX?: number;
15
+ minDeltaY?: number;
16
+ maxDeltaY?: number;
17
+ getMinMaxDelta?: (state: IResizeStoreState) => Partial<TMinMaxDelta>;
18
+ direction?: 'left' | 'top' | 'right' | 'bottom';
19
+ elRef: MutableRefObject<HTMLElement | null>;
20
+ resizerStore?: ReturnType<typeof useResizerStore>;
21
+ updator?: (state: IResizeStoreState) => any;
22
+ resizingChange?: (resizing: boolean) => void;
23
+ }
24
+ interface IDeltaRect {
25
+ deltaX: number;
26
+ deltaY: number;
27
+ }
28
+ export declare function useResizer(config: IConfig): ResizerStore;
29
+ export interface IResizeStoreState extends IDeltaRect {
30
+ resizing: boolean;
31
+ }
32
+ export interface IResizerStoreConfig {
33
+ baseDeltaX?: number;
34
+ baseDeltaY?: number;
35
+ }
36
+ export declare function useResizerStore(baseDelta: IResizerStoreConfig): ResizerStore;
37
+ export {};
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useResizer = useResizer;
7
+ exports.useResizerStore = useResizerStore;
8
+ var _utils = require("@chaomingd/utils");
9
+ var _ahooks = require("ahooks");
10
+ var _react = require("react");
11
+ var _useEffectWithTarget = require("../useEffectWithTarget");
12
+ class ResizerStore {
13
+ state = {
14
+ deltaX: 0,
15
+ deltaY: 0,
16
+ resizing: false
17
+ };
18
+ constructor(updator, baseDelta) {
19
+ this.updator = updator;
20
+ if (baseDelta) {
21
+ this.state.deltaX = baseDelta.baseDeltaX || 0;
22
+ this.state.deltaY = baseDelta.baseDeltaY || 0;
23
+ }
24
+ }
25
+ setState(state) {
26
+ this.state = {
27
+ ...this.state,
28
+ ...state
29
+ };
30
+ this.updator(this.state);
31
+ }
32
+ }
33
+ function getMinOrMaxDelta(config, state) {
34
+ const delta = {
35
+ ...config
36
+ };
37
+ if (config.getMinMaxDelta) {
38
+ Object.assign(delta, config.getMinMaxDelta(state) || {});
39
+ }
40
+ return delta;
41
+ }
42
+ function strictDelta(delta, minMaxDelta) {
43
+ if (minMaxDelta.maxDeltaX !== undefined) {
44
+ if (delta.deltaX !== undefined) {
45
+ delta.deltaX = Math.min(delta.deltaX, minMaxDelta.maxDeltaX);
46
+ }
47
+ }
48
+ if (minMaxDelta.maxDeltaY !== undefined) {
49
+ if (delta.deltaY !== undefined) {
50
+ delta.deltaY = Math.min(delta.deltaY, minMaxDelta.maxDeltaY);
51
+ }
52
+ }
53
+ if (minMaxDelta.minDeltaX !== undefined) {
54
+ if (delta.deltaX !== undefined) {
55
+ delta.deltaX = Math.max(delta.deltaX, minMaxDelta.minDeltaX);
56
+ }
57
+ }
58
+ if (minMaxDelta.minDeltaY !== undefined) {
59
+ if (delta.deltaY !== undefined) {
60
+ delta.deltaY = Math.max(delta.deltaY, minMaxDelta.minDeltaY);
61
+ }
62
+ }
63
+ return delta;
64
+ }
65
+ function useResizer(config) {
66
+ const {
67
+ baseDeltaX = 0,
68
+ baseDeltaY = 0,
69
+ direction,
70
+ resizerStore,
71
+ elRef
72
+ } = config;
73
+ const updator = (0, _ahooks.useUpdate)();
74
+ const innerResizerStore = (0, _ahooks.useCreation)(() => {
75
+ return resizerStore || new ResizerStore(config.updator || updator, config);
76
+ }, []);
77
+ innerResizerStore.updator = config.updator || updator;
78
+ const configRef = (0, _react.useRef)(config);
79
+ configRef.current = config;
80
+ const mousedownClientRef = (0, _react.useRef)({
81
+ clientX: 0,
82
+ clientY: 0
83
+ });
84
+ const deltaRef = (0, _react.useRef)({
85
+ deltaX: baseDeltaX,
86
+ deltaY: baseDeltaY
87
+ });
88
+ (0, _useEffectWithTarget.useEffectWithTarget)(() => {
89
+ let offMouseDown;
90
+ let cancelThrottleFunc;
91
+ if (elRef.current) {
92
+ offMouseDown = (0, _utils.listen)(elRef.current, 'mousedown', e => {
93
+ cancelThrottleFunc = handlerResizerMouseDown({
94
+ e,
95
+ mousedownClientRef,
96
+ store: innerResizerStore,
97
+ deltaRef,
98
+ configRef
99
+ });
100
+ });
101
+ }
102
+ // 第一次调用
103
+ if (configRef.current.firstUpdate) {
104
+ innerResizerStore.setState({});
105
+ }
106
+ return () => {
107
+ offMouseDown && offMouseDown();
108
+ cancelThrottleFunc && cancelThrottleFunc();
109
+ };
110
+ }, elRef, [baseDeltaX, baseDeltaY, innerResizerStore, direction, resizerStore], true);
111
+ return resizerStore || innerResizerStore;
112
+ }
113
+ function handlerResizerMouseDown({
114
+ e,
115
+ configRef,
116
+ mousedownClientRef,
117
+ store,
118
+ deltaRef
119
+ }) {
120
+ mousedownClientRef.current = (0, _utils.pick)(e, ['clientX', 'clientY']);
121
+ const deltaX = store.state.deltaX;
122
+ const deltaY = store.state.deltaY;
123
+ const direction = configRef.current.direction || 'left';
124
+ const isHorizantal = direction === 'left' || direction === 'right';
125
+ const dir = ['left', 'top'].indexOf(direction) !== -1 ? -1 : 1;
126
+ store.setState({
127
+ resizing: true
128
+ });
129
+ const minMaxDelta = getMinOrMaxDelta(configRef.current, store.state);
130
+ configRef.current.resizingChange?.(store.state.resizing);
131
+ const throttleMouseMoveRes = (0, _utils.requestAnimationFrameThrottle)({
132
+ // eslint-disable-next-line @typescript-eslint/no-shadow
133
+ service: e => {
134
+ e.preventDefault();
135
+ if (isHorizantal) {
136
+ deltaRef.current.deltaX = e.clientX - mousedownClientRef.current.clientX;
137
+ } else {
138
+ deltaRef.current.deltaY = e.clientY - mousedownClientRef.current.clientY;
139
+ }
140
+ const newDelta = strictDelta(isHorizantal ? {
141
+ deltaX: deltaX + deltaRef.current.deltaX * dir
142
+ } : {
143
+ deltaY: deltaY + deltaRef.current.deltaY * dir
144
+ }, minMaxDelta);
145
+ store.setState(newDelta);
146
+ }
147
+ });
148
+ const cancelThrottleFunc = throttleMouseMoveRes.cancel;
149
+ const offMouseMove = (0, _utils.listen)(document, 'mousemove', throttleMouseMoveRes.run);
150
+ // eslint-disable-next-line @typescript-eslint/no-shadow
151
+ const offMouseUp = (0, _utils.listen)(document, 'mouseup', e => {
152
+ e.preventDefault();
153
+ offMouseMove();
154
+ offMouseUp();
155
+ store.setState({
156
+ resizing: false
157
+ });
158
+ configRef.current.resizingChange?.(store.state.resizing);
159
+ });
160
+ return cancelThrottleFunc;
161
+ }
162
+ function useResizerStore(baseDelta) {
163
+ const updator = (0, _ahooks.useUpdate)();
164
+ const resizerStore = (0, _ahooks.useCreation)(() => {
165
+ return new ResizerStore(updator, baseDelta);
166
+ }, []);
167
+ return resizerStore;
168
+ }
@@ -0,0 +1,44 @@
1
+ import { MutableRefObject } from 'react';
2
+ export interface IResponsiveConfigItem<TData = any> {
3
+ key: string;
4
+ val: number;
5
+ minWidth?: number;
6
+ maxWidth?: number;
7
+ data: TData;
8
+ [key: string]: any;
9
+ }
10
+ export interface IUseResponseParams<TData = any> {
11
+ mediaQuery?: IResponsiveConfigItem<TData>[];
12
+ onChange?: (item: IResponsiveConfigItem<TData>) => void;
13
+ enable?: boolean;
14
+ containerRef?: MutableRefObject<HTMLElement | null>;
15
+ }
16
+ /**
17
+ * @examples
18
+ * ```ts
19
+ // window resize
20
+ const { matchedItem } = useResponsive({
21
+ mediaQuery: [
22
+ { key: 'small', maxWidth: 760 },
23
+ { key: 'middle', minWidth: 761, maxWidth: 1440 },
24
+ { key: 'big', minWidth: 1441 }
25
+ ],
26
+ onChange: (matchedItem) => {}
27
+ });
28
+ // dom resize
29
+ const containerRef = useRef<HTMLDivElement | null>(null);
30
+ const { matchedItem } = useResponsive({
31
+ containerRef,
32
+ mediaQuery: [
33
+ { key: 'small', maxWidth: 760 },
34
+ { key: 'middle', minWidth: 761, maxWidth: 1440 },
35
+ { key: 'big', minWidth: 1441 }
36
+ ],
37
+ onChange: (matchedItem) => {}
38
+ });
39
+ * ```
40
+ */
41
+ export declare function useResponsive<TData = any>(params: IUseResponseParams<TData>): {
42
+ mediaQueryMatchedItem: IResponsiveConfigItem<TData> | null;
43
+ matchMedia: (this: unknown) => void;
44
+ };
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useResponsive = useResponsive;
7
+ var _utils = require("@chaomingd/utils");
8
+ var _ahooks = require("ahooks");
9
+ var _react = require("react");
10
+ var _useEffectWithTarget = require("../useEffectWithTarget");
11
+ /**
12
+ * @examples
13
+ * ```ts
14
+ // window resize
15
+ const { matchedItem } = useResponsive({
16
+ mediaQuery: [
17
+ { key: 'small', maxWidth: 760 },
18
+ { key: 'middle', minWidth: 761, maxWidth: 1440 },
19
+ { key: 'big', minWidth: 1441 }
20
+ ],
21
+ onChange: (matchedItem) => {}
22
+ });
23
+ // dom resize
24
+ const containerRef = useRef<HTMLDivElement | null>(null);
25
+ const { matchedItem } = useResponsive({
26
+ containerRef,
27
+ mediaQuery: [
28
+ { key: 'small', maxWidth: 760 },
29
+ { key: 'middle', minWidth: 761, maxWidth: 1440 },
30
+ { key: 'big', minWidth: 1441 }
31
+ ],
32
+ onChange: (matchedItem) => {}
33
+ });
34
+ * ```
35
+ */
36
+
37
+ function useResponsive(params) {
38
+ const [mediaQueryMatchedItem, setMatchedItem] = (0, _react.useState)(null);
39
+ const paramsRef = (0, _ahooks.useLatest)(params);
40
+ const currDataRef = (0, _react.useRef)(null);
41
+ const matchMedia = (0, _ahooks.useMemoizedFn)(() => {
42
+ if (!paramsRef.current.enable || !paramsRef.current?.mediaQuery) return;
43
+ let width;
44
+ if (params.containerRef?.current) {
45
+ width = params.containerRef.current.getBoundingClientRect().width;
46
+ } else {
47
+ width = window.innerWidth;
48
+ }
49
+ const mediaQuery = paramsRef.current.mediaQuery;
50
+ let matchItem = null;
51
+ if (mediaQuery) {
52
+ for (let i = 0; i < mediaQuery.length; i++) {
53
+ const item = mediaQuery[i];
54
+ if (width >= (item.minWidth || 0) && width <= (item.maxWidth || Infinity)) {
55
+ matchItem = item;
56
+ break;
57
+ }
58
+ }
59
+ if (!matchItem) {
60
+ matchItem = mediaQuery[0];
61
+ }
62
+ if (matchItem && !(0, _utils.isSameObject)(currDataRef.current, matchItem)) {
63
+ currDataRef.current = matchItem;
64
+ setMatchedItem(matchItem);
65
+ paramsRef.current.onChange?.(matchItem);
66
+ }
67
+ }
68
+ });
69
+ (0, _useEffectWithTarget.useEffectWithTarget)(() => {
70
+ matchMedia();
71
+ let offResize;
72
+ if (params.containerRef?.current) {
73
+ offResize = (0, _utils.resizeObserver)({
74
+ el: params.containerRef.current,
75
+ onResize: matchMedia
76
+ });
77
+ } else {
78
+ offResize = (0, _utils.listen)(window, 'resize', matchMedia);
79
+ }
80
+ return () => {
81
+ offResize();
82
+ };
83
+ }, params.containerRef, [], true);
84
+ return {
85
+ mediaQueryMatchedItem,
86
+ matchMedia
87
+ };
88
+ }
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ interface IConfig<T = any> {
3
+ dataList?: T[];
4
+ listKey?: string;
5
+ getKey?: (item: T) => string;
6
+ }
7
+ export declare function useSelectionList<TData = any>({ dataList, listKey, getKey, }: IConfig<TData>): {
8
+ selectedKeys: string[];
9
+ selectedListKeys: string[];
10
+ selectedListItems: TData[];
11
+ changeSelectedListKeys: import("react").Dispatch<import("react").SetStateAction<string[]>>;
12
+ };
13
+ export {};
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSelectionList = useSelectionList;
7
+ var _utils = require("@chaomingd/utils");
8
+ var _ahooks = require("ahooks");
9
+ var _react = require("react");
10
+ const DEFAULT_LIST_KEY = 'key';
11
+ function useSelectionList({
12
+ dataList,
13
+ listKey,
14
+ getKey
15
+ }) {
16
+ const [selectedKeys, changeSelectedListKeys] = (0, _react.useState)([]);
17
+ const getKeyRef = (0, _ahooks.useLatest)(getKey);
18
+ const selectedListData = (0, _react.useMemo)(() => {
19
+ if (!dataList || !dataList.length) {
20
+ return {
21
+ selectedKeys,
22
+ selectedListKeys: [],
23
+ selectedListItems: [],
24
+ changeSelectedListKeys
25
+ };
26
+ }
27
+ const getKeyFunc = getKeyRef.current ? getKeyRef.current : item => item && item[listKey || DEFAULT_LIST_KEY];
28
+ const listDatMap = (0, _utils.arrayToMap)(dataList, getKeyFunc);
29
+ const selectedListKeys = [];
30
+ const selectedListItems = [];
31
+ selectedKeys.forEach(key => {
32
+ if (listDatMap[key]) {
33
+ selectedListKeys.push(key);
34
+ selectedListItems.push(listDatMap[key]);
35
+ }
36
+ });
37
+ return {
38
+ selectedKeys,
39
+ selectedListKeys,
40
+ selectedListItems,
41
+ changeSelectedListKeys
42
+ };
43
+ }, [dataList, listKey, getKeyRef, selectedKeys]);
44
+ return selectedListData;
45
+ }
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@chaomingd/hooks",
3
+ "version": "0.0.34",
4
+ "description": "hooks of laf",
5
+ "keywords": [],
6
+ "license": "MIT",
7
+ "main": "dist/lib/index.js",
8
+ "module": "dist/esm/index.js",
9
+ "typings": "dist/esm/index.d.ts",
10
+ "files": [
11
+ "dist",
12
+ "compiled"
13
+ ],
14
+ "dependencies": {
15
+ "@types/use-sync-external-store": "^0.0.6",
16
+ "use-sync-external-store": "^1.2.2",
17
+ "@chaomingd/utils": "0.0.17",
18
+ "@chaomingd/store": "2.0.7"
19
+ },
20
+ "peerDependencies": {
21
+ "ahooks": ">=3.0.0",
22
+ "antd": "^5.18.2",
23
+ "react": ">=16.9.0",
24
+ "react-dom": ">=16.9.0"
25
+ },
26
+ "devDependencies": {
27
+ "father": "^4.5.0"
28
+ },
29
+ "authors": [],
30
+ "publishConfig": {
31
+ "access": "public",
32
+ "registry": "https://registry.npmjs.org/"
33
+ },
34
+ "scripts": {
35
+ "build": "father build",
36
+ "build:deps": "father prebundle",
37
+ "dev": "father dev"
38
+ }
39
+ }