feat: transbox follow selection

This commit is contained in:
Gabe Yuan
2024-04-20 18:07:16 +08:00
parent d622db0d7c
commit 74bc58ba91
6 changed files with 73 additions and 22 deletions

View File

@@ -25,6 +25,7 @@ export default function Slection({
hideTranBtn = false,
simpleStyle: initSimpleStyle = false,
hideClickAway: initHideClickAway = false,
followSelection: initFollowMouse = false,
tranboxShortcut = DEFAULT_TRANBOX_SHORTCUT,
triggerMode = OPT_TRANBOX_TRIGGER_CLICK,
extStyles,
@@ -55,6 +56,7 @@ export default function Slection({
});
const [simpleStyle, setSimpleStyle] = useState(initSimpleStyle);
const [hideClickAway, setHideClickAway] = useState(initHideClickAway);
const [followSelection, setFollowSelection] = useState(initFollowMouse);
const handleTrigger = useCallback(
(text) => {
@@ -68,16 +70,25 @@ export default function Slection({
const handleTranbox = useCallback(() => {
setShowBtn(false);
const selectedText = window.getSelection()?.toString()?.trim() || "";
const selection = window.getSelection();
const selectedText = selection?.toString()?.trim() || "";
if (!selectedText) {
setShowBox((pre) => !pre);
return;
}
const rect = selection?.getRangeAt(0)?.getBoundingClientRect();
if (rect && followSelection) {
setBoxPosition({
x: limitNumber(rect.right, 0, window.innerWidth - 300),
y: limitNumber(rect.bottom, 0, window.innerHeight - 200),
});
}
setSelText(selectedText);
setText(selectedText);
setShowBox(true);
}, []);
}, [followSelection]);
const btnEvent = useMemo(() => {
if (isMobile) {
@@ -93,13 +104,22 @@ export default function Slection({
e.stopPropagation();
await sleep(200);
const selectedText = window.getSelection()?.toString()?.trim() || "";
const selection = window.getSelection();
const selectedText = selection?.toString()?.trim() || "";
setSelText(selectedText);
if (!selectedText) {
setShowBtn(false);
return;
}
const rect = selection?.getRangeAt(0)?.getBoundingClientRect();
if (rect && followSelection) {
setBoxPosition({
x: limitNumber(rect.right, 0, window.innerWidth - 300),
y: limitNumber(rect.bottom, 0, window.innerHeight - 200),
});
}
if (triggerMode === OPT_TRANBOX_TRIGGER_SELECT) {
handleTrigger(selectedText);
return;
@@ -119,7 +139,7 @@ export default function Slection({
handleMouseup
);
};
}, [hideTranBtn, triggerMode, handleTrigger]);
}, [hideTranBtn, triggerMode, followSelection, handleTrigger]);
useEffect(() => {
if (isExt) {
@@ -196,6 +216,8 @@ export default function Slection({
setSimpleStyle={setSimpleStyle}
hideClickAway={hideClickAway}
setHideClickAway={setHideClickAway}
followSelection={followSelection}
setFollowSelection={setFollowSelection}
extStyles={extStyles}
/>
)}