@aiszlab/relax 1.5.2 → 1.5.3

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.
@@ -13,4 +13,4 @@ export type Containable = {
13
13
  */
14
14
  contains?: (node: Nullable<Node>) => boolean;
15
15
  };
16
- export declare const contains: (root: Voidable<Containable>, node?: Voidable<Node>) => boolean;
16
+ export declare const contains: (root: Voidable<Containable>, node?: Voidable<Node | EventTarget>) => boolean;
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
4
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
+ var useUpdateState = require('./use-update-state.cjs');
6
+ var useEvent = require('./use-event.cjs');
7
+
8
+ /**
9
+ * @description
10
+ * Hook for dragging
11
+ */
12
+ var useDrag = function useDrag() {
13
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
14
+ _onDragEnd = _ref.onDragEnd,
15
+ _onDragMove = _ref.onDragMove,
16
+ _onDragStart = _ref.onDragStart;
17
+ var _useUpdateState = useUpdateState.useUpdateState({
18
+ x: 0,
19
+ y: 0,
20
+ movementX: 0,
21
+ movementY: 0,
22
+ offsetX: 0,
23
+ offsetY: 0,
24
+ isDragging: false,
25
+ isDragged: false
26
+ }),
27
+ _useUpdateState2 = _slicedToArray(_useUpdateState, 2),
28
+ dragState = _useUpdateState2[0],
29
+ setDragState = _useUpdateState2[1];
30
+ var onDragStart = useEvent.useEvent(function (event) {
31
+ event.persist();
32
+ setDragState(function () {
33
+ return {
34
+ isDragging: true,
35
+ isDragged: true,
36
+ x: event.clientX,
37
+ y: event.clientY,
38
+ movementX: 0,
39
+ movementY: 0,
40
+ offsetX: event.nativeEvent.layerX,
41
+ offsetY: event.nativeEvent.layerY
42
+ };
43
+ }, _onDragStart && function (_state) {
44
+ _onDragStart(event, _objectSpread({}, _state));
45
+ });
46
+ });
47
+ var onDragMove = useEvent.useEvent(function (event) {
48
+ event.persist();
49
+ setDragState(function (_state) {
50
+ if (!_state.isDragging) return _state;
51
+ var x = _state.x,
52
+ y = _state.y,
53
+ offsetX = _state.offsetX,
54
+ offsetY = _state.offsetY;
55
+ return {
56
+ isDragging: true,
57
+ isDragged: true,
58
+ x: x,
59
+ y: y,
60
+ offsetX: offsetX,
61
+ offsetY: offsetY,
62
+ movementX: event.clientX - x,
63
+ movementY: event.clientY - y
64
+ };
65
+ }, _onDragMove && function (_state) {
66
+ if (!_state.isDragging) return;
67
+ _onDragMove(event, _objectSpread({}, _state));
68
+ });
69
+ });
70
+ var onDragEnd = useEvent.useEvent(function (event) {
71
+ event.persist();
72
+ setDragState(function (_state) {
73
+ return {
74
+ isDragging: false,
75
+ isDragged: true,
76
+ x: event.clientX - _state.offsetX,
77
+ y: event.clientY - _state.offsetY,
78
+ movementX: 0,
79
+ movementY: 0,
80
+ offsetX: 0,
81
+ offsetY: 0
82
+ };
83
+ }, _onDragEnd && function (_state) {
84
+ _onDragEnd(event, _objectSpread({}, _state));
85
+ });
86
+ });
87
+ return [dragState, {
88
+ onDragEnd: onDragEnd,
89
+ onDragMove: onDragMove,
90
+ onDragStart: onDragStart
91
+ }];
92
+ };
93
+
94
+ exports.useDrag = useDrag;
@@ -1,11 +1,11 @@
1
- import { type DragEvent } from "react";
1
+ import { type MouseEvent } from "react";
2
2
  export type UsingDrag = {
3
3
  /** Optional callback invoked upon drag end. */
4
- onDragEnd?: (event: DragEvent<HTMLDivElement>, state: DragState) => void;
4
+ onDragEnd?: (event: MouseEvent<HTMLDivElement>, state: DragState) => void;
5
5
  /** Optional callback invoked upon drag movement. */
6
- onDragMove?: (event: DragEvent<HTMLDivElement>, state: DragState) => void;
6
+ onDragMove?: (event: MouseEvent<HTMLDivElement>, state: DragState) => void;
7
7
  /** Optional callback invoked upon drag start. */
8
- onDragStart?: (event: DragEvent<HTMLDivElement>, state: DragState) => void;
8
+ onDragStart?: (event: MouseEvent<HTMLDivElement>, state: DragState) => void;
9
9
  };
