@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.
Files changed (61) hide show
  1. package/dist/FlexLayoutSplitScreenDragBox-eCtq4kLd.d.cts +31 -0
  2. package/dist/FlexLayoutSplitScreenDragBox-eCtq4kLd.d.ts +31 -0
  3. package/dist/chunk-3EDKZTM3.js +3 -0
  4. package/dist/chunk-3EDKZTM3.js.map +1 -0
  5. package/dist/chunk-5HWEFTNQ.js +176 -0
  6. package/dist/chunk-5HWEFTNQ.js.map +1 -0
  7. package/dist/chunk-7J5JUVZK.js +3 -0
  8. package/dist/chunk-7J5JUVZK.js.map +1 -0
  9. package/dist/chunk-CFQQ6ZDC.js +182 -0
  10. package/dist/chunk-CFQQ6ZDC.js.map +1 -0
  11. package/dist/chunk-JM3CZ5DU.js +238 -0
  12. package/dist/chunk-JM3CZ5DU.js.map +1 -0
  13. package/dist/chunk-PMTZFSP4.js +219 -0
  14. package/dist/chunk-PMTZFSP4.js.map +1 -0
  15. package/dist/chunk-UYI4Z27V.js +2432 -0
  16. package/dist/chunk-UYI4Z27V.js.map +1 -0
  17. package/dist/chunk-W4CNFJTK.js +197 -0
  18. package/dist/chunk-W4CNFJTK.js.map +1 -0
  19. package/dist/chunk-YIHCWXKY.js +3 -0
  20. package/dist/chunk-YIHCWXKY.js.map +1 -0
  21. package/dist/components.cjs +3048 -0
  22. package/dist/components.cjs.map +1 -0
  23. package/dist/components.css +471 -0
  24. package/dist/components.css.map +1 -0
  25. package/dist/components.d.cts +122 -0
  26. package/dist/components.d.ts +122 -0
  27. package/dist/components.js +7 -0
  28. package/dist/components.js.map +1 -0
  29. package/dist/hooks.cjs +425 -0
  30. package/dist/hooks.cjs.map +1 -0
  31. package/dist/hooks.d.cts +37 -0
  32. package/dist/hooks.d.ts +37 -0
  33. package/dist/hooks.js +5 -0
  34. package/dist/hooks.js.map +1 -0
  35. package/dist/index.cjs +2600 -1
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +10 -287
  38. package/dist/index.d.ts +10 -287
  39. package/dist/index.js +9 -814
  40. package/dist/index.js.map +1 -1
  41. package/dist/providers.cjs +411 -0
  42. package/dist/providers.cjs.map +1 -0
  43. package/dist/providers.d.cts +54 -0
  44. package/dist/providers.d.ts +54 -0
  45. package/dist/providers.js +6 -0
  46. package/dist/providers.js.map +1 -0
  47. package/dist/store.cjs +204 -0
  48. package/dist/store.cjs.map +1 -0
  49. package/dist/store.d.cts +67 -0
  50. package/dist/store.d.ts +67 -0
  51. package/dist/store.js +4 -0
  52. package/dist/store.js.map +1 -0
  53. package/dist/useDrag-CYQnhUFk.d.cts +108 -0
  54. package/dist/useDrag-DR01Ob3s.d.ts +108 -0
  55. package/dist/utils.cjs +209 -0
  56. package/dist/utils.cjs.map +1 -0
  57. package/dist/utils.d.cts +28 -0
  58. package/dist/utils.d.ts +28 -0
  59. package/dist/utils.js +4 -0
  60. package/dist/utils.js.map +1 -0
  61. package/package.json +25 -5
