@byeolnaerim/flex-layout 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/flex-layout/components/FlexLayout.cjs +76 -0
- package/dist/flex-layout/components/FlexLayout.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayout.js +70 -0
- package/dist/flex-layout/components/FlexLayout.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutContainer.cjs +196 -0
- package/dist/flex-layout/components/FlexLayoutContainer.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutContainer.js +189 -0
- package/dist/flex-layout/components/FlexLayoutContainer.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.cjs +192 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.js +186 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs +1211 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreen.js +1197 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreen.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs +339 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js +333 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs +32 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js +25 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs +40 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.d.ts +2 -2
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js +34 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs +30 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.d.ts +2 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js +24 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs +109 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js +103 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.cjs +226 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.d.ts +6 -6
- package/dist/flex-layout/components/FlexLayoutStickyBox.js +224 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.js.map +1 -0
- package/dist/flex-layout/components/index.cjs +52 -0
- package/dist/flex-layout/components/index.cjs.map +1 -0
- package/dist/flex-layout/components/index.js +9 -0
- package/dist/flex-layout/components/index.js.map +1 -0
- package/dist/flex-layout/hooks/index.cjs +21 -0
- package/dist/flex-layout/hooks/index.cjs.map +1 -0
- package/dist/flex-layout/hooks/index.js +4 -0
- package/dist/flex-layout/hooks/index.js.map +1 -0
- package/dist/{hooks.cjs → flex-layout/hooks/useDrag.cjs} +15 -208
- package/dist/flex-layout/hooks/useDrag.cjs.map +1 -0
- package/dist/flex-layout/hooks/useDrag.d.ts +4 -4
- package/dist/{hooks.js → flex-layout/hooks/useDrag.js} +13 -203
- package/dist/flex-layout/hooks/useDrag.js.map +1 -0
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs +118 -0
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs.map +1 -0
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js +116 -0
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js.map +1 -0
- package/dist/flex-layout/hooks/useListPaging.cjs +179 -0
- package/dist/flex-layout/hooks/useListPaging.cjs.map +1 -0
- package/dist/flex-layout/hooks/useListPaging.js +175 -0
- package/dist/flex-layout/hooks/useListPaging.js.map +1 -0
- package/dist/flex-layout/hooks/useSizes.cjs +104 -0
- package/dist/flex-layout/hooks/useSizes.cjs.map +1 -0
- package/dist/flex-layout/hooks/useSizes.js +101 -0
- package/dist/flex-layout/hooks/useSizes.js.map +1 -0
- package/dist/flex-layout/index.cjs +42 -0
- package/dist/flex-layout/index.cjs.map +1 -0
- package/dist/flex-layout/index.js +7 -0
- package/dist/flex-layout/index.js.map +1 -0
- package/dist/flex-layout/providers/FlexLayoutContext.cjs +26 -0
- package/dist/flex-layout/providers/FlexLayoutContext.cjs.map +1 -0
- package/dist/flex-layout/providers/FlexLayoutContext.d.ts +2 -1
- package/dist/flex-layout/providers/FlexLayoutContext.js +23 -0
- package/dist/flex-layout/providers/FlexLayoutContext.js.map +1 -0
- package/dist/{providers.cjs → flex-layout/providers/FlexLayoutHooks.cjs} +22 -186
- package/dist/flex-layout/providers/FlexLayoutHooks.cjs.map +1 -0
- package/dist/{providers.js → flex-layout/providers/FlexLayoutHooks.js} +14 -178
- package/dist/flex-layout/providers/FlexLayoutHooks.js.map +1 -0
- package/dist/flex-layout/providers/index.cjs +14 -0
- package/dist/flex-layout/providers/index.cjs.map +1 -0
- package/dist/flex-layout/providers/index.js +3 -0
- package/dist/flex-layout/providers/index.js.map +1 -0
- package/dist/{store.cjs → flex-layout/store/FlexLayoutContainerStore.cjs} +20 -21
- package/dist/flex-layout/store/FlexLayoutContainerStore.cjs.map +1 -0
- package/dist/flex-layout/store/FlexLayoutContainerStore.d.ts +2 -2
- package/dist/{store.js → flex-layout/store/FlexLayoutContainerStore.js} +20 -21
- package/dist/flex-layout/store/FlexLayoutContainerStore.js.map +1 -0
- package/dist/flex-layout/store/index.cjs +14 -0
- package/dist/flex-layout/store/index.cjs.map +1 -0
- package/dist/flex-layout/store/index.js +3 -0
- package/dist/flex-layout/store/index.js.map +1 -0
- package/dist/flex-layout/types/FlexDirectionTypes.cjs +4 -0
- package/dist/flex-layout/types/FlexDirectionTypes.cjs.map +1 -0
- package/dist/flex-layout/types/FlexDirectionTypes.js +3 -0
- package/dist/flex-layout/types/FlexDirectionTypes.js.map +1 -0
- package/dist/flex-layout/types/FlexLayoutTypes.cjs +4 -0
- package/dist/flex-layout/types/FlexLayoutTypes.cjs.map +1 -0
- package/dist/flex-layout/types/FlexLayoutTypes.d.ts +3 -3
- package/dist/flex-layout/types/FlexLayoutTypes.js +3 -0
- package/dist/flex-layout/types/FlexLayoutTypes.js.map +1 -0
- package/dist/{utils.cjs → flex-layout/utils/FlexLayoutUtils.cjs} +3 -4
- package/dist/flex-layout/utils/FlexLayoutUtils.cjs.map +1 -0
- package/dist/{utils.js → flex-layout/utils/FlexLayoutUtils.js} +3 -4
- package/dist/flex-layout/utils/FlexLayoutUtils.js.map +1 -0
- package/dist/flex-layout/utils/index.cjs +14 -0
- package/dist/flex-layout/utils/index.cjs.map +1 -0
- package/dist/flex-layout/utils/index.js +3 -0
- package/dist/flex-layout/utils/index.js.map +1 -0
- package/dist/index.cjs +7 -3451
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -3396
- package/dist/index.js.map +1 -1
- package/dist/types/css.d.cjs +4 -0
- package/dist/types/css.d.cjs.map +1 -0
- package/dist/types/css.d.js +3 -0
- package/dist/types/css.d.js.map +1 -0
- package/package.json +31 -2
- package/dist/components.cjs +0 -3042
- package/dist/components.cjs.map +0 -1
- package/dist/components.css +0 -471
- package/dist/components.css.map +0 -1
- package/dist/components.js +0 -3029
- package/dist/components.js.map +0 -1
- package/dist/hooks.cjs.map +0 -1
- package/dist/hooks.js.map +0 -1
- package/dist/index.css +0 -471
- package/dist/index.css.map +0 -1
- package/dist/providers.cjs.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/store.cjs.map +0 -1
- package/dist/store.js.map +0 -1
- package/dist/utils.cjs.map +0 -1
- package/dist/utils.js.map +0 -1
|
@@ -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"]}
|
|
@@ -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":";;AAgBO,MAAM,2BAA2B,CAAwB;AAAA;AAAA;AAAA,EAG/D;AACD,CAAA,KAOK;AACJ,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAmB,IAAI,CAAA;AACnE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAmB,IAAI,CAAA;AACjE,EAAA,MAAM,WAAA,GAAc,OAAoC,IAAI,CAAA;AAE5D,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,IAAA,KAAmB;AACrD,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACvB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,IAAA,KAAmB;AACpD,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,IAAI,kBAAkB,WAAA,CAAY,OAAA;AACjC,MAAA,WAAA,CAAY,OAAA,CAAQ,UAAU,cAAc,CAAA;AAC7C,IAAA,IAAI,iBAAiB,WAAA,CAAY,OAAA;AAChC,MAAA,WAAA,CAAY,OAAA,CAAQ,UAAU,aAAa,CAAA;AAC5C,IAAA,MAAM,eAAA,GAAgD,CACrD,OAAA,EACAA,SAAAA,KACI;AACJ,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC1B,QAAA,IAAI,MAAM,cAAA,EAAgB;AACzB,UAAA,IAAI,KAAA,CAAM,WAAW,cAAA,EAAgB;AACpC,YAAA,IAAI,eAAA;AACH,cAAA,eAAA,CAAgB;AAAA,gBACf,OAAA,EAAS,IAAA;AAAA,gBACT,MAAA,EAAQ,KAAA;AAAA,gBACR,QAAA,EAAAA;AAAA,eACA,CAAA;AAAA,UACH;AAEA,UAAA,IAAI,KAAA,CAAM,WAAW,aAAA,EAAe;AACnC,YAAA,IAAI,eAAA;AACH,cAAA,eAAA,CAAgB;AAAA,gBACf,OAAA,EAAS,KAAA;AAAA,gBACT,MAAA,EAAQ,IAAA;AAAA,gBACR,QAAA,EAAAA;AAAA,eACA,CAAA;AAAA,UACH;AAAA,QACD;AAAA,MACD,CAAC,CAAA;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,CAAqB,eAAA,EAAiB;AAAA,MAC1D,SAAA,EAAW;AAAA,KACX,CAAA;AAED,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,IAAA,IAAI,cAAA,EAAgB,QAAA,CAAS,OAAA,CAAQ,cAAc,CAAA;AACnD,IAAA,IAAI,aAAA,EAAe,QAAA,CAAS,OAAA,CAAQ,aAAa,CAAA;AAEjD,IAAA,OAAO,MAAM;AACZ,MAAA,IAAI,YAAY,OAAA,EAAS;AAIxB,QAAA,WAAA,CAAY,QAAQ,UAAA,EAAW;AAAA,MAChC;AAAA,IACD,CAAA;AAAA,EACD,CAAA,EAAG,CAAC,cAAA,EAAgB,aAAa,CAAC,CAAA;AAElC,EAAA,OAAO;AAAA,IACN,aAAA;AAAA,IACA;AAAA,GACD;AACD;AAEO,MAAM,0BAA0B,CAAC;AAAA,EACvC;AACD,CAAA,KAEM;AACL,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GACrD,SAAiB,cAAc,CAAA;AAEhC,EAAA,MAAM,WAAA,GAAc,OAAoC,IAAI,CAAA;AAC5D,EAAA,MAAM,4BAAA,GAA+B,WAAA;AAAA,IACpC,CAAC,IAAA,KAA6B;AAC7B,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACzB,QAAA,WAAA,CAAY,UAAU,IAAI,oBAAA;AAAA,UACzB,CAAC,OAAA,KAAY;AACZ,YAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC1B,cAAA,IAAI,MAAM,cAAA,EAAgB;AACzB,gBAAA,MAAM,aAAA,GACL,MAAM,MAAA,CAAO,YAAA;AAAA,kBACZ;AAAA,iBACD;AACD,gBAAA,IAAI,CAAC,aAAA,EAAe;AAGpB,gBAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,EAAe,EAAE,CAAA;AAC5C,gBAAA,wBAAA,CAAyB,SAAS,CAAA;AAAA,cACnC;AAAA,YACD,CAAC,CAAA;AAAA,UACF,CAAA;AAAA,UACA;AAAA,YACC,SAAA,EAAW;AAAA;AAAA;AACZ,SACD;AAAA,MACD;AAGA,MAAA,WAAA,CAAY,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,IACjC,CAAA;AAAA,IACA;AAAC,GACF;AACA,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,MAAM,kBAAkB,WAAA,CAAY,OAAA;AACpC,IAAA,OAAO,MAAM;AACZ,MAAA,IAAI,eAAA,EAAiB;AACpB,QAAA,eAAA,CAAgB,UAAA,EAAW;AAAA,MAC5B;AAAA,IACD,CAAA;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO;AAAA,IACN,qBAAA;AAAA,IACA;AAAA,GACD;AACD;AAEO,MAAM,mBAAmB,CAAI;AAAA,EACnC,kBAAA;AAAA,EACA;AACD,CAAA,KAGM;AACL,EAAA,MAAM,oBAAA,GAAuB,OAAsB,kBAAkB,CAAA;AACrE,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,IAAI,qBAAqB,OAAA,EAAS;AACjC,MAAA,UAAA,CAAW,MAAM;AAChB,QAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAAA,MAChC,GAAG,GAAI,CAAA;AAAA,IACR;AAAA,EACD,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AACzB,EAAA,MAAM,8BAAA,GAAiC,MAAA,CAErC,EAAE,CAAA;AACJ,EAAA,MAAM,aAAA,GAAgB,OAAe,kBAAkB,CAAA;AAEvD,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACxB,CAAC,CAAA,KAAc,CAAC,IAAA,KAAgC;AAC/C,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,8BAAA,CAA+B,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA;AAG5C,MAAA,IACC,oBAAA,CAAqB,OAAA,KAAY,IAAA,IACjC,CAAA,KAAM,qBAAqB,OAAA,EAC1B;AACD,QAAA,IAAA,CAAK,cAAA,CAAe;AAAA,UACnB,QAAA,EAAU,SAAA;AAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACP,CAAA;AACD,QAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAAA,MAChC;AAAA,IACD,CAAA;AAAA,IACA;AAAC,GACF;AAGA,EAAA,MAAM,sBAAsB,CAC3B,EAAE,SAAS,MAAA,EAAQ,QAAA,IACnB,aAAA,KACI;AAEJ,IAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACtC,IAAA,IAAI,oBAAA,CAAqB,WAAW,IAAA,EAAM;AAC1C,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ;AAEzB,IAAA,MAAM,cAAA,GAAiB,OAAA,GACpB,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,UAAU,CAAA,EAAG,CAAC,CAAA,GACrC,aAAA,CAAc,OAAA,GAAU,CAAA;AAE3B,IAAA,IACC,WAAA,CAAY,OAAA,CAAQ,cAAc,CAAA,IAAK,IAAA,IAAA,CACtC,YAAY,OAAA,CAAQ,cAAc,CAAA,EAAG,MAAA,IAAU,CAAA,IAAK,CAAA;AAErD,MAAA;AACD,IAAA,oBAAA,CAAqB,OAAA,GAAU,cAAA;AAC/B,IAAA,UAAA,CAAW,MAAM;AAChB,MAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAAA,IAChC,GAAG,GAAI,CAAA;AACP,IAAA,aAAA,CAAc,cAAc,CAAA;AAAA,EAC7B,CAAA;AAGA,EAAA,MAAM,qBAAA,GAAwB,CAC7B,IAAA,EACA,aAAA,KACI;AAGJ,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAA;AAGzC,IAAA,IACC,QAAA,IAAY,QACZ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IACtB,QAAA,CAAS,SAAS,CAAA,EACjB;AACD,MAAA,8BAAA,CAA+B,OAAA,CAAQ,IAAI,CAAA,EAAG,cAAA,CAAe;AAAA,QAC5D,QAAA,EAAU,QAAA;AAAA,QACV,KAAA,EAAO;AAAA,OACP,CAAA;AACD,MAAA;AAAA,IACD;AACA,IAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAC/B,IAAA,UAAA,CAAW,MAAM;AAChB,MAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAAA,IAChC,GAAG,GAAI,CAAA;AACP,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACnB,CAAA;AACA,EAAA,OAAO;AAAA,IACN,oBAAA;AAAA,IACA,8BAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACD;AACD","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"]}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var rxjs = require('rxjs');
|
|
5
|
+
|
|
6
|
+
const useSize = (sizeName) => {
|
|
7
|
+
const ref = react.useRef(null);
|
|
8
|
+
const [size, setSize] = react.useState(void 0);
|
|
9
|
+
react.useLayoutEffect(() => {
|
|
10
|
+
if (!ref.current) return;
|
|
11
|
+
const handleResize = () => {
|
|
12
|
+
if (ref.current) {
|
|
13
|
+
const newSize = ref.current.getBoundingClientRect()[sizeName];
|
|
14
|
+
setSize(newSize);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
handleResize();
|
|
18
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
19
|
+
handleResize();
|
|
20
|
+
});
|
|
21
|
+
resizeObserver.observe(ref.current);
|
|
22
|
+
window.addEventListener("resize", handleResize);
|
|
23
|
+
return () => {
|
|
24
|
+
resizeObserver.disconnect();
|
|
25
|
+
window.removeEventListener("resize", handleResize);
|
|
26
|
+
};
|
|
27
|
+
}, [sizeName]);
|
|
28
|
+
return { ref, size };
|
|
29
|
+
};
|
|
30
|
+
const useFirstChildSize = (sizeName) => {
|
|
31
|
+
const ref = react.useRef(null);
|
|
32
|
+
const [sizes, setSizes] = react.useState();
|
|
33
|
+
react.useEffect(() => {
|
|
34
|
+
if (!ref.current || !ref.current.children[0]) return;
|
|
35
|
+
if (!sizes || sizes.length === 0) {
|
|
36
|
+
setSizes([
|
|
37
|
+
ref.current.getBoundingClientRect()[sizeName],
|
|
38
|
+
ref.current.children[0].getBoundingClientRect()[sizeName]
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
}, []);
|
|
42
|
+
react.useEffect(() => {
|
|
43
|
+
if (!ref.current || !ref.current.children[0]) return;
|
|
44
|
+
const childrenChangeObserver = new MutationObserver(
|
|
45
|
+
(mutationList, observer) => {
|
|
46
|
+
mutationList.forEach((mutation) => {
|
|
47
|
+
if (!ref.current || !sizes || !ref.current.children[0])
|
|
48
|
+
return;
|
|
49
|
+
const newSize = ref.current.getBoundingClientRect()[sizeName];
|
|
50
|
+
setSizes([
|
|
51
|
+
newSize,
|
|
52
|
+
ref.current.children[0].getBoundingClientRect()[sizeName]
|
|
53
|
+
]);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
childrenChangeObserver.observe(ref.current, {
|
|
58
|
+
childList: true,
|
|
59
|
+
subtree: true
|
|
60
|
+
});
|
|
61
|
+
let isFocus = false;
|
|
62
|
+
const windowResizeSubscribe = rxjs.fromEvent(window, "resize").pipe(
|
|
63
|
+
rxjs.distinctUntilChanged(),
|
|
64
|
+
rxjs.filter(
|
|
65
|
+
() => document.activeElement?.tagName !== "INPUT" && !isFocus
|
|
66
|
+
)
|
|
67
|
+
).subscribe((ev) => {
|
|
68
|
+
if (!ref.current || !ref.current.children[0]) return;
|
|
69
|
+
setSizes([
|
|
70
|
+
ref.current.getBoundingClientRect()[sizeName],
|
|
71
|
+
ref.current.children[0].getBoundingClientRect()[sizeName]
|
|
72
|
+
]);
|
|
73
|
+
});
|
|
74
|
+
const documentFocusoutSubscribe = rxjs.fromEvent(
|
|
75
|
+
document,
|
|
76
|
+
"focusout"
|
|
77
|
+
).pipe(
|
|
78
|
+
rxjs.auditTime(1e3),
|
|
79
|
+
rxjs.filter((ev) => document.activeElement?.tagName !== "INPUT")
|
|
80
|
+
).subscribe({
|
|
81
|
+
next: () => {
|
|
82
|
+
if (isFocus) isFocus = false;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
const documentFocusinSubscribe = rxjs.fromEvent(
|
|
86
|
+
document,
|
|
87
|
+
"focusin"
|
|
88
|
+
).subscribe({
|
|
89
|
+
next: (ev) => isFocus = ev.target.tagName === "INPUT"
|
|
90
|
+
});
|
|
91
|
+
return () => {
|
|
92
|
+
windowResizeSubscribe.unsubscribe();
|
|
93
|
+
documentFocusoutSubscribe.unsubscribe();
|
|
94
|
+
documentFocusinSubscribe.unsubscribe();
|
|
95
|
+
childrenChangeObserver.disconnect();
|
|
96
|
+
};
|
|
97
|
+
}, [sizeName, sizes]);
|
|
98
|
+
return { ref, sizes };
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
exports.useFirstChildSize = useFirstChildSize;
|
|
102
|
+
exports.useSize = useSize;
|
|
103
|
+
//# sourceMappingURL=useSizes.cjs.map
|
|
104
|
+
//# sourceMappingURL=useSizes.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/hooks/useSizes.ts"],"names":["useRef","useState","useLayoutEffect","useEffect","fromEvent","distinctUntilChanged","filter","auditTime"],"mappings":"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","file":"useSizes.cjs","sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { auditTime, distinctUntilChanged, filter, fromEvent } from \"rxjs\";\r\n\r\nexport const useSize = (sizeName: \"height\" | \"width\") => {\r\n\tconst ref = useRef<HTMLDivElement>(null);\r\n\tconst [size, setSize] = useState<number | undefined>(undefined);\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\tif (!ref.current) return;\r\n\r\n\t\tconst handleResize = () => {\r\n\t\t\tif (ref.current) {\r\n\t\t\t\tconst newSize = ref.current.getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number;\r\n\t\t\t\tsetSize(newSize);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// 초기 측정\r\n\t\thandleResize();\r\n\r\n\t\t// ResizeObserver 설정\r\n\t\tconst resizeObserver = new ResizeObserver(() => {\r\n\t\t\thandleResize();\r\n\t\t});\r\n\t\tresizeObserver.observe(ref.current);\r\n\r\n\t\t// 윈도우 리사이즈 이벤트도 청취\r\n\t\twindow.addEventListener(\"resize\", handleResize);\r\n\r\n\t\t// 클린업\r\n\t\treturn () => {\r\n\t\t\tresizeObserver.disconnect();\r\n\t\t\twindow.removeEventListener(\"resize\", handleResize);\r\n\t\t};\r\n\t}, [sizeName]);\r\n\r\n\treturn { ref, size };\r\n};\r\nexport const useFirstChildSize = (sizeName: string) => {\r\n\tconst ref = useRef<HTMLDivElement>(null);\r\n\tconst [sizes, setSizes] = useState<Array<number>>();\r\n\tuseEffect(() => {\r\n\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\tif (!sizes || sizes.length === 0) {\r\n\t\t\tsetSizes([\r\n\t\t\t\tref.current.getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number,\r\n\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number,\r\n\t\t\t]);\r\n\t\t}\r\n\t}, []);\r\n\tuseEffect(() => {\r\n\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\tconst childrenChangeObserver = new MutationObserver(\r\n\t\t\t(mutationList, observer) => {\r\n\t\t\t\tmutationList.forEach((mutation) => {\r\n\t\t\t\t\tif (!ref.current || !sizes || !ref.current.children[0])\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tconst newSize = ref.current.getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number;\r\n\t\t\t\t\t//if (newSize === sizes[0]) return;\r\n\t\t\t\t\tsetSizes([\r\n\t\t\t\t\t\tnewSize,\r\n\t\t\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t\t] as number,\r\n\t\t\t\t\t]);\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t);\r\n\t\tchildrenChangeObserver.observe(ref.current, {\r\n\t\t\tchildList: true,\r\n\t\t\tsubtree: true,\r\n\t\t});\r\n\t\tlet isFocus = false;\r\n\r\n\t\tconst windowResizeSubscribe = fromEvent<UIEvent>(window, \"resize\")\r\n\t\t\t.pipe(\r\n\t\t\t\tdistinctUntilChanged(),\r\n\t\t\t\tfilter(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t\tdocument.activeElement?.tagName !== \"INPUT\" && !isFocus,\r\n\t\t\t\t),\r\n\t\t\t)\r\n\t\t\t.subscribe((ev) => {\r\n\t\t\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\t\t\tsetSizes([\r\n\t\t\t\t\tref.current.getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number,\r\n\t\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number,\r\n\t\t\t\t]);\r\n\t\t\t});\r\n\r\n\t\tconst documentFocusoutSubscribe = fromEvent<FocusEvent>(\r\n\t\t\tdocument,\r\n\t\t\t\"focusout\",\r\n\t\t)\r\n\t\t\t.pipe(\r\n\t\t\t\tauditTime(1000),\r\n\t\t\t\tfilter((ev) => document.activeElement?.tagName !== \"INPUT\"),\r\n\t\t\t)\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: () => {\r\n\t\t\t\t\tif (isFocus) isFocus = false;\r\n\t\t\t\t},\r\n\t\t\t});\r\n\r\n\t\tconst documentFocusinSubscribe = fromEvent<FocusEvent>(\r\n\t\t\tdocument,\r\n\t\t\t\"focusin\",\r\n\t\t).subscribe({\r\n\t\t\tnext: (ev) =>\r\n\t\t\t\t(isFocus = (ev.target as Element).tagName === \"INPUT\"),\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\twindowResizeSubscribe.unsubscribe();\r\n\t\t\tdocumentFocusoutSubscribe.unsubscribe();\r\n\t\t\tdocumentFocusinSubscribe.unsubscribe();\r\n\t\t\tchildrenChangeObserver.disconnect();\r\n\t\t};\r\n\t}, [sizeName, sizes]);\r\n\treturn { ref, sizes };\r\n};\r\n"]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { useRef, useState, useLayoutEffect, useEffect } from 'react';
|
|
2
|
+
import { fromEvent, distinctUntilChanged, filter, auditTime } from 'rxjs';
|
|
3
|
+
|
|
4
|
+
const useSize = (sizeName) => {
|
|
5
|
+
const ref = useRef(null);
|
|
6
|
+
const [size, setSize] = useState(void 0);
|
|
7
|
+
useLayoutEffect(() => {
|
|
8
|
+
if (!ref.current) return;
|
|
9
|
+
const handleResize = () => {
|
|
10
|
+
if (ref.current) {
|
|
11
|
+
const newSize = ref.current.getBoundingClientRect()[sizeName];
|
|
12
|
+
setSize(newSize);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
handleResize();
|
|
16
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
17
|
+
handleResize();
|
|
18
|
+
});
|
|
19
|
+
resizeObserver.observe(ref.current);
|
|
20
|
+
window.addEventListener("resize", handleResize);
|
|
21
|
+
return () => {
|
|
22
|
+
resizeObserver.disconnect();
|
|
23
|
+
window.removeEventListener("resize", handleResize);
|
|
24
|
+
};
|
|
25
|
+
}, [sizeName]);
|
|
26
|
+
return { ref, size };
|
|
27
|
+
};
|
|
28
|
+
const useFirstChildSize = (sizeName) => {
|
|
29
|
+
const ref = useRef(null);
|
|
30
|
+
const [sizes, setSizes] = useState();
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (!ref.current || !ref.current.children[0]) return;
|
|
33
|
+
if (!sizes || sizes.length === 0) {
|
|
34
|
+
setSizes([
|
|
35
|
+
ref.current.getBoundingClientRect()[sizeName],
|
|
36
|
+
ref.current.children[0].getBoundingClientRect()[sizeName]
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
}, []);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (!ref.current || !ref.current.children[0]) return;
|
|
42
|
+
const childrenChangeObserver = new MutationObserver(
|
|
43
|
+
(mutationList, observer) => {
|
|
44
|
+
mutationList.forEach((mutation) => {
|
|
45
|
+
if (!ref.current || !sizes || !ref.current.children[0])
|
|
46
|
+
return;
|
|
47
|
+
const newSize = ref.current.getBoundingClientRect()[sizeName];
|
|
48
|
+
setSizes([
|
|
49
|
+
newSize,
|
|
50
|
+
ref.current.children[0].getBoundingClientRect()[sizeName]
|
|
51
|
+
]);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
childrenChangeObserver.observe(ref.current, {
|
|
56
|
+
childList: true,
|
|
57
|
+
subtree: true
|
|
58
|
+
});
|
|
59
|
+
let isFocus = false;
|
|
60
|
+
const windowResizeSubscribe = fromEvent(window, "resize").pipe(
|
|
61
|
+
distinctUntilChanged(),
|
|
62
|
+
filter(
|
|
63
|
+
() => document.activeElement?.tagName !== "INPUT" && !isFocus
|
|
64
|
+
)
|
|
65
|
+
).subscribe((ev) => {
|
|
66
|
+
if (!ref.current || !ref.current.children[0]) return;
|
|
67
|
+
setSizes([
|
|
68
|
+
ref.current.getBoundingClientRect()[sizeName],
|
|
69
|
+
ref.current.children[0].getBoundingClientRect()[sizeName]
|
|
70
|
+
]);
|
|
71
|
+
});
|
|
72
|
+
const documentFocusoutSubscribe = fromEvent(
|
|
73
|
+
document,
|
|
74
|
+
"focusout"
|
|
75
|
+
).pipe(
|
|
76
|
+
auditTime(1e3),
|
|
77
|
+
filter((ev) => document.activeElement?.tagName !== "INPUT")
|
|
78
|
+
).subscribe({
|
|
79
|
+
next: () => {
|
|
80
|
+
if (isFocus) isFocus = false;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
const documentFocusinSubscribe = fromEvent(
|
|
84
|
+
document,
|
|
85
|
+
"focusin"
|
|
86
|
+
).subscribe({
|
|
87
|
+
next: (ev) => isFocus = ev.target.tagName === "INPUT"
|
|
88
|
+
});
|
|
89
|
+
return () => {
|
|
90
|
+
windowResizeSubscribe.unsubscribe();
|
|
91
|
+
documentFocusoutSubscribe.unsubscribe();
|
|
92
|
+
documentFocusinSubscribe.unsubscribe();
|
|
93
|
+
childrenChangeObserver.disconnect();
|
|
94
|
+
};
|
|
95
|
+
}, [sizeName, sizes]);
|
|
96
|
+
return { ref, sizes };
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export { useFirstChildSize, useSize };
|
|
100
|
+
//# sourceMappingURL=useSizes.js.map
|
|
101
|
+
//# sourceMappingURL=useSizes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/hooks/useSizes.ts"],"names":[],"mappings":"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","file":"useSizes.js","sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { auditTime, distinctUntilChanged, filter, fromEvent } from \"rxjs\";\r\n\r\nexport const useSize = (sizeName: \"height\" | \"width\") => {\r\n\tconst ref = useRef<HTMLDivElement>(null);\r\n\tconst [size, setSize] = useState<number | undefined>(undefined);\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\tif (!ref.current) return;\r\n\r\n\t\tconst handleResize = () => {\r\n\t\t\tif (ref.current) {\r\n\t\t\t\tconst newSize = ref.current.getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number;\r\n\t\t\t\tsetSize(newSize);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// 초기 측정\r\n\t\thandleResize();\r\n\r\n\t\t// ResizeObserver 설정\r\n\t\tconst resizeObserver = new ResizeObserver(() => {\r\n\t\t\thandleResize();\r\n\t\t});\r\n\t\tresizeObserver.observe(ref.current);\r\n\r\n\t\t// 윈도우 리사이즈 이벤트도 청취\r\n\t\twindow.addEventListener(\"resize\", handleResize);\r\n\r\n\t\t// 클린업\r\n\t\treturn () => {\r\n\t\t\tresizeObserver.disconnect();\r\n\t\t\twindow.removeEventListener(\"resize\", handleResize);\r\n\t\t};\r\n\t}, [sizeName]);\r\n\r\n\treturn { ref, size };\r\n};\r\nexport const useFirstChildSize = (sizeName: string) => {\r\n\tconst ref = useRef<HTMLDivElement>(null);\r\n\tconst [sizes, setSizes] = useState<Array<number>>();\r\n\tuseEffect(() => {\r\n\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\tif (!sizes || sizes.length === 0) {\r\n\t\t\tsetSizes([\r\n\t\t\t\tref.current.getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number,\r\n\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number,\r\n\t\t\t]);\r\n\t\t}\r\n\t}, []);\r\n\tuseEffect(() => {\r\n\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\tconst childrenChangeObserver = new MutationObserver(\r\n\t\t\t(mutationList, observer) => {\r\n\t\t\t\tmutationList.forEach((mutation) => {\r\n\t\t\t\t\tif (!ref.current || !sizes || !ref.current.children[0])\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tconst newSize = ref.current.getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number;\r\n\t\t\t\t\t//if (newSize === sizes[0]) return;\r\n\t\t\t\t\tsetSizes([\r\n\t\t\t\t\t\tnewSize,\r\n\t\t\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t\t] as number,\r\n\t\t\t\t\t]);\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t);\r\n\t\tchildrenChangeObserver.observe(ref.current, {\r\n\t\t\tchildList: true,\r\n\t\t\tsubtree: true,\r\n\t\t});\r\n\t\tlet isFocus = false;\r\n\r\n\t\tconst windowResizeSubscribe = fromEvent<UIEvent>(window, \"resize\")\r\n\t\t\t.pipe(\r\n\t\t\t\tdistinctUntilChanged(),\r\n\t\t\t\tfilter(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t\tdocument.activeElement?.tagName !== \"INPUT\" && !isFocus,\r\n\t\t\t\t),\r\n\t\t\t)\r\n\t\t\t.subscribe((ev) => {\r\n\t\t\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\t\t\tsetSizes([\r\n\t\t\t\t\tref.current.getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number,\r\n\t\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number,\r\n\t\t\t\t]);\r\n\t\t\t});\r\n\r\n\t\tconst documentFocusoutSubscribe = fromEvent<FocusEvent>(\r\n\t\t\tdocument,\r\n\t\t\t\"focusout\",\r\n\t\t)\r\n\t\t\t.pipe(\r\n\t\t\t\tauditTime(1000),\r\n\t\t\t\tfilter((ev) => document.activeElement?.tagName !== \"INPUT\"),\r\n\t\t\t)\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: () => {\r\n\t\t\t\t\tif (isFocus) isFocus = false;\r\n\t\t\t\t},\r\n\t\t\t});\r\n\r\n\t\tconst documentFocusinSubscribe = fromEvent<FocusEvent>(\r\n\t\t\tdocument,\r\n\t\t\t\"focusin\",\r\n\t\t).subscribe({\r\n\t\t\tnext: (ev) =>\r\n\t\t\t\t(isFocus = (ev.target as Element).tagName === \"INPUT\"),\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\twindowResizeSubscribe.unsubscribe();\r\n\t\t\tdocumentFocusoutSubscribe.unsubscribe();\r\n\t\t\tdocumentFocusinSubscribe.unsubscribe();\r\n\t\t\tchildrenChangeObserver.disconnect();\r\n\t\t};\r\n\t}, [sizeName, sizes]);\r\n\treturn { ref, sizes };\r\n};\r\n"]}
|