@byeolnaerim/flex-layout 0.0.8 → 0.0.9

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 (127) hide show
  1. package/dist/flex-layout/components/FlexLayout.cjs +62 -28
  2. package/dist/flex-layout/components/FlexLayout.cjs.map +1 -1
  3. package/dist/flex-layout/components/FlexLayout.js +26 -11
  4. package/dist/flex-layout/components/FlexLayout.js.map +1 -1
  5. package/dist/flex-layout/components/FlexLayoutContainer.cjs +121 -55
  6. package/dist/flex-layout/components/FlexLayoutContainer.cjs.map +1 -1
  7. package/dist/flex-layout/components/FlexLayoutContainer.js +68 -25
  8. package/dist/flex-layout/components/FlexLayoutContainer.js.map +1 -1
  9. package/dist/flex-layout/components/FlexLayoutIFramePane.cjs +68 -0
  10. package/dist/flex-layout/components/FlexLayoutIFramePane.cjs.map +1 -0
  11. package/dist/flex-layout/components/FlexLayoutIFramePane.d.ts +4 -0
  12. package/dist/flex-layout/components/FlexLayoutIFramePane.js +44 -0
  13. package/dist/flex-layout/components/FlexLayoutIFramePane.js.map +1 -0
  14. package/dist/flex-layout/components/FlexLayoutResizePanel.cjs +96 -42
  15. package/dist/flex-layout/components/FlexLayoutResizePanel.cjs.map +1 -1
  16. package/dist/flex-layout/components/FlexLayoutResizePanel.d.ts +1 -1
  17. package/dist/flex-layout/components/FlexLayoutResizePanel.js +44 -14
  18. package/dist/flex-layout/components/FlexLayoutResizePanel.js.map +1 -1
  19. package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs +184 -143
  20. package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs.map +1 -1
  21. package/dist/flex-layout/components/FlexLayoutSplitScreen.js +71 -32
  22. package/dist/flex-layout/components/FlexLayoutSplitScreen.js.map +1 -1
  23. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs +253 -60
  24. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs.map +1 -1
  25. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.d.ts +1 -1
  26. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js +215 -39
  27. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js.map +1 -1
  28. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs +40 -17
  29. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs.map +1 -1
  30. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js +7 -7
  31. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js.map +1 -1
  32. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs +44 -21
  33. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs.map +1 -1
  34. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js +7 -8
  35. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js.map +1 -1
  36. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs +40 -17
  37. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs.map +1 -1
  38. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js +5 -6
  39. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js.map +1 -1
  40. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs +53 -29
  41. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs.map +1 -1
  42. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js +14 -10
  43. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js.map +1 -1
  44. package/dist/flex-layout/components/FlexLayoutStickyBox.cjs +46 -27
  45. package/dist/flex-layout/components/FlexLayoutStickyBox.cjs.map +1 -1
  46. package/dist/flex-layout/components/FlexLayoutStickyBox.d.ts +1 -0
  47. package/dist/flex-layout/components/FlexLayoutStickyBox.js +13 -8
  48. package/dist/flex-layout/components/FlexLayoutStickyBox.js.map +1 -1
  49. package/dist/flex-layout/components/index.cjs +54 -49
  50. package/dist/flex-layout/components/index.cjs.map +1 -1
  51. package/dist/flex-layout/components/index.js +16 -8
  52. package/dist/flex-layout/components/index.js.map +1 -1
  53. package/dist/flex-layout/hooks/index.cjs +23 -19
  54. package/dist/flex-layout/hooks/index.cjs.map +1 -1
  55. package/dist/flex-layout/hooks/index.js +2 -3
  56. package/dist/flex-layout/hooks/index.js.map +1 -1
  57. package/dist/flex-layout/hooks/useDrag.cjs +136 -79
  58. package/dist/flex-layout/hooks/useDrag.cjs.map +1 -1
  59. package/dist/flex-layout/hooks/useDrag.d.ts +5 -0
  60. package/dist/flex-layout/hooks/useDrag.js +86 -47
  61. package/dist/flex-layout/hooks/useDrag.js.map +1 -1
  62. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs +40 -19
  63. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs.map +1 -1
  64. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js +9 -7
  65. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js.map +1 -1
  66. package/dist/flex-layout/hooks/useListPaging.cjs +68 -35
  67. package/dist/flex-layout/hooks/useListPaging.cjs.map +1 -1
  68. package/dist/flex-layout/hooks/useListPaging.js +34 -18
  69. package/dist/flex-layout/hooks/useListPaging.js.map +1 -1
  70. package/dist/flex-layout/hooks/useSizes.cjs +45 -23
  71. package/dist/flex-layout/hooks/useSizes.cjs.map +1 -1
  72. package/dist/flex-layout/hooks/useSizes.js +6 -6
  73. package/dist/flex-layout/hooks/useSizes.js.map +1 -1
  74. package/dist/flex-layout/index.cjs +29 -40
  75. package/dist/flex-layout/index.cjs.map +1 -1
  76. package/dist/flex-layout/index.js +5 -6
  77. package/dist/flex-layout/index.js.map +1 -1
  78. package/dist/flex-layout/providers/FlexLayoutContext.cjs +35 -12
  79. package/dist/flex-layout/providers/FlexLayoutContext.cjs.map +1 -1
  80. package/dist/flex-layout/providers/FlexLayoutContext.js +7 -6
  81. package/dist/flex-layout/providers/FlexLayoutContext.js.map +1 -1
  82. package/dist/flex-layout/providers/FlexLayoutHooks.cjs +82 -53
  83. package/dist/flex-layout/providers/FlexLayoutHooks.cjs.map +1 -1
  84. package/dist/flex-layout/providers/FlexLayoutHooks.js +33 -8
  85. package/dist/flex-layout/providers/FlexLayoutHooks.js.map +1 -1
  86. package/dist/flex-layout/providers/index.cjs +21 -12
  87. package/dist/flex-layout/providers/index.cjs.map +1 -1
  88. package/dist/flex-layout/providers/index.js +1 -2
  89. package/dist/flex-layout/providers/index.js.map +1 -1
  90. package/dist/flex-layout/store/FlexLayoutContainerStore.cjs +130 -76
  91. package/dist/flex-layout/store/FlexLayoutContainerStore.cjs.map +1 -1
  92. package/dist/flex-layout/store/FlexLayoutContainerStore.d.ts +1 -0
  93. package/dist/flex-layout/store/FlexLayoutContainerStore.js +63 -38
  94. package/dist/flex-layout/store/FlexLayoutContainerStore.js.map +1 -1
  95. package/dist/flex-layout/store/index.cjs +21 -12
  96. package/dist/flex-layout/store/index.cjs.map +1 -1
  97. package/dist/flex-layout/store/index.js +1 -2
  98. package/dist/flex-layout/store/index.js.map +1 -1
  99. package/dist/flex-layout/types/FlexDirectionTypes.cjs +16 -3
  100. package/dist/flex-layout/types/FlexDirectionTypes.cjs.map +1 -1
  101. package/dist/flex-layout/types/FlexDirectionTypes.js +0 -2
  102. package/dist/flex-layout/types/FlexDirectionTypes.js.map +1 -1
  103. package/dist/flex-layout/types/FlexLayoutTypes.cjs +16 -3
  104. package/dist/flex-layout/types/FlexLayoutTypes.cjs.map +1 -1
  105. package/dist/flex-layout/types/FlexLayoutTypes.d.ts +1 -3
  106. package/dist/flex-layout/types/FlexLayoutTypes.js +0 -2
  107. package/dist/flex-layout/types/FlexLayoutTypes.js.map +1 -1
  108. package/dist/flex-layout/utils/FlexLayoutUtils.cjs +57 -20
  109. package/dist/flex-layout/utils/FlexLayoutUtils.cjs.map +1 -1
  110. package/dist/flex-layout/utils/FlexLayoutUtils.d.ts +4 -4
  111. package/dist/flex-layout/utils/FlexLayoutUtils.js +23 -8
  112. package/dist/flex-layout/utils/FlexLayoutUtils.js.map +1 -1
  113. package/dist/flex-layout/utils/index.cjs +21 -12
  114. package/dist/flex-layout/utils/index.cjs.map +1 -1
  115. package/dist/flex-layout/utils/index.js +1 -2
  116. package/dist/flex-layout/utils/index.js.map +1 -1
  117. package/dist/index.cjs +21 -12
  118. package/dist/index.cjs.map +1 -1
  119. package/dist/index.js +1 -2
  120. package/dist/index.js.map +1 -1
  121. package/dist/metafile-cjs.json +1 -0
  122. package/dist/metafile-esm.json +1 -0
  123. package/dist/types/css.d.cjs +1 -3
  124. package/dist/types/css.d.cjs.map +1 -1
  125. package/dist/types/css.d.js +0 -2
  126. package/dist/types/css.d.js.map +1 -1
  127. package/package.json +5 -1
