@byeolnaerim/flex-layout 0.0.5 → 0.0.7

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 (173) hide show
  1. package/README.en.md +314 -0
  2. package/README.ko.md +312 -0
  3. package/README.md +314 -0
  4. package/dist/flex-layout/components/FlexLayout.cjs +76 -0
  5. package/dist/flex-layout/components/FlexLayout.cjs.map +1 -0
  6. package/dist/flex-layout/components/FlexLayout.d.ts +2 -0
  7. package/dist/flex-layout/components/FlexLayout.js +70 -0
  8. package/dist/flex-layout/components/FlexLayout.js.map +1 -0
  9. package/dist/flex-layout/components/FlexLayoutContainer.cjs +196 -0
  10. package/dist/flex-layout/components/FlexLayoutContainer.cjs.map +1 -0
  11. package/dist/flex-layout/components/FlexLayoutContainer.d.ts +2 -0
  12. package/dist/flex-layout/components/FlexLayoutContainer.js +189 -0
  13. package/dist/flex-layout/components/FlexLayoutContainer.js.map +1 -0
  14. package/dist/flex-layout/components/FlexLayoutResizePanel.cjs +181 -0
  15. package/dist/flex-layout/components/FlexLayoutResizePanel.cjs.map +1 -0
  16. package/dist/flex-layout/components/FlexLayoutResizePanel.d.ts +2 -0
  17. package/dist/flex-layout/components/FlexLayoutResizePanel.js +175 -0
  18. package/dist/flex-layout/components/FlexLayoutResizePanel.js.map +1 -0
  19. package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs +1211 -0
  20. package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs.map +1 -0
  21. package/dist/flex-layout/components/FlexLayoutSplitScreen.d.ts +11 -0
  22. package/dist/flex-layout/components/FlexLayoutSplitScreen.js +1197 -0
  23. package/dist/flex-layout/components/FlexLayoutSplitScreen.js.map +1 -0
  24. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs +339 -0
  25. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs.map +1 -0
  26. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.d.ts +27 -0
  27. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js +333 -0
  28. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js.map +1 -0
  29. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs +32 -0
  30. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs.map +1 -0
  31. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.d.ts +5 -0
  32. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js +25 -0
  33. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js.map +1 -0
  34. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs +40 -0
  35. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs.map +1 -0
  36. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.d.ts +8 -0
  37. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js +34 -0
  38. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js.map +1 -0
  39. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs +30 -0
  40. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs.map +1 -0
  41. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.d.ts +4 -0
  42. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js +24 -0
  43. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js.map +1 -0
  44. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs +109 -0
  45. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs.map +1 -0
  46. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.d.ts +9 -0
  47. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js +103 -0
  48. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js.map +1 -0
  49. package/dist/flex-layout/components/FlexLayoutStickyBox.cjs +226 -0
  50. package/dist/flex-layout/components/FlexLayoutStickyBox.cjs.map +1 -0
  51. package/dist/flex-layout/components/FlexLayoutStickyBox.d.ts +29 -0
  52. package/dist/flex-layout/components/FlexLayoutStickyBox.js +224 -0
  53. package/dist/flex-layout/components/FlexLayoutStickyBox.js.map +1 -0
  54. package/dist/flex-layout/components/index.cjs +52 -0
  55. package/dist/flex-layout/components/index.cjs.map +1 -0
  56. package/dist/flex-layout/components/index.d.ts +7 -0
  57. package/dist/flex-layout/components/index.js +9 -0
  58. package/dist/flex-layout/components/index.js.map +1 -0
  59. package/dist/flex-layout/hooks/index.cjs +21 -0
  60. package/dist/flex-layout/hooks/index.cjs.map +1 -0
  61. package/dist/flex-layout/hooks/index.d.ts +2 -0
  62. package/dist/flex-layout/hooks/index.js +4 -0
  63. package/dist/flex-layout/hooks/index.js.map +1 -0
  64. package/dist/{hooks.cjs → flex-layout/hooks/useDrag.cjs} +15 -208
  65. package/dist/flex-layout/hooks/useDrag.cjs.map +1 -0
  66. package/dist/{useDrag-DR01Ob3s.d.ts → flex-layout/hooks/useDrag.d.ts} +22 -25
  67. package/dist/{hooks.js → flex-layout/hooks/useDrag.js} +13 -203
  68. package/dist/flex-layout/hooks/useDrag.js.map +1 -0
  69. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs +118 -0
  70. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs.map +1 -0
  71. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.d.ts +28 -0
  72. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js +116 -0
  73. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js.map +1 -0
  74. package/dist/flex-layout/hooks/useListPaging.cjs +179 -0
  75. package/dist/flex-layout/hooks/useListPaging.cjs.map +1 -0
  76. package/dist/{hooks.d.ts → flex-layout/hooks/useListPaging.d.ts} +6 -12
  77. package/dist/flex-layout/hooks/useListPaging.js +175 -0
  78. package/dist/flex-layout/hooks/useListPaging.js.map +1 -0
  79. package/dist/flex-layout/hooks/useSizes.cjs +104 -0
  80. package/dist/flex-layout/hooks/useSizes.cjs.map +1 -0
  81. package/dist/flex-layout/hooks/useSizes.d.ts +8 -0
  82. package/dist/flex-layout/hooks/useSizes.js +101 -0
  83. package/dist/flex-layout/hooks/useSizes.js.map +1 -0
  84. package/dist/flex-layout/index.cjs +42 -0
  85. package/dist/flex-layout/index.cjs.map +1 -0
  86. package/dist/flex-layout/index.d.ts +5 -0
  87. package/dist/flex-layout/index.js +7 -0
  88. package/dist/flex-layout/index.js.map +1 -0
  89. package/dist/flex-layout/providers/FlexLayoutContext.cjs +26 -0
  90. package/dist/flex-layout/providers/FlexLayoutContext.cjs.map +1 -0
  91. package/dist/flex-layout/providers/FlexLayoutContext.d.ts +9 -0
  92. package/dist/flex-layout/providers/FlexLayoutContext.js +23 -0
  93. package/dist/flex-layout/providers/FlexLayoutContext.js.map +1 -0
  94. package/dist/{providers.cjs → flex-layout/providers/FlexLayoutHooks.cjs} +22 -186
  95. package/dist/flex-layout/providers/FlexLayoutHooks.cjs.map +1 -0
  96. package/dist/flex-layout/providers/FlexLayoutHooks.d.ts +51 -0
  97. package/dist/{providers.js → flex-layout/providers/FlexLayoutHooks.js} +14 -178
  98. package/dist/flex-layout/providers/FlexLayoutHooks.js.map +1 -0
  99. package/dist/flex-layout/providers/index.cjs +14 -0
  100. package/dist/flex-layout/providers/index.cjs.map +1 -0
  101. package/dist/flex-layout/providers/index.d.ts +1 -0
  102. package/dist/flex-layout/providers/index.js +3 -0
  103. package/dist/flex-layout/providers/index.js.map +1 -0
  104. package/dist/{store.cjs → flex-layout/store/FlexLayoutContainerStore.cjs} +20 -21
  105. package/dist/flex-layout/store/FlexLayoutContainerStore.cjs.map +1 -0
  106. package/dist/flex-layout/store/FlexLayoutContainerStore.d.ts +62 -0
  107. package/dist/{store.js → flex-layout/store/FlexLayoutContainerStore.js} +20 -21
  108. package/dist/flex-layout/store/FlexLayoutContainerStore.js.map +1 -0
  109. package/dist/flex-layout/store/index.cjs +14 -0
  110. package/dist/flex-layout/store/index.cjs.map +1 -0
  111. package/dist/flex-layout/store/index.d.ts +1 -0
  112. package/dist/flex-layout/store/index.js +3 -0
  113. package/dist/flex-layout/store/index.js.map +1 -0
  114. package/dist/flex-layout/styles/FlexLayout.module.css +416 -0
  115. package/dist/flex-layout/styles/listScroll.module.css +85 -0
  116. package/dist/flex-layout/styles/shake.module.css +41 -0
  117. package/dist/flex-layout/types/FlexDirectionTypes.cjs +4 -0
  118. package/dist/flex-layout/types/FlexDirectionTypes.cjs.map +1 -0
  119. package/dist/flex-layout/types/FlexDirectionTypes.d.ts +6 -0
  120. package/dist/flex-layout/types/FlexDirectionTypes.js +3 -0
  121. package/dist/flex-layout/types/FlexDirectionTypes.js.map +1 -0
  122. package/dist/flex-layout/types/FlexLayoutTypes.cjs +4 -0
  123. package/dist/flex-layout/types/FlexLayoutTypes.cjs.map +1 -0
  124. package/dist/flex-layout/types/FlexLayoutTypes.d.ts +53 -0
  125. package/dist/flex-layout/types/FlexLayoutTypes.js +3 -0
  126. package/dist/flex-layout/types/FlexLayoutTypes.js.map +1 -0
  127. package/dist/{utils.cjs → flex-layout/utils/FlexLayoutUtils.cjs} +3 -4
  128. package/dist/flex-layout/utils/FlexLayoutUtils.cjs.map +1 -0
  129. package/dist/flex-layout/utils/FlexLayoutUtils.d.ts +26 -0
  130. package/dist/{utils.js → flex-layout/utils/FlexLayoutUtils.js} +3 -4
  131. package/dist/flex-layout/utils/FlexLayoutUtils.js.map +1 -0
  132. package/dist/flex-layout/utils/index.cjs +14 -0
  133. package/dist/flex-layout/utils/index.cjs.map +1 -0
  134. package/dist/flex-layout/utils/index.d.ts +1 -0
  135. package/dist/flex-layout/utils/index.js +3 -0
  136. package/dist/flex-layout/utils/index.js.map +1 -0
  137. package/dist/index.cjs +10 -0
  138. package/dist/index.cjs.map +1 -1
  139. package/dist/index.d.ts +1 -2
  140. package/dist/index.js +1 -1
  141. package/dist/index.js.map +1 -1
  142. package/dist/types/css.d.cjs +4 -0
  143. package/dist/types/css.d.cjs.map +1 -0
  144. package/dist/types/css.d.js +3 -0
  145. package/dist/types/css.d.js.map +1 -0
  146. package/package.json +27 -44
  147. package/dist/FlexLayoutSplitScreenDragBox-eCtq4kLd.d.cts +0 -31
  148. package/dist/FlexLayoutSplitScreenDragBox-eCtq4kLd.d.ts +0 -31
  149. package/dist/components.cjs +0 -3048
  150. package/dist/components.cjs.map +0 -1
  151. package/dist/components.css +0 -471
  152. package/dist/components.css.map +0 -1
  153. package/dist/components.d.cts +0 -122
  154. package/dist/components.d.ts +0 -122
  155. package/dist/components.js +0 -3036
  156. package/dist/components.js.map +0 -1
  157. package/dist/hooks.cjs.map +0 -1
  158. package/dist/hooks.d.cts +0 -37
  159. package/dist/hooks.js.map +0 -1
  160. package/dist/index.d.cts +0 -2
  161. package/dist/providers.cjs.map +0 -1
  162. package/dist/providers.d.cts +0 -54
  163. package/dist/providers.d.ts +0 -54
  164. package/dist/providers.js.map +0 -1
  165. package/dist/store.cjs.map +0 -1
  166. package/dist/store.d.cts +0 -67
  167. package/dist/store.d.ts +0 -67
  168. package/dist/store.js.map +0 -1
  169. package/dist/useDrag-CYQnhUFk.d.cts +0 -108
  170. package/dist/utils.cjs.map +0 -1
  171. package/dist/utils.d.cts +0 -28
  172. package/dist/utils.d.ts +0 -28
  173. package/dist/utils.js.map +0 -1
