Skip to content

Commit 8fd1c42

Browse files
committed
no jump at drag start
1 parent 6561c90 commit 8fd1c42

File tree

1 file changed

+26
-33
lines changed

1 file changed

+26
-33
lines changed

src/main/client/src/component/Chat.jsx

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -124,37 +124,30 @@ function isLastChildVisible(container) {
124124
}
125125

126126
function SplitPane({messageRef, topElement, bottomElement}) {
127-
let [dragBase, setDragBase] = useState(Number.NaN)
127+
let [dragOffset, setDragOffset] = useState(Number.NaN)
128128
let [splitPos, setSplitPos] = useState(200)
129-
let draggingRef = useRef()
129+
let splitPosRef = useRef()
130+
splitPosRef.current = splitPos
130131
let containerRef = useRef()
131-
draggingRef.current = dragBase
132132
useEffect(() => {
133-
let mousemove = (e) => {
134-
if (!draggingRef.current) {
133+
let onMouseMove = (e) => {
134+
if (Number.isNaN(dragOffset)) {
135135
return
136136
}
137-
setSplitPos(getSplitPos(e.clientY, containerRef.current))
137+
setSplitPos(getSplitPos(e.clientY + dragOffset, containerRef.current))
138138
}
139-
let mouseup = (e) => {
140-
if (!draggingRef.current) {
141-
return
142-
}
143-
setSplitPos(getSplitPos(e.clientY, containerRef.current))
144-
setDragBase(Number.NaN)
145-
}
146-
window.document.addEventListener("mousemove", mousemove)
147-
window.document.addEventListener("mouseup", mouseup)
139+
let onMouseUp = () => setDragOffset(Number.NaN)
140+
window.document.addEventListener("mousemove", onMouseMove)
141+
window.document.addEventListener("mouseup", onMouseUp)
148142
return () => {
149-
window.document.removeEventListener("mousemove", mousemove)
150-
window.document.removeEventListener("mouseup", mouseup)
143+
window.document.removeEventListener("mousemove", onMouseMove)
144+
window.document.removeEventListener("mouseup", onMouseUp)
151145
}
152-
}, [draggingRef, setDragBase])
146+
}, [dragOffset, setDragOffset])
153147
let onMouseDown = useCallback((e) => {
154148
e.preventDefault()
155-
setSplitPos(getSplitPos(e.clientY, containerRef.current))
156-
setDragBase(e.clientY)
157-
}, [setDragBase, setSplitPos])
149+
setDragOffset(splitPosRef.current - e.clientY)
150+
}, [setDragOffset])
158151
let topElementHeight = Math.trunc(splitPos)
159152
if (containerRef.current) {
160153
let rect = containerRef.current.getBoundingClientRect()
@@ -168,13 +161,13 @@ function SplitPane({messageRef, topElement, bottomElement}) {
168161
}
169162
if (!containerRef.current) {
170163
let rect = ref.getBoundingClientRect()
171-
setSplitPos(getSplitPos(rect.top, ref))
164+
setSplitPos(getSplitPos(rect.top + 2.5 * getRemInPixel(), ref))
172165
}
173166
containerRef.current = ref
174167
}}
175168
className={twJoin(
176169
"grow border-t border-x border-gray-500 bg-gray-900 flex flex-col overflow-y-hidden",
177-
!Number.isNaN(dragBase) && "cursor-row-resize",
170+
!Number.isNaN(dragOffset) && "cursor-row-resize",
178171
)}>
179172
<div
180173
style={{height: topElementHeight + "px"}}
@@ -184,7 +177,7 @@ function SplitPane({messageRef, topElement, bottomElement}) {
184177
<SplitBar
185178
container={containerRef.current}
186179
splitPos={splitPos}
187-
dragBase={dragBase}
180+
dragOffset={dragOffset}
188181
onMouseDown={onMouseDown} />
189182
<div ref={messageRef} className="px-1 pt-3 pb-1 overflow-y-scroll">
190183
{bottomElement}
@@ -193,7 +186,7 @@ function SplitPane({messageRef, topElement, bottomElement}) {
193186
)
194187
}
195188

196-
function SplitBar({splitPos, dragBase, onMouseDown, container}) {
189+
function SplitBar({splitPos, dragOffset, onMouseDown, container}) {
197190
if (!container) {
198191
return <div />
199192
}
@@ -204,16 +197,16 @@ function SplitBar({splitPos, dragBase, onMouseDown, container}) {
204197
let left = rect.left - parentRect.left
205198
return <>
206199
<div
207-
onMouseDown={Number.isNaN(dragBase) ? onMouseDown : undefined}
208-
style={{top: Math.trunc(splitPos - 1) + 0.5, height: 1, width: width, left: left}}
200+
onMouseDown={Number.isNaN(dragOffset) ? onMouseDown : undefined}
201+
style={{top: Math.trunc(splitPos - 1), height: 1, width: width, left: left}}
209202
className="absolute h-[1px] bg-gray-500 z-20 cursor-row-resize" />
210203
<div
211-
onMouseDown={Number.isNaN(dragBase) ? onMouseDown : undefined}
212-
style={{top: Math.trunc(splitPos) + 0.5, height: innerHeight, width: width, left: left}}
204+
onMouseDown={Number.isNaN(dragOffset) ? onMouseDown : undefined}
205+
style={{top: Math.trunc(splitPos), height: innerHeight, width: width, left: left}}
213206
className="absolute bg-slate-800 z-20 cursor-row-resize" />
214207
<div
215-
onMouseDown={Number.isNaN(dragBase) ? onMouseDown : undefined}
216-
style={{top: Math.trunc(splitPos + innerHeight) + 0.5, height: 1, width: width, left: left}}
208+
onMouseDown={Number.isNaN(dragOffset) ? onMouseDown : undefined}
209+
style={{top: Math.trunc(splitPos + innerHeight), height: 1, width: width, left: left}}
217210
className="absolute h-[1px] bg-gray-500 z-20 cursor-row-resize" />
218211
</>
219212
}
@@ -223,8 +216,8 @@ function getSplitPos(clientY, container) {
223216
return Math.trunc(clientY)
224217
}
225218
let rect = container.getBoundingClientRect()
226-
let safety = 4 * getRemInPixel()
219+
let safety = 1 * getRemInPixel()
227220
let result = Math.max(rect.top + safety, clientY)
228-
result = Math.min(rect.top + rect.height - safety, result)
221+
result = Math.min(rect.bottom - safety - 5, result)
229222
return Math.trunc(result)
230223
}

0 commit comments

Comments
 (0)