10
10
  export type DragState = {
11
11
  /**
@@ -18,32 +18,48 @@ export type DragState = {
18
18
  * y position
19
19
  */
20
20
  y: number;
21
+ /**
22
+ * @description
23
+ * moved x
24
+ */
25
+ movementX: number;
26
+ /**
27
+ * @description
28
+ * moved y
29
+ */
30
+ movementY: number;
21
31
  /**
22
32
  * @description
23
33
  * offset X
24
34
  */
25
- offsetX?: number;
35
+ offsetX: number;
26
36
  /**
27
37
  * @description
28
38
  * offset Y
29
39
  */
30
- offsetY?: number;
40
+ offsetY: number;
31
41
  /**
32
42
  * @description
33
43
  * Whether a drag is currently in progress.
34
44
  */
35
45
  isDragging: boolean;
46
+ /**
47
+ * @description
48
+ * isDragged
49
+ */
50
+ isDragged: boolean;
36
51
  };
37
52
  export type UsedDrag = [
38
53
  DragState,
39
54
  {
40
- onDragEnd: (event: DragEvent<HTMLDivElement>) => void;
41
- onDragMove: (event: DragEvent<HTMLDivElement>) => void;
42
- onDragStart: (event: DragEvent<HTMLDivElement>) => void;
55
+ onDragEnd: (event: MouseEvent<HTMLDivElement>) => void;
56
+ onDragMove: (event: MouseEvent<HTMLDivElement>) => void;
57
+ onDragStart: (event: MouseEvent<HTMLDivElement>) => void;
43
58
  }
44
59
  ];
45
60
  /**
46
61
  * @description
47
62
  * Hook for dragging
48
63
  */
49
- export default function useDrag({ onDragEnd: _onDragEnd, onDragMove: _onDragMove, onDragStart: _onDragStart, }?: UsingDrag | undefined): UsedDrag;
64
+ declare const useDrag: ({ onDragEnd: _onDragEnd, onDragMove: _onDragMove, onDragStart: _onDragStart, }?: UsingDrag | undefined) => UsedDrag;
65
+ export { useDrag };
@@ -0,0 +1,92 @@
1
+ import _objectSpread from '@babel/runtime/helpers/objectSpread2';
2
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
3
+ import { useUpdateState } from './use-update-state.mjs';
4
+ import { useEvent } from './use-event.mjs';
5
+
6
+ /**
7
+ * @description
8
+ * Hook for dragging
9
+ */
10
+ var useDrag = function useDrag() {
11
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
12
+ _onDragEnd = _ref.onDragEnd,
13
+ _onDragMove = _ref.onDragMove,
14
+ _onDragStart = _ref.onDragStart;
15
+ var _useUpdateState = useUpdateState({
16
+ x: 0,
17
+ y: 0,
18
+ movementX: 0,
19
+ movementY: 0,
20
+ offsetX: 0,
21
+ offsetY: 0,
22
+ isDragging: false,
23
+ isDragged: false
24
+ }),
25
+ _useUpdateState2 = _slicedToArray(_useUpdateState, 2),
26
+ dragState = _useUpdateState2[0],
27
+ setDragState = _useUpdateState2[1];
28
+ var onDragStart = useEvent(function (event) {
29
+ event.persist();
30
+ setDragState(function () {
31
+ return {
32
+ isDragging: true,
33
+ isDragged: true,
34
+ x: event.clientX,
35
+ y: event.clientY,
36
+ movementX: 0,
37
+ movementY: 0,
38
+ offsetX: event.nativeEvent.layerX,
39
+ offsetY: event.nativeEvent.layerY
40
+ };
41
+ }, _onDragStart && function (_state) {
42
+ _onDragStart(event, _objectSpread({}, _state));
43
+ });
44
+ });
45
+ var onDragMove = useEvent(function (event) {
46
+ event.persist();
47
+ setDragState(function (_state) {
48
+ if (!_state.isDragging) return _state;
49
+ var x = _state.x,
50
+ y = _state.y,
51
+ offsetX = _state.offsetX,
52
+ offsetY = _state.offsetY;
53
+ return {
54
+ isDragging: true,
55
+ isDragged: true,
56
+ x: x,
57
+ y: y,
58
+ offsetX: offsetX,
59
+ offsetY: offsetY,
60
+ movementX: event.clientX - x,
61
+ movementY: event.clientY - y
62
+ };
63
+ }, _onDragMove && function (_state) {
64
+ if (!_state.isDragging) return;
65
+ _onDragMove(event, _objectSpread({}, _state));
66
+ });
67
+ });
68
+ var onDragEnd = useEvent(function (event) {
69
+ event.persist();
70
+ setDragState(function (_state) {
71
+ return {
72
+ isDragging: false,
73
+ isDragged: true,
74
+ x: event.clientX - _state.offsetX,
75
+ y: event.clientY - _state.offsetY,
76
+ movementX: 0,
77
+ movementY: 0,
78
+ offsetX: 0,
79
+ offsetY: 0
80
+ };
81
+ }, _onDragEnd && function (_state) {
82
+ _onDragEnd(event, _objectSpread({}, _state));
83
+ });
84
+ });
85
+ return [dragState, {
86
+ onDragEnd: onDragEnd,
87
+ onDragMove: onDragMove,
88
+ onDragStart: onDragStart
89
+ }];
90
+ };
91
+
92
+ export { useDrag };
@@ -2,6 +2,7 @@
2
2
 
