Quickly edit question for Superpower ChatGPT

Press Ctrl + Alt + Left click on the text of the question you asked to jump in at the current mouse position to quickly edit the question

Skript installieren?
Vom Ersteller vorgeschlagenes Skript

Ihnen könnte auch Save & Submit keyboard shortcut for ChatGPT gefallen.

Skript installieren
// ==UserScript==
// @name         Quickly edit question for Superpower ChatGPT
// @description  Press Ctrl + Alt + Left click on the text of the question you asked to jump in at the current mouse position to quickly edit the question
// @author       NWP
// @namespace    https://greasyfork.org/users/877912
// @version      0.4
// @license      MIT
// @match        https://chat.openai.com/*
// @match        https://chatgpt.com/*
// @grant        none
// ==/UserScript==

// TODO:
// 1. Fix the screen flicker due to the fast jumping to the Save & Submit button and then
// jumping back to the current position of the caret in the textarea, except for Chrome
// 2. Launch a version for pure OpenAI

// DONE:
// Fixed code for Firefox, enabled instant scrolling instead of smooth scrolling
// Fixed flicker for Chrome

(function() {

    if (navigator.userAgent.toLowerCase().includes('firefox')) {
        document.addEventListener('mousedown', function(event) {
            if (event.ctrlKey && event.altKey && event.button === 0) {
                const targetDiv = event.target;
                if (targetDiv.tagName === 'DIV') {
                    let textNode, offset;
                    if (document.caretPositionFromPoint) {
                        const caretPos = document.caretPositionFromPoint(event.clientX, event.clientY);
                        if (caretPos) {
                            textNode = caretPos.offsetNode;
                            offset = caretPos.offset;
                        }
                    } else if (document.caretRangeFromPoint) {
                        const range = document.caretRangeFromPoint(event.clientX, event.clientY);
                        if (range) {
                            textNode = range.startContainer;
                            offset = range.startOffset;
                        }
                    }
                    if (textNode && (offset !== undefined)) {
                        if (targetDiv) {
                            const uniqueID = targetDiv.id.replace('message-text-', '');
                            const button = document.getElementById(`message-edit-button-${uniqueID}`);
                            if (button) {
                                // scrollableContainer WILL LIKELY BREAK IN THE FUTURE
                                const scrollableContainer = document.querySelector('div#conversation-inner-div.h-full.overflow-y-auto');
                                const y = scrollableContainer.scrollTop;

                                button.click();
                                event.preventDefault();

                                setTimeout(function() {
                                    const textarea = document.getElementById(`message-text-${uniqueID}`);
                                    if (textarea) {
                                        textarea.focus({preventScroll: true});
                                        textarea.setSelectionRange(offset, offset);

                                        scrollableContainer.scrollTo({
                                            top: y,
                                            behavior: 'instant'
                                        })
                                    }
                                }, 0);
                            }
                        }
                    }
                }
            }
        });

        console.log("The browser is Firefox.")

    } else {
        document.addEventListener('mousedown', function(event) {
            if (event.ctrlKey && event.altKey && event.button === 0) {
                const targetDiv = event.target;
                if (targetDiv.tagName === 'DIV' && targetDiv.id.startsWith('message-text-')) {
                    event.preventDefault();
                    let textNode, offset;
                    const pointMethod = document.caretPositionFromPoint ? 'caretPositionFromPoint' : 'caretRangeFromPoint';
                    const caretResult = document[pointMethod](event.clientX, event.clientY);

                    if (caretResult) {
                        textNode = caretResult.offsetNode || caretResult.startContainer;
                        offset = caretResult.offset !== undefined ? caretResult.offset : caretResult.startOffset;
                    }

                    if (textNode && offset !== undefined) {
                        const uniqueID = targetDiv.id.replace('message-text-', '');
                        const button = document.getElementById(`message-edit-button-${uniqueID}`);
                        if (button) {
                            // scrollableContainer WILL LIKELY BREAK IN THE FUTURE
                            const scrollableContainer = document.querySelector('div#conversation-inner-div.h-full.overflow-y-auto');
                            const originalScroll = { x: scrollableContainer.scrollLeft, y: scrollableContainer.scrollTop };

                            button.click();

                            const observer = new MutationObserver((mutations, obs) => {
                                const textarea = document.getElementById(`message-text-${uniqueID}`);
                                if (textarea && textarea.offsetHeight > 0 && document.activeElement === textarea) {
                                    textarea.setSelectionRange(offset, offset);
                                    scrollableContainer.scrollTo({
                                        top: originalScroll.y,
                                        behavior: 'instant'
                                    });
                                    obs.disconnect();
                                }
                            });

                            observer.observe(document.body, { childList: true, subtree: true });
                        }
                    }
                }
            }
        });

        console.log("The browser is not Firefox.")
    }


})();


// When scrollableContainer breaks use this code to find the new scrollableContainer element:

// function isScrollable(element) {
//     const hasScrollableContent = element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
//     const overflowStyle = window.getComputedStyle(element).overflow;
//     return hasScrollableContent && (overflowStyle === 'scroll' || overflowStyle === 'auto');
//   }

//   // Find all elements in the body
//   const allElements = document.querySelectorAll('body, body *');

//   // Counter variable to track index
//   let index = 1;

//   // Filter out scrollable elements and apply a red border
//   Array.from(allElements).forEach(element => {
//     if (isScrollable(element)) {
//       element.style.border = '2px solid red';
//       console.log("Scrollable Element " + index + ":", element);
//       console.log("Scroll Position " + index + " (x, y):", element.scrollLeft, element.scrollTop);
//       index++; // Increment index for the next scrollable element
//     }
//   });