@@ -0,0 +1,238 @@
1
+ import { getGrow, mathGrow, openFlex, closeFlex } from './chunk-W4CNFJTK.js';
2
+ import { getLayoutInfos, flexContainerStore, getResizePanelRef } from './chunk-CFQQ6ZDC.js';
3
+ import { useState, useEffect } from 'react';
4
+ import { Subject, map, filter, switchMap, EMPTY, fromEvent, buffer, debounceTime } from 'rxjs';
5
+
6
+ var g = globalThis;
7
+ g.__FLEX_SUBJECTS__ ?? (g.__FLEX_SUBJECTS__ = { openClose: {}, spread: {} });
8
+ var containerOpenCloseSubjectMap = g.__FLEX_SUBJECTS__.openClose;
9
+ var containerSpreadSubjectMap = g.__FLEX_SUBJECTS__.spread;
10
+ var ContainerOpenCloseProvider = ({
11
+ layoutName,
12
+ containerName,
13
+ sizeName
14
+ }) => {
15
+ if (!containerOpenCloseSubjectMap[containerName]) {
16
+ containerOpenCloseSubjectMap[containerName] = new Subject();
17
+ }
18
+ if (!containerSpreadSubjectMap[containerName]) {
19
+ containerSpreadSubjectMap[containerName] = new Subject();
20
+ }
21
+ const [containers, setContainers] = useState([]);
22
+ const [container, setContainer] = useState();
23
+ useEffect(() => {
24
+ const subscription = getLayoutInfos(layoutName).subscribe(
25
+ (layout) => {
26
+ if (!layout || !layout.container[containerName] || !layout.container[containerName].current)
27
+ return;
28
+ setContainers(
29
+ Object.values(layout.container).filter(
30
+ (e) => e.current !== null
31
+ ).map((e) => e.current)
32
+ );
33
+ setContainer(layout.container[containerName].current);
34
+ }
35
+ );
36
+ return () => subscription.unsubscribe();
37
+ }, [containerName, layoutName]);
38
+ useEffect(() => {
39
+ const styleName = `${sizeName.charAt(0).toUpperCase() + sizeName.substring(1)}`;
40
+ const clientSize = "client" + styleName;
41
+ const outerSize = "outer" + styleName;
42
+ const maxSize = "max" + styleName;
43
+ const subscribe = containerOpenCloseSubjectMap[containerName].subscribe(
44
+ ({
45
+ mode,
46
+ initOpenState: isOpenState,
47
+ onClose,
48
+ onOpen,
49
+ openOption = {},
50
+ closeOption = {}
51
+ }) => {
52
+ if (!container || containers.length === 0) return;
53
+ const currentGrow = getGrow(container);
54
+ const styleMap = window.getComputedStyle(container);
55
+ const maxSizeGrow = mathGrow(
56
+ parseInt(styleMap[maxSize]),
57
+ container.parentElement && container.parentElement[clientSize] || window[outerSize],
58
+ containers.length
59
+ );
60
+ const open = () => openFlex(container, containers, {
61
+ sizeName,
62
+ ...isNaN(maxSizeGrow) ? {} : {
63
+ openGrowImportant: maxSizeGrow
64
+ },
65
+ ...openOption
66
+ }).then((openTargetGrow) => {
67
+ if (onOpen) onOpen();
68
+ containerSpreadSubjectMap[containerName].next({
69
+ isOpen: true,
70
+ grow: openTargetGrow,
71
+ targetContainer: container
72
+ });
73
+ });
74
+ const close = () => closeFlex(container, containers, {
75
+ sizeName,
76
+ ...closeOption
77
+ }).then(() => {
78
+ if (onClose) onClose();
79
+ containerSpreadSubjectMap[containerName].next({
80
+ isOpen: false,
81
+ grow: 0,
82
+ targetContainer: container
83
+ });
84
+ });
85
+ if (mode === "toggle") {
86
+ if (currentGrow === 0) {
87
+ open();
88
+ } else {
89
+ close();
90
+ }
91
+ } else if (mode === "open") {
92
+ if (currentGrow === 0) {
93
+ open();
94
+ }
95
+ } else if (mode === "close") {
96
+ if (currentGrow !== 0) {
97
+ close();
98
+ }
99
+ }
100
+ }
101
+ );
102
+ return () => {
103
+ subscribe.unsubscribe();
104
+ };
105
+ }, [containerName, container, containers, sizeName]);
106
+ return null;
107
+ };
108
+ var useContainers = (layoutName) => {
109
+ const [containers, setContainers] = useState([]);
110
+ useEffect(() => {
111
+ const subscription = getLayoutInfos(layoutName).subscribe(
112
+ (layout) => {
113
+ setContainers(
114
+ Object.values(layout.container).filter(
115
+ (e) => e.current !== null
116
+ ).map((e) => e.current)
117
+ );
118
+ }
119
+ );
120
+ return () => subscription.unsubscribe();
121
+ }, [layoutName]);
122
+ return containers;
123
+ };
124
+ var useLayoutName = (containerName) => {
125
+ const [layoutName, setLayoutName] = useState();
126
+ useEffect(() => {
127
+ const subscribe = flexContainerStore.pipe(
128
+ map(
129
+ (layouts) => Object.entries(layouts).filter(([_, v]) => v[containerName]).map(([k]) => k)[0]
130
+ // 첫 번째 결과 가져오기
131
+ )
132
+ ).subscribe(setLayoutName);
133
+ return () => subscribe.unsubscribe();
134
+ }, [containerName]);
135
+ return layoutName;
136
+ };
137
+ var useDecompositionLayout = ({
138
+ layoutName: initialLayoutName,
139
+ containerName
140
+ }) => {
141
+ const derivedLayoutName = useLayoutName(containerName);
142
+ const finalLayoutName = initialLayoutName || derivedLayoutName;
143
+ const [containers, setContainers] = useState([]);
144
+ const [container, setContainer] = useState();
145
+ const [resizePanel, setResizePanel] = useState();
146
+ useEffect(() => {
147
+ if (!finalLayoutName) return;
148
+ const subscription = getLayoutInfos(finalLayoutName).subscribe(
149
+ (layout) => {
150
+ if (!layout) return;
151
+ setContainers(
152
+ Object.values(layout.container).filter(
153
+ (e) => e.current !== null
154
+ ).map((e) => e.current)
155
+ );
156
+ if (containerName && layout.container[containerName] && layout.container[containerName].current) {
157
+ setContainer(layout.container[containerName].current);
158
+ if (layout.resizePanel[containerName] && layout.resizePanel[containerName].current) {
159
+ setResizePanel(
160
+ layout.resizePanel[containerName].current
161
+ );
162
+ }
163
+ }
164
+ }
165
+ );
166
+ return () => subscription.unsubscribe();
167
+ }, [containerName, finalLayoutName]);
168
+ return { layout: containers, container, resizePanel };
169
+ };
170
+ var useContainerSize = (containerName) => {
171
+ const { layout, container, resizePanel } = useDecompositionLayout({
172
+ containerName
173
+ });
174
+ const [size, setSize] = useState();
175
+ useEffect(() => {
176
+ if (!container) return;
177
+ const observer = new ResizeObserver((entries) => {
178
+ for (const entry of entries) {
179
+ setSize({
180
+ width: entry.contentRect.width,
181
+ height: entry.contentRect.height
182
+ });
183
+ }
184
+ });
185
+ observer.observe(container);
186
+ return () => observer.disconnect();
187
+ }, [container]);
188
+ return { size };
189
+ };
190
+ var useDoubleClick = (containerName, opt) => {
191
+ const [isOpen, setIsOpen] = useState();
192
+ const [isDoubleClick, setIsDoubleClick] = useState();
193
+ useEffect(() => {
194
+ const resizePanelClickEvent = getResizePanelRef({
195
+ containerName
196
+ }).pipe(
197
+ filter(
198
+ (resizePanelref) => resizePanelref != void 0 && resizePanelref.current != void 0
199
+ ),
200
+ //take(1),
201
+ switchMap((resizePanelref) => {
202
+ if (!resizePanelref || !resizePanelref.current) return EMPTY;
203
+ return fromEvent(resizePanelref.current, "click");
204
+ })
205
+ );
206
+ const subscribe = resizePanelClickEvent.pipe(
207
+ buffer(resizePanelClickEvent.pipe(debounceTime(500))),
208
+ filter((clickEventArray) => clickEventArray.length >= 2),
209
+ map((events) => {
210
+ containerOpenCloseSubjectMap[containerName].next({
211
+ ...opt,
212
+ openOption: {
213
+ ...opt.openOption,
214
+ isPrevSizeOpen: false
215
+ },
216
+ onClose: () => {
217
+ if (opt.onClose) opt.onClose();
218
+ setIsOpen(false);
219
+ setIsDoubleClick(true);
220
+ },
221
+ onOpen: () => {
222
+ if (opt.onOpen) opt.onOpen();
223
+ setIsOpen(true);
224
+ setIsDoubleClick(true);
225
+ }
226
+ });
227
+ })
228
+ ).subscribe();
229
+ return () => {
230
+ subscribe.unsubscribe();
231
+ };
232
+ }, [containerName]);
233
+ return { isOpen, isDoubleClick, setIsDoubleClick };
234
+ };
235
+
236
+ export { ContainerOpenCloseProvider, containerOpenCloseSubjectMap, containerSpreadSubjectMap, useContainerSize, useContainers, useDecompositionLayout, useDoubleClick, useLayoutName };
237
+ //# sourceMappingURL=chunk-JM3CZ5DU.js.map
238
+ //# sourceMappingURL=chunk-JM3CZ5DU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/flex-layout/providers/FlexLayoutHooks.tsx"],"names":[],"mappings":"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","file":"chunk-JM3CZ5DU.js","sourcesContent":["\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport {\r\n\tflexContainerStore,\r\n\tgetLayoutInfos,\r\n\tgetResizePanelRef,\r\n} from \"../store/FlexLayoutContainerStore\";\r\nimport {\r\n\tcloseFlex,\r\n\tgetGrow,\r\n\tmathGrow,\r\n\topenFlex,\r\n} from \"../utils/FlexLayoutUtils\";\r\n\r\nimport {\r\n\tbuffer,\r\n\tdebounceTime,\r\n\tEMPTY,\r\n\tfilter,\r\n\tfromEvent,\r\n\tmap,\r\n\tSubject,\r\n\tswitchMap,\r\n} from \"rxjs\";\r\nconst g = globalThis as any;\r\ng.__FLEX_SUBJECTS__ ??= { openClose: {}, spread: {} };\r\n\r\nexport type SubjectMap<T> = Record<string, Subject<T>>;\r\n\r\n// 컨테이너 상태 타입 정의\r\ninterface ContainerStateRequest {\r\n\tmode: \"toggle\" | \"open\" | \"close\";\r\n\tinitOpenState?: boolean;\r\n\tonOpen?: () => void;\r\n\tonClose?: () => void;\r\n\topenOption?: {\r\n\t\tisPrevSizeOpen?: boolean;\r\n\t\tisResize?: boolean;\r\n\t\topenGrowImportant?: number;\r\n\t};\r\n\tcloseOption?: { isResize?: boolean; isDsiabledResizePanel?: boolean };\r\n}\r\n\r\ninterface ContainerState {\r\n\tisOpen: boolean;\r\n\ttargetContainer: HTMLElement;\r\n\tgrow: number;\r\n}\r\nexport const containerOpenCloseSubjectMap: SubjectMap<ContainerStateRequest> =\r\n\tg.__FLEX_SUBJECTS__.openClose;\r\nexport const containerSpreadSubjectMap: SubjectMap<ContainerState> =\r\n\tg.__FLEX_SUBJECTS__.spread;\r\n\r\n// export const containerOpenCloseSubjectMap: SubjectMap<ContainerStateRequest> = (\r\n// Object.keys({}) as Array<string>\r\n// ).reduce((total, key) => {\r\n// total[key] = new Subject<ContainerStateRequest>();\r\n// return total;\r\n// }, {} as SubjectMap<ContainerStateRequest>);\r\n\r\n// export const containerSpreadSubjectMap: SubjectMap<ContainerState> = (\r\n// Object.keys({}) as Array<string>\r\n// ).reduce((total, key) => {\r\n// total[key] = new Subject<ContainerState>();\r\n// return total;\r\n// }, {} as SubjectMap<ContainerState>);\r\n\r\nexport const ContainerOpenCloseProvider = ({\r\n\tlayoutName,\r\n\tcontainerName,\r\n\tsizeName,\r\n}: {\r\n\tlayoutName: string;\r\n\tcontainerName: string;\r\n\tsizeName: \"width\" | \"height\";\r\n}) => {\r\n\t// SubjectMap에 중복 체크 후 Subject 추가\r\n\tif (!containerOpenCloseSubjectMap[containerName]) {\r\n\t\tcontainerOpenCloseSubjectMap[containerName] =\r\n\t\t\tnew Subject<ContainerStateRequest>();\r\n\t}\r\n\tif (!containerSpreadSubjectMap[containerName]) {\r\n\t\tcontainerSpreadSubjectMap[containerName] =\r\n\t\t\tnew Subject<ContainerState>();\r\n\t}\r\n\r\n\tconst [containers, setContainers] = useState<HTMLElement[]>([]);\r\n\tconst [container, setContainer] = useState<HTMLElement>();\r\n\r\n\tuseEffect(() => {\r\n\t\t// 특정 layoutName과 containerName을 통해 ref를 구독\r\n\t\tconst subscription = getLayoutInfos(layoutName as string).subscribe(\r\n\t\t\t(layout) => {\r\n\t\t\t\tif (\r\n\t\t\t\t\t!layout ||\r\n\t\t\t\t\t!layout.container[containerName] ||\r\n\t\t\t\t\t!layout.container[containerName].current\r\n\t\t\t\t)\r\n\t\t\t\t\treturn;\r\n\t\t\t\tsetContainers(\r\n\t\t\t\t\tObject.values(layout.container)\r\n\t\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t\t(e): e is { current: HTMLElement } =>\r\n\t\t\t\t\t\t\t\te.current !== null,\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t.map((e) => e.current),\r\n\t\t\t\t);\r\n\t\t\t\tsetContainer(layout.container[containerName].current);\r\n\t\t\t},\r\n\t\t);\r\n\r\n\t\t// 구독 해제\r\n\t\treturn () => subscription.unsubscribe();\r\n\t}, [containerName, layoutName]);\r\n\tuseEffect(() => {\r\n\t\tconst styleName = `${sizeName.charAt(0).toUpperCase() + sizeName.substring(1)}`;\r\n\t\tconst clientSize = (\"client\" + styleName) as\r\n\t\t\t| \"clientWidth\"\r\n\t\t\t| \"clientHeight\";\r\n\t\tconst outerSize = (\"outer\" + styleName) as \"outerWidth\" | \"outerHeight\";\r\n\t\tconst maxSize = (\"max\" + styleName) as \"maxWidth\" | \"maxHeight\";\r\n\t\tconst subscribe = containerOpenCloseSubjectMap[containerName].subscribe(\r\n\t\t\t({\r\n\t\t\t\tmode,\r\n\t\t\t\tinitOpenState: isOpenState,\r\n\t\t\t\tonClose,\r\n\t\t\t\tonOpen,\r\n\t\t\t\topenOption = {},\r\n\t\t\t\tcloseOption = {},\r\n\t\t\t}) => {\r\n\t\t\t\tif (!container || containers.length === 0) return;\r\n\t\t\t\tconst currentGrow = getGrow(container);\r\n\t\t\t\tconst styleMap = window.getComputedStyle(container);\r\n\t\t\t\tconst maxSizeGrow = mathGrow(\r\n\t\t\t\t\tparseInt(styleMap[maxSize]),\r\n\t\t\t\t\t(container.parentElement &&\r\n\t\t\t\t\t\tcontainer.parentElement[clientSize]) ||\r\n\t\t\t\t\t\twindow[outerSize],\r\n\t\t\t\t\tcontainers.length,\r\n\t\t\t\t);\r\n\t\t\t\tconst open = () =>\r\n\t\t\t\t\topenFlex(container, containers, {\r\n\t\t\t\t\t\tsizeName,\r\n\t\t\t\t\t\t...(isNaN(maxSizeGrow)\r\n\t\t\t\t\t\t\t? {}\r\n\t\t\t\t\t\t\t: {\r\n\t\t\t\t\t\t\t\t\topenGrowImportant: maxSizeGrow,\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t...openOption,\r\n\t\t\t\t\t}).then((openTargetGrow) => {\r\n\t\t\t\t\t\tif (onOpen) onOpen();\r\n\t\t\t\t\t\tcontainerSpreadSubjectMap[containerName].next({\r\n\t\t\t\t\t\t\tisOpen: true,\r\n\t\t\t\t\t\t\tgrow: openTargetGrow as any,\r\n\t\t\t\t\t\t\ttargetContainer: container,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\tconst close = () =>\r\n\t\t\t\t\tcloseFlex(container, containers, {\r\n\t\t\t\t\t\tsizeName,\r\n\t\t\t\t\t\t...closeOption,\r\n\t\t\t\t\t}).then(() => {\r\n\t\t\t\t\t\tif (onClose) onClose();\r\n\t\t\t\t\t\tcontainerSpreadSubjectMap[containerName].next({\r\n\t\t\t\t\t\t\tisOpen: false,\r\n\t\t\t\t\t\t\tgrow: 0,\r\n\t\t\t\t\t\t\ttargetContainer: container,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\tif (mode === \"toggle\") {\r\n\t\t\t\t\tif (currentGrow === 0) {\r\n\t\t\t\t\t\topen();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclose();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (mode === \"open\") {\r\n\t\t\t\t\tif (currentGrow === 0) {\r\n\t\t\t\t\t\topen();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (mode === \"close\") {\r\n\t\t\t\t\tif (currentGrow !== 0) {\r\n\t\t\t\t\t\tclose();\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\treturn () => {\r\n\t\t\tsubscribe.unsubscribe();\r\n\t\t};\r\n\t}, [containerName, container, containers, sizeName]);\r\n\r\n\treturn null;\r\n};\r\n\r\nexport const useContainers = (layoutName: string) => {\r\n\tconst [containers, setContainers] = useState<HTMLElement[]>([]);\r\n\r\n\tuseEffect(() => {\r\n\t\t// 특정 layoutName과 containerName을 통해 ref를 구독\r\n\t\tconst subscription = getLayoutInfos(layoutName as string).subscribe(\r\n\t\t\t(layout) => {\r\n\t\t\t\tsetContainers(\r\n\t\t\t\t\tObject.values(layout.container)\r\n\t\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t\t(e): e is { current: HTMLElement } =>\r\n\t\t\t\t\t\t\t\te.current !== null,\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t.map((e) => e.current),\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t);\r\n\r\n\t\t// 구독 해제\r\n\t\treturn () => subscription.unsubscribe();\r\n\t}, [layoutName]);\r\n\treturn containers;\r\n};\r\n\r\nexport const useLayoutName = (containerName: string) => {\r\n\tconst [layoutName, setLayoutName] = useState<string>();\r\n\tuseEffect(() => {\r\n\t\tconst subscribe = flexContainerStore\r\n\t\t\t.pipe(\r\n\t\t\t\tmap(\r\n\t\t\t\t\t(layouts) =>\r\n\t\t\t\t\t\tObject.entries(layouts)\r\n\t\t\t\t\t\t\t.filter(([_, v]) => v[containerName])\r\n\t\t\t\t\t\t\t.map(([k]) => k)[0] as string, // 첫 번째 결과 가져오기\r\n\t\t\t\t),\r\n\t\t\t)\r\n\t\t\t.subscribe(setLayoutName);\r\n\r\n\t\t// 컴포넌트 언마운트 시 구독 해제\r\n\t\treturn () => subscribe.unsubscribe();\r\n\t}, [containerName]);\r\n\r\n\treturn layoutName;\r\n};\r\n\r\nexport const useDecompositionLayout = ({\r\n\tlayoutName: initialLayoutName,\r\n\tcontainerName,\r\n}: {\r\n\tlayoutName?: string;\r\n\tcontainerName: string;\r\n}) => {\r\n\tconst derivedLayoutName = useLayoutName(containerName);\r\n\tconst finalLayoutName = initialLayoutName || derivedLayoutName;\r\n\r\n\tconst [containers, setContainers] = useState<HTMLElement[]>([]);\r\n\tconst [container, setContainer] = useState<HTMLElement>();\r\n\tconst [resizePanel, setResizePanel] = useState<HTMLElement>();\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!finalLayoutName) return; // layoutName이 준비될 때까지 대기\r\n\t\t// 특정 layoutName과 containerName을 통해 ref를 구독\r\n\t\tconst subscription = getLayoutInfos(finalLayoutName).subscribe(\r\n\t\t\t(layout) => {\r\n\t\t\t\tif (!layout) return;\r\n\t\t\t\tsetContainers(\r\n\t\t\t\t\tObject.values(layout.container)\r\n\t\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t\t(e): e is { current: HTMLElement } =>\r\n\t\t\t\t\t\t\t\te.current !== null,\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t.map((e) => e.current),\r\n\t\t\t\t);\r\n\t\t\t\tif (\r\n\t\t\t\t\tcontainerName &&\r\n\t\t\t\t\tlayout.container[containerName] &&\r\n\t\t\t\t\tlayout.container[containerName].current\r\n\t\t\t\t) {\r\n\t\t\t\t\tsetContainer(layout.container[containerName].current);\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tlayout.resizePanel[containerName] &&\r\n\t\t\t\t\t\tlayout.resizePanel[containerName].current\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tsetResizePanel(\r\n\t\t\t\t\t\t\tlayout.resizePanel[containerName].current,\r\n\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\t// 구독 해제\r\n\t\treturn () => subscription.unsubscribe();\r\n\t}, [containerName, finalLayoutName]);\r\n\r\n\treturn { layout: containers, container, resizePanel };\r\n};\r\n\r\nexport const useContainerSize = (containerName: string) => {\r\n\tconst { layout, container, resizePanel } = useDecompositionLayout({\r\n\t\tcontainerName,\r\n\t});\r\n\tconst [size, setSize] = useState<{ width: number; height: number }>();\r\n\tuseEffect(() => {\r\n\t\tif (!container) return;\r\n\t\tconst observer = new ResizeObserver((entries) => {\r\n\t\t\tfor (const entry of entries) {\r\n\t\t\t\tsetSize({\r\n\t\t\t\t\twidth: entry.contentRect.width,\r\n\t\t\t\t\theight: entry.contentRect.height,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\tobserver.observe(container);\r\n\t\treturn () => observer.disconnect();\r\n\t}, [container]);\r\n\treturn { size };\r\n};\r\n\r\nexport const useDoubleClick = (\r\n\tcontainerName: string,\r\n\topt: ContainerStateRequest,\r\n) => {\r\n\tconst [isOpen, setIsOpen] = useState<boolean>();\r\n\tconst [isDoubleClick, setIsDoubleClick] = useState<boolean>();\r\n\tuseEffect(() => {\r\n\t\tconst resizePanelClickEvent = getResizePanelRef({\r\n\t\t\tcontainerName,\r\n\t\t}).pipe(\r\n\t\t\tfilter(\r\n\t\t\t\t(resizePanelref) =>\r\n\t\t\t\t\tresizePanelref != undefined &&\r\n\t\t\t\t\tresizePanelref.current != undefined,\r\n\t\t\t),\r\n\t\t\t//take(1),\r\n\t\t\tswitchMap((resizePanelref) => {\r\n\t\t\t\tif (!resizePanelref || !resizePanelref.current) return EMPTY;\r\n\t\t\t\treturn fromEvent(resizePanelref.current, \"click\");\r\n\t\t\t}),\r\n\t\t);\r\n\t\tconst subscribe = resizePanelClickEvent\r\n\t\t\t.pipe(\r\n\t\t\t\tbuffer(resizePanelClickEvent.pipe(debounceTime(500))),\r\n\t\t\t\tfilter((clickEventArray) => clickEventArray.length >= 2),\r\n\t\t\t\tmap((events) => {\r\n\t\t\t\t\tcontainerOpenCloseSubjectMap[containerName].next({\r\n\t\t\t\t\t\t...opt,\r\n\t\t\t\t\t\topenOption: {\r\n\t\t\t\t\t\t\t...opt.openOption,\r\n\t\t\t\t\t\t\tisPrevSizeOpen: false,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tonClose: () => {\r\n\t\t\t\t\t\t\tif (opt.onClose) opt.onClose();\r\n\t\t\t\t\t\t\tsetIsOpen(false);\r\n\t\t\t\t\t\t\tsetIsDoubleClick(true);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tonOpen: () => {\r\n\t\t\t\t\t\t\tif (opt.onOpen) opt.onOpen();\r\n\t\t\t\t\t\t\tsetIsOpen(true);\r\n\t\t\t\t\t\t\tsetIsDoubleClick(true);\r\n\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\t.subscribe();\r\n\t\treturn () => {\r\n\t\t\tsubscribe.unsubscribe();\r\n\t\t};\r\n\t}, [containerName]);\r\n\treturn { isOpen, isDoubleClick, setIsDoubleClick };\r\n};\r\n"]}
@@ -0,0 +1,219 @@
1
+ import { getClientXy } from './chunk-W4CNFJTK.js';
2
+ import equal from 'fast-deep-equal';
3
+ import { useRef, useEffect, useState, useCallback } from 'react';
4
+ import { Subject, BehaviorSubject, map, distinctUntilChanged } from 'rxjs';
5
+
6
+ var dragState = new Subject();
7
+ var filterChildren = (obj) => {
8
+ const { children, ...rest } = obj || {};
9
+ return rest;
10
+ };
11
+ var useDragCapture = (targetRef) => {
12
+ const stateRef = useRef(null);
13
+ const forceUpdate = useRef(0);
14
+ useEffect(() => {
15
+ const subscription = dragState.pipe(
16
+ map((value) => {
17
+ if (!targetRef || !targetRef.current) return null;
18
+ const { x, y } = value;
19
+ const rect = targetRef.current.getBoundingClientRect();
20
+ const {
21
+ width,
22
+ height,
23
+ x: rectX,
24
+ y: rectY,
25
+ right,
26
+ bottom
27
+ } = rect;
28
+ let isOver = false;
29
+ if (x < rectX || x > right || y < rectY || y > bottom) {
30
+ isOver = true;
31
+ }
32
+ const leftBoundary = rectX + width * 0.2;
33
+ const rightBoundary = right - width * 0.2;
34
+ const topBoundary = rectY + height * 0.2;
35
+ const bottomBoundary = bottom - height * 0.2;
36
+ let position = "centerBoundary";
37
+ if (x < leftBoundary) {
38
+ position = "leftBoundary";
39
+ } else if (x > rightBoundary) {
40
+ position = "rightBoundary";
41
+ } else if (y < topBoundary) {
42
+ position = "topBoundary";
43
+ } else if (y > bottomBoundary) {
44
+ position = "bottomBoundary";
45
+ }
46
+ return {
47
+ positionName: position,
48
+ isOver,
49
+ ...value
50
+ };
51
+ }),
52
+ distinctUntilChanged(
53
+ (prev, curr) => equal(filterChildren(prev), filterChildren(curr))
54
+ )
55
+ ).subscribe({
56
+ next: (value) => {
57
+ if (value && !equal(
58
+ filterChildren(stateRef.current),
59
+ filterChildren(value)
60
+ )) {
61
+ stateRef.current = value;
62
+ forceUpdate.current++;
63
+ }
64
+ },
65
+ error: (err) => console.error(err)
66
+ });
67
+ return () => subscription.unsubscribe();
68
+ }, [targetRef]);
69
+ const [, rerender] = useState({});
70
+ useEffect(() => {
71
+ const interval = setInterval(() => {
72
+ rerender({});
73
+ }, 50);
74
+ return () => clearInterval(interval);
75
+ }, []);
76
+ return stateRef.current;
77
+ };
78
+ var dropMovementEventSubject = new Subject();
79
+ var allSplitScreenCount = new BehaviorSubject(0);
80
+ var useDragEvents = ({
81
+ isBlockingActiveInput = false
82
+ }) => {
83
+ const dragResumeTimer = useRef(null);
84
+ const scrollThreshold = 10;
85
+ const isScrolling = useRef(false);
86
+ const isPending = useRef(false);
87
+ const isMouseDown = useRef(false);
88
+ const isDragging = useRef(false);
89
+ const touchStartX = useRef(0);
90
+ const touchStartY = useRef(0);
91
+ const handleStart = useCallback(
92
+ ({
93
+ event: _event,
94
+ dragStartCallback
95
+ }) => {
96
+ const event = _event instanceof Event ? _event : _event.nativeEvent;
97
+ if (dragResumeTimer.current) {
98
+ clearTimeout(dragResumeTimer.current);
99
+ dragResumeTimer.current = null;
100
+ }
101
+ if (event.target.contentEditable === "true" || isBlockingActiveInput && document.activeElement === event.target) {
102
+ return;
103
+ }
104
+ if (event.cancelable) {
105
+ event.preventDefault();
106
+ }
107
+ isPending.current = true;
108
+ isMouseDown.current = true;
109
+ if (event instanceof globalThis.TouchEvent) {
110
+ const touch = event.touches[0];
111
+ touchStartX.current = touch.clientX;
112
+ touchStartY.current = touch.clientY;
113
+ } else if (event instanceof globalThis.MouseEvent) {
114
+ touchStartX.current = event.clientX;
115
+ touchStartY.current = event.clientY;
116
+ }
117
+ setTimeout(() => {
118
+ if (!isPending.current || isScrolling.current) return;
119
+ isPending.current = false;
120
+ isDragging.current = true;
121
+ const xy = getClientXy(event);
122
+ if (!xy) return;
123
+ const { clientX, clientY } = xy;
124
+ dragStartCallback({ x: clientX, y: clientY });
125
+ }, 300);
126
+ },
127
+ [isBlockingActiveInput]
128
+ );
129
+ const handleMove = useCallback(
130
+ ({
131
+ event: _event,
132
+ notDragCallback,
133
+ dragStartCallback,
134
+ moveingCallback
135
+ }) => {
136
+ if (!isMouseDown.current) return;
137
+ const event = _event instanceof Event ? _event : _event.nativeEvent;
138
+ const xy = getClientXy(event);
139
+ if (!xy) return;
140
+ const { clientX, clientY } = xy;
141
+ const deltaX = Math.abs(clientX - touchStartX.current);
142
+ const deltaY = Math.abs(clientY - touchStartY.current);
143
+ if (isPending.current && (deltaX > scrollThreshold || deltaY > scrollThreshold)) {
144
+ isScrolling.current = true;
145
+ isPending.current = false;
146
+ isDragging.current = false;
147
+ if (notDragCallback)
148
+ notDragCallback({ x: clientX, y: clientY });
149
+ if (dragResumeTimer.current) {
150
+ clearTimeout(dragResumeTimer.current);
151
+ dragResumeTimer.current = null;
152
+ }
153
+ dragResumeTimer.current = setTimeout(() => {
154
+ if (!isMouseDown.current) return;
155
+ if (dragStartCallback)
156
+ dragStartCallback({ x: clientX, y: clientY });
157
+ isPending.current = true;
158
+ isScrolling.current = false;
159
+ handleStart({ event: _event, dragStartCallback });
160
+ }, 400);
161
+ return;
162
+ }
163
+ if (!isDragging.current || isPending.current) return;
164
+ moveingCallback({ x: clientX, y: clientY });
165
+ },
166
+ [isBlockingActiveInput]
167
+ );
168
+ const handleEnd = useCallback(
169
+ ({
170
+ event: _event,
171
+ dragEndCallback
172
+ }) => {
173
+ isScrolling.current = false;
174
+ isMouseDown.current = false;
175
+ if (isPending.current) {
176
+ isPending.current = false;
177
+ return;
178
+ }
179
+ const event = _event instanceof Event ? _event : _event.nativeEvent;
180
+ if (!isDragging.current) return;
181
+ isDragging.current = false;
182
+ const xy = getClientXy(event);
183
+ if (!xy) return;
184
+ const { clientX, clientY } = xy;
185
+ dragEndCallback({ x: clientX, y: clientY });
186
+ },
187
+ [isBlockingActiveInput]
188
+ );
189
+ return {
190
+ handleStart,
191
+ handleMove,
192
+ handleEnd
193
+ };
194
+ };
195
+ var folderEventSubject = new Subject();
196
+ var setFolderEvent = (newValue) => {
197
+ folderEventSubject.next(newValue);
198
+ };
199
+ var useFolderEvent = () => {
200
+ const [folderEvent, setFolderEvent2] = useState(
201
+ null
202
+ );
203
+ useEffect(() => {
204
+ const subscription = folderEventSubject.subscribe((e) => {
205
+ if (!e) return;
206
+ setFolderEvent2(e);
207
+ });
208
+ return () => {
209
+ if (subscription) {
210
+ subscription.unsubscribe();
211
+ }
212
+ };
213
+ }, []);
214
+ return { folderEvent };
215
+ };
216
+
217
+ export { allSplitScreenCount, dragState, dropMovementEventSubject, folderEventSubject, setFolderEvent, useDragCapture, useDragEvents, useFolderEvent };
218
+ //# sourceMappingURL=chunk-PMTZFSP4.js.map
219
+ //# sourceMappingURL=chunk-PMTZFSP4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/flex-layout/hooks/useDrag.ts"],"names":["setFolderEvent"],"mappings":";;;;;AA4CO,IAAM,SAAA,GAAY,IAAI,OAAA;AAC7B,IAAM,cAAA,GAAiB,CAAC,GAAA,KAAa;AAEpC,EAAA,MAAM,EAAE,QAAA,EAAU,GAAG,IAAA,EAAK,GAAI,OAAO,EAAC;AACtC,EAAA,OAAO,IAAA;AACR,CAAA;AAEO,IAAM,cAAA,GAAiB,CAAC,SAAA,KAA6C;AAC3E,EAAA,MAAM,QAAA,GAAW,OAAmC,IAAI,CAAA;AACxD,EAAA,MAAM,WAAA,GAAc,OAAO,CAAC,CAAA;AAE5B,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,MAAM,eAAe,SAAA,CACnB,IAAA;AAAA,MACA,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,QAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,SAAS,OAAO,IAAA;AAE7C,QAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,KAAA;AACjB,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,qBAAA,EAAsB;AACrD,QAAA,MAAM;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA,CAAA,EAAG,KAAA;AAAA,UACH,CAAA,EAAG,KAAA;AAAA,UACH,KAAA;AAAA,UACA;AAAA,SACD,GAAI,IAAA;AAEJ,QAAA,IAAI,MAAA,GAAS,KAAA;AACb,QAAA,IAAI,IAAI,KAAA,IAAS,CAAA,GAAI,SAAS,CAAA,GAAI,KAAA,IAAS,IAAI,MAAA,EAAQ;AACtD,UAAA,MAAA,GAAS,IAAA;AAAA,QACV;AAEA,QAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,GAAQ,GAAA;AACrC,QAAA,MAAM,aAAA,GAAgB,QAAQ,KAAA,GAAQ,GAAA;AACtC,QAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,GAAS,GAAA;AACrC,QAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,GAAS,GAAA;AAEzC,QAAA,IAAI,QAAA,GAAW,gBAAA;AACf,QAAA,IAAI,IAAI,YAAA,EAAc;AACrB,UAAA,QAAA,GAAW,cAAA;AAAA,QACZ,CAAA,MAAA,IAAW,IAAI,aAAA,EAAe;AAC7B,UAAA,QAAA,GAAW,eAAA;AAAA,QACZ,CAAA,MAAA,IAAW,IAAI,WAAA,EAAa;AAC3B,UAAA,QAAA,GAAW,aAAA;AAAA,QACZ,CAAA,MAAA,IAAW,IAAI,cAAA,EAAgB;AAC9B,UAAA,QAAA,GAAW,gBAAA;AAAA,QACZ;AAEA,QAAA,OAAO;AAAA,UACN,YAAA,EAAc,QAAA;AAAA,UACd,MAAA;AAAA,UACA,GAAG;AAAA,SACJ;AAAA,MACD,CAAC,CAAA;AAAA,MACD,oBAAA;AAAA,QAAqB,CAAC,MAAM,IAAA,KAC3B,KAAA,CAAM,eAAe,IAAI,CAAA,EAAG,cAAA,CAAe,IAAI,CAAC;AAAA;AACjD,MAEA,SAAA,CAAU;AAAA,MACV,IAAA,EAAM,CAAC,KAAA,KAAU;AAChB,QAAA,IACC,SACA,CAAC,KAAA;AAAA,UACA,cAAA,CAAe,SAAS,OAAO,CAAA;AAAA,UAC/B,eAAe,KAAK;AAAA,SACrB,EACC;AACD,UAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,UAAA,WAAA,CAAY,OAAA,EAAA;AAAA,QACb;AAAA,MACD,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,GAAA,KAAQ,OAAA,CAAQ,MAAM,GAAG;AAAA,KACjC,CAAA;AAEF,IAAA,OAAO,MAAM,aAAa,WAAA,EAAY;AAAA,EACvC,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,MAAM,GAAG,QAAQ,CAAA,GAAI,QAAA,CAAS,EAAE,CAAA;AAChC,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AAClC,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IACZ,GAAG,EAAE,CAAA;AACL,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACpC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,QAAA,CAAS,OAAA;AACjB;AAsCO,IAAM,wBAAA,GAA2B,IAAI,OAAA;AAErC,IAAM,mBAAA,GAAsB,IAAI,eAAA,CAAwB,CAAC;AAEzD,IAAM,gBAAgB,CAAC;AAAA,EAC7B,qBAAA,GAAwB;AACzB,CAAA,KAEM;AACL,EAAA,MAAM,eAAA,GAAkB,OAA6C,IAAI,CAAA;AACzE,EAAA,MAAM,eAAA,GAAkB,EAAA;AAExB,EAAA,MAAM,WAAA,GAAc,OAAgB,KAAK,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,OAAO,KAAK,CAAA;AAC9B,EAAA,MAAM,WAAA,GAAc,OAAO,KAAK,CAAA;AAChC,EAAA,MAAM,UAAA,GAAa,OAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,OAAe,CAAC,CAAA;AACpC,EAAA,MAAM,WAAA,GAAc,OAAe,CAAC,CAAA;AAEpC,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IACnB,CAAC;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP;AAAA,KACD,KAGM;AACL,MAAA,MAAM,KAAA,GAAQ,MAAA,YAAkB,KAAA,GAAQ,MAAA,GAAS,MAAA,CAAO,WAAA;AAGxD,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC5B,QAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,QAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,MAC3B;AAEA,MAAA,IACE,KAAA,CAAM,OAAuB,eAAA,KAAoB,MAAA,IACjD,yBACA,QAAA,CAAS,aAAA,KAAkB,MAAM,MAAA,EACjC;AACD,QAAA;AAAA,MACD;AACA,MAAA,IAAI,MAAM,UAAA,EAAY;AACrB,QAAA,KAAA,CAAM,cAAA,EAAe;AAAA,MACtB;AACA,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,IAAI,KAAA,YAAiB,WAAW,UAAA,EAAY;AAC3C,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC7B,QAAA,WAAA,CAAY,UAAU,KAAA,CAAM,OAAA;AAC5B,QAAA,WAAA,CAAY,UAAU,KAAA,CAAM,OAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,KAAA,YAAiB,UAAA,CAAW,UAAA,EAAY;AAClD,QAAA,WAAA,CAAY,UAAU,KAAA,CAAM,OAAA;AAC5B,QAAA,WAAA,CAAY,UAAU,KAAA,CAAM,OAAA;AAAA,MAC7B;AAEA,MAAA,UAAA,CAAW,MAAM;AAChB,QAAA,IAAI,CAAC,SAAA,CAAU,OAAA,IAAW,WAAA,CAAY,OAAA,EAAS;AAC/C,QAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAErB,QAAA,MAAM,EAAA,GAAK,YAAY,KAAK,CAAA;AAC5B,QAAA,IAAI,CAAC,EAAA,EAAI;AAET,QAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,EAAA;AAE7B,QAAA,iBAAA,CAAkB,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA;AAAA,MAC7C,GAAG,GAAG,CAAA;AAAA,IACP,CAAA;AAAA,IACA,CAAC,qBAAqB;AAAA,GACvB;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IAClB,CAAC;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,eAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACD,KAKM;AACL,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,MAAA,MAAM,KAAA,GAAQ,MAAA,YAAkB,KAAA,GAAQ,MAAA,GAAS,MAAA,CAAO,WAAA;AAExD,MAAA,MAAM,EAAA,GAAK,YAAY,KAAK,CAAA;AAC5B,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,EAAA;AAC7B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,YAAY,OAAO,CAAA;AACrD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,YAAY,OAAO,CAAA;AAErD,MAAA,IACC,SAAA,CAAU,OAAA,KACT,MAAA,GAAS,eAAA,IAAmB,SAAS,eAAA,CAAA,EACrC;AACD,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,QAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,QAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AAErB,QAAA,IAAI,eAAA;AACH,UAAA,eAAA,CAAgB,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA;AAG3C,QAAA,IAAI,gBAAgB,OAAA,EAAS;AAC5B,UAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,UAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,QAC3B;AACA,QAAA,eAAA,CAAgB,OAAA,GAAU,WAAW,MAAM;AAC1C,UAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,UAAA,IAAI,iBAAA;AACH,YAAA,iBAAA,CAAkB,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA;AAC7C,UAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,UAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,UAAA,WAAA,CAAY,EAAE,KAAA,EAAO,MAAA,EAAQ,iBAAA,EAAmB,CAAA;AAAA,QACjD,GAAG,GAAG,CAAA;AACN,QAAA;AAAA,MACD;AAEA,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,SAAA,CAAU,OAAA,EAAS;AAE9C,MAAA,eAAA,CAAgB,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,CAAC,qBAAqB;AAAA,GACvB;AACA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IACjB,CAAC;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP;AAAA,KACD,KAGM;AACL,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,MAAA,IAAI,UAAU,OAAA,EAAS;AACtB,QAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,QAAA;AAAA,MACD;AACA,MAAA,MAAM,KAAA,GAAQ,MAAA,YAAkB,KAAA,GAAQ,MAAA,GAAS,MAAA,CAAO,WAAA;AAExD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AAEzB,MAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AAErB,MAAA,MAAM,EAAA,GAAK,YAAY,KAAK,CAAA;AAC5B,MAAA,IAAI,CAAC,EAAA,EAAI;AAET,MAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,EAAA;AAE7B,MAAA,eAAA,CAAgB,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA;AAAA,IA4C3C,CAAA;AAAA,IACA,CAAC,qBAAqB;AAAA,GACvB;AAEA,EAAA,OAAO;AAAA,IACN,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD;AACD;AAYO,IAAM,kBAAA,GAAqB,IAAI,OAAA;AAE/B,IAAM,cAAA,GAAiB,CAAC,QAAA,KAA8B;AAC5D,EAAA,kBAAA,CAAmB,KAAK,QAAQ,CAAA;AACjC;AAEO,IAAM,iBAAiB,MAAM;AACnC,EAAA,MAAM,CAAC,WAAA,EAAaA,eAAc,CAAA,GAAI,QAAA;AAAA,IACrC;AAAA,GACD;AACA,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,SAAA,CAAU,CAAC,CAAA,KAAM;AACxD,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAAA,gBAAe,CAAC,CAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACZ,MAAA,IAAI,YAAA,EAAc;AACjB,QAAA,YAAA,CAAa,WAAA,EAAY;AAAA,MAC1B;AAAA,IACD,CAAA;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,WAAA,EAAY;AACtB","file":"chunk-PMTZFSP4.js","sourcesContent":["import equal from \"fast-deep-equal\";\r\nimport {\r\n\tReactElement,\r\n\tRefObject,\r\n\tuseCallback,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\nimport { BehaviorSubject, distinctUntilChanged, map, Subject } from \"rxjs\";\r\nimport { DropDocumentOutsideOption } from \"../components/FlexLayoutSplitScreenDragBox\";\r\nimport { getClientXy } from \"../utils/FlexLayoutUtils\";\r\nexport interface DragStateType {\r\n\tisDragging: boolean;\r\n\tisDrop: boolean;\r\n\tnavigationTitle?: string;\r\n\tchildren?: ReactElement;\r\n\tcontainerName: string;\r\n\tx: number;\r\n\ty: number;\r\n\tdropDocumentOutsideOption?: DropDocumentOutsideOption;\r\n\tdropEndCallback?: ({\r\n\t\tx,\r\n\t\ty,\r\n\t\tcontainerName,\r\n\t}: {\r\n\t\tx: number;\r\n\t\ty: number;\r\n\t\tcontainerName: string;\r\n\t}) => void;\r\n\tscreenKey?: string;\r\n\tcustomData?: Record<string, string | number | boolean | undefined>;\r\n}\r\nexport type PositionName =\r\n\t| \"centerBoundary\"\r\n\t| \"leftBoundary\"\r\n\t| \"rightBoundary\"\r\n\t| \"topBoundary\"\r\n\t| \"bottomBoundary\";\r\n\r\nexport interface DragStateResultType extends DragStateType {\r\n\tpositionName: PositionName;\r\n\tisOver: boolean;\r\n}\r\nexport const dragState = new Subject<DragStateType>();\r\nconst filterChildren = (obj: any) => {\r\n\t// 객체 복사 후 children 속성 제거\r\n\tconst { children, ...rest } = obj || {};\r\n\treturn rest;\r\n};\r\n\r\nexport const useDragCapture = (targetRef: RefObject<HTMLElement | null>) => {\r\n\tconst stateRef = useRef<DragStateResultType | null>(null); // 상태를 저장하는 useRef\r\n\tconst forceUpdate = useRef(0); // 강제로 업데이트를 트리거하기 위한 변수\r\n\r\n\tuseEffect(() => {\r\n\t\tconst subscription = dragState\r\n\t\t\t.pipe(\r\n\t\t\t\tmap((value) => {\r\n\t\t\t\t\tif (!targetRef || !targetRef.current) return null;\r\n\r\n\t\t\t\t\tconst { x, y } = value;\r\n\t\t\t\t\tconst rect = targetRef.current.getBoundingClientRect();\r\n\t\t\t\t\tconst {\r\n\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\theight,\r\n\t\t\t\t\t\tx: rectX,\r\n\t\t\t\t\t\ty: rectY,\r\n\t\t\t\t\t\tright,\r\n\t\t\t\t\t\tbottom,\r\n\t\t\t\t\t} = rect;\r\n\r\n\t\t\t\t\tlet isOver = false;\r\n\t\t\t\t\tif (x < rectX || x > right || y < rectY || y > bottom) {\r\n\t\t\t\t\t\tisOver = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst leftBoundary = rectX + width * 0.2;\r\n\t\t\t\t\tconst rightBoundary = right - width * 0.2;\r\n\t\t\t\t\tconst topBoundary = rectY + height * 0.2;\r\n\t\t\t\t\tconst bottomBoundary = bottom - height * 0.2;\r\n\r\n\t\t\t\t\tlet position = \"centerBoundary\";\r\n\t\t\t\t\tif (x < leftBoundary) {\r\n\t\t\t\t\t\tposition = \"leftBoundary\";\r\n\t\t\t\t\t} else if (x > rightBoundary) {\r\n\t\t\t\t\t\tposition = \"rightBoundary\";\r\n\t\t\t\t\t} else if (y < topBoundary) {\r\n\t\t\t\t\t\tposition = \"topBoundary\";\r\n\t\t\t\t\t} else if (y > bottomBoundary) {\r\n\t\t\t\t\t\tposition = \"bottomBoundary\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tpositionName: position as PositionName,\r\n\t\t\t\t\t\tisOver,\r\n\t\t\t\t\t\t...value,\r\n\t\t\t\t\t};\r\n\t\t\t\t}),\r\n\t\t\t\tdistinctUntilChanged((prev, curr) =>\r\n\t\t\t\t\tequal(filterChildren(prev), filterChildren(curr)),\r\n\t\t\t\t),\r\n\t\t\t)\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: (value) => {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tvalue &&\r\n\t\t\t\t\t\t!equal(\r\n\t\t\t\t\t\t\tfilterChildren(stateRef.current),\r\n\t\t\t\t\t\t\tfilterChildren(value),\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tstateRef.current = value; // 상태를 업데이트\r\n\t\t\t\t\t\tforceUpdate.current++; // 업데이트 트리거\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\terror: (err) => console.error(err),\r\n\t\t\t});\r\n\r\n\t\treturn () => subscription.unsubscribe();\r\n\t}, [targetRef]);\r\n\r\n\t// 강제 렌더링을 트리거하기 위한 업데이트\r\n\tconst [, rerender] = useState({});\r\n\tuseEffect(() => {\r\n\t\tconst interval = setInterval(() => {\r\n\t\t\trerender({}); // 변경된 ref 상태를 반영\r\n\t\t}, 50); // 50ms 간격으로 렌더링 반영\r\n\t\treturn () => clearInterval(interval);\r\n\t}, []);\r\n\r\n\treturn stateRef.current;\r\n};\r\nexport interface DropTargetComponent {\r\n\tcontainerName: string;\r\n\tcomponent: ReactElement;\r\n\tnavigationTitle?: string;\r\n\tdropDocumentOutsideOption?: DropDocumentOutsideOption;\r\n\tscreenKey: string;\r\n}\r\nexport type DropPositionOrderName = \"before\" | \"center\" | \"after\";\r\n\r\nexport interface DropMovementEventType {\r\n\tstate: \"remove\" | \"append\" | \"change\";\r\n\ttargetParentLayoutName: string;\r\n\ttargetLayoutName: string;\r\n\ttargetContainerName: string;\r\n\ttargetComponent?: ReactElement;\r\n\tnextContainerName?: string;\r\n\tparentOrderName?: DropPositionOrderName;\r\n\torderName?: DropPositionOrderName;\r\n\tx?: number;\r\n\ty?: number;\r\n\tdropEndCallback?: ({\r\n\t\tx,\r\n\t\ty,\r\n\t\tcontainerName,\r\n\t}: {\r\n\t\tx: number;\r\n\t\ty: number;\r\n\t\tcontainerName: string;\r\n\t}) => void;\r\n\tdropTargetComponentEvent?: DropTargetComponentEvent;\r\n}\r\nexport interface DropTargetComponentEvent extends Omit<\r\n\tDropTargetComponent,\r\n\t\"containerName\" | \"component\"\r\n> {\r\n\tdirection: \"row\" | \"column\";\r\n}\r\nexport const dropMovementEventSubject = new Subject<DropMovementEventType>();\r\n\r\nexport const allSplitScreenCount = new BehaviorSubject<number>(0);\r\n\r\nexport const useDragEvents = ({\r\n\tisBlockingActiveInput = false,\r\n}: {\r\n\tisBlockingActiveInput?: boolean;\r\n}) => {\r\n\tconst dragResumeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\tconst scrollThreshold = 10; // 이동 거리 임계값\r\n\r\n\tconst isScrolling = useRef<boolean>(false);\r\n\tconst isPending = useRef(false);\r\n\tconst isMouseDown = useRef(false);\r\n\tconst isDragging = useRef(false); // 드래그 상태 플래그\r\n\tconst touchStartX = useRef<number>(0);\r\n\tconst touchStartY = useRef<number>(0);\r\n\r\n\tconst handleStart = useCallback(\r\n\t\t({\r\n\t\t\tevent: _event,\r\n\t\t\tdragStartCallback,\r\n\t\t}: {\r\n\t\t\tevent: React.MouseEvent | React.TouchEvent | Event;\r\n\t\t\tdragStartCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t}) => {\r\n\t\t\tconst event = _event instanceof Event ? _event : _event.nativeEvent;\r\n\r\n\t\t\t// 기존 타이머가 있다면 정리\r\n\t\t\tif (dragResumeTimer.current) {\r\n\t\t\t\tclearTimeout(dragResumeTimer.current);\r\n\t\t\t\tdragResumeTimer.current = null;\r\n\t\t\t}\r\n\r\n\t\t\tif (\r\n\t\t\t\t(event.target as HTMLElement).contentEditable === \"true\" ||\r\n\t\t\t\t(isBlockingActiveInput &&\r\n\t\t\t\t\tdocument.activeElement === event.target)\r\n\t\t\t) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (event.cancelable) {\r\n\t\t\t\tevent.preventDefault(); // cancelable=false 면 자동 skip\r\n\t\t\t}\r\n\t\t\tisPending.current = true;\r\n\t\t\tisMouseDown.current = true;\r\n\t\t\tif (event instanceof globalThis.TouchEvent) {\r\n\t\t\t\tconst touch = event.touches[0];\r\n\t\t\t\ttouchStartX.current = touch.clientX;\r\n\t\t\t\ttouchStartY.current = touch.clientY;\r\n\t\t\t} else if (event instanceof globalThis.MouseEvent) {\r\n\t\t\t\ttouchStartX.current = event.clientX;\r\n\t\t\t\ttouchStartY.current = event.clientY;\r\n\t\t\t}\r\n\t\t\t//event.preventDefault();\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tif (!isPending.current || isScrolling.current) return; // 스크롤 중이면 드래그 취소\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\tisDragging.current = true;\r\n\r\n\t\t\t\tconst xy = getClientXy(event);\r\n\t\t\t\tif (!xy) return;\r\n\r\n\t\t\t\tconst { clientX, clientY } = xy;\r\n\r\n\t\t\t\tdragStartCallback({ x: clientX, y: clientY });\r\n\t\t\t}, 300);\r\n\t\t},\r\n\t\t[isBlockingActiveInput],\r\n\t);\r\n\r\n\tconst handleMove = useCallback(\r\n\t\t({\r\n\t\t\tevent: _event,\r\n\t\t\tnotDragCallback,\r\n\t\t\tdragStartCallback,\r\n\t\t\tmoveingCallback,\r\n\t\t}: {\r\n\t\t\tevent: React.MouseEvent | React.TouchEvent | Event;\r\n\t\t\tnotDragCallback?: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t\tdragStartCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t\tmoveingCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t}) => {\r\n\t\t\tif (!isMouseDown.current) return;\r\n\t\t\tconst event = _event instanceof Event ? _event : _event.nativeEvent;\r\n\r\n\t\t\tconst xy = getClientXy(event);\r\n\t\t\tif (!xy) return;\r\n\t\t\tconst { clientX, clientY } = xy;\r\n\t\t\tconst deltaX = Math.abs(clientX - touchStartX.current);\r\n\t\t\tconst deltaY = Math.abs(clientY - touchStartY.current);\r\n\r\n\t\t\tif (\r\n\t\t\t\tisPending.current &&\r\n\t\t\t\t(deltaX > scrollThreshold || deltaY > scrollThreshold)\r\n\t\t\t) {\r\n\t\t\t\tisScrolling.current = true; // 스크롤 중으로 설정\r\n\t\t\t\tisPending.current = false; // 드래그 취소\r\n\t\t\t\tisDragging.current = false;\r\n\r\n\t\t\t\tif (notDragCallback)\r\n\t\t\t\t\tnotDragCallback({ x: clientX, y: clientY });\r\n\t\t\t\t//if (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\r\n\t\t\t\tif (dragResumeTimer.current) {\r\n\t\t\t\t\tclearTimeout(dragResumeTimer.current);\r\n\t\t\t\t\tdragResumeTimer.current = null;\r\n\t\t\t\t}\r\n\t\t\t\tdragResumeTimer.current = setTimeout(() => {\r\n\t\t\t\t\tif (!isMouseDown.current) return;\r\n\t\t\t\t\tif (dragStartCallback)\r\n\t\t\t\t\t\tdragStartCallback({ x: clientX, y: clientY });\r\n\t\t\t\t\tisPending.current = true;\r\n\t\t\t\t\tisScrolling.current = false;\r\n\t\t\t\t\thandleStart({ event: _event, dragStartCallback });\r\n\t\t\t\t}, 400);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!isDragging.current || isPending.current) return; // 드래그 중이 아닐 경우 무시\r\n\r\n\t\t\tmoveingCallback({ x: clientX, y: clientY });\r\n\t\t},\r\n\t\t[isBlockingActiveInput],\r\n\t);\r\n\tconst handleEnd = useCallback(\r\n\t\t({\r\n\t\t\tevent: _event,\r\n\t\t\tdragEndCallback,\r\n\t\t}: {\r\n\t\t\tevent: React.MouseEvent | React.TouchEvent | Event;\r\n\t\t\tdragEndCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t}) => {\r\n\t\t\tisScrolling.current = false;\r\n\t\t\tisMouseDown.current = false;\r\n\t\t\tif (isPending.current) {\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst event = _event instanceof Event ? _event : _event.nativeEvent;\r\n\r\n\t\t\tif (!isDragging.current) return; // 드래그 중이 아닐 경우 무시\r\n\r\n\t\t\tisDragging.current = false; // 드래그 종료\r\n\r\n\t\t\tconst xy = getClientXy(event);\r\n\t\t\tif (!xy) return;\r\n\r\n\t\t\tconst { clientX, clientY } = xy;\r\n\r\n\t\t\tdragEndCallback({ x: clientX, y: clientY });\r\n\t\t\t// const href = hrefUrlRef.current;\r\n\r\n\t\t\t// if (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\t\t\t// //console.log(clientX, clientY);\r\n\t\t\t// if (\r\n\t\t\t// dropDocumentOutsideOption &&\r\n\t\t\t// isDocumentOut({ x: clientX, y: clientY })\r\n\t\t\t// ) {\r\n\t\t\t// if (\r\n\t\t\t// dropDocumentOutsideOption.isNewTap ||\r\n\t\t\t// (!dropDocumentOutsideOption.widthRatio &&\r\n\t\t\t// !dropDocumentOutsideOption.heightRatio)\r\n\t\t\t// ) {\r\n\t\t\t// window.open(href, '_blank');\r\n\t\t\t// } else {\r\n\t\t\t// const width =\r\n\t\t\t// window.innerWidth *\r\n\t\t\t// (dropDocumentOutsideOption.widthRatio || 1);\r\n\t\t\t// const height =\r\n\t\t\t// window.innerHeight *\r\n\t\t\t// (dropDocumentOutsideOption.heightRatio || 1);\r\n\t\t\t// window.open(\r\n\t\t\t// href,\r\n\t\t\t// '_blank',\r\n\t\t\t// `width=${width},height=${height},left=${window.screenLeft - clientX * -1 - width},top=${window.screenTop + clientY}`\r\n\t\t\t// );\r\n\t\t\t// }\r\n\t\t\t// }\r\n\r\n\t\t\t// dragState.next({\r\n\t\t\t// isDragging: false,\r\n\t\t\t// isDrop: true,\r\n\t\t\t// navigationTitle,\r\n\t\t\t// children: targetComponent,\r\n\t\t\t// x: clientX,\r\n\t\t\t// y: clientY,\r\n\t\t\t// containerName,\r\n\t\t\t// dropDocumentOutsideOption,\r\n\t\t\t// dropEndCallback,\r\n\t\t\t// screenKey,\r\n\t\t\t// customData,\r\n\t\t\t// });\r\n\t\t\t//if (dropEndCallback) dropEndCallback({ x: clientX, y: clientY });\r\n\t\t},\r\n\t\t[isBlockingActiveInput],\r\n\t);\r\n\r\n\treturn {\r\n\t\thandleStart,\r\n\t\thandleMove,\r\n\t\thandleEnd,\r\n\t};\r\n};\r\n\r\nexport type FolderEventType = {\r\n\ttype: \"new\" | \"sort\" | \"title\" | \"delete\" | \"insert\" | \"update\" | \"next\";\r\n\tisFolder: boolean;\r\n\ttitle: string;\r\n\tsort?: number;\r\n\tparentId?: string;\r\n\tid?: string;\r\n\tnewData?: any;\r\n};\r\n\r\nexport const folderEventSubject = new Subject<FolderEventType>();\r\n\r\nexport const setFolderEvent = (newValue: FolderEventType) => {\r\n\tfolderEventSubject.next(newValue);\r\n};\r\n\r\nexport const useFolderEvent = () => {\r\n\tconst [folderEvent, setFolderEvent] = useState<FolderEventType | null>(\r\n\t\tnull,\r\n\t);\r\n\tuseEffect(() => {\r\n\t\tconst subscription = folderEventSubject.subscribe((e) => {\r\n\t\t\tif (!e) return;\r\n\t\t\tsetFolderEvent(e);\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\tif (subscription) {\r\n\t\t\t\tsubscription.unsubscribe();\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\r\n\treturn { folderEvent };\r\n};\r\n"]}