@@ -0,0 +1,116 @@
1
+ import { useState, useRef, useEffect } from 'react';
2
+ import { useDragCapture, dropMovementEventSubject } from './useDrag';
3
+
4
+ function useFlexLayoutSplitScreen({
5
+ isSplitInitial = false,
6
+ parentDirection,
7
+ directionInitial = "row",
8
+ selfContainerName,
9
+ parentLayoutName,
10
+ layoutName
11
+ }) {
12
+ const [direction, setDirection] = useState(
13
+ directionInitial
14
+ );
15
+ const [isSplit, setIsSplit] = useState(isSplitInitial);
16
+ const [boundaryContainerSize, setBoundaryContainerSize] = useState(null);
17
+ const [centerDropTargetComponent, setCenterDropTargetComponent] = useState([]);
18
+ const [afterDropTargetComponent, setAfterDropTargetComponent] = useState([]);
19
+ const [beforeDropTargetComponent, setBeforeDropTargetComponent] = useState([]);
20
+ const layoutRef = useRef(null);
21
+ const dragState = useDragCapture(layoutRef);
22
+ useEffect(() => {
23
+ if (!dragState) {
24
+ setBoundaryContainerSize(null);
25
+ return;
26
+ }
27
+ const {
28
+ isDrop,
29
+ isDragging,
30
+ positionName,
31
+ containerName,
32
+ children: dropComponent,
33
+ isOver,
34
+ navigationTitle,
35
+ dropEndCallback,
36
+ x,
37
+ y,
38
+ screenKey
39
+ } = dragState;
40
+ const orderName = positionName === "leftBoundary" || positionName === "topBoundary" ? "before" : positionName === "rightBoundary" || positionName === "bottomBoundary" ? "after" : "center";
41
+ if ((isOver || isDrop) && boundaryContainerSize) {
42
+ setBoundaryContainerSize(null);
43
+ }
44
+ if (selfContainerName.startsWith(containerName)) {
45
+ return;
46
+ }
47
+ if (isDrop && screenKey) {
48
+ const dropDirection = positionName === "leftBoundary" || positionName === "rightBoundary" ? "row" : "column";
49
+ if (!isSplit && !isOver) {
50
+ if (positionName !== "centerBoundary" && dropDirection !== parentDirection) {
51
+ setIsSplit(true);
52
+ setDirection(dropDirection);
53
+ }
54
+ dropMovementEventSubject.next({
55
+ state: "append",
56
+ targetContainerName: containerName,
57
+ targetParentLayoutName: parentLayoutName,
58
+ targetLayoutName: layoutName,
59
+ targetComponent: dropComponent,
60
+ orderName,
61
+ x,
62
+ y,
63
+ dropEndCallback,
64
+ dropTargetComponentEvent: {
65
+ navigationTitle,
66
+ dropDocumentOutsideOption: dragState?.dropDocumentOutsideOption,
67
+ direction: dropDirection,
68
+ screenKey
69
+ }
70
+ });
71
+ }
72
+ }
73
+ if (isDragging && !isSplit && !isOver) {
74
+ const newSize = {
75
+ left: positionName === "rightBoundary" ? "50%" : "0",
76
+ top: positionName === "bottomBoundary" ? "50%" : "0",
77
+ width: positionName === "leftBoundary" || positionName === "rightBoundary" ? "50%" : "100%",
78
+ height: positionName === "topBoundary" || positionName === "bottomBoundary" ? "50%" : "100%"
79
+ };
80
+ if (JSON.stringify(boundaryContainerSize) !== JSON.stringify(newSize)) {
81
+ setBoundaryContainerSize(newSize);
82
+ }
83
+ }
84
+ }, [
85
+ dragState,
86
+ isSplit,
87
+ boundaryContainerSize,
88
+ parentLayoutName,
89
+ layoutName,
90
+ selfContainerName,
91
+ direction
92
+ ]);
93
+ return {
94
+ direction,
95
+ setDirection,
96
+ isSplit,
97
+ setIsSplit,
98
+ boundaryContainerSize,
99
+ //setBoundaryContainerSize,
100
+ centerDropTargetComponent,
101
+ afterDropTargetComponent,
102
+ beforeDropTargetComponent,
103
+ setAfterDropTargetComponent,
104
+ setBeforeDropTargetComponent,
105
+ setCenterDropTargetComponent,
106
+ //dropTargetComponent,
107
+ //setDropTargetComponent,
108
+ //setDropPosition,
109
+ isOver: dragState?.isOver,
110
+ layoutRef
111
+ };
112
+ }
113
+
114
+ export { useFlexLayoutSplitScreen };
115
+ //# sourceMappingURL=useFlexLayoutSplitScreen.js.map
116
+ //# sourceMappingURL=useFlexLayoutSplitScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/flex-layout/hooks/useFlexLayoutSplitScreen.ts"],"names":[],"mappings":"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","file":"useFlexLayoutSplitScreen.js","sourcesContent":["// useFlexLayoutSplitScreen.js\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport {\r\n\tdropMovementEventSubject,\r\n\tDropTargetComponent,\r\n\tuseDragCapture,\r\n} from \"./useDrag\";\r\n\r\nexport function useFlexLayoutSplitScreen({\r\n\tisSplitInitial = false,\r\n\tparentDirection,\r\n\tdirectionInitial = \"row\",\r\n\tselfContainerName,\r\n\tparentLayoutName,\r\n\tlayoutName,\r\n}: {\r\n\tisSplitInitial: boolean;\r\n\tparentDirection?: \"row\" | \"column\" | null;\r\n\tdirectionInitial: \"row\" | \"column\";\r\n\tselfContainerName: string;\r\n\tparentLayoutName: string;\r\n\tlayoutName: string;\r\n}) {\r\n\tconst [direction, setDirection] = useState<\"row\" | \"column\">(\r\n\t\tdirectionInitial,\r\n\t);\r\n\r\n\tconst [isSplit, setIsSplit] = useState<boolean>(isSplitInitial);\r\n\tconst [boundaryContainerSize, setBoundaryContainerSize] = useState<{\r\n\t\tleft: string;\r\n\t\ttop: string;\r\n\t\twidth: string;\r\n\t\theight: string;\r\n\t} | null>(null);\r\n\tconst [centerDropTargetComponent, setCenterDropTargetComponent] = useState<\r\n\t\tDropTargetComponent[]\r\n\t>([]);\r\n\tconst [afterDropTargetComponent, setAfterDropTargetComponent] = useState<\r\n\t\tDropTargetComponent[]\r\n\t>([]);\r\n\tconst [beforeDropTargetComponent, setBeforeDropTargetComponent] = useState<\r\n\t\tDropTargetComponent[]\r\n\t>([]);\r\n\tconst layoutRef = useRef<HTMLDivElement>(null);\r\n\r\n\tconst dragState = useDragCapture(layoutRef);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!dragState) {\r\n\t\t\tsetBoundaryContainerSize(null);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst {\r\n\t\t\tisDrop,\r\n\t\t\tisDragging,\r\n\t\t\tpositionName,\r\n\t\t\tcontainerName,\r\n\t\t\tchildren: dropComponent,\r\n\t\t\tisOver,\r\n\t\t\tnavigationTitle,\r\n\t\t\tdropEndCallback,\r\n\t\t\tx,\r\n\t\t\ty,\r\n\t\t\tscreenKey,\r\n\t\t} = dragState;\r\n\t\tconst orderName =\r\n\t\t\tpositionName === \"leftBoundary\" || positionName === \"topBoundary\"\r\n\t\t\t\t? \"before\"\r\n\t\t\t\t: positionName === \"rightBoundary\" ||\r\n\t\t\t\t\t positionName === \"bottomBoundary\"\r\n\t\t\t\t\t? \"after\"\r\n\t\t\t\t\t: \"center\";\r\n\t\t// if (selfContainerName === containerName) {\r\n\t\t// setBoundaryContainerSize(null);\r\n\t\t// return;\r\n\t\t// }\r\n\r\n\t\tif ((isOver || isDrop) && boundaryContainerSize) {\r\n\t\t\tsetBoundaryContainerSize(null);\r\n\t\t}\r\n\r\n\t\tif (selfContainerName.startsWith(containerName)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (isDrop && screenKey) {\r\n\t\t\t// if (isDuplication) {\r\n\t\t\t// setDuplicationInfo({ isDuplication, containerName });\r\n\t\t\t// }\r\n\t\t\t// console.log('isDuplication:::', isDuplication);\r\n\t\t\tconst dropDirection =\r\n\t\t\t\tpositionName === \"leftBoundary\" ||\r\n\t\t\t\tpositionName === \"rightBoundary\"\r\n\t\t\t\t\t? \"row\"\r\n\t\t\t\t\t: \"column\";\r\n\t\t\t// if (!parentDirection) {\r\n\t\t\t// console.log(isSplit, positionName !== 'centerBoundary', isOver);\r\n\t\t\t// }\r\n\t\t\tif (\r\n\t\t\t\t!isSplit &&\r\n\t\t\t\t!isOver\r\n\t\t\t\t//!isDuplication\r\n\t\t\t) {\r\n\t\t\t\t//setDirection(dropDirection);\r\n\t\t\t\t//if (positionName !== 'centerBoundary') {\r\n\t\t\t\tif (\r\n\t\t\t\t\tpositionName !== \"centerBoundary\" &&\r\n\t\t\t\t\tdropDirection !== parentDirection\r\n\t\t\t\t) {\r\n\t\t\t\t\tsetIsSplit(true);\r\n\t\t\t\t\tsetDirection(dropDirection);\r\n\t\t\t\t}\r\n\t\t\t\tdropMovementEventSubject.next({\r\n\t\t\t\t\tstate: \"append\",\r\n\t\t\t\t\ttargetContainerName: containerName,\r\n\t\t\t\t\ttargetParentLayoutName: parentLayoutName,\r\n\t\t\t\t\ttargetLayoutName: layoutName,\r\n\t\t\t\t\ttargetComponent: dropComponent,\r\n\t\t\t\t\torderName,\r\n\t\t\t\t\tx,\r\n\t\t\t\t\ty,\r\n\t\t\t\t\tdropEndCallback,\r\n\t\t\t\t\tdropTargetComponentEvent: {\r\n\t\t\t\t\t\tnavigationTitle,\r\n\t\t\t\t\t\tdropDocumentOutsideOption:\r\n\t\t\t\t\t\t\tdragState?.dropDocumentOutsideOption,\r\n\t\t\t\t\t\tdirection: dropDirection,\r\n\t\t\t\t\t\tscreenKey,\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t\t// } else {\r\n\t\t\t\t// dropMovementEventSubject.next({\r\n\t\t\t\t// state: 'append',\r\n\t\t\t\t// targetContainerName: containerName,\r\n\t\t\t\t// targetParentLayoutName: parentLayoutName,\r\n\t\t\t\t// targetLayoutName: layoutName,\r\n\t\t\t\t// targetComponent: dropComponent,\r\n\t\t\t\t// orderName: orderName,\r\n\t\t\t\t// x,\r\n\t\t\t\t// y,\r\n\t\t\t\t// dropEndCallback,\r\n\t\t\t\t// dropTargetComponentEvent: {\r\n\t\t\t\t// navigationTitle,\r\n\t\t\t\t// dropDocumentOutsideOption:\r\n\t\t\t\t// dragState?.dropDocumentOutsideOption,\r\n\t\t\t\t// direction: direction,\r\n\t\t\t\t// },\r\n\t\t\t\t// });\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\t\t\t// else if (\r\n\t\t\t// isSplit &&\r\n\t\t\t// positionName !== 'centerBoundary' &&\r\n\t\t\t// !isOver\r\n\t\t\t// ) {\r\n\t\t\t// if (!isFirstSplitUpdatedRef.current) {\r\n\t\t\t// isFirstSplitUpdatedRef.current = true;\r\n\t\t\t// return;\r\n\t\t\t// }\r\n\t\t\t// updateDropTargetComponents(\r\n\t\t\t// positionName,\r\n\t\t\t// containerName,\r\n\t\t\t// dropComponent\r\n\t\t\t// );\r\n\t\t\t// }\r\n\t\t}\r\n\t\tif (isDragging && !isSplit && !isOver) {\r\n\t\t\tconst newSize = {\r\n\t\t\t\tleft: positionName === \"rightBoundary\" ? \"50%\" : \"0\",\r\n\t\t\t\ttop: positionName === \"bottomBoundary\" ? \"50%\" : \"0\",\r\n\t\t\t\twidth:\r\n\t\t\t\t\tpositionName === \"leftBoundary\" ||\r\n\t\t\t\t\tpositionName === \"rightBoundary\"\r\n\t\t\t\t\t\t? \"50%\"\r\n\t\t\t\t\t\t: \"100%\",\r\n\t\t\t\theight:\r\n\t\t\t\t\tpositionName === \"topBoundary\" ||\r\n\t\t\t\t\tpositionName === \"bottomBoundary\"\r\n\t\t\t\t\t\t? \"50%\"\r\n\t\t\t\t\t\t: \"100%\",\r\n\t\t\t};\r\n\t\t\t// 이전 상태와 비교\r\n\t\t\tif (\r\n\t\t\t\tJSON.stringify(boundaryContainerSize) !==\r\n\t\t\t\tJSON.stringify(newSize)\r\n\t\t\t) {\r\n\t\t\t\tsetBoundaryContainerSize(newSize);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [\r\n\t\tdragState,\r\n\t\tisSplit,\r\n\t\tboundaryContainerSize,\r\n\t\tparentLayoutName,\r\n\t\tlayoutName,\r\n\t\tselfContainerName,\r\n\t\tdirection,\r\n\t]);\r\n\treturn {\r\n\t\tdirection,\r\n\t\tsetDirection,\r\n\t\tisSplit,\r\n\t\tsetIsSplit,\r\n\t\tboundaryContainerSize,\r\n\t\t//setBoundaryContainerSize,\r\n\t\tcenterDropTargetComponent,\r\n\t\tafterDropTargetComponent,\r\n\t\tbeforeDropTargetComponent,\r\n\t\tsetAfterDropTargetComponent,\r\n\t\tsetBeforeDropTargetComponent,\r\n\t\tsetCenterDropTargetComponent,\r\n\t\t//dropTargetComponent,\r\n\t\t//setDropTargetComponent,\r\n\t\t//setDropPosition,\r\n\t\tisOver: dragState?.isOver,\r\n\t\tlayoutRef,\r\n\t};\r\n}\r\n"]}
@@ -0,0 +1,179 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ const useListPagingForSentinel = ({
6
+ //initPageNumber,
7
+ //initPageSize,
8
+ onReachTerminal
9
+ }) => {
10
+ const [firstChildNode, setFirstChildNode] = react.useState(null);
11
+ const [lastChildNode, setLastChildNode] = react.useState(null);
12
+ const observerRef = react.useRef(null);
13
+ const firstChildRef = react.useCallback((node) => {
14
+ setFirstChildNode(node);
15
+ }, []);
16
+ const lastChildRef = react.useCallback((node) => {
17
+ setLastChildNode(node);
18
+ }, []);
19
+ react.useEffect(() => {
20
+ if (firstChildNode && observerRef.current)
21
+ observerRef.current.unobserve(firstChildNode);
22
+ if (lastChildNode && observerRef.current)
23
+ observerRef.current.unobserve(lastChildNode);
24
+ const handleIntersect = (entries, observer2) => {
25
+ entries.forEach((entry) => {
26
+ if (entry.isIntersecting) {
27
+ if (entry.target === firstChildNode) {
28
+ if (onReachTerminal)
29
+ onReachTerminal({
30
+ isFirst: true,
31
+ isLast: false,
32
+ observer: observer2
33
+ });
34
+ }
35
+ if (entry.target === lastChildNode) {
36
+ if (onReachTerminal)
37
+ onReachTerminal({
38
+ isFirst: false,
39
+ isLast: true,
40
+ observer: observer2
41
+ });
42
+ }
43
+ }
44
+ });
45
+ };
46
+ const observer = new IntersectionObserver(handleIntersect, {
47
+ threshold: 0.1
48
+ });
49
+ observerRef.current = observer;
50
+ if (firstChildNode) observer.observe(firstChildNode);
51
+ if (lastChildNode) observer.observe(lastChildNode);
52
+ return () => {
53
+ if (observerRef.current) {
54
+ observerRef.current.disconnect();
55
+ }
56
+ };
57
+ }, [firstChildNode, lastChildNode]);
58
+ return {
59
+ firstChildRef,
60
+ lastChildRef
61
+ };
62
+ };
63
+ const usePaginationViewNumber = ({
64
+ initPageNumber
65
+ }) => {
66
+ const [showCurrentPageNumber, setShowCurrentPageNumber] = react.useState(initPageNumber);
67
+ const observerRef = react.useRef(null);
68
+ const showCurrentPageObserveTarget = react.useCallback(
69
+ (node) => {
70
+ if (!node) return;
71
+ if (!observerRef.current) {
72
+ observerRef.current = new IntersectionObserver(
73
+ (entries) => {
74
+ entries.forEach((entry) => {
75
+ if (entry.isIntersecting) {
76
+ const pageIndexAttr = entry.target.getAttribute(
77
+ "data-page-index"
78
+ );
79
+ if (!pageIndexAttr) return;
80
+ const pageIndex = parseInt(pageIndexAttr, 10);
81
+ setShowCurrentPageNumber(pageIndex);
82
+ }
83
+ });
84
+ },
85
+ {
86
+ threshold: 0.1
87
+ // 예: 10% 이상 보여야 intersect로 판단
88
+ }
89
+ );
90
+ }
91
+ observerRef.current.observe(node);
92
+ },
93
+ []
94
+ );
95
+ react.useEffect(() => {
96
+ const currentObserver = observerRef.current;
97
+ return () => {
98
+ if (currentObserver) {
99
+ currentObserver.disconnect();
100
+ }
101
+ };
102
+ }, []);
103
+ return {
104
+ showCurrentPageNumber,
105
+ showCurrentPageObserveTarget
106
+ };
107
+ };
108
+ const usePagingHandler = ({
109
+ lastCallPageNumber,
110
+ dataListRef
111
+ }) => {
112
+ const jumpingPageNumberRef = react.useRef(lastCallPageNumber);
113
+ react.useEffect(() => {
114
+ if (jumpingPageNumberRef.current) {
115
+ setTimeout(() => {
116
+ jumpingPageNumberRef.current = null;
117
+ }, 1e3);
118
+ }
119
+ }, [jumpingPageNumberRef]);
120
+ const paginationScrollIntoViewTarget = react.useRef({});
121
+ const pageNumberRef = react.useRef(lastCallPageNumber);
122
+ const setPaginationRef = react.useCallback(
123
+ (i) => (node) => {
124
+ if (!node) return;
125
+ paginationScrollIntoViewTarget.current[i] = node;
126
+ if (jumpingPageNumberRef.current !== null && i === jumpingPageNumberRef.current) {
127
+ node.scrollIntoView({
128
+ behavior: "instant",
129
+ // 필요한 경우 'smooth' 등으로 수정 가능
130
+ block: "start"
131
+ });
132
+ jumpingPageNumberRef.current = null;
133
+ }
134
+ },
135
+ []
136
+ );
137
+ const handleReachTerminal = ({ isFirst, isLast, observer }, dataCallFetch) => {
138
+ if (dataListRef.current.length === 0) return;
139
+ if (jumpingPageNumberRef.current != null) return;
140
+ if (!isFirst && !isLast) return;
141
+ const callPageNumber = isFirst ? Math.max(pageNumberRef.current - 1, 0) : pageNumberRef.current + 1;
142
+ if (dataListRef.current[callPageNumber] != null && (dataListRef.current[callPageNumber]?.length || 0) > 0)
143
+ return;
144
+ jumpingPageNumberRef.current = callPageNumber;
145
+ setTimeout(() => {
146
+ jumpingPageNumberRef.current = null;
147
+ }, 1e3);
148
+ dataCallFetch(callPageNumber);
149
+ };
150
+ const handleClickPageChange = (page, dataCallFetch) => {
151
+ const pageData = dataListRef.current[page];
152
+ if (pageData != null && Array.isArray(pageData) && pageData.length > 0) {
153
+ paginationScrollIntoViewTarget.current[page]?.scrollIntoView({
154
+ behavior: "smooth",
155
+ block: "start"
156
+ });
157
+ return;
158
+ }
159
+ jumpingPageNumberRef.current = page;
160
+ setTimeout(() => {
161
+ jumpingPageNumberRef.current = null;
162
+ }, 1e3);
163
+ dataCallFetch(page);
164
+ };
165
+ return {
166
+ jumpingPageNumberRef,
167
+ paginationScrollIntoViewTarget,
168
+ pageNumberRef,
169
+ setPaginationRef,
170
+ handleReachTerminal,
171
+ handleClickPageChange
172
+ };
173
+ };
174
+
175
+ exports.useListPagingForSentinel = useListPagingForSentinel;
176
+ exports.usePaginationViewNumber = usePaginationViewNumber;
177
+ exports.usePagingHandler = usePagingHandler;
178
+ //# sourceMappingURL=useListPaging.cjs.map
179
+ //# sourceMappingURL=useListPaging.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/flex-layout/hooks/useListPaging.ts"],"names":["useState","useRef","useCallback","useEffect","observer"],"mappings":"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","file":"useListPaging.cjs","sourcesContent":["import {\r\n\tMutableRefObject,\r\n\tuseCallback,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\nexport type OnReachTerminalType = {\r\n\tisFirst: boolean;\r\n\tisLast: boolean;\r\n\tobserver: IntersectionObserver;\r\n};\r\ninterface UseListPagingForInfinityProps {\r\n\tonReachTerminal?: (onReachTerminalData: OnReachTerminalType) => void;\r\n}\r\nexport const useListPagingForSentinel = <E extends HTMLElement>({\r\n\t//initPageNumber,\r\n\t//initPageSize,\r\n\tonReachTerminal,\r\n}: UseListPagingForInfinityProps): {\r\n\tfirstChildRef: (node: E | null) => void;\r\n\tlastChildRef: (node: E | null) => void;\r\n\t//pageNumber: number;\r\n\t//pageSize: number;\r\n\t//setPageNumber: Dispatch<SetStateAction<number>>;\r\n\t//setPageSize: Dispatch<SetStateAction<number>>;\r\n} => {\r\n\tconst [firstChildNode, setFirstChildNode] = useState<E | null>(null);\r\n\tconst [lastChildNode, setLastChildNode] = useState<E | null>(null);\r\n\tconst observerRef = useRef<IntersectionObserver | null>(null);\r\n\r\n\tconst firstChildRef = useCallback((node: E | null) => {\r\n\t\tsetFirstChildNode(node);\r\n\t}, []);\r\n\r\n\tconst lastChildRef = useCallback((node: E | null) => {\r\n\t\tsetLastChildNode(node);\r\n\t}, []);\r\n\t// 페이지 번호가 변경될 때마다 데이터 로드를 위한 콜백 호출\r\n\r\n\tuseEffect(() => {\r\n\t\tif (firstChildNode && observerRef.current)\r\n\t\t\tobserverRef.current.unobserve(firstChildNode);\r\n\t\tif (lastChildNode && observerRef.current)\r\n\t\t\tobserverRef.current.unobserve(lastChildNode);\r\n\t\tconst handleIntersect: IntersectionObserverCallback = (\r\n\t\t\tentries,\r\n\t\t\tobserver,\r\n\t\t) => {\r\n\t\t\tentries.forEach((entry) => {\r\n\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\tif (entry.target === firstChildNode) {\r\n\t\t\t\t\t\tif (onReachTerminal)\r\n\t\t\t\t\t\t\tonReachTerminal({\r\n\t\t\t\t\t\t\t\tisFirst: true,\r\n\t\t\t\t\t\t\t\tisLast: false,\r\n\t\t\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (entry.target === lastChildNode) {\r\n\t\t\t\t\t\tif (onReachTerminal)\r\n\t\t\t\t\t\t\tonReachTerminal({\r\n\t\t\t\t\t\t\t\tisFirst: false,\r\n\t\t\t\t\t\t\t\tisLast: true,\r\n\t\t\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst observer = new IntersectionObserver(handleIntersect, {\r\n\t\t\tthreshold: 0.1,\r\n\t\t});\r\n\r\n\t\tobserverRef.current = observer;\r\n\r\n\t\tif (firstChildNode) observer.observe(firstChildNode);\r\n\t\tif (lastChildNode) observer.observe(lastChildNode);\r\n\r\n\t\treturn () => {\r\n\t\t\tif (observerRef.current) {\r\n\t\t\t\t// if (firstChildNode)\r\n\t\t\t\t// observerRef.current.unobserve(firstChildNode);\r\n\t\t\t\t// if (lastChildNode) observerRef.current.unobserve(lastChildNode);\r\n\t\t\t\tobserverRef.current.disconnect();\r\n\t\t\t}\r\n\t\t};\r\n\t}, [firstChildNode, lastChildNode]);\r\n\r\n\treturn {\r\n\t\tfirstChildRef,\r\n\t\tlastChildRef,\r\n\t};\r\n};\r\n\r\nexport const usePaginationViewNumber = ({\r\n\tinitPageNumber,\r\n}: {\r\n\tinitPageNumber: number;\r\n}) => {\r\n\tconst [showCurrentPageNumber, setShowCurrentPageNumber] =\r\n\t\tuseState<number>(initPageNumber);\r\n\r\n\tconst observerRef = useRef<IntersectionObserver | null>(null);\r\n\tconst showCurrentPageObserveTarget = useCallback(\r\n\t\t(node: HTMLElement | null) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\t// 아직 observer가 없으면 새로 생성\r\n\t\t\tif (!observerRef.current) {\r\n\t\t\t\tobserverRef.current = new IntersectionObserver(\r\n\t\t\t\t\t(entries) => {\r\n\t\t\t\t\t\tentries.forEach((entry) => {\r\n\t\t\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\t\t\tconst pageIndexAttr =\r\n\t\t\t\t\t\t\t\t\tentry.target.getAttribute(\r\n\t\t\t\t\t\t\t\t\t\t\"data-page-index\",\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\tif (!pageIndexAttr) return;\r\n\t\t\t\t\t\t\t\t// if (!entry.target.hasAttribute('data-is-first'))\r\n\t\t\t\t\t\t\t\t// return;\r\n\t\t\t\t\t\t\t\tconst pageIndex = parseInt(pageIndexAttr, 10);\r\n\t\t\t\t\t\t\t\tsetShowCurrentPageNumber(pageIndex);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthreshold: 0.1, // 예: 10% 이상 보여야 intersect로 판단\r\n\t\t\t\t\t},\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\t// 해당 노드를 관찰\r\n\t\t\tobserverRef.current.observe(node);\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\tuseEffect(() => {\r\n\t\tconst currentObserver = observerRef.current;\r\n\t\treturn () => {\r\n\t\t\tif (currentObserver) {\r\n\t\t\t\tcurrentObserver.disconnect();\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\treturn {\r\n\t\tshowCurrentPageNumber,\r\n\t\tshowCurrentPageObserveTarget,\r\n\t};\r\n};\r\n\r\nexport const usePagingHandler = <T>({\r\n\tlastCallPageNumber,\r\n\tdataListRef,\r\n}: {\r\n\tlastCallPageNumber: number;\r\n\tdataListRef: MutableRefObject<Array<T[] | null>>;\r\n}) => {\r\n\tconst jumpingPageNumberRef = useRef<number | null>(lastCallPageNumber);\r\n\tuseEffect(() => {\r\n\t\tif (jumpingPageNumberRef.current) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t\t}, 1000);\r\n\t\t}\r\n\t}, [jumpingPageNumberRef]);\r\n\tconst paginationScrollIntoViewTarget = useRef<\r\n\t\tRecord<number, HTMLDivElement | null>\r\n\t>({});\r\n\tconst pageNumberRef = useRef<number>(lastCallPageNumber);\r\n\r\n\tconst setPaginationRef = useCallback(\r\n\t\t(i: number) => (node: HTMLDivElement | null) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\tpaginationScrollIntoViewTarget.current[i] = node;\r\n\r\n\t\t\t// jumpingPageNumberRef에 값이 있고, 그 값이 현재 i와 같으면 스크롤\r\n\t\t\tif (\r\n\t\t\t\tjumpingPageNumberRef.current !== null &&\r\n\t\t\t\ti === jumpingPageNumberRef.current\r\n\t\t\t) {\r\n\t\t\t\tnode.scrollIntoView({\r\n\t\t\t\t\tbehavior: \"instant\", // 필요한 경우 'smooth' 등으로 수정 가능\r\n\t\t\t\t\tblock: \"start\",\r\n\t\t\t\t});\r\n\t\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t\t}\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\r\n\t//스크롤이 “첫 아이템” 혹은 “마지막 아이템”에 닿을 때 호출\r\n\tconst handleReachTerminal = (\r\n\t\t{ isFirst, isLast, observer }: OnReachTerminalType,\r\n\t\tdataCallFetch: (callPageNumber: number) => void,\r\n\t) => {\r\n\t\t// 이미 다른 페이지로 점프 중이면, 중복 호출 방지\r\n\t\tif (dataListRef.current.length === 0) return;\r\n\t\tif (jumpingPageNumberRef.current != null) return;\r\n\t\tif (!isFirst && !isLast) return;\r\n\r\n\t\tconst callPageNumber = isFirst\r\n\t\t\t? Math.max(pageNumberRef.current - 1, 0)\r\n\t\t\t: pageNumberRef.current + 1;\r\n\r\n\t\tif (\r\n\t\t\tdataListRef.current[callPageNumber] != null &&\r\n\t\t\t(dataListRef.current[callPageNumber]?.length || 0) > 0\r\n\t\t)\r\n\t\t\treturn;\r\n\t\tjumpingPageNumberRef.current = callPageNumber;\r\n\t\tsetTimeout(() => {\r\n\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t}, 1000);\r\n\t\tdataCallFetch(callPageNumber);\r\n\t};\r\n\r\n\t//페이지네이션에서 페이지 번호를 직접 클릭했을 시\r\n\tconst handleClickPageChange = (\r\n\t\tpage: number,\r\n\t\tdataCallFetch: (callPageNumber: number) => void,\r\n\t) => {\r\n\t\t// PaginationLayer는 1-based, 내부 로직은 0-based\r\n\t\t// 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n\t\tconst pageData = dataListRef.current[page];\r\n\r\n\t\t// 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n\t\tif (\r\n\t\t\tpageData != null &&\r\n\t\t\tArray.isArray(pageData) &&\r\n\t\t\tpageData.length > 0\r\n\t\t) {\r\n\t\t\tpaginationScrollIntoViewTarget.current[page]?.scrollIntoView({\r\n\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\tblock: \"start\",\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tjumpingPageNumberRef.current = page;\r\n\t\tsetTimeout(() => {\r\n\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t}, 1000);\r\n\t\tdataCallFetch(page);\r\n\t};\r\n\treturn {\r\n\t\tjumpingPageNumberRef,\r\n\t\tpaginationScrollIntoViewTarget,\r\n\t\tpageNumberRef,\r\n\t\tsetPaginationRef,\r\n\t\thandleReachTerminal,\r\n\t\thandleClickPageChange,\r\n\t};\r\n};\r\n"]}
@@ -1,10 +1,5 @@
1
- export { D as DragStateResultType, a as DragStateType, b as DropMovementEventType, c as DropPositionOrderName, d as DropTargetComponent, e as DropTargetComponentEvent, F as FolderEventType, P as PositionName, f as allSplitScreenCount, g as dragState, h as dropMovementEventSubject, i as folderEventSubject, s as setFolderEvent, u as useDragCapture, j as useDragEvents, k as useFolderEvent } from './useDrag-DR01Ob3s.js';
2
- import { MutableRefObject } from 'react';
3
- import 'rxjs';
4
- import './FlexLayoutSplitScreenDragBox-eCtq4kLd.js';
5
- import 'react/jsx-runtime';
6
-
7
- type OnReachTerminalType = {
1
+ import { MutableRefObject } from "react";
2
+ export type OnReachTerminalType = {
8
3
  isFirst: boolean;
9
4
  isLast: boolean;
10
5
  observer: IntersectionObserver;
@@ -12,17 +7,17 @@ type OnReachTerminalType = {
12
7
  interface UseListPagingForInfinityProps {
13
8
  onReachTerminal?: (onReachTerminalData: OnReachTerminalType) => void;
14
9
  }
15
- declare const useListPagingForSentinel: <E extends HTMLElement>({ onReachTerminal, }: UseListPagingForInfinityProps) => {
10
+ export declare const useListPagingForSentinel: <E extends HTMLElement>({ onReachTerminal, }: UseListPagingForInfinityProps) => {
16
11
  firstChildRef: (node: E | null) => void;
17
12
  lastChildRef: (node: E | null) => void;
18
13
  };
19
- declare const usePaginationViewNumber: ({ initPageNumber, }: {
14
+ export declare const usePaginationViewNumber: ({ initPageNumber, }: {
20
15
  initPageNumber: number;
21
16
  }) => {
22
17
  showCurrentPageNumber: number;
23
18
  showCurrentPageObserveTarget: (node: HTMLElement | null) => void;
24
19
  };
25
- declare const usePagingHandler: <T>({ lastCallPageNumber, dataListRef, }: {
20
+ export declare const usePagingHandler: <T>({ lastCallPageNumber, dataListRef, }: {
26
21
  lastCallPageNumber: number;
27
22
  dataListRef: MutableRefObject<Array<T[] | null>>;
28
23
  }) => {
@@ -33,5 +28,4 @@ declare const usePagingHandler: <T>({ lastCallPageNumber, dataListRef, }: {
33
28
  handleReachTerminal: ({ isFirst, isLast, observer }: OnReachTerminalType, dataCallFetch: (callPageNumber: number) => void) => void;
34
29
  handleClickPageChange: (page: number, dataCallFetch: (callPageNumber: number) => void) => void;
35
30
  };
36
-
37
- export { type OnReachTerminalType, useListPagingForSentinel, usePaginationViewNumber, usePagingHandler };
31
+ export {};
@@ -0,0 +1,175 @@
1
+ import { useState, useRef, useCallback, useEffect } from 'react';
2
+
3
+ const useListPagingForSentinel = ({
4
+ //initPageNumber,
5
+ //initPageSize,
6
+ onReachTerminal
7
+ }) => {
8
+ const [firstChildNode, setFirstChildNode] = useState(null);
9
+ const [lastChildNode, setLastChildNode] = useState(null);
10
+ const observerRef = useRef(null);
11
+ const firstChildRef = useCallback((node) => {
12
+ setFirstChildNode(node);
13
+ }, []);
14
+ const lastChildRef = useCallback((node) => {
15
+ setLastChildNode(node);
16
+ }, []);
17
+ useEffect(() => {
18
+ if (firstChildNode && observerRef.current)
19
+ observerRef.current.unobserve(firstChildNode);
20
+ if (lastChildNode && observerRef.current)
21
+ observerRef.current.unobserve(lastChildNode);
22
+ const handleIntersect = (entries, observer2) => {
23
+ entries.forEach((entry) => {
24
+ if (entry.isIntersecting) {
25
+ if (entry.target === firstChildNode) {
26
+ if (onReachTerminal)
27
+ onReachTerminal({
28
+ isFirst: true,
29
+ isLast: false,
30
+ observer: observer2
31
+ });
32
+ }
33
+ if (entry.target === lastChildNode) {
34
+ if (onReachTerminal)
35
+ onReachTerminal({
36
+ isFirst: false,
37
+ isLast: true,
38
+ observer: observer2
39
+ });
40
+ }
41
+ }
42
+ });
43
+ };
44
+ const observer = new IntersectionObserver(handleIntersect, {
45
+ threshold: 0.1
46
+ });
47
+ observerRef.current = observer;
48
+ if (firstChildNode) observer.observe(firstChildNode);
49
+ if (lastChildNode) observer.observe(lastChildNode);
50
+ return () => {
51
+ if (observerRef.current) {
52
+ observerRef.current.disconnect();
53
+ }
54
+ };
55
+ }, [firstChildNode, lastChildNode]);
56
+ return {
57
+ firstChildRef,
58
+ lastChildRef
59
+ };
60
+ };
61
+ const usePaginationViewNumber = ({
62
+ initPageNumber
63
+ }) => {
64
+ const [showCurrentPageNumber, setShowCurrentPageNumber] = useState(initPageNumber);
65
+ const observerRef = useRef(null);
66
+ const showCurrentPageObserveTarget = useCallback(
67
+ (node) => {
68
+ if (!node) return;
69
+ if (!observerRef.current) {
70
+ observerRef.current = new IntersectionObserver(
71
+ (entries) => {
72
+ entries.forEach((entry) => {
73
+ if (entry.isIntersecting) {
74
+ const pageIndexAttr = entry.target.getAttribute(
75
+ "data-page-index"
76
+ );
77
+ if (!pageIndexAttr) return;
78
+ const pageIndex = parseInt(pageIndexAttr, 10);
79
+ setShowCurrentPageNumber(pageIndex);
80
+ }
81
+ });
82
+ },
83
+ {
84
+ threshold: 0.1
85
+ // 예: 10% 이상 보여야 intersect로 판단
86
+ }
87
+ );
88
+ }
89
+ observerRef.current.observe(node);
90
+ },
91
+ []
92
+ );
93
+ useEffect(() => {
94
+ const currentObserver = observerRef.current;
95
+ return () => {
96
+ if (currentObserver) {
97
+ currentObserver.disconnect();
98
+ }
99
+ };
100
+ }, []);
101
+ return {
102
+ showCurrentPageNumber,
103
+ showCurrentPageObserveTarget
104
+ };
105
+ };
106
+ const usePagingHandler = ({
107
+ lastCallPageNumber,
108
+ dataListRef
109
+ }) => {
110
+ const jumpingPageNumberRef = useRef(lastCallPageNumber);
111
+ useEffect(() => {
112
+ if (jumpingPageNumberRef.current) {
113
+ setTimeout(() => {
114
+ jumpingPageNumberRef.current = null;
115
+ }, 1e3);
116
+ }
117
+ }, [jumpingPageNumberRef]);
118
+ const paginationScrollIntoViewTarget = useRef({});
119
+ const pageNumberRef = useRef(lastCallPageNumber);
120
+ const setPaginationRef = useCallback(
121
+ (i) => (node) => {
122
+ if (!node) return;
123
+ paginationScrollIntoViewTarget.current[i] = node;
124
+ if (jumpingPageNumberRef.current !== null && i === jumpingPageNumberRef.current) {
125
+ node.scrollIntoView({
126
+ behavior: "instant",
127
+ // 필요한 경우 'smooth' 등으로 수정 가능
128
+ block: "start"
129
+ });
130
+ jumpingPageNumberRef.current = null;
131
+ }
132
+ },
133
+ []
134
+ );
135
+ const handleReachTerminal = ({ isFirst, isLast, observer }, dataCallFetch) => {
136
+ if (dataListRef.current.length === 0) return;
137
+ if (jumpingPageNumberRef.current != null) return;
138
+ if (!isFirst && !isLast) return;
139
+ const callPageNumber = isFirst ? Math.max(pageNumberRef.current - 1, 0) : pageNumberRef.current + 1;
140
+ if (dataListRef.current[callPageNumber] != null && (dataListRef.current[callPageNumber]?.length || 0) > 0)
141
+ return;
142
+ jumpingPageNumberRef.current = callPageNumber;
143
+ setTimeout(() => {
144
+ jumpingPageNumberRef.current = null;
145
+ }, 1e3);
146
+ dataCallFetch(callPageNumber);
147
+ };
148
+ const handleClickPageChange = (page, dataCallFetch) => {
149
+ const pageData = dataListRef.current[page];
150
+ if (pageData != null && Array.isArray(pageData) && pageData.length > 0) {
151
+ paginationScrollIntoViewTarget.current[page]?.scrollIntoView({
152
+ behavior: "smooth",
153
+ block: "start"
154
+ });
155
+ return;
156
+ }
157
+ jumpingPageNumberRef.current = page;
158
+ setTimeout(() => {
159
+ jumpingPageNumberRef.current = null;
160
+ }, 1e3);
161
+ dataCallFetch(page);
162
+ };
163
+ return {
164
+ jumpingPageNumberRef,
165
+ paginationScrollIntoViewTarget,
166
+ pageNumberRef,
167
+ setPaginationRef,
168
+ handleReachTerminal,
169
+ handleClickPageChange
170
+ };
171
+ };
172
+
173
+ export { useListPagingForSentinel, usePaginationViewNumber, usePagingHandler };
174
+ //# sourceMappingURL=useListPaging.js.map
175
+ //# sourceMappingURL=useListPaging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/flex-layout/hooks/useListPaging.ts"],"names":["observer"],"mappings":"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","file":"useListPaging.js","sourcesContent":["import {\r\n\tMutableRefObject,\r\n\tuseCallback,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\nexport type OnReachTerminalType = {\r\n\tisFirst: boolean;\r\n\tisLast: boolean;\r\n\tobserver: IntersectionObserver;\r\n};\r\ninterface UseListPagingForInfinityProps {\r\n\tonReachTerminal?: (onReachTerminalData: OnReachTerminalType) => void;\r\n}\r\nexport const useListPagingForSentinel = <E extends HTMLElement>({\r\n\t//initPageNumber,\r\n\t//initPageSize,\r\n\tonReachTerminal,\r\n}: UseListPagingForInfinityProps): {\r\n\tfirstChildRef: (node: E | null) => void;\r\n\tlastChildRef: (node: E | null) => void;\r\n\t//pageNumber: number;\r\n\t//pageSize: number;\r\n\t//setPageNumber: Dispatch<SetStateAction<number>>;\r\n\t//setPageSize: Dispatch<SetStateAction<number>>;\r\n} => {\r\n\tconst [firstChildNode, setFirstChildNode] = useState<E | null>(null);\r\n\tconst [lastChildNode, setLastChildNode] = useState<E | null>(null);\r\n\tconst observerRef = useRef<IntersectionObserver | null>(null);\r\n\r\n\tconst firstChildRef = useCallback((node: E | null) => {\r\n\t\tsetFirstChildNode(node);\r\n\t}, []);\r\n\r\n\tconst lastChildRef = useCallback((node: E | null) => {\r\n\t\tsetLastChildNode(node);\r\n\t}, []);\r\n\t// 페이지 번호가 변경될 때마다 데이터 로드를 위한 콜백 호출\r\n\r\n\tuseEffect(() => {\r\n\t\tif (firstChildNode && observerRef.current)\r\n\t\t\tobserverRef.current.unobserve(firstChildNode);\r\n\t\tif (lastChildNode && observerRef.current)\r\n\t\t\tobserverRef.current.unobserve(lastChildNode);\r\n\t\tconst handleIntersect: IntersectionObserverCallback = (\r\n\t\t\tentries,\r\n\t\t\tobserver,\r\n\t\t) => {\r\n\t\t\tentries.forEach((entry) => {\r\n\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\tif (entry.target === firstChildNode) {\r\n\t\t\t\t\t\tif (onReachTerminal)\r\n\t\t\t\t\t\t\tonReachTerminal({\r\n\t\t\t\t\t\t\t\tisFirst: true,\r\n\t\t\t\t\t\t\t\tisLast: false,\r\n\t\t\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (entry.target === lastChildNode) {\r\n\t\t\t\t\t\tif (onReachTerminal)\r\n\t\t\t\t\t\t\tonReachTerminal({\r\n\t\t\t\t\t\t\t\tisFirst: false,\r\n\t\t\t\t\t\t\t\tisLast: true,\r\n\t\t\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst observer = new IntersectionObserver(handleIntersect, {\r\n\t\t\tthreshold: 0.1,\r\n\t\t});\r\n\r\n\t\tobserverRef.current = observer;\r\n\r\n\t\tif (firstChildNode) observer.observe(firstChildNode);\r\n\t\tif (lastChildNode) observer.observe(lastChildNode);\r\n\r\n\t\treturn () => {\r\n\t\t\tif (observerRef.current) {\r\n\t\t\t\t// if (firstChildNode)\r\n\t\t\t\t// observerRef.current.unobserve(firstChildNode);\r\n\t\t\t\t// if (lastChildNode) observerRef.current.unobserve(lastChildNode);\r\n\t\t\t\tobserverRef.current.disconnect();\r\n\t\t\t}\r\n\t\t};\r\n\t}, [firstChildNode, lastChildNode]);\r\n\r\n\treturn {\r\n\t\tfirstChildRef,\r\n\t\tlastChildRef,\r\n\t};\r\n};\r\n\r\nexport const usePaginationViewNumber = ({\r\n\tinitPageNumber,\r\n}: {\r\n\tinitPageNumber: number;\r\n}) => {\r\n\tconst [showCurrentPageNumber, setShowCurrentPageNumber] =\r\n\t\tuseState<number>(initPageNumber);\r\n\r\n\tconst observerRef = useRef<IntersectionObserver | null>(null);\r\n\tconst showCurrentPageObserveTarget = useCallback(\r\n\t\t(node: HTMLElement | null) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\t// 아직 observer가 없으면 새로 생성\r\n\t\t\tif (!observerRef.current) {\r\n\t\t\t\tobserverRef.current = new IntersectionObserver(\r\n\t\t\t\t\t(entries) => {\r\n\t\t\t\t\t\tentries.forEach((entry) => {\r\n\t\t\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\t\t\tconst pageIndexAttr =\r\n\t\t\t\t\t\t\t\t\tentry.target.getAttribute(\r\n\t\t\t\t\t\t\t\t\t\t\"data-page-index\",\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\tif (!pageIndexAttr) return;\r\n\t\t\t\t\t\t\t\t// if (!entry.target.hasAttribute('data-is-first'))\r\n\t\t\t\t\t\t\t\t// return;\r\n\t\t\t\t\t\t\t\tconst pageIndex = parseInt(pageIndexAttr, 10);\r\n\t\t\t\t\t\t\t\tsetShowCurrentPageNumber(pageIndex);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthreshold: 0.1, // 예: 10% 이상 보여야 intersect로 판단\r\n\t\t\t\t\t},\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\t// 해당 노드를 관찰\r\n\t\t\tobserverRef.current.observe(node);\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\tuseEffect(() => {\r\n\t\tconst currentObserver = observerRef.current;\r\n\t\treturn () => {\r\n\t\t\tif (currentObserver) {\r\n\t\t\t\tcurrentObserver.disconnect();\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\treturn {\r\n\t\tshowCurrentPageNumber,\r\n\t\tshowCurrentPageObserveTarget,\r\n\t};\r\n};\r\n\r\nexport const usePagingHandler = <T>({\r\n\tlastCallPageNumber,\r\n\tdataListRef,\r\n}: {\r\n\tlastCallPageNumber: number;\r\n\tdataListRef: MutableRefObject<Array<T[] | null>>;\r\n}) => {\r\n\tconst jumpingPageNumberRef = useRef<number | null>(lastCallPageNumber);\r\n\tuseEffect(() => {\r\n\t\tif (jumpingPageNumberRef.current) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t\t}, 1000);\r\n\t\t}\r\n\t}, [jumpingPageNumberRef]);\r\n\tconst paginationScrollIntoViewTarget = useRef<\r\n\t\tRecord<number, HTMLDivElement | null>\r\n\t>({});\r\n\tconst pageNumberRef = useRef<number>(lastCallPageNumber);\r\n\r\n\tconst setPaginationRef = useCallback(\r\n\t\t(i: number) => (node: HTMLDivElement | null) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\tpaginationScrollIntoViewTarget.current[i] = node;\r\n\r\n\t\t\t// jumpingPageNumberRef에 값이 있고, 그 값이 현재 i와 같으면 스크롤\r\n\t\t\tif (\r\n\t\t\t\tjumpingPageNumberRef.current !== null &&\r\n\t\t\t\ti === jumpingPageNumberRef.current\r\n\t\t\t) {\r\n\t\t\t\tnode.scrollIntoView({\r\n\t\t\t\t\tbehavior: \"instant\", // 필요한 경우 'smooth' 등으로 수정 가능\r\n\t\t\t\t\tblock: \"start\",\r\n\t\t\t\t});\r\n\t\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t\t}\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\r\n\t//스크롤이 “첫 아이템” 혹은 “마지막 아이템”에 닿을 때 호출\r\n\tconst handleReachTerminal = (\r\n\t\t{ isFirst, isLast, observer }: OnReachTerminalType,\r\n\t\tdataCallFetch: (callPageNumber: number) => void,\r\n\t) => {\r\n\t\t// 이미 다른 페이지로 점프 중이면, 중복 호출 방지\r\n\t\tif (dataListRef.current.length === 0) return;\r\n\t\tif (jumpingPageNumberRef.current != null) return;\r\n\t\tif (!isFirst && !isLast) return;\r\n\r\n\t\tconst callPageNumber = isFirst\r\n\t\t\t? Math.max(pageNumberRef.current - 1, 0)\r\n\t\t\t: pageNumberRef.current + 1;\r\n\r\n\t\tif (\r\n\t\t\tdataListRef.current[callPageNumber] != null &&\r\n\t\t\t(dataListRef.current[callPageNumber]?.length || 0) > 0\r\n\t\t)\r\n\t\t\treturn;\r\n\t\tjumpingPageNumberRef.current = callPageNumber;\r\n\t\tsetTimeout(() => {\r\n\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t}, 1000);\r\n\t\tdataCallFetch(callPageNumber);\r\n\t};\r\n\r\n\t//페이지네이션에서 페이지 번호를 직접 클릭했을 시\r\n\tconst handleClickPageChange = (\r\n\t\tpage: number,\r\n\t\tdataCallFetch: (callPageNumber: number) => void,\r\n\t) => {\r\n\t\t// PaginationLayer는 1-based, 내부 로직은 0-based\r\n\t\t// 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n\t\tconst pageData = dataListRef.current[page];\r\n\r\n\t\t// 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n\t\tif (\r\n\t\t\tpageData != null &&\r\n\t\t\tArray.isArray(pageData) &&\r\n\t\t\tpageData.length > 0\r\n\t\t) {\r\n\t\t\tpaginationScrollIntoViewTarget.current[page]?.scrollIntoView({\r\n\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\tblock: \"start\",\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tjumpingPageNumberRef.current = page;\r\n\t\tsetTimeout(() => {\r\n\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t}, 1000);\r\n\t\tdataCallFetch(page);\r\n\t};\r\n\treturn {\r\n\t\tjumpingPageNumberRef,\r\n\t\tpaginationScrollIntoViewTarget,\r\n\t\tpageNumberRef,\r\n\t\tsetPaginationRef,\r\n\t\thandleReachTerminal,\r\n\t\thandleClickPageChange,\r\n\t};\r\n};\r\n"]}