@@ -1,33 +1,68 @@
1
- 'use strict';
2
-
3
- var equal = require('fast-deep-equal');
4
- var rxjs = require('rxjs');
5
- var operators = require('rxjs/operators');
6
-
7
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
-
9
- var equal__default = /*#__PURE__*/_interopDefault(equal);
10
-
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var FlexLayoutContainerStore_exports = {};
31
+ __export(FlexLayoutContainerStore_exports, {
32
+ flexContainerStore: () => flexContainerStore,
33
+ flexResizePanelStore: () => flexResizePanelStore,
34
+ getContainerRef: () => getContainerRef,
35
+ getCurrentSplitScreenComponents: () => getCurrentSplitScreenComponents,
36
+ getLayoutInfos: () => getLayoutInfos,
37
+ getResizePanelRef: () => getResizePanelRef,
38
+ getScrollPosition: () => getScrollPosition,
39
+ getSplitScreen: () => getSplitScreen,
40
+ layoutSplitScreenStore: () => layoutSplitScreenStore,
41
+ removeRootSplitScreen: () => removeRootSplitScreen,
42
+ removeScrollPosition: () => removeScrollPosition,
43
+ removeSplitScreenChild: () => removeSplitScreenChild,
44
+ resetRootSplitScreen: () => resetRootSplitScreen,
45
+ scrollPositions: () => scrollPositions,
46
+ setContainerRef: () => setContainerRef,
47
+ setResizePanelRef: () => setResizePanelRef,
48
+ setScrollPosition: () => setScrollPosition,
49
+ setSplitScreen: () => setSplitScreen
50
+ });
51
+ module.exports = __toCommonJS(FlexLayoutContainerStore_exports);
52
+ var import_fast_deep_equal = __toESM(require("fast-deep-equal"), 1);
53
+ var import_rxjs = require("rxjs");
54
+ var import_operators = require("rxjs/operators");
11
55
  function updateScrollStore(subject, newValue) {
12
56
  const currentValue = subject.getValue();
13
- if (!equal__default.default(currentValue, newValue)) {
57
+ if (!(0, import_fast_deep_equal.default)(currentValue, newValue)) {
14
58
  subject.next(newValue);
15
59
  }
16
60
  }
17
- function updateRefStore(store, newState) {
18
- const prevState = store.getValue();
19
- if (!equal__default.default(prevState, newState)) {
20
- store.next(newState);
21
- }
22
- }
23
61
  function updateSplitScreenStore(newValue) {
24
- const prevValue = layoutSplitScreenStore.getValue();
25
- if (!equal__default.default(prevValue, newValue)) {
26
- layoutSplitScreenStore.next(newValue);
27
- }
62
+ layoutSplitScreenStore.next(newValue);
28
63
  }
29
64
  const scrollPositions = {};
30
- const scrollPositionsSubject = new rxjs.BehaviorSubject(scrollPositions);
65
+ const scrollPositionsSubject = new import_rxjs.BehaviorSubject(scrollPositions);
31
66
  const setScrollPosition = (layoutName, position) => {
32
67
  const current = scrollPositionsSubject.getValue();
33
68
  const prevPos = current[layoutName];
@@ -43,20 +78,19 @@ const setScrollPosition = (layoutName, position) => {
43
78
  const getScrollPosition = (layoutName) => {
44
79
  return scrollPositionsSubject.pipe(
45
80
  // 해당 layoutName이 정의되지 않았을 때는 제외
46
- operators.filter((e) => e[layoutName] !== void 0),
47
- operators.map((positions) => positions[layoutName]),
48
- operators.distinctUntilChanged(
81
+ (0, import_operators.filter)((e) => e[layoutName] !== void 0),
82
+ (0, import_operators.map)((positions) => positions[layoutName]),
83
+ (0, import_operators.distinctUntilChanged)(
49
84
  (prev, curr) => prev?.x === curr?.x && prev?.y === curr?.y
50
85
  )
51
86
  );
52
87
  };
53
88
  const removeScrollPosition = (layoutName) => {
54
89
  const current = scrollPositionsSubject.getValue();
55
- delete current[layoutName];
56
- const newPositions = { ...current };
57
- updateScrollStore(scrollPositionsSubject, newPositions);
90
+ const { [layoutName]: _, ...rest } = current;
91
+ updateScrollStore(scrollPositionsSubject, rest);
58
92
  };
59
- const layoutSplitScreenStore = new rxjs.BehaviorSubject({});
93
+ const layoutSplitScreenStore = new import_rxjs.BehaviorSubject({});
60
94
  const setSplitScreen = (rootName, layoutName, newComponents) => {
61
95
  const current = layoutSplitScreenStore.getValue();
62
96
  const updatedLayout = { ...current[rootName] || {} };
@@ -75,6 +109,12 @@ const resetRootSplitScreen = (rootName) => {
75
109
  };
76
110
  updateSplitScreenStore(newStoreValue);
77
111
  };
112
+ const removeRootSplitScreen = (rootName) => {
113
+ const current = layoutSplitScreenStore.getValue();
114
+ if (!current[rootName]) return;
115
+ const { [rootName]: _, ...rest } = current;
116
+ updateSplitScreenStore(rest);
117
+ };
78
118
  const removeSplitScreenChild = (rootName, layoutName) => {
79
119
  const current = layoutSplitScreenStore.getValue();
80
120
  if (!current[rootName]) return;
@@ -93,49 +133,59 @@ const getCurrentSplitScreenComponents = (rootName, layoutName) => {
93
133
  };
94
134
  const getSplitScreen = (rootName, layoutName) => {
95
135
  return layoutSplitScreenStore.pipe(
96
- operators.map((splitScreen) => splitScreen[rootName][layoutName]),
97
- operators.distinctUntilChanged((prev, curr) => {
136
+ (0, import_operators.map)((splitScreen) => splitScreen[rootName]?.[layoutName]),
137
+ (0, import_operators.distinctUntilChanged)((prev, curr) => {
98
138
  const filterChildren = (obj) => {
99
139
  const { children, component, targetComponent, x, y, ...rest } = obj || {};
100
140
  return rest;
101
141
  };
102
- return equal__default.default(filterChildren(prev), filterChildren(curr));
142
+ return (0, import_fast_deep_equal.default)(filterChildren(prev), filterChildren(curr));
103
143
  })
104
144
  );
105
145
  };
106
- const flexContainerStore = new rxjs.BehaviorSubject({});
107
- const flexResizePanelStore = new rxjs.BehaviorSubject({});
146
+ const flexContainerStore = new import_rxjs.BehaviorSubject({});
147
+ const flexResizePanelStore = new import_rxjs.BehaviorSubject({});
108
148
  const setContainerRef = (layoutName, containerName, ref) => {
109
149
  const currentRefs = flexContainerStore.getValue();
110
- const updatedLayoutRefs = { ...currentRefs[layoutName] || {} };
150
+ const layoutRefs = currentRefs[layoutName] || {};
111
151
  if (ref === null) {
112
- delete updatedLayoutRefs[containerName];
113
- } else {
114
- updatedLayoutRefs[containerName] = ref;
152
+ if (!(containerName in layoutRefs)) return;
153
+ const { [containerName]: _, ...restLayout } = layoutRefs;
154
+ const next = Object.keys(restLayout).length === 0 ? (() => {
155
+ const { [layoutName]: __, ...rest } = currentRefs;
156
+ return rest;
157
+ })() : { ...currentRefs, [layoutName]: restLayout };
158
+ flexContainerStore.next(next);
159
+ return;
115
160
  }
116
- const newRefs = {
161
+ if (layoutRefs[containerName] === ref) return;
162
+ flexContainerStore.next({
117
163
  ...currentRefs,
118
- [layoutName]: updatedLayoutRefs
119
- };
120
- updateRefStore(flexContainerStore, newRefs);
164
+ [layoutName]: { ...layoutRefs, [containerName]: ref }
165
+ });
121
166
  };
122
167
  const setResizePanelRef = (layoutName, containerName, ref) => {
123
168
  const currentRefs = flexResizePanelStore.getValue();
124
- const updatedLayoutRefs = { ...currentRefs[layoutName] || {} };
169
+ const layoutRefs = currentRefs[layoutName] || {};
125
170
  if (ref === null) {
126
- delete updatedLayoutRefs[containerName];
127
- } else {
128
- updatedLayoutRefs[containerName] = ref;
171
+ if (!(containerName in layoutRefs)) return;
172
+ const { [containerName]: _, ...restLayout } = layoutRefs;
173
+ const next = Object.keys(restLayout).length === 0 ? (() => {
174
+ const { [layoutName]: __, ...rest } = currentRefs;
175
+ return rest;
176
+ })() : { ...currentRefs, [layoutName]: restLayout };
177
+ flexResizePanelStore.next(next);
178
+ return;
129
179
  }
130
- const newRefs = {
180
+ if (layoutRefs[containerName] === ref) return;
181
+ flexResizePanelStore.next({
131
182
  ...currentRefs,
132
- [layoutName]: updatedLayoutRefs
133
- };
134
- updateRefStore(flexResizePanelStore, newRefs);
183
+ [layoutName]: { ...layoutRefs, [containerName]: ref }
184
+ });
135
185
  };
136
186
  const getLayoutInfos = (layoutName) => {
137
- return rxjs.combineLatest([flexContainerStore, flexResizePanelStore]).pipe(
138
- operators.map(([containerRefs, resizePanelRefs]) => {
187
+ return (0, import_rxjs.combineLatest)([flexContainerStore, flexResizePanelStore]).pipe(
188
+ (0, import_operators.map)(([containerRefs, resizePanelRefs]) => {
139
189
  const containerData = containerRefs[layoutName] || {};
140
190
  const resizePanelData = resizePanelRefs[layoutName] || {};
141
191
  return {
@@ -143,7 +193,9 @@ const getLayoutInfos = (layoutName) => {
143
193
  resizePanel: resizePanelData
144
194
  };
145
195
  }),
146
- operators.filter((result) => result.container !== null)
196
+ (0, import_operators.filter)(
197
+ (result) => result.container !== null && Object.keys(result.container).length > 0
198
+ )
147
199
  // 빈 객체 제외
148
200
  );
149
201
  };
@@ -152,7 +204,7 @@ const getContainerRef = ({
152
204
  layoutName
153
205
  }) => {
154
206
  return flexContainerStore.pipe(
155
- operators.map((refs) => {
207
+ (0, import_operators.map)((refs) => {
156
208
  if (layoutName) {
157
209
  return refs[layoutName]?.[containerName] || null;
158
210
  } else {
@@ -161,7 +213,7 @@ const getContainerRef = ({
161
213
  )?.[1][containerName];
162
214
  }
163
215
  }),
164
- operators.filter((ref) => ref !== null)
216
+ (0, import_operators.filter)((ref) => ref !== null)
165
217
  );
166
218
  };
167
219
  const getResizePanelRef = ({
@@ -169,7 +221,7 @@ const getResizePanelRef = ({
169
221
  layoutName
170
222
  }) => {
171
223
  return flexResizePanelStore.pipe(
172
- operators.map((refs) => {
224
+ (0, import_operators.map)((refs) => {
173
225
  if (layoutName) {
174
226
  return refs[layoutName]?.[containerName] || null;
175
227
  } else {
@@ -178,26 +230,28 @@ const getResizePanelRef = ({
178
230
  )?.[1][containerName];
179
231
  }
180
232
  }),
181
- operators.filter((ref) => ref !== null)
233
+ (0, import_operators.filter)((ref) => ref !== null)
182
234
  );
183
235
  };
184
-
185
- exports.flexContainerStore = flexContainerStore;
186
- exports.flexResizePanelStore = flexResizePanelStore;
187
- exports.getContainerRef = getContainerRef;
188
- exports.getCurrentSplitScreenComponents = getCurrentSplitScreenComponents;
189
- exports.getLayoutInfos = getLayoutInfos;
190
- exports.getResizePanelRef = getResizePanelRef;
191
- exports.getScrollPosition = getScrollPosition;
192
- exports.getSplitScreen = getSplitScreen;
193
- exports.layoutSplitScreenStore = layoutSplitScreenStore;
194
- exports.removeScrollPosition = removeScrollPosition;
195
- exports.removeSplitScreenChild = removeSplitScreenChild;
196
- exports.resetRootSplitScreen = resetRootSplitScreen;
197
- exports.scrollPositions = scrollPositions;
198
- exports.setContainerRef = setContainerRef;
199
- exports.setResizePanelRef = setResizePanelRef;
200
- exports.setScrollPosition = setScrollPosition;
201
- exports.setSplitScreen = setSplitScreen;
202
- //# sourceMappingURL=FlexLayoutContainerStore.cjs.map
236
+ // Annotate the CommonJS export names for ESM import in node:
237
+ 0 && (module.exports = {
238
+ flexContainerStore,
239
+ flexResizePanelStore,
240
+ getContainerRef,
241
+ getCurrentSplitScreenComponents,
242
+ getLayoutInfos,
243
+ getResizePanelRef,
244
+ getScrollPosition,
245
+ getSplitScreen,
246
+ layoutSplitScreenStore,
247
+ removeRootSplitScreen,
248
+ removeScrollPosition,
249
+ removeSplitScreenChild,
250
+ resetRootSplitScreen,
251
+ scrollPositions,
252
+ setContainerRef,
253
+ setResizePanelRef,
254
+ setScrollPosition,
255
+ setSplitScreen
256
+ });
203
257
  //# sourceMappingURL=FlexLayoutContainerStore.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/flex-layout/store/FlexLayoutContainerStore.ts"],"names":["equal","BehaviorSubject","filter","map","distinctUntilChanged","combineLatest"],"mappings":";;;;;;;;;;AAUA,SAAS,iBAAA,CAAqB,SAA6B,QAAA,EAAa;AACvE,EAAA,MAAM,YAAA,GAAe,QAAQ,QAAA,EAAS;AAEtC,EAAA,IAAI,CAACA,sBAAA,CAAM,YAAA,EAAc,QAAQ,CAAA,EAAG;AACnC,IAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,EACtB;AACD;AAEA,SAAS,cAAA,CAAe,OAAkC,QAAA,EAAoB;AAC7E,EAAA,MAAM,SAAA,GAAY,MAAM,QAAA,EAAS;AACjC,EAAA,IAAI,CAACA,sBAAA,CAAM,SAAA,EAAW,QAAQ,CAAA,EAAG;AAChC,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,EACpB;AACD;AAEA,SAAS,uBAAuB,QAAA,EAAkC;AACjE,EAAA,MAAM,SAAA,GAAY,uBAAuB,QAAA,EAAS;AAElD,EAAA,IAAI,CAACA,sBAAA,CAAM,SAAA,EAAW,QAAQ,CAAA,EAAG;AAChC,IAAA,sBAAA,CAAuB,KAAK,QAAQ,CAAA;AAAA,EACrC;AACD;AAYO,MAAM,kBAAkD;AAE/D,MAAM,sBAAA,GAAyB,IAAIC,oBAAA,CAEjC,eAAe,CAAA;AAOV,MAAM,iBAAA,GAAoB,CAChC,UAAA,EACA,QAAA,KACI;AACJ,EAAA,MAAM,OAAA,GAAU,uBAAuB,QAAA,EAAS;AAChD,EAAA,MAAM,OAAA,GAAU,QAAQ,UAAU,CAAA;AAGlC,EAAA,IAAI,OAAA,IAAW,QAAQ,CAAA,KAAM,QAAA,CAAS,KAAK,OAAA,CAAQ,CAAA,KAAM,SAAS,CAAA,EAAG;AACpE,IAAA;AAAA,EACD;AAGA,EAAA,MAAM,YAAA,GAAe;AAAA,IACpB,GAAG,OAAA;AAAA,IACH,CAAC,UAAU,GAAG;AAAA,GACf;AAEA,EAAA,iBAAA,CAAkB,wBAAwB,YAAY,CAAA;AACvD;AAKO,MAAM,iBAAA,GAAoB,CAAC,UAAA,KAAuB;AACxD,EAAA,OAAO,sBAAA,CAAuB,IAAA;AAAA;AAAA,IAE7BC,iBAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,MAAM,MAAS,CAAA;AAAA,IACzCC,aAAA,CAAI,CAAC,SAAA,KAAc,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,IACxCC,8BAAA;AAAA,MACC,CAAC,MAAM,IAAA,KAAS,IAAA,EAAM,MAAM,IAAA,EAAM,CAAA,IAAK,IAAA,EAAM,CAAA,KAAM,IAAA,EAAM;AAAA;AAC1D,GACD;AACD;AAEO,MAAM,oBAAA,GAAuB,CAAC,UAAA,KAAuB;AAC3D,EAAA,MAAM,OAAA,GAAU,uBAAuB,QAAA,EAAS;AAChD,EAAA,OAAO,QAAQ,UAAU,CAAA;AAGzB,EAAA,MAAM,YAAA,GAAe,EAAE,GAAG,OAAA,EAAQ;AAClC,EAAA,iBAAA,CAAkB,wBAAwB,YAAY,CAAA;AACvD;AAcO,MAAM,sBAAA,GACZ,IAAIH,oBAAA,CAAwC,EAAE;AAExC,MAAM,cAAA,GAAiB,CAC7B,QAAA,EACA,UAAA,EACA,aAAA,KACI;AACJ,EAAA,MAAM,OAAA,GAAU,uBAAuB,QAAA,EAAS;AAChD,EAAA,MAAM,gBAAgB,EAAE,GAAI,QAAQ,QAAQ,CAAA,IAAK,EAAC,EAAG;AACrD,EAAA,aAAA,CAAc,UAAU,CAAA,GAAI,aAAA;AAE5B,EAAA,MAAM,aAAA,GAAgB;AAAA,IACrB,GAAG,OAAA;AAAA,IACH,CAAC,QAAQ,GAAG;AAAA,GACb;AACA,EAAA,sBAAA,CAAuB,aAAa,CAAA;AACrC;AAEO,MAAM,oBAAA,GAAuB,CAAC,QAAA,KAAqB;AACzD,EAAA,MAAM,OAAA,GAAU,uBAAuB,QAAA,EAAS;AAEhD,EAAA,MAAM,aAAA,GAAgB;AAAA,IACrB,GAAG,OAAA;AAAA,IACH,CAAC,QAAQ,GAAG;AAAC,GACd;AACA,EAAA,sBAAA,CAAuB,aAAa,CAAA;AACrC;AAEO,MAAM,sBAAA,GAAyB,CACrC,QAAA,EACA,UAAA,KACI;AACJ,EAAA,MAAM,OAAA,GAAU,uBAAuB,QAAA,EAAS;AAChD,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAExB,EAAA,MAAM,aAAA,GAAgB,EAAE,GAAG,OAAA,CAAQ,QAAQ,CAAA,EAAE;AAC7C,EAAA,OAAO,cAAc,UAAU,CAAA;AAE/B,EAAA,MAAM,aAAA,GAAgB;AAAA,IACrB,GAAG,OAAA;AAAA,IACH,CAAC,QAAQ,GAAG;AAAA,GACb;AACA,EAAA,sBAAA,CAAuB,aAAa,CAAA;AACrC;AAEO,MAAM,+BAAA,GAAkC,CAC9C,QAAA,EACA,UAAA,KACI;AACJ,EAAA,MAAM,OAAA,GAAU,uBAAuB,QAAA,EAAS;AAChD,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACxB,EAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,UAAU,CAAA;AACpC;AAEO,MAAM,cAAA,GAAiB,CAAC,QAAA,EAAkB,UAAA,KAAuB;AACvE,EAAA,OAAO,sBAAA,CAAuB,IAAA;AAAA,IAC7BE,cAAI,CAAC,WAAA,KAAgB,YAAY,QAAQ,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IACtDC,8BAAA,CAAqB,CAAC,IAAA,EAAM,IAAA,KAAS;AAEpC,MAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAa;AAEpC,QAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,eAAA,EAAiB,CAAA,EAAG,GAAG,GAAG,IAAA,EAAK,GAC3D,GAAA,IAAO,EAAC;AACT,QAAA,OAAO,IAAA;AAAA,MACR,CAAA;AACA,MAAA,OAAOJ,uBAAM,cAAA,CAAe,IAAI,CAAA,EAAG,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,IACxD,CAAC;AAAA,GACF;AACD;AAUO,MAAM,kBAAA,GAAqB,IAAIC,oBAAA,CAA0B,EAAE;AAE3D,MAAM,oBAAA,GAAuB,IAAIA,oBAAA,CAA0B,EAAE;AAK7D,MAAM,eAAA,GAAkB,CAC9B,UAAA,EACA,aAAA,EACA,GAAA,KACI;AACJ,EAAA,MAAM,WAAA,GAAc,mBAAmB,QAAA,EAAS;AAChD,EAAA,MAAM,oBAAoB,EAAE,GAAI,YAAY,UAAU,CAAA,IAAK,EAAC,EAAG;AAE/D,EAAA,IAAI,QAAQ,IAAA,EAAM;AACjB,IAAA,OAAO,kBAAkB,aAAa,CAAA;AAAA,EACvC,CAAA,MAAO;AACN,IAAA,iBAAA,CAAkB,aAAa,CAAA,GAAI,GAAA;AAAA,EACpC;AAEA,EAAA,MAAM,OAAA,GAAoB;AAAA,IACzB,GAAG,WAAA;AAAA,IACH,CAAC,UAAU,GAAG;AAAA,GACf;AAEA,EAAA,cAAA,CAAe,oBAAoB,OAAO,CAAA;AAC3C;AAEO,MAAM,iBAAA,GAAoB,CAChC,UAAA,EACA,aAAA,EACA,GAAA,KACI;AACJ,EAAA,MAAM,WAAA,GAAc,qBAAqB,QAAA,EAAS;AAClD,EAAA,MAAM,oBAAoB,EAAE,GAAI,YAAY,UAAU,CAAA,IAAK,EAAC,EAAG;AAE/D,EAAA,IAAI,QAAQ,IAAA,EAAM;AACjB,IAAA,OAAO,kBAAkB,aAAa,CAAA;AAAA,EACvC,CAAA,MAAO;AACN,IAAA,iBAAA,CAAkB,aAAa,CAAA,GAAI,GAAA;AAAA,EACpC;AAEA,EAAA,MAAM,OAAA,GAAoB;AAAA,IACzB,GAAG,WAAA;AAAA,IACH,CAAC,UAAU,GAAG;AAAA,GACf;AAEA,EAAA,cAAA,CAAe,sBAAsB,OAAO,CAAA;AAC7C;AAEO,MAAM,cAAA,GAAiB,CAAC,UAAA,KAAuB;AACrD,EAAA,OAAOI,kBAAA,CAAc,CAAC,kBAAA,EAAoB,oBAAoB,CAAC,CAAA,CAAE,IAAA;AAAA,IAChEF,aAAA,CAAI,CAAC,CAAC,aAAA,EAAe,eAAe,CAAA,KAAM;AAEzC,MAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,UAAU,CAAA,IAAK,EAAC;AACpD,MAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,UAAU,CAAA,IAAK,EAAC;AAGxD,MAAA,OAAO;AAAA,QACN,SAAA,EAAW,aAAA;AAAA,QACX,WAAA,EAAa;AAAA,OACd;AAAA,IACD,CAAC,CAAA;AAAA,IACDD,gBAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,cAAc,IAAI;AAAA;AAAA,GAC7C;AACD;AAIO,MAAM,kBAAkB,CAAC;AAAA,EAC/B,aAAA;AAAA,EACA;AACD,CAAA,KAGM;AACL,EAAA,OAAO,kBAAA,CAAmB,IAAA;AAAA,IACzBC,aAAA,CAAI,CAAC,IAAA,KAAmB;AACvB,MAAA,IAAI,UAAA,EAAY;AAEf,QAAA,OAAO,IAAA,CAAK,UAAU,CAAA,GAAI,aAAa,CAAA,IAAK,IAAA;AAAA,MAC7C,CAAA,MAAO;AAEN,QAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA;AAAA,UAC3B,CAAC,CAAC,GAAA,EAAK,KAAK,MAAM,IAAA,CAAK,GAAG,EAAE,aAAa;AAAA,SAC1C,GAAI,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,MACrB;AAAA,IAUD,CAAC,CAAA;AAAA,IACDD,gBAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,KAAQ,IAAI;AAAA,GAC7B;AACD;AAEO,MAAM,oBAAoB,CAAC;AAAA,EACjC,aAAA;AAAA,EACA;AACD,CAAA,KAGM;AACL,EAAA,OAAO,oBAAA,CAAqB,IAAA;AAAA,IAC3BC,aAAA,CAAI,CAAC,IAAA,KAAmB;AACvB,MAAA,IAAI,UAAA,EAAY;AAEf,QAAA,OAAO,IAAA,CAAK,UAAU,CAAA,GAAI,aAAa,CAAA,IAAK,IAAA;AAAA,MAC7C,CAAA,MAAO;AAEN,QAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA;AAAA,UAC3B,CAAC,CAAC,GAAA,EAAK,KAAK,MAAM,IAAA,CAAK,GAAG,EAAE,aAAa;AAAA,SAC1C,GAAI,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,MACrB;AAAA,IAUD,CAAC,CAAA;AAAA,IACDD,gBAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,KAAQ,IAAI;AAAA,GAC7B;AACD","file":"FlexLayoutContainerStore.cjs","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: 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: 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"]}
1
+ {"version":3,"sources":["../../../src/flex-layout/store/FlexLayoutContainerStore.ts"],"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 updateSplitScreenStore(newValue: LayoutSplitScreenState) {\r\n\t// const prevValue = layoutSplitScreenStore.getValue();\r\n\t// deep-equal 로 비교\r\n\t// if (!equal(prevValue, newValue)) {\r\n\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\nexport const removeScrollPosition = (layoutName: string) => {\r\n\tconst current = scrollPositionsSubject.getValue();\r\n\tconst { [layoutName]: _, ...rest } = current;\r\n\tupdateScrollStore(scrollPositionsSubject, rest);\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 removeRootSplitScreen = (rootName: string) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\tif (!current[rootName]) return;\r\n\tconst { [rootName]: _, ...rest } = current;\r\n\tupdateSplitScreenStore(rest);\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: RefObject<T | null> | null,\r\n) => {\r\n\tconst currentRefs = flexContainerStore.getValue();\r\n\tconst layoutRefs = currentRefs[layoutName] || {};\r\n\r\n\tif (ref === null) {\r\n\t\tif (!(containerName in layoutRefs)) return; //\r\n\t\tconst { [containerName]: _, ...restLayout } = layoutRefs;\r\n\t\tconst next =\r\n\t\t\tObject.keys(restLayout).length === 0\r\n\t\t\t\t? (() => {\r\n\t\t\t\t\t\tconst { [layoutName]: __, ...rest } = currentRefs;\r\n\t\t\t\t\t\treturn rest;\r\n\t\t\t\t\t})()\r\n\t\t\t\t: { ...currentRefs, [layoutName]: restLayout };\r\n\t\tflexContainerStore.next(next);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (layoutRefs[containerName] === ref) return; // 동일 ref면 skip\r\n\r\n\tflexContainerStore.next({\r\n\t\t...currentRefs,\r\n\t\t[layoutName]: { ...layoutRefs, [containerName]: ref },\r\n\t});\r\n};\r\n\r\nexport const setResizePanelRef = <T extends HTMLElement>(\r\n\tlayoutName: string,\r\n\tcontainerName: string,\r\n\tref: RefObject<T | null> | null,\r\n) => {\r\n\tconst currentRefs = flexResizePanelStore.getValue();\r\n\tconst layoutRefs = currentRefs[layoutName] || {};\r\n\r\n\tif (ref === null) {\r\n\t\tif (!(containerName in layoutRefs)) return; //\r\n\t\tconst { [containerName]: _, ...restLayout } = layoutRefs;\r\n\t\tconst next =\r\n\t\t\tObject.keys(restLayout).length === 0\r\n\t\t\t\t? (() => {\r\n\t\t\t\t\t\tconst { [layoutName]: __, ...rest } = currentRefs;\r\n\t\t\t\t\t\treturn rest;\r\n\t\t\t\t\t})()\r\n\t\t\t\t: { ...currentRefs, [layoutName]: restLayout };\r\n\t\tflexResizePanelStore.next(next);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (layoutRefs[containerName] === ref) return; // 동일 ref면 skip\r\n\r\n\tflexResizePanelStore.next({\r\n\t\t...currentRefs,\r\n\t\t[layoutName]: { ...layoutRefs, [containerName]: ref },\r\n\t});\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(\r\n\t\t\t(result) =>\r\n\t\t\t\tresult.container !== null &&\r\n\t\t\t\tObject.keys(result.container).length > 0,\r\n\t\t), // 빈 객체 제외\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"],"mappings":"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","names":["equal"]}
@@ -27,6 +27,7 @@ export type LayoutSplitScreenState = Record<string, Record<string, SplitScreenCo
27
27
  export declare const layoutSplitScreenStore: BehaviorSubject<LayoutSplitScreenState>;
28
28
  export declare const setSplitScreen: (rootName: string, layoutName: string, newComponents: SplitScreenComponents) => void;
29
29
  export declare const resetRootSplitScreen: (rootName: string) => void;
30
+ export declare const removeRootSplitScreen: (rootName: string) => void;
30
31
  export declare const removeSplitScreenChild: (rootName: string, layoutName: string) => void;
31
32
  export declare const getCurrentSplitScreenComponents: (rootName: string, layoutName: string) => SplitScreenComponents | undefined;
32
33
  export declare const getSplitScreen: (rootName: string, layoutName: string) => import("rxjs").Observable<SplitScreenComponents>;
@@ -1,24 +1,15 @@
1
- import equal from 'fast-deep-equal';
2
- import { BehaviorSubject, combineLatest } from 'rxjs';
3
- import { filter, map, distinctUntilChanged } from 'rxjs/operators';
4
-
1
+ "use client";
2
+ import equal from "fast-deep-equal";
3
+ import { BehaviorSubject, combineLatest } from "rxjs";
4
+ import { distinctUntilChanged, filter, map } from "rxjs/operators";
5
5
  function updateScrollStore(subject, newValue) {
6
6
  const currentValue = subject.getValue();
7
7
  if (!equal(currentValue, newValue)) {
8
8
  subject.next(newValue);
9
9
  }
10
10
  }
11
- function updateRefStore(store, newState) {
12
- const prevState = store.getValue();
13
- if (!equal(prevState, newState)) {
14
- store.next(newState);
15
- }
16
- }
17
11
  function updateSplitScreenStore(newValue) {
18
- const prevValue = layoutSplitScreenStore.getValue();
19
- if (!equal(prevValue, newValue)) {
20
- layoutSplitScreenStore.next(newValue);
21
- }
12
+ layoutSplitScreenStore.next(newValue);
22
13
  }
23
14
  const scrollPositions = {};
24
15
  const scrollPositionsSubject = new BehaviorSubject(scrollPositions);
@@ -46,9 +37,8 @@ const getScrollPosition = (layoutName) => {
46
37
  };
47
38
  const removeScrollPosition = (layoutName) => {
48
39
  const current = scrollPositionsSubject.getValue();
49
- delete current[layoutName];
50
- const newPositions = { ...current };
51
- updateScrollStore(scrollPositionsSubject, newPositions);
40
+ const { [layoutName]: _, ...rest } = current;
41
+ updateScrollStore(scrollPositionsSubject, rest);
52
42
  };
53
43
  const layoutSplitScreenStore = new BehaviorSubject({});
54
44
  const setSplitScreen = (rootName, layoutName, newComponents) => {
@@ -69,6 +59,12 @@ const resetRootSplitScreen = (rootName) => {
69
59
  };
70
60
  updateSplitScreenStore(newStoreValue);
71
61
  };
62
+ const removeRootSplitScreen = (rootName) => {
63
+ const current = layoutSplitScreenStore.getValue();
64
+ if (!current[rootName]) return;
65
+ const { [rootName]: _, ...rest } = current;
66
+ updateSplitScreenStore(rest);
67
+ };
72
68
  const removeSplitScreenChild = (rootName, layoutName) => {
73
69
  const current = layoutSplitScreenStore.getValue();
74
70
  if (!current[rootName]) return;
@@ -87,7 +83,7 @@ const getCurrentSplitScreenComponents = (rootName, layoutName) => {
87
83
  };
88
84
  const getSplitScreen = (rootName, layoutName) => {
89
85
  return layoutSplitScreenStore.pipe(
90
- map((splitScreen) => splitScreen[rootName][layoutName]),
86
+ map((splitScreen) => splitScreen[rootName]?.[layoutName]),
91
87
  distinctUntilChanged((prev, curr) => {
92
88
  const filterChildren = (obj) => {
93
89
  const { children, component, targetComponent, x, y, ...rest } = obj || {};
@@ -101,31 +97,41 @@ const flexContainerStore = new BehaviorSubject({});
101
97
  const flexResizePanelStore = new BehaviorSubject({});
102
98
  const setContainerRef = (layoutName, containerName, ref) => {
103
99
  const currentRefs = flexContainerStore.getValue();
104
- const updatedLayoutRefs = { ...currentRefs[layoutName] || {} };
100
+ const layoutRefs = currentRefs[layoutName] || {};
105
101
  if (ref === null) {
106
- delete updatedLayoutRefs[containerName];
107
- } else {
108
- updatedLayoutRefs[containerName] = ref;
102
+ if (!(containerName in layoutRefs)) return;
103
+ const { [containerName]: _, ...restLayout } = layoutRefs;
104
+ const next = Object.keys(restLayout).length === 0 ? (() => {
105
+ const { [layoutName]: __, ...rest } = currentRefs;
106
+ return rest;
107
+ })() : { ...currentRefs, [layoutName]: restLayout };
108
+ flexContainerStore.next(next);
109
+ return;
109
110
  }
110
- const newRefs = {
111
+ if (layoutRefs[containerName] === ref) return;
112
+ flexContainerStore.next({
111
113
  ...currentRefs,
112
- [layoutName]: updatedLayoutRefs
113
- };
114
- updateRefStore(flexContainerStore, newRefs);
114
+ [layoutName]: { ...layoutRefs, [containerName]: ref }
115
+ });
115
116
  };
116
117
  const setResizePanelRef = (layoutName, containerName, ref) => {
117
118
  const currentRefs = flexResizePanelStore.getValue();
118
- const updatedLayoutRefs = { ...currentRefs[layoutName] || {} };
119
+ const layoutRefs = currentRefs[layoutName] || {};
119
120
  if (ref === null) {
120
- delete updatedLayoutRefs[containerName];
121
- } else {
122
- updatedLayoutRefs[containerName] = ref;
121
+ if (!(containerName in layoutRefs)) return;
122
+ const { [containerName]: _, ...restLayout } = layoutRefs;
123
+ const next = Object.keys(restLayout).length === 0 ? (() => {
124
+ const { [layoutName]: __, ...rest } = currentRefs;
125
+ return rest;
126
+ })() : { ...currentRefs, [layoutName]: restLayout };
127
+ flexResizePanelStore.next(next);
128
+ return;
123
129
  }
124
- const newRefs = {
130
+ if (layoutRefs[containerName] === ref) return;
131
+ flexResizePanelStore.next({
125
132
  ...currentRefs,
126
- [layoutName]: updatedLayoutRefs
127
- };
128
- updateRefStore(flexResizePanelStore, newRefs);
133
+ [layoutName]: { ...layoutRefs, [containerName]: ref }
134
+ });
129
135
  };
130
136
  const getLayoutInfos = (layoutName) => {
131
137
  return combineLatest([flexContainerStore, flexResizePanelStore]).pipe(
@@ -137,7 +143,9 @@ const getLayoutInfos = (layoutName) => {
137
143
  resizePanel: resizePanelData
138
144
  };
139
145
  }),
140
- filter((result) => result.container !== null)
146
+ filter(
147
+ (result) => result.container !== null && Object.keys(result.container).length > 0
148
+ )
141
149
  // 빈 객체 제외
142
150
  );
143
151
  };
@@ -175,7 +183,24 @@ const getResizePanelRef = ({
175
183
  filter((ref) => ref !== null)
176
184
  );
177
185
  };
178
-
179
- export { flexContainerStore, flexResizePanelStore, getContainerRef, getCurrentSplitScreenComponents, getLayoutInfos, getResizePanelRef, getScrollPosition, getSplitScreen, layoutSplitScreenStore, removeScrollPosition, removeSplitScreenChild, resetRootSplitScreen, scrollPositions, setContainerRef, setResizePanelRef, setScrollPosition, setSplitScreen };
180
- //# sourceMappingURL=FlexLayoutContainerStore.js.map
186
+ export {
187
+ flexContainerStore,
188
+ flexResizePanelStore,
189
+ getContainerRef,
190
+ getCurrentSplitScreenComponents,
191
+ getLayoutInfos,
192
+ getResizePanelRef,
193
+ getScrollPosition,
194
+ getSplitScreen,
195
+ layoutSplitScreenStore,
196
+ removeRootSplitScreen,
197
+ removeScrollPosition,
198
+ removeSplitScreenChild,
199
+ resetRootSplitScreen,
200
+ scrollPositions,
201
+ setContainerRef,
202
+ setResizePanelRef,
203
+ setScrollPosition,
204
+ setSplitScreen
205
+ };
181
206
  //# sourceMappingURL=FlexLayoutContainerStore.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/flex-layout/store/FlexLayoutContainerStore.ts"],"names":[],"mappings":"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","file":"FlexLayoutContainerStore.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: 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: 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"]}
1
+ {"version":3,"sources":["../../../src/flex-layout/store/FlexLayoutContainerStore.ts"],"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 updateSplitScreenStore(newValue: LayoutSplitScreenState) {\r\n\t// const prevValue = layoutSplitScreenStore.getValue();\r\n\t// deep-equal 로 비교\r\n\t// if (!equal(prevValue, newValue)) {\r\n\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\nexport const removeScrollPosition = (layoutName: string) => {\r\n\tconst current = scrollPositionsSubject.getValue();\r\n\tconst { [layoutName]: _, ...rest } = current;\r\n\tupdateScrollStore(scrollPositionsSubject, rest);\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 removeRootSplitScreen = (rootName: string) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\tif (!current[rootName]) return;\r\n\tconst { [rootName]: _, ...rest } = current;\r\n\tupdateSplitScreenStore(rest);\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: RefObject<T | null> | null,\r\n) => {\r\n\tconst currentRefs = flexContainerStore.getValue();\r\n\tconst layoutRefs = currentRefs[layoutName] || {};\r\n\r\n\tif (ref === null) {\r\n\t\tif (!(containerName in layoutRefs)) return; //\r\n\t\tconst { [containerName]: _, ...restLayout } = layoutRefs;\r\n\t\tconst next =\r\n\t\t\tObject.keys(restLayout).length === 0\r\n\t\t\t\t? (() => {\r\n\t\t\t\t\t\tconst { [layoutName]: __, ...rest } = currentRefs;\r\n\t\t\t\t\t\treturn rest;\r\n\t\t\t\t\t})()\r\n\t\t\t\t: { ...currentRefs, [layoutName]: restLayout };\r\n\t\tflexContainerStore.next(next);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (layoutRefs[containerName] === ref) return; // 동일 ref면 skip\r\n\r\n\tflexContainerStore.next({\r\n\t\t...currentRefs,\r\n\t\t[layoutName]: { ...layoutRefs, [containerName]: ref },\r\n\t});\r\n};\r\n\r\nexport const setResizePanelRef = <T extends HTMLElement>(\r\n\tlayoutName: string,\r\n\tcontainerName: string,\r\n\tref: RefObject<T | null> | null,\r\n) => {\r\n\tconst currentRefs = flexResizePanelStore.getValue();\r\n\tconst layoutRefs = currentRefs[layoutName] || {};\r\n\r\n\tif (ref === null) {\r\n\t\tif (!(containerName in layoutRefs)) return; //\r\n\t\tconst { [containerName]: _, ...restLayout } = layoutRefs;\r\n\t\tconst next =\r\n\t\t\tObject.keys(restLayout).length === 0\r\n\t\t\t\t? (() => {\r\n\t\t\t\t\t\tconst { [layoutName]: __, ...rest } = currentRefs;\r\n\t\t\t\t\t\treturn rest;\r\n\t\t\t\t\t})()\r\n\t\t\t\t: { ...currentRefs, [layoutName]: restLayout };\r\n\t\tflexResizePanelStore.next(next);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (layoutRefs[containerName] === ref) return; // 동일 ref면 skip\r\n\r\n\tflexResizePanelStore.next({\r\n\t\t...currentRefs,\r\n\t\t[layoutName]: { ...layoutRefs, [containerName]: ref },\r\n\t});\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(\r\n\t\t\t(result) =>\r\n\t\t\t\tresult.container !== null &&\r\n\t\t\t\tObject.keys(result.container).length > 0,\r\n\t\t), // 빈 객체 제외\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"],"mappings":"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","names":[]}