@byeolnaerim/flex-layout 0.0.2 → 0.0.4
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/FlexLayoutSplitScreenDragBox-eCtq4kLd.d.cts +31 -0
- package/dist/FlexLayoutSplitScreenDragBox-eCtq4kLd.d.ts +31 -0
- package/dist/chunk-3EDKZTM3.js +3 -0
- package/dist/chunk-3EDKZTM3.js.map +1 -0
- package/dist/chunk-5HWEFTNQ.js +176 -0
- package/dist/chunk-5HWEFTNQ.js.map +1 -0
- package/dist/chunk-7J5JUVZK.js +3 -0
- package/dist/chunk-7J5JUVZK.js.map +1 -0
- package/dist/chunk-CFQQ6ZDC.js +182 -0
- package/dist/chunk-CFQQ6ZDC.js.map +1 -0
- package/dist/chunk-JM3CZ5DU.js +238 -0
- package/dist/chunk-JM3CZ5DU.js.map +1 -0
- package/dist/chunk-PMTZFSP4.js +219 -0
- package/dist/chunk-PMTZFSP4.js.map +1 -0
- package/dist/chunk-UYI4Z27V.js +2432 -0
- package/dist/chunk-UYI4Z27V.js.map +1 -0
- package/dist/chunk-W4CNFJTK.js +197 -0
- package/dist/chunk-W4CNFJTK.js.map +1 -0
- package/dist/chunk-YIHCWXKY.js +3 -0
- package/dist/chunk-YIHCWXKY.js.map +1 -0
- package/dist/components.cjs +3048 -0
- package/dist/components.cjs.map +1 -0
- package/dist/components.css +471 -0
- package/dist/components.css.map +1 -0
- package/dist/components.d.cts +122 -0
- package/dist/components.d.ts +122 -0
- package/dist/components.js +7 -0
- package/dist/components.js.map +1 -0
- package/dist/hooks.cjs +425 -0
- package/dist/hooks.cjs.map +1 -0
- package/dist/hooks.d.cts +37 -0
- package/dist/hooks.d.ts +37 -0
- package/dist/hooks.js +5 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.cjs +2600 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -287
- package/dist/index.d.ts +10 -287
- package/dist/index.js +9 -814
- package/dist/index.js.map +1 -1
- package/dist/providers.cjs +411 -0
- package/dist/providers.cjs.map +1 -0
- package/dist/providers.d.cts +54 -0
- package/dist/providers.d.ts +54 -0
- package/dist/providers.js +6 -0
- package/dist/providers.js.map +1 -0
- package/dist/store.cjs +204 -0
- package/dist/store.cjs.map +1 -0
- package/dist/store.d.cts +67 -0
- package/dist/store.d.ts +67 -0
- package/dist/store.js +4 -0
- package/dist/store.js.map +1 -0
- package/dist/useDrag-CYQnhUFk.d.cts +108 -0
- package/dist/useDrag-DR01Ob3s.d.ts +108 -0
- package/dist/utils.cjs +209 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +28 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.js +4 -0
- package/dist/utils.js.map +1 -0
- package/package.json +25 -5
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { HTMLAttributes, MouseEvent, TouchEvent, CSSProperties, ReactElement, ReactNode, RefObject } from 'react';
|
|
3
|
+
|
|
4
|
+
interface FlexLayoutSplitScreenDragBoxProps<E extends HTMLElement = HTMLElement> extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
|
|
5
|
+
onMouseDown?: (event: MouseEvent<HTMLDivElement>) => void;
|
|
6
|
+
onTouchStart?: (event: TouchEvent<HTMLDivElement>) => void;
|
|
7
|
+
dropEndCallback?: ({ x, y, containerName, }: {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
containerName: string;
|
|
11
|
+
}) => void;
|
|
12
|
+
style?: CSSProperties;
|
|
13
|
+
navigationTitle?: string;
|
|
14
|
+
targetComponent?: ReactElement;
|
|
15
|
+
dropDocumentOutsideOption?: DropDocumentOutsideOption;
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
containerName: string;
|
|
18
|
+
screenKey?: string;
|
|
19
|
+
isBlockingActiveInput?: boolean;
|
|
20
|
+
customData?: Record<string, string | number | boolean | undefined>;
|
|
21
|
+
scrollTargetRef?: RefObject<E>;
|
|
22
|
+
}
|
|
23
|
+
interface DropDocumentOutsideOption {
|
|
24
|
+
openUrl: string;
|
|
25
|
+
widthRatio?: number;
|
|
26
|
+
heightRatio?: number;
|
|
27
|
+
isNewTap?: boolean;
|
|
28
|
+
}
|
|
29
|
+
declare function FlexLayoutSplitScreenDragBox<E extends HTMLElement>({ onMouseDown, onTouchStart, dropEndCallback, style, navigationTitle, targetComponent, containerName, children, className, dropDocumentOutsideOption, screenKey, isBlockingActiveInput, customData, scrollTargetRef, ...props }: FlexLayoutSplitScreenDragBoxProps): react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
export { type DropDocumentOutsideOption as D, FlexLayoutSplitScreenDragBox as F };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { HTMLAttributes, MouseEvent, TouchEvent, CSSProperties, ReactElement, ReactNode, RefObject } from 'react';
|
|
3
|
+
|
|
4
|
+
interface FlexLayoutSplitScreenDragBoxProps<E extends HTMLElement = HTMLElement> extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
|
|
5
|
+
onMouseDown?: (event: MouseEvent<HTMLDivElement>) => void;
|
|
6
|
+
onTouchStart?: (event: TouchEvent<HTMLDivElement>) => void;
|
|
7
|
+
dropEndCallback?: ({ x, y, containerName, }: {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
containerName: string;
|
|
11
|
+
}) => void;
|
|
12
|
+
style?: CSSProperties;
|
|
13
|
+
navigationTitle?: string;
|
|
14
|
+
targetComponent?: ReactElement;
|
|
15
|
+
dropDocumentOutsideOption?: DropDocumentOutsideOption;
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
containerName: string;
|
|
18
|
+
screenKey?: string;
|
|
19
|
+
isBlockingActiveInput?: boolean;
|
|
20
|
+
customData?: Record<string, string | number | boolean | undefined>;
|
|
21
|
+
scrollTargetRef?: RefObject<E>;
|
|
22
|
+
}
|
|
23
|
+
interface DropDocumentOutsideOption {
|
|
24
|
+
openUrl: string;
|
|
25
|
+
widthRatio?: number;
|
|
26
|
+
heightRatio?: number;
|
|
27
|
+
isNewTap?: boolean;
|
|
28
|
+
}
|
|
29
|
+
declare function FlexLayoutSplitScreenDragBox<E extends HTMLElement>({ onMouseDown, onTouchStart, dropEndCallback, style, navigationTitle, targetComponent, containerName, children, className, dropDocumentOutsideOption, screenKey, isBlockingActiveInput, customData, scrollTargetRef, ...props }: FlexLayoutSplitScreenDragBoxProps): react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
export { type DropDocumentOutsideOption as D, FlexLayoutSplitScreenDragBox as F };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-3EDKZTM3.js"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/flex-layout/hooks/useListPaging.ts
|
|
4
|
+
var useListPagingForSentinel = ({
|
|
5
|
+
//initPageNumber,
|
|
6
|
+
//initPageSize,
|
|
7
|
+
onReachTerminal
|
|
8
|
+
}) => {
|
|
9
|
+
const [firstChildNode, setFirstChildNode] = useState(null);
|
|
10
|
+
const [lastChildNode, setLastChildNode] = useState(null);
|
|
11
|
+
const observerRef = useRef(null);
|
|
12
|
+
const firstChildRef = useCallback((node) => {
|
|
13
|
+
setFirstChildNode(node);
|
|
14
|
+
}, []);
|
|
15
|
+
const lastChildRef = useCallback((node) => {
|
|
16
|
+
setLastChildNode(node);
|
|
17
|
+
}, []);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (firstChildNode && observerRef.current)
|
|
20
|
+
observerRef.current.unobserve(firstChildNode);
|
|
21
|
+
if (lastChildNode && observerRef.current)
|
|
22
|
+
observerRef.current.unobserve(lastChildNode);
|
|
23
|
+
const handleIntersect = (entries, observer2) => {
|
|
24
|
+
entries.forEach((entry) => {
|
|
25
|
+
if (entry.isIntersecting) {
|
|
26
|
+
if (entry.target === firstChildNode) {
|
|
27
|
+
if (onReachTerminal)
|
|
28
|
+
onReachTerminal({
|
|
29
|
+
isFirst: true,
|
|
30
|
+
isLast: false,
|
|
31
|
+
observer: observer2
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (entry.target === lastChildNode) {
|
|
35
|
+
if (onReachTerminal)
|
|
36
|
+
onReachTerminal({
|
|
37
|
+
isFirst: false,
|
|
38
|
+
isLast: true,
|
|
39
|
+
observer: observer2
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const observer = new IntersectionObserver(handleIntersect, {
|
|
46
|
+
threshold: 0.1
|
|
47
|
+
});
|
|
48
|
+
observerRef.current = observer;
|
|
49
|
+
if (firstChildNode) observer.observe(firstChildNode);
|
|
50
|
+
if (lastChildNode) observer.observe(lastChildNode);
|
|
51
|
+
return () => {
|
|
52
|
+
if (observerRef.current) {
|
|
53
|
+
observerRef.current.disconnect();
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}, [firstChildNode, lastChildNode]);
|
|
57
|
+
return {
|
|
58
|
+
firstChildRef,
|
|
59
|
+
lastChildRef
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
var usePaginationViewNumber = ({
|
|
63
|
+
initPageNumber
|
|
64
|
+
}) => {
|
|
65
|
+
const [showCurrentPageNumber, setShowCurrentPageNumber] = useState(initPageNumber);
|
|
66
|
+
const observerRef = useRef(null);
|
|
67
|
+
const showCurrentPageObserveTarget = useCallback(
|
|
68
|
+
(node) => {
|
|
69
|
+
if (!node) return;
|
|
70
|
+
if (!observerRef.current) {
|
|
71
|
+
observerRef.current = new IntersectionObserver(
|
|
72
|
+
(entries) => {
|
|
73
|
+
entries.forEach((entry) => {
|
|
74
|
+
if (entry.isIntersecting) {
|
|
75
|
+
const pageIndexAttr = entry.target.getAttribute(
|
|
76
|
+
"data-page-index"
|
|
77
|
+
);
|
|
78
|
+
if (!pageIndexAttr) return;
|
|
79
|
+
const pageIndex = parseInt(pageIndexAttr, 10);
|
|
80
|
+
setShowCurrentPageNumber(pageIndex);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
threshold: 0.1
|
|
86
|
+
// 예: 10% 이상 보여야 intersect로 판단
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
observerRef.current.observe(node);
|
|
91
|
+
},
|
|
92
|
+
[]
|
|
93
|
+
);
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
const currentObserver = observerRef.current;
|
|
96
|
+
return () => {
|
|
97
|
+
if (currentObserver) {
|
|
98
|
+
currentObserver.disconnect();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}, []);
|
|
102
|
+
return {
|
|
103
|
+
showCurrentPageNumber,
|
|
104
|
+
showCurrentPageObserveTarget
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
var usePagingHandler = ({
|
|
108
|
+
lastCallPageNumber,
|
|
109
|
+
dataListRef
|
|
110
|
+
}) => {
|
|
111
|
+
const jumpingPageNumberRef = useRef(lastCallPageNumber);
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
if (jumpingPageNumberRef.current) {
|
|
114
|
+
setTimeout(() => {
|
|
115
|
+
jumpingPageNumberRef.current = null;
|
|
116
|
+
}, 1e3);
|
|
117
|
+
}
|
|
118
|
+
}, [jumpingPageNumberRef]);
|
|
119
|
+
const paginationScrollIntoViewTarget = useRef({});
|
|
120
|
+
const pageNumberRef = useRef(lastCallPageNumber);
|
|
121
|
+
const setPaginationRef = useCallback(
|
|
122
|
+
(i) => (node) => {
|
|
123
|
+
if (!node) return;
|
|
124
|
+
paginationScrollIntoViewTarget.current[i] = node;
|
|
125
|
+
if (jumpingPageNumberRef.current !== null && i === jumpingPageNumberRef.current) {
|
|
126
|
+
node.scrollIntoView({
|
|
127
|
+
behavior: "instant",
|
|
128
|
+
// 필요한 경우 'smooth' 등으로 수정 가능
|
|
129
|
+
block: "start"
|
|
130
|
+
});
|
|
131
|
+
jumpingPageNumberRef.current = null;
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
[]
|
|
135
|
+
);
|
|
136
|
+
const handleReachTerminal = ({ isFirst, isLast, observer }, dataCallFetch) => {
|
|
137
|
+
if (dataListRef.current.length === 0) return;
|
|
138
|
+
if (jumpingPageNumberRef.current != null) return;
|
|
139
|
+
if (!isFirst && !isLast) return;
|
|
140
|
+
const callPageNumber = isFirst ? Math.max(pageNumberRef.current - 1, 0) : pageNumberRef.current + 1;
|
|
141
|
+
if (dataListRef.current[callPageNumber] != null && (dataListRef.current[callPageNumber]?.length || 0) > 0)
|
|
142
|
+
return;
|
|
143
|
+
jumpingPageNumberRef.current = callPageNumber;
|
|
144
|
+
setTimeout(() => {
|
|
145
|
+
jumpingPageNumberRef.current = null;
|
|
146
|
+
}, 1e3);
|
|
147
|
+
dataCallFetch(callPageNumber);
|
|
148
|
+
};
|
|
149
|
+
const handleClickPageChange = (page, dataCallFetch) => {
|
|
150
|
+
const pageData = dataListRef.current[page];
|
|
151
|
+
if (pageData != null && Array.isArray(pageData) && pageData.length > 0) {
|
|
152
|
+
paginationScrollIntoViewTarget.current[page]?.scrollIntoView({
|
|
153
|
+
behavior: "smooth",
|
|
154
|
+
block: "start"
|
|
155
|
+
});
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
jumpingPageNumberRef.current = page;
|
|
159
|
+
setTimeout(() => {
|
|
160
|
+
jumpingPageNumberRef.current = null;
|
|
161
|
+
}, 1e3);
|
|
162
|
+
dataCallFetch(page);
|
|
163
|
+
};
|
|
164
|
+
return {
|
|
165
|
+
jumpingPageNumberRef,
|
|
166
|
+
paginationScrollIntoViewTarget,
|
|
167
|
+
pageNumberRef,
|
|
168
|
+
setPaginationRef,
|
|
169
|
+
handleReachTerminal,
|
|
170
|
+
handleClickPageChange
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export { useListPagingForSentinel, usePaginationViewNumber, usePagingHandler };
|
|
175
|
+
//# sourceMappingURL=chunk-5HWEFTNQ.js.map
|
|
176
|
+
//# sourceMappingURL=chunk-5HWEFTNQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/flex-layout/hooks/useListPaging.ts"],"names":["observer"],"mappings":"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","file":"chunk-5HWEFTNQ.js","sourcesContent":["import {\r\n MutableRefObject,\r\n RefObject,\r\n useCallback,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from 'react';\r\n\r\nexport type OnReachTerminalType = {\r\n isFirst: boolean;\r\n isLast: boolean;\r\n observer: IntersectionObserver;\r\n};\r\ninterface UseListPagingForInfinityProps {\r\n onReachTerminal?: (onReachTerminalData: OnReachTerminalType) => void;\r\n}\r\nexport const useListPagingForSentinel = <E extends HTMLElement>({\r\n //initPageNumber,\r\n //initPageSize,\r\n onReachTerminal,\r\n}: UseListPagingForInfinityProps): {\r\n firstChildRef: (node: E | null) => void;\r\n lastChildRef: (node: E | null) => void;\r\n //pageNumber: number;\r\n //pageSize: number;\r\n //setPageNumber: React.Dispatch<React.SetStateAction<number>>;\r\n //setPageSize: React.Dispatch<React.SetStateAction<number>>;\r\n} => {\r\n const [firstChildNode, setFirstChildNode] = useState<E | null>(null);\r\n const [lastChildNode, setLastChildNode] = useState<E | null>(null);\r\n const observerRef = useRef<IntersectionObserver | null>(null);\r\n\r\n const firstChildRef = useCallback((node: E | null) => {\r\n setFirstChildNode(node);\r\n }, []);\r\n\r\n const lastChildRef = useCallback((node: E | null) => {\r\n setLastChildNode(node);\r\n }, []);\r\n // 페이지 번호가 변경될 때마다 데이터 로드를 위한 콜백 호출\r\n\r\n useEffect(() => {\r\n if (firstChildNode && observerRef.current)\r\n observerRef.current.unobserve(firstChildNode);\r\n if (lastChildNode && observerRef.current)\r\n observerRef.current.unobserve(lastChildNode);\r\n const handleIntersect: IntersectionObserverCallback = (\r\n entries,\r\n observer\r\n ) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n if (entry.target === firstChildNode) {\r\n if (onReachTerminal)\r\n onReachTerminal({\r\n isFirst: true,\r\n isLast: false,\r\n observer,\r\n });\r\n }\r\n\r\n if (entry.target === lastChildNode) {\r\n if (onReachTerminal)\r\n onReachTerminal({\r\n isFirst: false,\r\n isLast: true,\r\n observer,\r\n });\r\n }\r\n }\r\n });\r\n };\r\n\r\n const observer = new IntersectionObserver(handleIntersect, {\r\n threshold: 0.1,\r\n });\r\n\r\n observerRef.current = observer;\r\n\r\n if (firstChildNode) observer.observe(firstChildNode);\r\n if (lastChildNode) observer.observe(lastChildNode);\r\n\r\n return () => {\r\n if (observerRef.current) {\r\n // if (firstChildNode)\r\n // observerRef.current.unobserve(firstChildNode);\r\n // if (lastChildNode) observerRef.current.unobserve(lastChildNode);\r\n observerRef.current.disconnect();\r\n }\r\n };\r\n }, [firstChildNode, lastChildNode]);\r\n\r\n return {\r\n firstChildRef,\r\n lastChildRef,\r\n };\r\n};\r\n\r\nexport const usePaginationViewNumber = ({\r\n initPageNumber,\r\n}: {\r\n initPageNumber: number;\r\n}) => {\r\n const [showCurrentPageNumber, setShowCurrentPageNumber] =\r\n useState<number>(initPageNumber);\r\n\r\n const observerRef = useRef<IntersectionObserver | null>(null);\r\n const showCurrentPageObserveTarget = useCallback(\r\n (node: HTMLElement | null) => {\r\n if (!node) return;\r\n\r\n // 아직 observer가 없으면 새로 생성\r\n if (!observerRef.current) {\r\n observerRef.current = new IntersectionObserver(\r\n entries => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n const pageIndexAttr =\r\n entry.target.getAttribute(\r\n 'data-page-index'\r\n );\r\n if (!pageIndexAttr) return;\r\n // if (!entry.target.hasAttribute('data-is-first'))\r\n // return;\r\n const pageIndex = parseInt(pageIndexAttr, 10);\r\n setShowCurrentPageNumber(pageIndex);\r\n }\r\n });\r\n },\r\n {\r\n threshold: 0.1, // 예: 10% 이상 보여야 intersect로 판단\r\n }\r\n );\r\n }\r\n\r\n // 해당 노드를 관찰\r\n observerRef.current.observe(node);\r\n },\r\n []\r\n );\r\n useEffect(() => {\r\n const currentObserver = observerRef.current;\r\n return () => {\r\n if (currentObserver) {\r\n currentObserver.disconnect();\r\n }\r\n };\r\n }, []);\r\n return {\r\n showCurrentPageNumber,\r\n showCurrentPageObserveTarget,\r\n };\r\n};\r\n\r\nexport const usePagingHandler = <T>({\r\n lastCallPageNumber,\r\n dataListRef,\r\n}: {\r\n lastCallPageNumber: number;\r\n dataListRef: MutableRefObject<Array<T[] | null>>;\r\n}) => {\r\n const jumpingPageNumberRef = useRef<number | null>(lastCallPageNumber);\r\n useEffect(() => {\r\n if (jumpingPageNumberRef.current) {\r\n setTimeout(() => {\r\n jumpingPageNumberRef.current = null;\r\n }, 1000);\r\n }\r\n }, [jumpingPageNumberRef]);\r\n const paginationScrollIntoViewTarget = useRef<\r\n Record<number, HTMLDivElement | null>\r\n >({});\r\n const pageNumberRef = useRef<number>(lastCallPageNumber);\r\n\r\n const setPaginationRef = useCallback(\r\n (i: number) => (node: HTMLDivElement | null) => {\r\n if (!node) return;\r\n\r\n paginationScrollIntoViewTarget.current[i] = node;\r\n\r\n // jumpingPageNumberRef에 값이 있고, 그 값이 현재 i와 같으면 스크롤\r\n if (\r\n jumpingPageNumberRef.current !== null &&\r\n i === jumpingPageNumberRef.current\r\n ) {\r\n node.scrollIntoView({\r\n behavior: 'instant', // 필요한 경우 'smooth' 등으로 수정 가능\r\n block: 'start',\r\n });\r\n jumpingPageNumberRef.current = null;\r\n }\r\n },\r\n []\r\n );\r\n\r\n //스크롤이 “첫 아이템” 혹은 “마지막 아이템”에 닿을 때 호출\r\n const handleReachTerminal = (\r\n { isFirst, isLast, observer }: OnReachTerminalType,\r\n dataCallFetch: (callPageNumber: number) => void\r\n ) => {\r\n // 이미 다른 페이지로 점프 중이면, 중복 호출 방지\r\n if (dataListRef.current.length === 0) return;\r\n if (jumpingPageNumberRef.current != null) return;\r\n if (!isFirst && !isLast) return;\r\n\r\n const callPageNumber = isFirst\r\n ? Math.max(pageNumberRef.current - 1, 0)\r\n : pageNumberRef.current + 1;\r\n\r\n if (\r\n dataListRef.current[callPageNumber] != null &&\r\n (dataListRef.current[callPageNumber]?.length || 0) > 0\r\n )\r\n return;\r\n jumpingPageNumberRef.current = callPageNumber;\r\n setTimeout(() => {\r\n jumpingPageNumberRef.current = null;\r\n }, 1000);\r\n dataCallFetch(callPageNumber);\r\n };\r\n\r\n //페이지네이션에서 페이지 번호를 직접 클릭했을 시\r\n const handleClickPageChange = (\r\n page: number,\r\n dataCallFetch: (callPageNumber: number) => void\r\n ) => {\r\n // PaginationLayer는 1-based, 내부 로직은 0-based\r\n // 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n const pageData = dataListRef.current[page];\r\n\r\n // 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n if (\r\n pageData != null &&\r\n Array.isArray(pageData) &&\r\n pageData.length > 0\r\n ) {\r\n paginationScrollIntoViewTarget.current[page]?.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n });\r\n return;\r\n }\r\n jumpingPageNumberRef.current = page;\r\n setTimeout(() => {\r\n jumpingPageNumberRef.current = null;\r\n }, 1000);\r\n dataCallFetch(page);\r\n };\r\n return {\r\n jumpingPageNumberRef,\r\n paginationScrollIntoViewTarget,\r\n pageNumberRef,\r\n setPaginationRef,\r\n handleReachTerminal,\r\n handleClickPageChange,\r\n };\r\n};\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-7J5JUVZK.js"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import equal from 'fast-deep-equal';
|
|
2
|
+
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
3
|
+
import { filter, map, distinctUntilChanged } from 'rxjs/operators';
|
|
4
|
+
|
|
5
|
+
// src/flex-layout/store/FlexLayoutContainerStore.ts
|
|
6
|
+
function updateScrollStore(subject, newValue) {
|
|
7
|
+
const currentValue = subject.getValue();
|
|
8
|
+
if (!equal(currentValue, newValue)) {
|
|
9
|
+
subject.next(newValue);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function updateRefStore(store, newState) {
|
|
13
|
+
const prevState = store.getValue();
|
|
14
|
+
if (!equal(prevState, newState)) {
|
|
15
|
+
store.next(newState);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function updateSplitScreenStore(newValue) {
|
|
19
|
+
const prevValue = layoutSplitScreenStore.getValue();
|
|
20
|
+
if (!equal(prevValue, newValue)) {
|
|
21
|
+
layoutSplitScreenStore.next(newValue);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
var scrollPositions = {};
|
|
25
|
+
var scrollPositionsSubject = new BehaviorSubject(scrollPositions);
|
|
26
|
+
var setScrollPosition = (layoutName, position) => {
|
|
27
|
+
const current = scrollPositionsSubject.getValue();
|
|
28
|
+
const prevPos = current[layoutName];
|
|
29
|
+
if (prevPos && prevPos.x === position.x && prevPos.y === position.y) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const newPositions = {
|
|
33
|
+
...current,
|
|
34
|
+
[layoutName]: position
|
|
35
|
+
};
|
|
36
|
+
updateScrollStore(scrollPositionsSubject, newPositions);
|
|
37
|
+
};
|
|
38
|
+
var getScrollPosition = (layoutName) => {
|
|
39
|
+
return scrollPositionsSubject.pipe(
|
|
40
|
+
// 해당 layoutName이 정의되지 않았을 때는 제외
|
|
41
|
+
filter((e) => e[layoutName] !== void 0),
|
|
42
|
+
map((positions) => positions[layoutName]),
|
|
43
|
+
distinctUntilChanged(
|
|
44
|
+
(prev, curr) => prev?.x === curr?.x && prev?.y === curr?.y
|
|
45
|
+
)
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
var removeScrollPosition = (layoutName) => {
|
|
49
|
+
const current = scrollPositionsSubject.getValue();
|
|
50
|
+
delete current[layoutName];
|
|
51
|
+
const newPositions = { ...current };
|
|
52
|
+
updateScrollStore(scrollPositionsSubject, newPositions);
|
|
53
|
+
};
|
|
54
|
+
var layoutSplitScreenStore = new BehaviorSubject({});
|
|
55
|
+
var setSplitScreen = (rootName, layoutName, newComponents) => {
|
|
56
|
+
const current = layoutSplitScreenStore.getValue();
|
|
57
|
+
const updatedLayout = { ...current[rootName] || {} };
|
|
58
|
+
updatedLayout[layoutName] = newComponents;
|
|
59
|
+
const newStoreValue = {
|
|
60
|
+
...current,
|
|
61
|
+
[rootName]: updatedLayout
|
|
62
|
+
};
|
|
63
|
+
updateSplitScreenStore(newStoreValue);
|
|
64
|
+
};
|
|
65
|
+
var resetRootSplitScreen = (rootName) => {
|
|
66
|
+
const current = layoutSplitScreenStore.getValue();
|
|
67
|
+
const newStoreValue = {
|
|
68
|
+
...current,
|
|
69
|
+
[rootName]: {}
|
|
70
|
+
};
|
|
71
|
+
updateSplitScreenStore(newStoreValue);
|
|
72
|
+
};
|
|
73
|
+
var removeSplitScreenChild = (rootName, layoutName) => {
|
|
74
|
+
const current = layoutSplitScreenStore.getValue();
|
|
75
|
+
if (!current[rootName]) return;
|
|
76
|
+
const updatedLayout = { ...current[rootName] };
|
|
77
|
+
delete updatedLayout[layoutName];
|
|
78
|
+
const newStoreValue = {
|
|
79
|
+
...current,
|
|
80
|
+
[rootName]: updatedLayout
|
|
81
|
+
};
|
|
82
|
+
updateSplitScreenStore(newStoreValue);
|
|
83
|
+
};
|
|
84
|
+
var getCurrentSplitScreenComponents = (rootName, layoutName) => {
|
|
85
|
+
const current = layoutSplitScreenStore.getValue();
|
|
86
|
+
if (!current[rootName]) return;
|
|
87
|
+
return current[rootName][layoutName];
|
|
88
|
+
};
|
|
89
|
+
var getSplitScreen = (rootName, layoutName) => {
|
|
90
|
+
return layoutSplitScreenStore.pipe(
|
|
91
|
+
map((splitScreen) => splitScreen[rootName][layoutName]),
|
|
92
|
+
distinctUntilChanged((prev, curr) => {
|
|
93
|
+
const filterChildren = (obj) => {
|
|
94
|
+
const { children, component, targetComponent, x, y, ...rest } = obj || {};
|
|
95
|
+
return rest;
|
|
96
|
+
};
|
|
97
|
+
return equal(filterChildren(prev), filterChildren(curr));
|
|
98
|
+
})
|
|
99
|
+
);
|
|
100
|
+
};
|
|
101
|
+
var flexContainerStore = new BehaviorSubject({});
|
|
102
|
+
var flexResizePanelStore = new BehaviorSubject({});
|
|
103
|
+
var setContainerRef = (layoutName, containerName, ref) => {
|
|
104
|
+
const currentRefs = flexContainerStore.getValue();
|
|
105
|
+
const updatedLayoutRefs = { ...currentRefs[layoutName] || {} };
|
|
106
|
+
if (ref === null) {
|
|
107
|
+
delete updatedLayoutRefs[containerName];
|
|
108
|
+
} else {
|
|
109
|
+
updatedLayoutRefs[containerName] = ref;
|
|
110
|
+
}
|
|
111
|
+
const newRefs = {
|
|
112
|
+
...currentRefs,
|
|
113
|
+
[layoutName]: updatedLayoutRefs
|
|
114
|
+
};
|
|
115
|
+
updateRefStore(flexContainerStore, newRefs);
|
|
116
|
+
};
|
|
117
|
+
var setResizePanelRef = (layoutName, containerName, ref) => {
|
|
118
|
+
const currentRefs = flexResizePanelStore.getValue();
|
|
119
|
+
const updatedLayoutRefs = { ...currentRefs[layoutName] || {} };
|
|
120
|
+
if (ref === null) {
|
|
121
|
+
delete updatedLayoutRefs[containerName];
|
|
122
|
+
} else {
|
|
123
|
+
updatedLayoutRefs[containerName] = ref;
|
|
124
|
+
}
|
|
125
|
+
const newRefs = {
|
|
126
|
+
...currentRefs,
|
|
127
|
+
[layoutName]: updatedLayoutRefs
|
|
128
|
+
};
|
|
129
|
+
updateRefStore(flexResizePanelStore, newRefs);
|
|
130
|
+
};
|
|
131
|
+
var getLayoutInfos = (layoutName) => {
|
|
132
|
+
return combineLatest([flexContainerStore, flexResizePanelStore]).pipe(
|
|
133
|
+
map(([containerRefs, resizePanelRefs]) => {
|
|
134
|
+
const containerData = containerRefs[layoutName] || {};
|
|
135
|
+
const resizePanelData = resizePanelRefs[layoutName] || {};
|
|
136
|
+
return {
|
|
137
|
+
container: containerData,
|
|
138
|
+
resizePanel: resizePanelData
|
|
139
|
+
};
|
|
140
|
+
}),
|
|
141
|
+
filter((result) => result.container !== null)
|
|
142
|
+
// 빈 객체 제외
|
|
143
|
+
);
|
|
144
|
+
};
|
|
145
|
+
var getContainerRef = ({
|
|
146
|
+
containerName,
|
|
147
|
+
layoutName
|
|
148
|
+
}) => {
|
|
149
|
+
return flexContainerStore.pipe(
|
|
150
|
+
map((refs) => {
|
|
151
|
+
if (layoutName) {
|
|
152
|
+
return refs[layoutName]?.[containerName] || null;
|
|
153
|
+
} else {
|
|
154
|
+
return Object.entries(refs).find(
|
|
155
|
+
([key, value]) => refs[key][containerName]
|
|
156
|
+
)?.[1][containerName];
|
|
157
|
+
}
|
|
158
|
+
}),
|
|
159
|
+
filter((ref) => ref !== null)
|
|
160
|
+
);
|
|
161
|
+
};
|
|
162
|
+
var getResizePanelRef = ({
|
|
163
|
+
containerName,
|
|
164
|
+
layoutName
|
|
165
|
+
}) => {
|
|
166
|
+
return flexResizePanelStore.pipe(
|
|
167
|
+
map((refs) => {
|
|
168
|
+
if (layoutName) {
|
|
169
|
+
return refs[layoutName]?.[containerName] || null;
|
|
170
|
+
} else {
|
|
171
|
+
return Object.entries(refs).find(
|
|
172
|
+
([key, value]) => refs[key][containerName]
|
|
173
|
+
)?.[1][containerName];
|
|
174
|
+
}
|
|
175
|
+
}),
|
|
176
|
+
filter((ref) => ref !== null)
|
|
177
|
+
);
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export { flexContainerStore, flexResizePanelStore, getContainerRef, getCurrentSplitScreenComponents, getLayoutInfos, getResizePanelRef, getScrollPosition, getSplitScreen, layoutSplitScreenStore, removeScrollPosition, removeSplitScreenChild, resetRootSplitScreen, scrollPositions, setContainerRef, setResizePanelRef, setScrollPosition, setSplitScreen };
|
|
181
|
+
//# sourceMappingURL=chunk-CFQQ6ZDC.js.map
|
|
182
|
+
//# sourceMappingURL=chunk-CFQQ6ZDC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/flex-layout/store/FlexLayoutContainerStore.ts"],"names":[],"mappings":"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","file":"chunk-CFQQ6ZDC.js","sourcesContent":["\"use client\";\r\nimport equal from \"fast-deep-equal\";\r\nimport { RefObject } from \"react\";\r\nimport { BehaviorSubject, combineLatest } from \"rxjs\";\r\nimport { distinctUntilChanged, filter, map } from \"rxjs/operators\";\r\nimport { DropTargetComponent } from \"../hooks/useDrag\";\r\n\r\n/**\r\n * 이전 값과 새 값이 동일하지 않을 때만 store를 업데이트하는 유틸 함수\r\n */\r\nfunction updateScrollStore<T>(subject: BehaviorSubject<T>, newValue: T) {\r\n\tconst currentValue = subject.getValue();\r\n\t// deep 비교를 통해 실제 변경이 있는 경우만 next\r\n\tif (!equal(currentValue, newValue)) {\r\n\t\tsubject.next(newValue);\r\n\t}\r\n}\r\n// 동일한지 확인 후 업데이트하는 유틸\r\nfunction updateRefStore(store: BehaviorSubject<RefStore>, newState: RefStore) {\r\n\tconst prevState = store.getValue();\r\n\tif (!equal(prevState, newState)) {\r\n\t\tstore.next(newState);\r\n\t}\r\n}\r\n\r\nfunction updateSplitScreenStore(newValue: LayoutSplitScreenState) {\r\n\tconst prevValue = layoutSplitScreenStore.getValue();\r\n\t// deep-equal 로 비교\r\n\tif (!equal(prevValue, newValue)) {\r\n\t\tlayoutSplitScreenStore.next(newValue);\r\n\t}\r\n}\r\n\r\n// 구독 시 이전 상태들을 축적하여 관리\r\n// const stateWithHistory$ = flexContainerStore.pipe(\r\n// scan((acc, newState) => [...acc, newState], [] as RefStore[])\r\n// );\r\n\r\nexport interface ScrollPosition {\r\n\tx: number;\r\n\ty: number;\r\n}\r\n\r\nexport const scrollPositions: Record<string, ScrollPosition> = {};\r\n\r\nconst scrollPositionsSubject = new BehaviorSubject<\r\n\tRecord<string, ScrollPosition>\r\n>(scrollPositions);\r\n\r\n/**\r\n * 스크롤 위치 업데이트 함수\r\n *\r\n * 기존: 항상 store.next()가 호출됨 → 바뀌지 않았다면 건너뛰도록 변경\r\n */\r\nexport const setScrollPosition = (\r\n\tlayoutName: string,\r\n\tposition: ScrollPosition,\r\n) => {\r\n\tconst current = scrollPositionsSubject.getValue();\r\n\tconst prevPos = current[layoutName];\r\n\r\n\t// x, y 모두 동일하면 업데이트할 필요가 없으므로 조기 반환\r\n\tif (prevPos && prevPos.x === position.x && prevPos.y === position.y) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// 변경사항이 있으면 새 객체를 만들어 넘김\r\n\tconst newPositions = {\r\n\t\t...current,\r\n\t\t[layoutName]: position,\r\n\t};\r\n\r\n\tupdateScrollStore(scrollPositionsSubject, newPositions);\r\n};\r\n\r\n/**\r\n * 스크롤 위치 구독\r\n */\r\nexport const getScrollPosition = (layoutName: string) => {\r\n\treturn scrollPositionsSubject.pipe(\r\n\t\t// 해당 layoutName이 정의되지 않았을 때는 제외\r\n\t\tfilter((e) => e[layoutName] !== undefined),\r\n\t\tmap((positions) => positions[layoutName]),\r\n\t\tdistinctUntilChanged(\r\n\t\t\t(prev, curr) => prev?.x === curr?.x && prev?.y === curr?.y,\r\n\t\t),\r\n\t);\r\n};\r\n\r\nexport const removeScrollPosition = (layoutName: string) => {\r\n\tconst current = scrollPositionsSubject.getValue();\r\n\tdelete current[layoutName];\r\n\r\n\t// 꼭 삭제 후에도 이전 상태와 달라졌는지 확인\r\n\tconst newPositions = { ...current };\r\n\tupdateScrollStore(scrollPositionsSubject, newPositions);\r\n};\r\n\r\nexport type SplitScreenComponents = {\r\n\tafterDropTargetComponent: DropTargetComponent[];\r\n\tbeforeDropTargetComponent: DropTargetComponent[];\r\n\tcenterDropTargetComponent: DropTargetComponent[];\r\n\tdirection: \"row\" | \"column\";\r\n};\r\n\r\nexport type LayoutSplitScreenState = Record<\r\n\tstring,\r\n\tRecord<string, SplitScreenComponents>\r\n>;\r\n\r\nexport const layoutSplitScreenStore =\r\n\tnew BehaviorSubject<LayoutSplitScreenState>({});\r\n\r\nexport const setSplitScreen = (\r\n\trootName: string,\r\n\tlayoutName: string,\r\n\tnewComponents: SplitScreenComponents,\r\n) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\tconst updatedLayout = { ...(current[rootName] || {}) };\r\n\tupdatedLayout[layoutName] = newComponents;\r\n\r\n\tconst newStoreValue = {\r\n\t\t...current,\r\n\t\t[rootName]: updatedLayout,\r\n\t};\r\n\tupdateSplitScreenStore(newStoreValue);\r\n};\r\n\r\nexport const resetRootSplitScreen = (rootName: string) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\t// rootName 아래만 초기화\r\n\tconst newStoreValue = {\r\n\t\t...current,\r\n\t\t[rootName]: {},\r\n\t};\r\n\tupdateSplitScreenStore(newStoreValue);\r\n};\r\n\r\nexport const removeSplitScreenChild = (\r\n\trootName: string,\r\n\tlayoutName: string,\r\n) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\tif (!current[rootName]) return;\r\n\r\n\tconst updatedLayout = { ...current[rootName] };\r\n\tdelete updatedLayout[layoutName];\r\n\r\n\tconst newStoreValue = {\r\n\t\t...current,\r\n\t\t[rootName]: updatedLayout,\r\n\t};\r\n\tupdateSplitScreenStore(newStoreValue);\r\n};\r\n\r\nexport const getCurrentSplitScreenComponents = (\r\n\trootName: string,\r\n\tlayoutName: string,\r\n) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\tif (!current[rootName]) return;\r\n\treturn current[rootName][layoutName];\r\n};\r\n\r\nexport const getSplitScreen = (rootName: string, layoutName: string) => {\r\n\treturn layoutSplitScreenStore.pipe(\r\n\t\tmap((splitScreen) => splitScreen[rootName][layoutName]),\r\n\t\tdistinctUntilChanged((prev, curr) => {\r\n\t\t\t// 이전 상태와 현재 상태를 비교하여 동일하면 필터링\r\n\t\t\tconst filterChildren = (obj: any) => {\r\n\t\t\t\t// 객체 복사 후 children 속성 제거\r\n\t\t\t\tconst { children, component, targetComponent, x, y, ...rest } =\r\n\t\t\t\t\tobj || {};\r\n\t\t\t\treturn rest;\r\n\t\t\t};\r\n\t\t\treturn equal(filterChildren(prev), filterChildren(curr));\r\n\t\t}),\r\n\t);\r\n};\r\n\r\n// 중첩된 객체 구조로 ref를 관리하는 타입\r\ntype RefStore = {\r\n\t[layoutName: string]: {\r\n\t\t[containerName: string]: RefObject<HTMLElement | null>;\r\n\t};\r\n};\r\n\r\n// 초기값으로 빈 객체를 설정한 BehaviorSubject 생성\r\nexport const flexContainerStore = new BehaviorSubject<RefStore>({});\r\n\r\nexport const flexResizePanelStore = new BehaviorSubject<RefStore>({});\r\n/**\r\n * ref를 업데이트하는 함수\r\n * - 기존: 무조건 next() → 새/이전 상태 비교 후 다를 경우에만 next()\r\n */\r\nexport const setContainerRef = <T extends HTMLElement>(\r\n\tlayoutName: string,\r\n\tcontainerName: string,\r\n\tref: React.RefObject<T | null> | null,\r\n) => {\r\n\tconst currentRefs = flexContainerStore.getValue();\r\n\tconst updatedLayoutRefs = { ...(currentRefs[layoutName] || {}) };\r\n\r\n\tif (ref === null) {\r\n\t\tdelete updatedLayoutRefs[containerName];\r\n\t} else {\r\n\t\tupdatedLayoutRefs[containerName] = ref;\r\n\t}\r\n\r\n\tconst newRefs: RefStore = {\r\n\t\t...currentRefs,\r\n\t\t[layoutName]: updatedLayoutRefs,\r\n\t};\r\n\r\n\tupdateRefStore(flexContainerStore, newRefs);\r\n};\r\n\r\nexport const setResizePanelRef = <T extends HTMLElement>(\r\n\tlayoutName: string,\r\n\tcontainerName: string,\r\n\tref: React.RefObject<T | null> | null,\r\n) => {\r\n\tconst currentRefs = flexResizePanelStore.getValue();\r\n\tconst updatedLayoutRefs = { ...(currentRefs[layoutName] || {}) };\r\n\r\n\tif (ref === null) {\r\n\t\tdelete updatedLayoutRefs[containerName];\r\n\t} else {\r\n\t\tupdatedLayoutRefs[containerName] = ref;\r\n\t}\r\n\r\n\tconst newRefs: RefStore = {\r\n\t\t...currentRefs,\r\n\t\t[layoutName]: updatedLayoutRefs,\r\n\t};\r\n\r\n\tupdateRefStore(flexResizePanelStore, newRefs);\r\n};\r\n\r\nexport const getLayoutInfos = (layoutName: string) => {\r\n\treturn combineLatest([flexContainerStore, flexResizePanelStore]).pipe(\r\n\t\tmap(([containerRefs, resizePanelRefs]) => {\r\n\t\t\t// 두 Store에서 layoutName에 해당하는 값을 병합\r\n\t\t\tconst containerData = containerRefs[layoutName] || {};\r\n\t\t\tconst resizePanelData = resizePanelRefs[layoutName] || {};\r\n\r\n\t\t\t// container와 resizePanel 데이터 합치기\r\n\t\t\treturn {\r\n\t\t\t\tcontainer: containerData,\r\n\t\t\t\tresizePanel: resizePanelData,\r\n\t\t\t};\r\n\t\t}),\r\n\t\tfilter((result) => result.container !== null), // 빈 객체 제외\r\n\t);\r\n};\r\n\r\n// 특정 containerName의 ref를 구독하는 함수\r\n// layoutName이 지정되지 않으면 전체 layout에서 해당하는 containerName의 ref를 찾음\r\nexport const getContainerRef = ({\r\n\tcontainerName,\r\n\tlayoutName,\r\n}: {\r\n\tcontainerName: string;\r\n\tlayoutName?: string;\r\n}) => {\r\n\treturn flexContainerStore.pipe(\r\n\t\tmap((refs: RefStore) => {\r\n\t\t\tif (layoutName) {\r\n\t\t\t\t// 지정된 layoutName에서 해당 containerName의 ref 반환\r\n\t\t\t\treturn refs[layoutName]?.[containerName] || null;\r\n\t\t\t} else {\r\n\t\t\t\t// 모든 layout에서 해당 containerName의 ref 찾기\r\n\t\t\t\treturn Object.entries(refs).find(\r\n\t\t\t\t\t([key, value]) => refs[key][containerName],\r\n\t\t\t\t)?.[1][containerName];\r\n\t\t\t}\r\n\t\t\t// else {\r\n\t\t\t// // 모든 layout에서 해당 containerName의 ref 찾기\r\n\t\t\t// for (const layout in refs) {\r\n\t\t\t// if (refs[layout][containerName]) {\r\n\t\t\t// return refs[layout][containerName];\r\n\t\t\t// }\r\n\t\t\t// }\r\n\t\t\t// return null;\r\n\t\t\t// }\r\n\t\t}),\r\n\t\tfilter((ref) => ref !== null),\r\n\t);\r\n};\r\n\r\nexport const getResizePanelRef = ({\r\n\tcontainerName,\r\n\tlayoutName,\r\n}: {\r\n\tcontainerName: string;\r\n\tlayoutName?: string;\r\n}) => {\r\n\treturn flexResizePanelStore.pipe(\r\n\t\tmap((refs: RefStore) => {\r\n\t\t\tif (layoutName) {\r\n\t\t\t\t// 지정된 layoutName에서 해당 containerName의 ref 반환\r\n\t\t\t\treturn refs[layoutName]?.[containerName] || null;\r\n\t\t\t} else {\r\n\t\t\t\t// 모든 layout에서 해당 containerName의 ref 찾기\r\n\t\t\t\treturn Object.entries(refs).find(\r\n\t\t\t\t\t([key, value]) => refs[key][containerName],\r\n\t\t\t\t)?.[1][containerName];\r\n\t\t\t}\r\n\t\t\t// else {\r\n\t\t\t// // 모든 layout에서 해당 containerName의 ref 찾기\r\n\t\t\t// for (const layout in refs) {\r\n\t\t\t// if (refs[layout][containerName]) {\r\n\t\t\t// return refs[layout][containerName];\r\n\t\t\t// }\r\n\t\t\t// }\r\n\t\t\t// return null;\r\n\t\t\t// }\r\n\t\t}),\r\n\t\tfilter((ref) => ref !== null),\r\n\t);\r\n};\r\n"]}
|