@os-design/drag-sort 1.0.18 → 1.0.20

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 (92) hide show
  1. package/dist/cjs/DragAndDrop.js +9 -9
  2. package/dist/cjs/DragAndDrop.js.map +1 -1
  3. package/dist/cjs/Draggable.js +6 -6
  4. package/dist/cjs/Draggable.js.map +1 -1
  5. package/dist/cjs/Droppable.js +2 -2
  6. package/dist/cjs/Droppable.js.map +1 -1
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/utils/ListStore.js.map +1 -1
  9. package/dist/cjs/utils/NodeList.js +27 -35
  10. package/dist/cjs/utils/NodeList.js.map +1 -1
  11. package/dist/cjs/utils/getElementOffset.js.map +1 -1
  12. package/dist/cjs/utils/getElementScroll.js.map +1 -1
  13. package/dist/cjs/utils/getNodeRect.js +1 -1
  14. package/dist/cjs/utils/getNodeRect.js.map +1 -1
  15. package/dist/cjs/utils/useAppendClassName.js.map +1 -1
  16. package/dist/cjs/utils/useBlankNode.js +2 -2
  17. package/dist/cjs/utils/useBlankNode.js.map +1 -1
  18. package/dist/cjs/utils/useDragAndDrop.js.map +1 -1
  19. package/dist/cjs/utils/useDragEffect.js +14 -14
  20. package/dist/cjs/utils/useDragEffect.js.map +1 -1
  21. package/dist/cjs/utils/useDroppable.js.map +1 -1
  22. package/dist/cjs/utils/useGeneratedId.js.map +1 -1
  23. package/dist/cjs/utils/useGetNodeStyle.js.map +1 -1
  24. package/dist/cjs/utils/useInitRect.js.map +1 -1
  25. package/dist/cjs/utils/useInitScrollOffset.js.map +1 -1
  26. package/dist/cjs/utils/useMoveNode.js +2 -2
  27. package/dist/cjs/utils/useMoveNode.js.map +1 -1
  28. package/dist/cjs/utils/useScrollEventByPoint.js +1 -1
  29. package/dist/cjs/utils/useScrollEventByPoint.js.map +1 -1
  30. package/dist/cjs/utils/useTargetList.js +3 -3
  31. package/dist/cjs/utils/useTargetList.js.map +1 -1
  32. package/dist/cjs/utils/useTransitionStyle.js.map +1 -1
  33. package/dist/esm/DragAndDrop.js +6 -6
  34. package/dist/esm/DragAndDrop.js.map +1 -1
  35. package/dist/esm/Draggable.js +3 -3
  36. package/dist/esm/Draggable.js.map +1 -1
  37. package/dist/esm/Droppable.js +1 -1
  38. package/dist/esm/Droppable.js.map +1 -1
  39. package/dist/esm/utils/ListStore.js.map +1 -1
  40. package/dist/esm/utils/NodeList.js +26 -37
  41. package/dist/esm/utils/NodeList.js.map +1 -1
  42. package/dist/esm/utils/getNodeRect.js +1 -1
  43. package/dist/esm/utils/getNodeRect.js.map +1 -1
  44. package/dist/esm/utils/useAppendClassName.js.map +1 -1
  45. package/dist/esm/utils/useBlankNode.js.map +1 -1
  46. package/dist/esm/utils/useDragAndDrop.js.map +1 -1
  47. package/dist/esm/utils/useDragEffect.js +6 -6
  48. package/dist/esm/utils/useDragEffect.js.map +1 -1
  49. package/dist/esm/utils/useDroppable.js.map +1 -1
  50. package/dist/esm/utils/useGeneratedId.js.map +1 -1
  51. package/dist/esm/utils/useInitRect.js.map +1 -1
  52. package/dist/esm/utils/useMoveNode.js.map +1 -1
  53. package/dist/esm/utils/useScrollEventByPoint.js +1 -1
  54. package/dist/esm/utils/useScrollEventByPoint.js.map +1 -1
  55. package/dist/esm/utils/useTargetList.js +1 -1
  56. package/dist/esm/utils/useTargetList.js.map +1 -1
  57. package/dist/types/DragAndDrop.d.ts +1 -1
  58. package/dist/types/DragAndDrop.d.ts.map +1 -1
  59. package/dist/types/Draggable.d.ts +1 -1
  60. package/dist/types/Draggable.d.ts.map +1 -1
  61. package/dist/types/Droppable.d.ts.map +1 -1
  62. package/dist/types/utils/useDragAndDrop.d.ts +1 -1
  63. package/dist/types/utils/useDragAndDrop.d.ts.map +1 -1
  64. package/dist/types/utils/useDragEffect.d.ts +1 -1
  65. package/dist/types/utils/useDragEffect.d.ts.map +1 -1
  66. package/dist/types/utils/useDroppable.d.ts.map +1 -1
  67. package/dist/types/utils/useMoveNode.d.ts.map +1 -1
  68. package/dist/types/utils/useTargetList.d.ts +1 -1
  69. package/dist/types/utils/useTargetList.d.ts.map +1 -1
  70. package/package.json +21 -13
  71. package/src/DragAndDrop.tsx +235 -0
  72. package/src/Draggable.tsx +109 -0
  73. package/src/Droppable.tsx +142 -0
  74. package/src/index.ts +7 -0
  75. package/src/utils/ListStore.ts +47 -0
  76. package/src/utils/NodeList.ts +245 -0
  77. package/src/utils/getElementOffset.ts +13 -0
  78. package/src/utils/getElementScroll.ts +13 -0
  79. package/src/utils/getNodeRect.ts +29 -0
  80. package/src/utils/useAppendClassName.ts +20 -0
  81. package/src/utils/useBlankNode.ts +104 -0
  82. package/src/utils/useDragAndDrop.ts +32 -0
  83. package/src/utils/useDragEffect.ts +490 -0
  84. package/src/utils/useDroppable.ts +21 -0
  85. package/src/utils/useGeneratedId.ts +6 -0
  86. package/src/utils/useGetNodeStyle.ts +34 -0
  87. package/src/utils/useInitRect.ts +17 -0
  88. package/src/utils/useInitScrollOffset.ts +16 -0
  89. package/src/utils/useMoveNode.ts +97 -0
  90. package/src/utils/useScrollEventByPoint.ts +56 -0
  91. package/src/utils/useTargetList.ts +31 -0
  92. package/src/utils/useTransitionStyle.ts +26 -0