3
3
  var react = require('react');
4
4
  var useEvent = require('./use-event.cjs');
5
+ var useUnmount = require('./use-unmount.cjs');
5
6
 
6
7
  /**
7
8
  * @description
@@ -10,18 +11,28 @@ var useEvent = require('./use-event.cjs');
10
11
  var useRaf = function useRaf(_callback) {
11
12
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
12
13
  timely = _ref.timely;
13
- var callback = useEvent.useEvent(_callback);
14
14
  var timed = react.useRef(null);
15
15
  var isTimed = react.useRef(false);
16
- return function () {
16
+ useUnmount.useUnmount(function () {
17
+ if (!timed.current) return;
18
+ cancelAnimationFrame(timed.current);
19
+ });
20
+ var callback = useEvent.useEvent(function () {
21
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
22
+ args[_key] = arguments[_key];
23
+ }
17
24
  if (isTimed.current) return;
18
25
  isTimed.current = true;
19
- timely && callback();
26
+ if (timely) {
27
+ _callback.apply(void 0, args);
28
+ return;
29
+ }
20
30
  timed.current = requestAnimationFrame(function () {
21
31
  isTimed.current = false;
22
- !timely && callback();
32
+ _callback.apply(void 0, args);
23
33
  });
24
- };
34
+ });
35
+ return callback;
25
36
  };
26
37
 
27
38
  exports.useRaf = useRaf;
@@ -1,21 +1,16 @@
1
1
  import type { AnyFunction } from "@aiszlab/relax/types";
2
- type UsingRaf = [
3
- callback: AnyFunction,
4
- {
5
- /**
6
- * @description
7
- * run callback immediately
8
- * if `timely` is true, run callback immediately
9
- * otherwise, wait for next frame
10
- */
11
- timely?: boolean;
12
- }?
13
- ];
14
- type UsedRaf = () => void;
15
- type UseRaf = (...args: UsingRaf) => UsedRaf;
2
+ type UsingRaf = {
3
+ /**
4
+ * @description
5
+ * run callback immediately
6
+ * if `timely` is true, run callback immediately
7
+ * otherwise, wait for next frame
8
+ */
9
+ timely?: boolean;
10
+ };
16
11
  /**
17
12
  * @description
18
13
  * raf
19
14
  */
