ChatGPT fix for missing caret

Fixes ChatGPT bug where caret disappears after pasting CRLF-based newlines (Windows standard); converts CRLF to LF and pastes properly in ChatGPT ProseMirror editor

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         ChatGPT fix for missing caret
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Fixes ChatGPT bug where caret disappears after pasting CRLF-based newlines (Windows standard); converts CRLF to LF and pastes properly in ChatGPT ProseMirror editor
// @license      MIT
// @match        https://chat.openai.com/*
// @match        https://chatgpt.com/*
// @grant        none
// @homepage     https://greasyfork.org/en/scripts/559039/
// ==/UserScript==

(function ()
{
    'use strict';

    document.addEventListener('paste', function (event)
    {
        const target = event.target;
        if (!(target instanceof HTMLElement)) return;

        const prosemirror = target.closest('.ProseMirror');
        if (!prosemirror) return;

        const clipdata = event.clipboardData;
        if (!clipdata) return;

        const text = clipdata.getData('text/plain');
        if (!text || !text.includes('\r\n')) return;

        event.preventDefault();

        const normalized = text.replace(/\r\n?/g, '\n');
        const datatransfer = new DataTransfer();
        datatransfer.setData('text/plain', normalized);

        const syntheticpaste = new ClipboardEvent('paste',
        {
            clipboardData: datatransfer,
            bubbles: true,
            cancelable: true
        });

        target.dispatchEvent(syntheticpaste);
    }, true);
})();