@byeolnaerim/flex-layout 0.0.7 → 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.
- package/dist/flex-layout/components/FlexLayout.cjs +62 -28
- package/dist/flex-layout/components/FlexLayout.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayout.js +26 -11
- package/dist/flex-layout/components/FlexLayout.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutContainer.cjs +121 -55
- package/dist/flex-layout/components/FlexLayoutContainer.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutContainer.js +68 -25
- package/dist/flex-layout/components/FlexLayoutContainer.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutIFramePane.cjs +68 -0
- package/dist/flex-layout/components/FlexLayoutIFramePane.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutIFramePane.d.ts +4 -0
- package/dist/flex-layout/components/FlexLayoutIFramePane.js +44 -0
- package/dist/flex-layout/components/FlexLayoutIFramePane.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.cjs +111 -46
- package/dist/flex-layout/components/FlexLayoutResizePanel.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutResizePanel.d.ts +1 -1
- package/dist/flex-layout/components/FlexLayoutResizePanel.js +68 -27
- package/dist/flex-layout/components/FlexLayoutResizePanel.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs +184 -143
- package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreen.js +71 -32
- package/dist/flex-layout/components/FlexLayoutSplitScreen.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs +253 -60
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.d.ts +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js +215 -39
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs +40 -17
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js +7 -7
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs +44 -21
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js +7 -8
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs +40 -17
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js +5 -6
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs +53 -29
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js +14 -10
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutStickyBox.cjs +46 -27
- package/dist/flex-layout/components/FlexLayoutStickyBox.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutStickyBox.d.ts +1 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.js +13 -8
- package/dist/flex-layout/components/FlexLayoutStickyBox.js.map +1 -1
- package/dist/flex-layout/components/index.cjs +54 -49
- package/dist/flex-layout/components/index.cjs.map +1 -1
- package/dist/flex-layout/components/index.js +16 -8
- package/dist/flex-layout/components/index.js.map +1 -1
- package/dist/flex-layout/hooks/index.cjs +23 -19
- package/dist/flex-layout/hooks/index.cjs.map +1 -1
- package/dist/flex-layout/hooks/index.js +2 -3
- package/dist/flex-layout/hooks/index.js.map +1 -1
- package/dist/flex-layout/hooks/useDrag.cjs +136 -79
- package/dist/flex-layout/hooks/useDrag.cjs.map +1 -1
- package/dist/flex-layout/hooks/useDrag.d.ts +5 -0
- package/dist/flex-layout/hooks/useDrag.js +86 -47
- package/dist/flex-layout/hooks/useDrag.js.map +1 -1
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs +40 -19
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs.map +1 -1
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js +9 -7
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js.map +1 -1
- package/dist/flex-layout/hooks/useListPaging.cjs +68 -35
- package/dist/flex-layout/hooks/useListPaging.cjs.map +1 -1
- package/dist/flex-layout/hooks/useListPaging.js +34 -18
- package/dist/flex-layout/hooks/useListPaging.js.map +1 -1
- package/dist/flex-layout/hooks/useSizes.cjs +45 -23
- package/dist/flex-layout/hooks/useSizes.cjs.map +1 -1
- package/dist/flex-layout/hooks/useSizes.js +6 -6
- package/dist/flex-layout/hooks/useSizes.js.map +1 -1
- package/dist/flex-layout/index.cjs +29 -40
- package/dist/flex-layout/index.cjs.map +1 -1
- package/dist/flex-layout/index.js +5 -6
- package/dist/flex-layout/index.js.map +1 -1
- package/dist/flex-layout/providers/FlexLayoutContext.cjs +35 -12
- package/dist/flex-layout/providers/FlexLayoutContext.cjs.map +1 -1
- package/dist/flex-layout/providers/FlexLayoutContext.js +7 -6
- package/dist/flex-layout/providers/FlexLayoutContext.js.map +1 -1
- package/dist/flex-layout/providers/FlexLayoutHooks.cjs +82 -53
- package/dist/flex-layout/providers/FlexLayoutHooks.cjs.map +1 -1
- package/dist/flex-layout/providers/FlexLayoutHooks.js +33 -8
- package/dist/flex-layout/providers/FlexLayoutHooks.js.map +1 -1
- package/dist/flex-layout/providers/index.cjs +21 -12
- package/dist/flex-layout/providers/index.cjs.map +1 -1
- package/dist/flex-layout/providers/index.js +1 -2
- package/dist/flex-layout/providers/index.js.map +1 -1
- package/dist/flex-layout/store/FlexLayoutContainerStore.cjs +130 -76
- package/dist/flex-layout/store/FlexLayoutContainerStore.cjs.map +1 -1
- package/dist/flex-layout/store/FlexLayoutContainerStore.d.ts +1 -0
- package/dist/flex-layout/store/FlexLayoutContainerStore.js +63 -38
- package/dist/flex-layout/store/FlexLayoutContainerStore.js.map +1 -1
- package/dist/flex-layout/store/index.cjs +21 -12
- package/dist/flex-layout/store/index.cjs.map +1 -1
- package/dist/flex-layout/store/index.js +1 -2
- package/dist/flex-layout/store/index.js.map +1 -1
- package/dist/flex-layout/types/FlexDirectionTypes.cjs +16 -3
- package/dist/flex-layout/types/FlexDirectionTypes.cjs.map +1 -1
- package/dist/flex-layout/types/FlexDirectionTypes.js +0 -2
- package/dist/flex-layout/types/FlexDirectionTypes.js.map +1 -1
- package/dist/flex-layout/types/FlexLayoutTypes.cjs +16 -3
- package/dist/flex-layout/types/FlexLayoutTypes.cjs.map +1 -1
- package/dist/flex-layout/types/FlexLayoutTypes.d.ts +1 -3
- package/dist/flex-layout/types/FlexLayoutTypes.js +0 -2
- package/dist/flex-layout/types/FlexLayoutTypes.js.map +1 -1
- package/dist/flex-layout/utils/FlexLayoutUtils.cjs +57 -20
- package/dist/flex-layout/utils/FlexLayoutUtils.cjs.map +1 -1
- package/dist/flex-layout/utils/FlexLayoutUtils.d.ts +4 -4
- package/dist/flex-layout/utils/FlexLayoutUtils.js +23 -8
- package/dist/flex-layout/utils/FlexLayoutUtils.js.map +1 -1
- package/dist/flex-layout/utils/index.cjs +21 -12
- package/dist/flex-layout/utils/index.cjs.map +1 -1
- package/dist/flex-layout/utils/index.js +1 -2
- package/dist/flex-layout/utils/index.js.map +1 -1
- package/dist/index.cjs +21 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/types/css.d.cjs +1 -3
- package/dist/types/css.d.cjs.map +1 -1
- package/dist/types/css.d.js +0 -2
- package/dist/types/css.d.js.map +1 -1
- package/package.json +5 -1
|
@@ -1,25 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var useDrag_exports = {};
|
|
30
|
+
__export(useDrag_exports, {
|
|
31
|
+
allSplitScreenCount: () => allSplitScreenCount,
|
|
32
|
+
dragState: () => dragState,
|
|
33
|
+
dragStateSubject: () => dragStateSubject,
|
|
34
|
+
dropMovementEventSubject: () => dropMovementEventSubject,
|
|
35
|
+
folderEventSubject: () => folderEventSubject,
|
|
36
|
+
isResizingSubject: () => isResizingSubject,
|
|
37
|
+
setFolderEvent: () => setFolderEvent,
|
|
38
|
+
useDragCapture: () => useDragCapture,
|
|
39
|
+
useDragEvents: () => useDragEvents,
|
|
40
|
+
useFolderEvent: () => useFolderEvent
|
|
41
|
+
});
|
|
42
|
+
module.exports = __toCommonJS(useDrag_exports);
|
|
43
|
+
var import_fast_deep_equal = __toESM(require("fast-deep-equal"), 1);
|
|
44
|
+
var import_react = require("react");
|
|
45
|
+
var import_rxjs = require("rxjs");
|
|
46
|
+
var import_FlexLayoutUtils = require("../utils/FlexLayoutUtils");
|
|
47
|
+
const dragStateSubject = new import_rxjs.Subject();
|
|
48
|
+
const dragState = dragStateSubject;
|
|
49
|
+
const isResizingSubject = new import_rxjs.BehaviorSubject(false);
|
|
13
50
|
const filterChildren = (obj) => {
|
|
14
51
|
const { children, ...rest } = obj || {};
|
|
15
52
|
return rest;
|
|
16
53
|
};
|
|
17
54
|
const useDragCapture = (targetRef) => {
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
55
|
+
const [state, setState] = (0, import_react.useState)(null);
|
|
56
|
+
(0, import_react.useEffect)(() => {
|
|
57
|
+
const subscription = dragStateSubject.pipe(
|
|
58
|
+
(0, import_rxjs.auditTime)(0, import_rxjs.animationFrameScheduler),
|
|
59
|
+
(0, import_rxjs.map)((value) => {
|
|
23
60
|
if (!targetRef || !targetRef.current) return null;
|
|
24
61
|
const { x, y } = value;
|
|
25
62
|
const rect = targetRef.current.getBoundingClientRect();
|
|
@@ -55,46 +92,48 @@ const useDragCapture = (targetRef) => {
|
|
|
55
92
|
...value
|
|
56
93
|
};
|
|
57
94
|
}),
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
95
|
+
(0, import_rxjs.distinctUntilChanged)((prev, curr) => {
|
|
96
|
+
const { children: prevChildren, ..._prev } = prev || {};
|
|
97
|
+
const { children: currChildren, ..._curr } = curr || {};
|
|
98
|
+
return (0, import_fast_deep_equal.default)(filterChildren(_prev), filterChildren(_curr));
|
|
99
|
+
})
|
|
61
100
|
).subscribe({
|
|
62
|
-
next:
|
|
63
|
-
if (value && !equal__default.default(
|
|
64
|
-
filterChildren(stateRef.current),
|
|
65
|
-
filterChildren(value)
|
|
66
|
-
)) {
|
|
67
|
-
stateRef.current = value;
|
|
68
|
-
forceUpdate.current++;
|
|
69
|
-
}
|
|
70
|
-
},
|
|
101
|
+
next: setState,
|
|
71
102
|
error: (err) => console.error(err)
|
|
72
103
|
});
|
|
73
104
|
return () => subscription.unsubscribe();
|
|
74
105
|
}, [targetRef]);
|
|
75
|
-
|
|
76
|
-
react.useEffect(() => {
|
|
77
|
-
const interval = setInterval(() => {
|
|
78
|
-
rerender({});
|
|
79
|
-
}, 50);
|
|
80
|
-
return () => clearInterval(interval);
|
|
81
|
-
}, []);
|
|
82
|
-
return stateRef.current;
|
|
106
|
+
return state;
|
|
83
107
|
};
|
|
84
|
-
const dropMovementEventSubject = new
|
|
85
|
-
const allSplitScreenCount = new
|
|
108
|
+
const dropMovementEventSubject = new import_rxjs.Subject();
|
|
109
|
+
const allSplitScreenCount = new import_rxjs.BehaviorSubject(0);
|
|
86
110
|
const useDragEvents = ({
|
|
87
111
|
isBlockingActiveInput = false
|
|
88
112
|
}) => {
|
|
89
|
-
const dragResumeTimer =
|
|
113
|
+
const dragResumeTimer = (0, import_react.useRef)(null);
|
|
114
|
+
const dragStartDelayTimer = (0, import_react.useRef)(
|
|
115
|
+
null
|
|
116
|
+
);
|
|
90
117
|
const scrollThreshold = 10;
|
|
91
|
-
const isScrolling =
|
|
92
|
-
const isPending =
|
|
93
|
-
const isMouseDown =
|
|
94
|
-
const isDragging =
|
|
95
|
-
const touchStartX =
|
|
96
|
-
const touchStartY =
|
|
97
|
-
|
|
118
|
+
const isScrolling = (0, import_react.useRef)(false);
|
|
119
|
+
const isPending = (0, import_react.useRef)(false);
|
|
120
|
+
const isMouseDown = (0, import_react.useRef)(false);
|
|
121
|
+
const isDragging = (0, import_react.useRef)(false);
|
|
122
|
+
const touchStartX = (0, import_react.useRef)(0);
|
|
123
|
+
const touchStartY = (0, import_react.useRef)(0);
|
|
124
|
+
(0, import_react.useEffect)(() => {
|
|
125
|
+
return () => {
|
|
126
|
+
if (dragResumeTimer.current) {
|
|
127
|
+
clearTimeout(dragResumeTimer.current);
|
|
128
|
+
dragResumeTimer.current = null;
|
|
129
|
+
}
|
|
130
|
+
if (dragStartDelayTimer.current) {
|
|
131
|
+
clearTimeout(dragStartDelayTimer.current);
|
|
132
|
+
dragStartDelayTimer.current = null;
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}, []);
|
|
136
|
+
const handleStart = (0, import_react.useCallback)(
|
|
98
137
|
({
|
|
99
138
|
event: _event,
|
|
100
139
|
dragStartCallback
|
|
@@ -104,35 +143,42 @@ const useDragEvents = ({
|
|
|
104
143
|
clearTimeout(dragResumeTimer.current);
|
|
105
144
|
dragResumeTimer.current = null;
|
|
106
145
|
}
|
|
146
|
+
if (dragStartDelayTimer.current) {
|
|
147
|
+
clearTimeout(dragStartDelayTimer.current);
|
|
148
|
+
dragStartDelayTimer.current = null;
|
|
149
|
+
}
|
|
107
150
|
if (event.target.contentEditable === "true" || isBlockingActiveInput && document.activeElement === event.target) {
|
|
108
151
|
return;
|
|
109
152
|
}
|
|
110
|
-
if (event.cancelable) {
|
|
153
|
+
if (event.cancelable && !(event instanceof globalThis.TouchEvent)) {
|
|
111
154
|
event.preventDefault();
|
|
112
155
|
}
|
|
113
156
|
isPending.current = true;
|
|
114
157
|
isMouseDown.current = true;
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
158
|
+
isScrolling.current = false;
|
|
159
|
+
const xy = (0, import_FlexLayoutUtils.getClientXy)(event);
|
|
160
|
+
if (!xy) return;
|
|
161
|
+
touchStartX.current = xy.clientX;
|
|
162
|
+
touchStartY.current = xy.clientY;
|
|
163
|
+
if (event.type.toLowerCase().startsWith("touch") || event instanceof globalThis.TouchEvent) {
|
|
164
|
+
isPending.current = false;
|
|
165
|
+
isDragging.current = true;
|
|
166
|
+
dragStartCallback({ x: xy.clientX, y: xy.clientY });
|
|
167
|
+
return;
|
|
122
168
|
}
|
|
123
|
-
setTimeout(() => {
|
|
169
|
+
dragStartDelayTimer.current = setTimeout(() => {
|
|
124
170
|
if (!isPending.current || isScrolling.current) return;
|
|
125
171
|
isPending.current = false;
|
|
126
172
|
isDragging.current = true;
|
|
127
|
-
const
|
|
128
|
-
if (!
|
|
129
|
-
const { clientX, clientY } =
|
|
173
|
+
const xy2 = (0, import_FlexLayoutUtils.getClientXy)(event);
|
|
174
|
+
if (!xy2) return;
|
|
175
|
+
const { clientX, clientY } = xy2;
|
|
130
176
|
dragStartCallback({ x: clientX, y: clientY });
|
|
131
177
|
}, 300);
|
|
132
178
|
},
|
|
133
179
|
[isBlockingActiveInput]
|
|
134
180
|
);
|
|
135
|
-
const handleMove =
|
|
181
|
+
const handleMove = (0, import_react.useCallback)(
|
|
136
182
|
({
|
|
137
183
|
event: _event,
|
|
138
184
|
notDragCallback,
|
|
@@ -141,12 +187,16 @@ const useDragEvents = ({
|
|
|
141
187
|
}) => {
|
|
142
188
|
if (!isMouseDown.current) return;
|
|
143
189
|
const event = _event instanceof Event ? _event : _event.nativeEvent;
|
|
144
|
-
const xy =
|
|
190
|
+
const xy = (0, import_FlexLayoutUtils.getClientXy)(event);
|
|
145
191
|
if (!xy) return;
|
|
146
192
|
const { clientX, clientY } = xy;
|
|
147
193
|
const deltaX = Math.abs(clientX - touchStartX.current);
|
|
148
194
|
const deltaY = Math.abs(clientY - touchStartY.current);
|
|
149
|
-
if (isPending.current && (deltaX > scrollThreshold || deltaY > scrollThreshold)) {
|
|
195
|
+
if (isPending.current && (event.type.toLowerCase().startsWith("touch") || event instanceof globalThis.TouchEvent) && (deltaX > scrollThreshold || deltaY > scrollThreshold)) {
|
|
196
|
+
if (dragStartDelayTimer.current) {
|
|
197
|
+
clearTimeout(dragStartDelayTimer.current);
|
|
198
|
+
dragStartDelayTimer.current = null;
|
|
199
|
+
}
|
|
150
200
|
isScrolling.current = true;
|
|
151
201
|
isPending.current = false;
|
|
152
202
|
isDragging.current = false;
|
|
@@ -158,8 +208,8 @@ const useDragEvents = ({
|
|
|
158
208
|
}
|
|
159
209
|
dragResumeTimer.current = setTimeout(() => {
|
|
160
210
|
if (!isMouseDown.current) return;
|
|
161
|
-
|
|
162
|
-
|
|
211
|
+
touchStartX.current = clientX;
|
|
212
|
+
touchStartY.current = clientY;
|
|
163
213
|
isPending.current = true;
|
|
164
214
|
isScrolling.current = false;
|
|
165
215
|
handleStart({ event: _event, dragStartCallback });
|
|
@@ -171,7 +221,7 @@ const useDragEvents = ({
|
|
|
171
221
|
},
|
|
172
222
|
[isBlockingActiveInput]
|
|
173
223
|
);
|
|
174
|
-
const handleEnd =
|
|
224
|
+
const handleEnd = (0, import_react.useCallback)(
|
|
175
225
|
({
|
|
176
226
|
event: _event,
|
|
177
227
|
dragEndCallback
|
|
@@ -180,12 +230,16 @@ const useDragEvents = ({
|
|
|
180
230
|
isMouseDown.current = false;
|
|
181
231
|
if (isPending.current) {
|
|
182
232
|
isPending.current = false;
|
|
233
|
+
if (dragStartDelayTimer.current) {
|
|
234
|
+
clearTimeout(dragStartDelayTimer.current);
|
|
235
|
+
dragStartDelayTimer.current = null;
|
|
236
|
+
}
|
|
183
237
|
return;
|
|
184
238
|
}
|
|
185
239
|
const event = _event instanceof Event ? _event : _event.nativeEvent;
|
|
186
240
|
if (!isDragging.current) return;
|
|
187
241
|
isDragging.current = false;
|
|
188
|
-
const xy =
|
|
242
|
+
const xy = (0, import_FlexLayoutUtils.getClientXy)(event);
|
|
189
243
|
if (!xy) return;
|
|
190
244
|
const { clientX, clientY } = xy;
|
|
191
245
|
dragEndCallback({ x: clientX, y: clientY });
|
|
@@ -198,15 +252,15 @@ const useDragEvents = ({
|
|
|
198
252
|
handleEnd
|
|
199
253
|
};
|
|
200
254
|
};
|
|
201
|
-
const folderEventSubject = new
|
|
255
|
+
const folderEventSubject = new import_rxjs.Subject();
|
|
202
256
|
const setFolderEvent = (newValue) => {
|
|
203
257
|
folderEventSubject.next(newValue);
|
|
204
258
|
};
|
|
205
259
|
const useFolderEvent = () => {
|
|
206
|
-
const [folderEvent, setFolderEvent2] =
|
|
260
|
+
const [folderEvent, setFolderEvent2] = (0, import_react.useState)(
|
|
207
261
|
null
|
|
208
262
|
);
|
|
209
|
-
|
|
263
|
+
(0, import_react.useEffect)(() => {
|
|
210
264
|
const subscription = folderEventSubject.subscribe((e) => {
|
|
211
265
|
if (!e) return;
|
|
212
266
|
setFolderEvent2(e);
|
|
@@ -219,14 +273,17 @@ const useFolderEvent = () => {
|
|
|
219
273
|
}, []);
|
|
220
274
|
return { folderEvent };
|
|
221
275
|
};
|
|
222
|
-
|
|
223
|
-
exports
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
276
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
277
|
+
0 && (module.exports = {
|
|
278
|
+
allSplitScreenCount,
|
|
279
|
+
dragState,
|
|
280
|
+
dragStateSubject,
|
|
281
|
+
dropMovementEventSubject,
|
|
282
|
+
folderEventSubject,
|
|
283
|
+
isResizingSubject,
|
|
284
|
+
setFolderEvent,
|
|
285
|
+
useDragCapture,
|
|
286
|
+
useDragEvents,
|
|
287
|
+
useFolderEvent
|
|
288
|
+
});
|
|
232
289
|
//# sourceMappingURL=useDrag.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/flex-layout/hooks/useDrag.ts"],"names":["Subject","useRef","useEffect","map","distinctUntilChanged","equal","useState","BehaviorSubject","useCallback","getClientXy","setFolderEvent"],"mappings":"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","file":"useDrag.cjs","sourcesContent":["import equal from \"fast-deep-equal\";\r\nimport {\r\n\tMouseEvent,\r\n\tReactElement,\r\n\tRefObject,\r\n\tTouchEvent,\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: MouseEvent | 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: MouseEvent | 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: MouseEvent | 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"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/hooks/useDrag.ts"],"sourcesContent":["import equal from \"fast-deep-equal\";\r\nimport {\r\n\tMouseEvent,\r\n\tReactElement,\r\n\tRefObject,\r\n\tTouchEvent,\r\n\tuseCallback,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\nimport {\r\n\tanimationFrameScheduler,\r\n\tauditTime,\r\n\tBehaviorSubject,\r\n\tdistinctUntilChanged,\r\n\tmap,\r\n\tSubject,\r\n} 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 dragStateSubject = new Subject<DragStateType>();\r\n/**\r\n * @deprecated Use `dragStateSubject` instead. This alias will be removed in a future release.\r\n */\r\nexport const dragState = dragStateSubject;\r\n\r\nexport const isResizingSubject = new BehaviorSubject<boolean>(false);\r\n\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 [state, setState] = useState<DragStateResultType | null>(null);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst subscription = dragStateSubject\r\n\t\t\t.pipe(\r\n\t\t\t\tauditTime(0, animationFrameScheduler),\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\tconst { children: prevChildren, ..._prev } = prev || {};\r\n\t\t\t\t\tconst { children: currChildren, ..._curr } = curr || {};\r\n\r\n\t\t\t\t\treturn equal(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: setState,\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\treturn state;\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 dragStartDelayTimer = useRef<ReturnType<typeof setTimeout> | null>(\r\n\t\tnull,\r\n\t);\r\n\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\tuseEffect(() => {\r\n\t\treturn () => {\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\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\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: MouseEvent | 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\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\tdragStartDelayTimer.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 && !(event instanceof globalThis.TouchEvent)) {\r\n\t\t\t\tevent.preventDefault(); // cancelable=false 면 자동 skip\r\n\t\t\t}\r\n\r\n\t\t\tisPending.current = true;\r\n\t\t\tisMouseDown.current = true;\r\n\t\t\tisScrolling.current = false;\r\n\r\n\t\t\t// if (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\r\n\t\t\tconst xy = getClientXy(event);\r\n\t\t\tif (!xy) return;\r\n\t\t\ttouchStartX.current = xy.clientX;\r\n\t\t\ttouchStartY.current = xy.clientY;\r\n\r\n\t\t\tif (\r\n\t\t\t\tevent.type.toLowerCase().startsWith(\"touch\") ||\r\n\t\t\t\tevent instanceof globalThis.TouchEvent\r\n\t\t\t) {\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\tisDragging.current = true;\r\n\r\n\t\t\t\tdragStartCallback({ x: xy.clientX, y: xy.clientY });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t//event.preventDefault();\r\n\t\t\tdragStartDelayTimer.current = setTimeout(() => {\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: MouseEvent | 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(event.type.toLowerCase().startsWith(\"touch\") ||\r\n\t\t\t\t\tevent instanceof globalThis.TouchEvent) &&\r\n\t\t\t\t(deltaX > scrollThreshold || deltaY > scrollThreshold)\r\n\t\t\t) {\r\n\t\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t\t}\r\n\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\t// if (dragStartCallback)\r\n\t\t\t\t\t// \tdragStartCallback({ x: clientX, y: clientY });\r\n\t\t\t\t\t// isPending.current = true;\r\n\t\t\t\t\t// isScrolling.current = false;\r\n\t\t\t\t\t// handleStart({ event: _event, dragStartCallback });\r\n\r\n\t\t\t\t\ttouchStartX.current = clientX;\r\n\t\t\t\t\ttouchStartY.current = 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: MouseEvent | 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\r\n\t\t\tif (isPending.current) {\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t\t}\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"],"mappings":"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","names":["equal","xy","setFolderEvent"]}
|
|
@@ -23,7 +23,12 @@ export interface DragStateResultType extends DragStateType {
|
|
|
23
23
|
positionName: PositionName;
|
|
24
24
|
isOver: boolean;
|
|
25
25
|
}
|
|
26
|
+
export declare const dragStateSubject: Subject<DragStateType>;
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated Use `dragStateSubject` instead. This alias will be removed in a future release.
|
|
29
|
+
*/
|
|
26
30
|
export declare const dragState: Subject<DragStateType>;
|
|
31
|
+
export declare const isResizingSubject: BehaviorSubject<boolean>;
|
|
27
32
|
export declare const useDragCapture: (targetRef: RefObject<HTMLElement | null>) => DragStateResultType | null;
|
|
28
33
|
export interface DropTargetComponent {
|
|
29
34
|
containerName: string;
|
|
@@ -1,18 +1,31 @@
|
|
|
1
|
-
import equal from
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import equal from "fast-deep-equal";
|
|
2
|
+
import {
|
|
3
|
+
useCallback,
|
|
4
|
+
useEffect,
|
|
5
|
+
useRef,
|
|
6
|
+
useState
|
|
7
|
+
} from "react";
|
|
8
|
+
import {
|
|
9
|
+
animationFrameScheduler,
|
|
10
|
+
auditTime,
|
|
11
|
+
BehaviorSubject,
|
|
12
|
+
distinctUntilChanged,
|
|
13
|
+
map,
|
|
14
|
+
Subject
|
|
15
|
+
} from "rxjs";
|
|
16
|
+
import { getClientXy } from "../utils/FlexLayoutUtils";
|
|
17
|
+
const dragStateSubject = new Subject();
|
|
18
|
+
const dragState = dragStateSubject;
|
|
19
|
+
const isResizingSubject = new BehaviorSubject(false);
|
|
7
20
|
const filterChildren = (obj) => {
|
|
8
21
|
const { children, ...rest } = obj || {};
|
|
9
22
|
return rest;
|
|
10
23
|
};
|
|
11
24
|
const useDragCapture = (targetRef) => {
|
|
12
|
-
const
|
|
13
|
-
const forceUpdate = useRef(0);
|
|
25
|
+
const [state, setState] = useState(null);
|
|
14
26
|
useEffect(() => {
|
|
15
|
-
const subscription =
|
|
27
|
+
const subscription = dragStateSubject.pipe(
|
|
28
|
+
auditTime(0, animationFrameScheduler),
|
|
16
29
|
map((value) => {
|
|
17
30
|
if (!targetRef || !targetRef.current) return null;
|
|
18
31
|
const { x, y } = value;
|
|
@@ -49,31 +62,18 @@ const useDragCapture = (targetRef) => {
|
|
|
49
62
|
...value
|
|
50
63
|
};
|
|
51
64
|
}),
|
|
52
|
-
distinctUntilChanged(
|
|
53
|
-
|
|
54
|
-
|
|
65
|
+
distinctUntilChanged((prev, curr) => {
|
|
66
|
+
const { children: prevChildren, ..._prev } = prev || {};
|
|
67
|
+
const { children: currChildren, ..._curr } = curr || {};
|
|
68
|
+
return equal(filterChildren(_prev), filterChildren(_curr));
|
|
69
|
+
})
|
|
55
70
|
).subscribe({
|
|
56
|
-
next:
|
|
57
|
-
if (value && !equal(
|
|
58
|
-
filterChildren(stateRef.current),
|
|
59
|
-
filterChildren(value)
|
|
60
|
-
)) {
|
|
61
|
-
stateRef.current = value;
|
|
62
|
-
forceUpdate.current++;
|
|
63
|
-
}
|
|
64
|
-
},
|
|
71
|
+
next: setState,
|
|
65
72
|
error: (err) => console.error(err)
|
|
66
73
|
});
|
|
67
74
|
return () => subscription.unsubscribe();
|
|
68
75
|
}, [targetRef]);
|
|
69
|
-
|
|
70
|
-
useEffect(() => {
|
|
71
|
-
const interval = setInterval(() => {
|
|
72
|
-
rerender({});
|
|
73
|
-
}, 50);
|
|
74
|
-
return () => clearInterval(interval);
|
|
75
|
-
}, []);
|
|
76
|
-
return stateRef.current;
|
|
76
|
+
return state;
|
|
77
77
|
};
|
|
78
78
|
const dropMovementEventSubject = new Subject();
|
|
79
79
|
const allSplitScreenCount = new BehaviorSubject(0);
|
|
@@ -81,6 +81,9 @@ const useDragEvents = ({
|
|
|
81
81
|
isBlockingActiveInput = false
|
|
82
82
|
}) => {
|
|
83
83
|
const dragResumeTimer = useRef(null);
|
|
84
|
+
const dragStartDelayTimer = useRef(
|
|
85
|
+
null
|
|
86
|
+
);
|
|
84
87
|
const scrollThreshold = 10;
|
|
85
88
|
const isScrolling = useRef(false);
|
|
86
89
|
const isPending = useRef(false);
|
|
@@ -88,6 +91,18 @@ const useDragEvents = ({
|
|
|
88
91
|
const isDragging = useRef(false);
|
|
89
92
|
const touchStartX = useRef(0);
|
|
90
93
|
const touchStartY = useRef(0);
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
return () => {
|
|
96
|
+
if (dragResumeTimer.current) {
|
|
97
|
+
clearTimeout(dragResumeTimer.current);
|
|
98
|
+
dragResumeTimer.current = null;
|
|
99
|
+
}
|
|
100
|
+
if (dragStartDelayTimer.current) {
|
|
101
|
+
clearTimeout(dragStartDelayTimer.current);
|
|
102
|
+
dragStartDelayTimer.current = null;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}, []);
|
|
91
106
|
const handleStart = useCallback(
|
|
92
107
|
({
|
|
93
108
|
event: _event,
|
|
@@ -98,29 +113,36 @@ const useDragEvents = ({
|
|
|
98
113
|
clearTimeout(dragResumeTimer.current);
|
|
99
114
|
dragResumeTimer.current = null;
|
|
100
115
|
}
|
|
116
|
+
if (dragStartDelayTimer.current) {
|
|
117
|
+
clearTimeout(dragStartDelayTimer.current);
|
|
118
|
+
dragStartDelayTimer.current = null;
|
|
119
|
+
}
|
|
101
120
|
if (event.target.contentEditable === "true" || isBlockingActiveInput && document.activeElement === event.target) {
|
|
102
121
|
return;
|
|
103
122
|
}
|
|
104
|
-
if (event.cancelable) {
|
|
123
|
+
if (event.cancelable && !(event instanceof globalThis.TouchEvent)) {
|
|
105
124
|
event.preventDefault();
|
|
106
125
|
}
|
|
107
126
|
isPending.current = true;
|
|
108
127
|
isMouseDown.current = true;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
128
|
+
isScrolling.current = false;
|
|
129
|
+
const xy = getClientXy(event);
|
|
130
|
+
if (!xy) return;
|
|
131
|
+
touchStartX.current = xy.clientX;
|
|
132
|
+
touchStartY.current = xy.clientY;
|
|
133
|
+
if (event.type.toLowerCase().startsWith("touch") || event instanceof globalThis.TouchEvent) {
|
|
134
|
+
isPending.current = false;
|
|
135
|
+
isDragging.current = true;
|
|
136
|
+
dragStartCallback({ x: xy.clientX, y: xy.clientY });
|
|
137
|
+
return;
|
|
116
138
|
}
|
|
117
|
-
setTimeout(() => {
|
|
139
|
+
dragStartDelayTimer.current = setTimeout(() => {
|
|
118
140
|
if (!isPending.current || isScrolling.current) return;
|
|
119
141
|
isPending.current = false;
|
|
120
142
|
isDragging.current = true;
|
|
121
|
-
const
|
|
122
|
-
if (!
|
|
123
|
-
const { clientX, clientY } =
|
|
143
|
+
const xy2 = getClientXy(event);
|
|
144
|
+
if (!xy2) return;
|
|
145
|
+
const { clientX, clientY } = xy2;
|
|
124
146
|
dragStartCallback({ x: clientX, y: clientY });
|
|
125
147
|
}, 300);
|
|
126
148
|
},
|
|
@@ -140,7 +162,11 @@ const useDragEvents = ({
|
|
|
140
162
|
const { clientX, clientY } = xy;
|
|
141
163
|
const deltaX = Math.abs(clientX - touchStartX.current);
|
|
142
164
|
const deltaY = Math.abs(clientY - touchStartY.current);
|
|
143
|
-
if (isPending.current && (deltaX > scrollThreshold || deltaY > scrollThreshold)) {
|
|
165
|
+
if (isPending.current && (event.type.toLowerCase().startsWith("touch") || event instanceof globalThis.TouchEvent) && (deltaX > scrollThreshold || deltaY > scrollThreshold)) {
|
|
166
|
+
if (dragStartDelayTimer.current) {
|
|
167
|
+
clearTimeout(dragStartDelayTimer.current);
|
|
168
|
+
dragStartDelayTimer.current = null;
|
|
169
|
+
}
|
|
144
170
|
isScrolling.current = true;
|
|
145
171
|
isPending.current = false;
|
|
146
172
|
isDragging.current = false;
|
|
@@ -152,8 +178,8 @@ const useDragEvents = ({
|
|
|
152
178
|
}
|
|
153
179
|
dragResumeTimer.current = setTimeout(() => {
|
|
154
180
|
if (!isMouseDown.current) return;
|
|
155
|
-
|
|
156
|
-
|
|
181
|
+
touchStartX.current = clientX;
|
|
182
|
+
touchStartY.current = clientY;
|
|
157
183
|
isPending.current = true;
|
|
158
184
|
isScrolling.current = false;
|
|
159
185
|
handleStart({ event: _event, dragStartCallback });
|
|
@@ -174,6 +200,10 @@ const useDragEvents = ({
|
|
|
174
200
|
isMouseDown.current = false;
|
|
175
201
|
if (isPending.current) {
|
|
176
202
|
isPending.current = false;
|
|
203
|
+
if (dragStartDelayTimer.current) {
|
|
204
|
+
clearTimeout(dragStartDelayTimer.current);
|
|
205
|
+
dragStartDelayTimer.current = null;
|
|
206
|
+
}
|
|
177
207
|
return;
|
|
178
208
|
}
|
|
179
209
|
const event = _event instanceof Event ? _event : _event.nativeEvent;
|
|
@@ -213,7 +243,16 @@ const useFolderEvent = () => {
|
|
|
213
243
|
}, []);
|
|
214
244
|
return { folderEvent };
|
|
215
245
|
};
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
246
|
+
export {
|
|
247
|
+
allSplitScreenCount,
|
|
248
|
+
dragState,
|
|
249
|
+
dragStateSubject,
|
|
250
|
+
dropMovementEventSubject,
|
|
251
|
+
folderEventSubject,
|
|
252
|
+
isResizingSubject,
|
|
253
|
+
setFolderEvent,
|
|
254
|
+
useDragCapture,
|
|
255
|
+
useDragEvents,
|
|
256
|
+
useFolderEvent
|
|
257
|
+
};
|
|
219
258
|
//# sourceMappingURL=useDrag.js.map
|