Ctrl Enter submits comment & reply forms uwu

/// ==UserScript==
// @name         Lemmy Form Submit with Ctrl+Enter
// @version      1.0
// @description  Submit forms with Ctrl+Enter in Lemmy instances so you don't have to click the button every time you want to post something.
// @author       God (https://sh.itjust.works/u/god)
// @match        https://*/post/*
// @match        https://*/comment/*
// @icon         https://join-lemmy.org/static/assets/icons/favicon.svg
// ==/UserScript==

var isLemmy =
  document.head.querySelector("[name~=Description][content]").content ===
  "Lemmy";

if (isLemmy) {
  // Define a global variable to keep track of the currently focused textarea.
  var currentFocusedTextarea = null;

  // Function to attach focus and blur event handlers to all textareas.
  function attachEventHandlers() {
    document.querySelectorAll("textarea").forEach((textarea) => {
      if (!textarea.dataset.ctrlEnterHandled) {
        textarea.dataset.ctrlEnterHandled = true;

        // Check if this textarea is currently focused
        const wasFocused = document.activeElement === textarea;

        textarea.addEventListener("focus", function () {
          currentFocusedTextarea = this;
        });

        textarea.addEventListener("blur", function () {
          currentFocusedTextarea = null;
        });

        // If this textarea was focused, blur and re-focus it to ensure event handlers get triggered
        if (wasFocused) {
          textarea.blur();
          textarea.focus();
        }
      }
    });
  }

  // Attach a keydown event handler to the entire document.
  document.addEventListener("keydown", function (event) {
    // If Ctrl + Enter is pressed
    if (event.ctrlKey && event.key === "Enter") {
      // If a textarea is focused and contains text
      if (
        currentFocusedTextarea &&
        currentFocusedTextarea.value.trim() !== ""
      ) {
        // Your submit logic here
        handleSubmit(currentFocusedTextarea);
      }
    }
  });

  function handleSubmit(textarea) {
    // find the closest type="submit" button and press it.
    textarea.closest("form").querySelector('[type="submit"]').click();
  }

  // Call the function initially to cover textareas that exist when the page is first loaded.
  attachEventHandlers();

  // Observe the document for changes and reattach event handlers when new textareas are added.
  const observer = new MutationObserver(function (mutations) {
    mutations.forEach((mutation) => {
      if (mutation.type === "childList") {
        attachEventHandlers();
      }
    });
  });

  observer.observe(document.body, { childList: true, subtree: true });
}
    • GodOPM
      link
      fedilink
      English
      arrow-up
      1
      ·
      edit-2
      1 year ago

      here’s the final form kanye! works with Tampermonkey & Greasemonkey

      /// ==UserScript==
      // @name         Lemmy Form Submit with Ctrl+Enter
      // @version      1.0
      // @description  Submit forms with Ctrl+Enter in Lemmy instances so you don't have to click the button every time you want to post something.
      // @author       God (https://sh.itjust.works/u/god)
      // @match        https://*/post/*
      // @match        https://*/comment/*
      // @icon         https://join-lemmy.org/static/assets/icons/favicon.svg
      // ==/UserScript==
      
      var isLemmy =
        document.head.querySelector("[name~=Description][content]").content ===
        "Lemmy";
      
      if (isLemmy) {
        // Define a global variable to keep track of the currently focused textarea.
        var currentFocusedTextarea = null;
      
        // Function to attach focus and blur event handlers to all textareas.
        function attachEventHandlers() {
          document.querySelectorAll("textarea").forEach((textarea) => {
            if (!textarea.dataset.ctrlEnterHandled) {
              textarea.dataset.ctrlEnterHandled = true;
      
              // Check if this textarea is currently focused
              const wasFocused = document.activeElement === textarea;
      
              textarea.addEventListener("focus", function () {
                currentFocusedTextarea = this;
              });
      
              textarea.addEventListener("blur", function () {
                currentFocusedTextarea = null;
              });
      
              // If this textarea was focused, blur and re-focus it to ensure event handlers get triggered
              if (wasFocused) {
                textarea.blur();
                textarea.focus();
              }
            }
          });
        }
      
        // Attach a keydown event handler to the entire document.
        document.addEventListener("keydown", function (event) {
          // If Ctrl + Enter is pressed
          if (event.ctrlKey && event.key === "Enter") {
            // If a textarea is focused and contains text
            if (
              currentFocusedTextarea &&
              currentFocusedTextarea.value.trim() !== ""
            ) {
              // Your submit logic here
              handleSubmit(currentFocusedTextarea);
            }
          }
        });
      
        function handleSubmit(textarea) {
          // find the closest type="submit" button and press it.
          textarea.closest("form").querySelector('[type="submit"]').click();
        }
      
        // Call the function initially to cover textareas that exist when the page is first loaded.
        attachEventHandlers();
      
        // Observe the document for changes and reattach event handlers when new textareas are added.
        const observer = new MutationObserver(function (mutations) {
          mutations.forEach((mutation) => {
            if (mutation.type === "childList") {
              attachEventHandlers();
            }
          });
        });
      
        observer.observe(document.body, { childList: true, subtree: true });
      }