From 75b23174bf31f78db96c079685903cbe308dff7c Mon Sep 17 00:00:00 2001 From: josc146 Date: Tue, 21 Mar 2023 16:33:19 +0800 Subject: [PATCH] feat: make the floating selectionTools follow the scrolling, while the result window remains fixed (#40) --- src/components/ConversationCard/index.jsx | 1 - src/components/FloatingToolbar/index.jsx | 10 +++++++--- src/content-script/index.jsx | 16 +++++----------- src/utils/get-client-position.mjs | 4 ++++ src/utils/index.mjs | 1 + 5 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 src/utils/get-client-position.mjs diff --git a/src/components/ConversationCard/index.jsx b/src/components/ConversationCard/index.jsx index 117b019..4362e6a 100644 --- a/src/components/ConversationCard/index.jsx +++ b/src/components/ConversationCard/index.jsx @@ -213,7 +213,6 @@ function ConversationCard(props) { { setConfig(config) setRender(true) + + if (!triggered) props.container.style.position = 'absolute' }) }, []) @@ -127,6 +129,9 @@ function FloatingToolbar(props) { className: 'chatgptbox-selection-toolbar-button', title: toolConfig.label, onClick: async () => { + const p = getClientPosition(props.container) + props.container.style.position = 'fixed' + setPosition(p) setPrompt(await toolConfig.genPrompt(selection)) setTriggered(true) }, @@ -149,7 +154,6 @@ function FloatingToolbar(props) { FloatingToolbar.propTypes = { session: PropTypes.object.isRequired, selection: PropTypes.string.isRequired, - position: PropTypes.object.isRequired, container: PropTypes.object.isRequired, triggered: PropTypes.bool, closeable: PropTypes.bool, diff --git a/src/content-script/index.jsx b/src/content-script/index.jsx index 42612f4..664efc3 100644 --- a/src/content-script/index.jsx +++ b/src/content-script/index.jsx @@ -121,14 +121,12 @@ async function prepareForSelectionTools() { setTimeout(() => { const selection = window.getSelection()?.toString() if (selection) { - const position = { x: e.clientX + 15, y: e.clientY - 15 } - toolbarContainer = createElementAtPosition(position.x, position.y) + toolbarContainer = createElementAtPosition(e.pageX + 15, e.pageY - 15) toolbarContainer.className = 'chatgptbox-toolbar-container' render( , @@ -169,17 +167,15 @@ async function prepareForSelectionToolsTouch() { setTimeout(() => { const selection = window.getSelection()?.toString() if (selection) { - const position = { - x: e.changedTouches[0].clientX + 15, - y: e.changedTouches[0].clientY - 15, - } - toolbarContainer = createElementAtPosition(position.x, position.y) + toolbarContainer = createElementAtPosition( + e.changedTouches[0].pageX + 15, + e.changedTouches[0].pageY - 15, + ) toolbarContainer.className = 'chatgptbox-toolbar-container' render( , @@ -214,7 +210,6 @@ async function prepareForRightClickMenu() {