20
- export declare const useRaf: UseRaf;
15
+ export declare const useRaf: <T extends AnyFunction<any[], void>>(_callback: T, { timely }?: UsingRaf) => T;
21
16
  export {};
@@ -1,5 +1,6 @@
1
1
  import { useRef } from 'react';
2
2
  import { useEvent } from './use-event.mjs';
3
+ import { useUnmount } from './use-unmount.mjs';
3
4
 
4
5
  /**
5
6
  * @description
@@ -8,18 +9,28 @@ import { useEvent } from './use-event.mjs';
8
9
  var useRaf = function useRaf(_callback) {
9
10
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
10
11
  timely = _ref.timely;
11
- var callback = useEvent(_callback);
12
12
  var timed = useRef(null);
13
13
  var isTimed = useRef(false);
14
- return function () {
14
+ useUnmount(function () {
15
+ if (!timed.current) return;
16
+ cancelAnimationFrame(timed.current);
17
+ });
18
+ var callback = useEvent(function () {
19
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
20
+ args[_key] = arguments[_key];
21
+ }
15
22
  if (isTimed.current) return;
16
23
  isTimed.current = true;
17
- timely && callback();
24
+ if (timely) {
25
+ _callback.apply(void 0, args);
26
+ return;
27
+ }
18
28
  timed.current = requestAnimationFrame(function () {
19
29
  isTimed.current = false;
20
- !timely && callback();
30
+ _callback.apply(void 0, args);
21
31
  });
22
- };
32
+ });
33
+ return callback;
23
34
  };
24
35
 
25
36
  export { useRaf };
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
4
+ var react = require('react');
5
+ var useUpdateEffect = require('./use-update-effect.cjs');
6
+
7
+ function useUpdateState(initialState) {
8
+ var _useState = react.useState(initialState),
9
+ _useState2 = _slicedToArray(_useState, 2),
10
+ state = _useState2[0],
11
+ setState = _useState2[1];
12
+ var callbackRef = react.useRef(null);
13
+ var setter = react.useCallback(function (state, callback) {
14
+ setState(state);
15
+ callbackRef.current = callback !== null && callback !== void 0 ? callback : null;
16
+ }, []);
17
+ useUpdateEffect.useUpdateEffect(function () {
18
+ var _callback = callbackRef.current;
19
+ if (!_callback) return;
20
+ // execution & reset
21
+ _callback(state);
22
+ callbackRef.current = null;
23
+ }, [state]);
24
+ return [state, setter];
25
+ }
26
+
27
+ exports.useUpdateState = useUpdateState;
@@ -0,0 +1,25 @@
1
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
2
+ import { useState, useRef, useCallback } from 'react';
3
+ import { useUpdateEffect } from './use-update-effect.mjs';
4
+
5
+ function useUpdateState(initialState) {
6
+ var _useState = useState(initialState),
7
+ _useState2 = _slicedToArray(_useState, 2),
8
+ state = _useState2[0],
9
+ setState = _useState2[1];
10
+ var callbackRef = useRef(null);
11
+ var setter = useCallback(function (state, callback) {
12
+ setState(state);
13
+ callbackRef.current = callback !== null && callback !== void 0 ? callback : null;
14
+ }, []);
15
+ useUpdateEffect(function () {
16
+ var _callback = callbackRef.current;
17
+ if (!_callback) return;
18
+ // execution & reset
19
+ _callback(state);
20
+ callbackRef.current = null;
21
+ }, [state]);
22
+ return [state, setter];
23
+ }
24
+
25
+ export { useUpdateState };
package/dist/index.cjs CHANGED
@@ -35,6 +35,7 @@ var useInfiniteScroll = require('./hooks/use-infinite-scroll.cjs');
35
35
  var useReactive = require('./hooks/use-reactive.cjs');
36
36
  var useParentSize = require('./hooks/use-parent-size.cjs');
37
37
  var useScreenSize = require('./hooks/use-screen-size.cjs');
38
+ var useDrag = require('./hooks/use-drag.cjs');
38
39
  var isRefable = require('./is/is-refable.cjs');
39
40
  var isUndefined = require('./is/is-undefined.cjs');
40
41
  var isNull = require('./is/is-null.cjs');
@@ -112,6 +113,7 @@ exports.useInfiniteScroll = useInfiniteScroll.useInfiniteScroll;
112
113
  exports.useReactive = useReactive.useReactive;
113
114
  exports.useParentSize = useParentSize.useParentSize;
114
115
  exports.useScreenSize = useScreenSize.useScreenSize;
116
+ exports.useDrag = useDrag.useDrag;
115
117
  exports.isRefable = isRefable.isRefable;
116
118
  exports.isUndefined = isUndefined.isUndefined;
117
119
  exports.isNull = isNull.isNull;
package/dist/index.d.ts CHANGED
@@ -37,6 +37,7 @@ export { useInfiniteScroll } from "./hooks/use-infinite-scroll";
37
37
  export { useReactive } from "./hooks/use-reactive";
38
38
  export { useParentSize } from "./hooks/use-parent-size";
39
39
  export { useScreenSize } from "./hooks/use-screen-size";
40
+ export { useDrag } from "./hooks/use-drag";
40
41
  /**
41
42
  * @description
42
43
  * is
package/dist/index.mjs CHANGED
@@ -33,6 +33,7 @@ export { useInfiniteScroll } from './hooks/use-infinite-scroll.mjs';
33
33
  export { useReactive } from './hooks/use-reactive.mjs';
34
34
  export { useParentSize } from './hooks/use-parent-size.mjs';
35
35
  export { useScreenSize } from './hooks/use-screen-size.mjs';
36
+ export { useDrag } from './hooks/use-drag.mjs';
36
37
  export { isRefable } from './is/is-refable.mjs';
37
38
  export { isUndefined } from './is/is-undefined.mjs';
38
39
  export { isNull } from './is/is-null.mjs';
@@ -1 +1 @@
1
- export type AnyFunction = (...args: any) => any;
1
+ export type AnyFunction<P extends any[] = any[], R = any> = (...args: P) => R;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiszlab/relax",
3
- "version": "1.5.2",
3
+ "version": "1.5.3",
4
4
  "description": "react utils collection",
5
5
  "exports": {
6
6
  ".": {
@@ -36,30 +36,30 @@
36
36
  "publish:npm": "npm publish"
37
37
  },
38
38
  "dependencies": {
39
- "@babel/runtime": "^7.25.7",
39
+ "@babel/runtime": "^7.26.0",
40
40
  "react-is": "^18.3.1",
41
41
  "rxjs": "^7.8.1"
42
42
  },
43
43
  "devDependencies": {
44
- "@babel/core": "^7.25.8",
45
- "@babel/plugin-transform-runtime": "^7.25.7",
46
- "@babel/preset-env": "^7.25.8",
47
- "@babel/preset-react": "^7.25.7",
48
- "@babel/preset-typescript": "^7.25.7",
44
+ "@babel/core": "^7.26.0",
45
+ "@babel/plugin-transform-runtime": "^7.25.9",
46
+ "@babel/preset-env": "^7.26.0",
47
+ "@babel/preset-react": "^7.25.9",
48
+ "@babel/preset-typescript": "^7.26.0",
49
49
  "@jest/globals": "^29.7.0",
50
50
  "@rollup/plugin-babel": "^6.0.4",
51
51
  "@rollup/plugin-node-resolve": "^15.3.0",
52
52
  "@rollup/plugin-typescript": "^12.1.1",
53
53
  "@testing-library/react": "^16.0.1",
54
54
  "@types/babel__core": "^7.20.5",
55
- "@types/react": "^18.3.11",
55
+ "@types/react": "^18.3.12",
56
56
  "@types/react-dom": "^18.3.1",
57
57
  "@types/react-is": "^18.3.0",
58
58
  "jest": "^29.7.0",
59
59
  "jest-environment-jsdom": "^29.7.0",
60
60
  "react": "^18.3.1",
61
61
  "react-dom": "^18.3.1",
62
- "rollup": "^4.24.0",
62
+ "rollup": "^4.24.1",
63
63
  "typescript": "5.6.2"
64
64
  },
65
65
  "peerDependencies": {