Skip to content

Commit 5a86528

Browse files
committed
fix: 修复编辑器浮动工具栏点击第一次时无效的问题
1 parent 881a28d commit 5a86528

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/app/core/article/floatbar/index.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,23 @@ import Expansion from "./expansion";
66
import ReadAloud from "./read-aloud";
77
import Vditor from "vditor";
88
import { useEffect, useRef, useState } from "react";
9+
import emitter from "@/lib/emitter";
910

1011
export default function FloatBar({left, top, value, editor}: {left?: number, top?: number, value?: string, editor?: Vditor}) {
1112
const floatBarRef = useRef<HTMLDivElement>(null)
1213
const [adjustedLeft, setAdjustedLeft] = useState(left)
1314

15+
// 阻止鼠标按下事件冒泡到编辑器
16+
const handleMouseDown = (e: React.MouseEvent) => {
17+
e.stopPropagation()
18+
// 通知编辑器正在点击浮动工具栏
19+
emitter.emit('floatbar-mousedown')
20+
}
21+
22+
const handleMouseUp = () => {
23+
emitter.emit('floatbar-mouseup')
24+
}
25+
1426
useEffect(() => {
1527
if (left !== undefined && floatBarRef.current) {
1628
const floatBarWidth = floatBarRef.current.offsetWidth
@@ -31,6 +43,8 @@ export default function FloatBar({left, top, value, editor}: {left?: number, top
3143
<div
3244
ref={floatBarRef}
3345
data-float-bar="true"
46+
onMouseDown={handleMouseDown}
47+
onMouseUp={handleMouseUp}
3448
className={`${(left && top ) ? 'block': 'hidden'} absolute shadow rounded-lg bg-primary text-primary-foreground p-1`}
3549
style={{left: adjustedLeft + 'px', top: (top || 0) < 64 ? (top || 0) + 82 + 'px' : (top || 0) + 'px'}}>
3650
<div className="flex items-center justify-between">

src/app/core/article/md-editor.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,12 @@ export function MdEditor() {
296296
editorElement?.addEventListener('click', handleClick)
297297

298298
// 监听失焦事件,隐藏浮动工具栏并取消正在进行的补全
299+
let isClickingFloatBar = false
299300
const handleBlur = (e: FocusEvent) => {
301+
// 如果正在点击浮动工具栏,不隐藏
302+
if (isClickingFloatBar) {
303+
return
304+
}
300305
// 检查失焦是否不是因为点击了浮动工具栏本身
301306
const floatBarElement = document.querySelector('[data-float-bar="true"]')
302307
if (floatBarElement && floatBarElement.contains(e.relatedTarget as Node)) {
@@ -306,6 +311,18 @@ export function MdEditor() {
306311
// 取消正在进行的补全
307312
cancelCompletion()
308313
}
314+
315+
// 监听浮动工具栏的点击事件
316+
const handleFloatBarMouseDown = () => {
317+
isClickingFloatBar = true
318+
}
319+
const handleFloatBarMouseUp = () => {
320+
isClickingFloatBar = false
321+
}
322+
323+
emitter.on('floatbar-mousedown', handleFloatBarMouseDown)
324+
emitter.on('floatbar-mouseup', handleFloatBarMouseUp)
325+
309326
editorElement?.addEventListener('blur', handleBlur, true)
310327

311328
// 监听 beforeinput 事件,在输入前就清除补全预览
@@ -324,6 +341,8 @@ export function MdEditor() {
324341
editorElement?.removeEventListener('click', handleClick)
325342
editorElement?.removeEventListener('blur', handleBlur, true)
326343
editorElement?.removeEventListener('beforeinput', handleBeforeInput)
344+
emitter.off('floatbar-mousedown', handleFloatBarMouseDown)
345+
emitter.off('floatbar-mouseup', handleFloatBarMouseUp)
327346
}
328347
},
329348
input: async (value) => {

0 commit comments

Comments
 (0)