@@ -0,0 +1,56 @@
1
+ import { getScrollableElements } from '@os-design/use-auto-scroll';
2
+ import { useCallback, useEffect, useRef } from 'react';
3
+
4
+ const compare = <T>(prevArr: T[], nextArr: T[]) => {
5
+ const remove: T[] = [];
6
+ const add: T[] = [];
7
+ prevArr.forEach((item) => {
8
+ if (!nextArr.includes(item)) remove.push(item);
9
+ });
10
+ nextArr.forEach((item) => {
11
+ if (!prevArr.includes(item)) add.push(item);
12
+ });
13
+ return { remove, add };
14
+ };
15
+
16
+ export interface Point {
17
+ x: number;
18
+ y: number;
19
+ }
20
+
21
+ /**
22
+ * Sets the listener that will be called whenever the scroll event occurs
23
+ * in one of the elements located under the specified point.
24
+ */
25
+ const useScrollEventByPoint = (
26
+ point: Point | null,
27
+ listener: (e: Event) => void
28
+ ) => {
29
+ const listenerRef = useRef(listener);
30
+ useEffect(() => {
31
+ listenerRef.current = listener;
32
+ }, [listener]);
33
+
34
+ const eventListener = useCallback((e: Event) => listenerRef.current(e), []);
35
+ const elementsRef = useRef<Element[]>([]);
36
+
37
+ useEffect(() => {
38
+ if (!point) return;
39
+ const scrollableElements = getScrollableElements(point.x, point.y);
40
+ const { remove, add } = compare(elementsRef.current, scrollableElements);
41
+ const getTarget = (item: Element) =>
42
+ item === document.body ? window : item;
43
+
44
+ remove.forEach((item) => {
45
+ const index = elementsRef.current.indexOf(item);
46
+ if (index >= 0) elementsRef.current.splice(index, 1);
47
+ getTarget(item).removeEventListener('scroll', eventListener);
48
+ });
49
+ add.forEach((item) => {
50
+ elementsRef.current.push(item);
51
+ getTarget(item).addEventListener('scroll', eventListener);
52
+ });
53
+ }, [eventListener, point]);
54
+ };
55
+
56
+ export default useScrollEventByPoint;
@@ -0,0 +1,31 @@
1
+ import { Position } from '@os-design/use-drag';
2
+ import useThrottle from '@os-design/use-throttle';
3
+ import { RefObject, useCallback, useMemo, useState } from 'react';
4
+ import ListStore from './ListStore';
5
+ import useScrollEventByPoint from './useScrollEventByPoint';
6
+
7
+ const useTargetList = (
8
+ position: Position | null,
9
+ listStoreRef: RefObject<ListStore>
10
+ ) => {
11
+ const [number, setNumber] = useState(0);
12
+
13
+ const targetList = useMemo(() => {
14
+ if (!position || !listStoreRef.current) return null;
15
+ const { x, y } = position;
16
+ const list = listStoreRef.current.findByPosition(x, y);
17
+ return list || null;
18
+ }, [listStoreRef, position, number]); // eslint-disable-line react-hooks/exhaustive-deps
19
+
20
+ const forceUpdate = useCallback(() => {
21
+ setNumber((n) => n + 1);
22
+ }, []);
23
+
24
+ // Update the target list if one of the elements located under the specified point has been scrolled
25
+ const [throttledForceUpdate] = useThrottle(forceUpdate, 100);
26
+ useScrollEventByPoint(position, throttledForceUpdate);
27
+
28
+ return targetList;
29
+ };
30
+
31
+ export default useTargetList;
@@ -0,0 +1,26 @@
1
+ import { useEffect } from 'react';
2
+
3
+ interface UseTransitionStyleProps {
4
+ className: string;
5
+ ms: number;
6
+ enabled: boolean;
7
+ }
8
+
9
+ /**
10
+ * Creates the global style for setting the transition delay.
11
+ */
12
+ const useTransitionStyle = (props: UseTransitionStyleProps) => {
13
+ const { className, ms, enabled } = props;
14
+
15
+ useEffect(() => {
16
+ if (!enabled) return () => {};
17
+ const style = document.createElement('style');
18
+ style.innerHTML = `.${className}{transition:transform ${ms}ms;}`;
19
+ const child = document.head.appendChild(style);
20
+ return () => {
21
+ document.head.removeChild(child);
22
+ };
23
+ }, [className, enabled, ms]);
24
+ };
25
+
26
+ export default useTransitionStyle;