Construction JavaScript Injection

Inject some javascript into these websites

As of 27. 06. 2025. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name            Construction JavaScript Injection
// @description     Inject some javascript into these websites
// @version         1.0.0
// @author          Oliver P
// @namespace       https://github.com/OlisDevSpot
// @license         MIT
// @match           *://*/*
// @run-at          document-end
// @compatible      safari
// @grant           GM_setValue
// @grant           GM_getValue
// @grant           GM_registerMenuCommand
// ==/UserScript==

// jshint esversion: 8

(async function() {
  // Only run config in top window
  if (window.self !== window.top) return;

  let company = await GM_getValue('company');
  let firstName = await GM_getValue('firstName');
  let lastName = await GM_getValue('lastName');

  if (!company || !firstName || !lastName) {
    // Register a menu option to configure later
    GM_registerMenuCommand('Set Sales Credentials', configure);

    // Ask upfront
    await configure();
  }

  async function configure() {
    company = prompt('Enter your company name (e.g. david-star):') || '';
    firstName = prompt('First name:') || '';
    lastName = prompt('Last name:') || '';
    if (company && firstName && lastName) {
      await GM_setValue('company', company);
      await GM_setValue('firstName', firstName);
      await GM_setValue('lastName', lastName);
      location.reload();
    } else {
      alert('Values cannot be empty!');
    }
  }

  // Build dynamic fetch URL
  const salesperson = { firstName, lastName };
  const currentSiteUrl = encodeURIComponent(window.location.href);
  const params = new URLSearchParams({
    data: JSON.stringify({ currentSiteUrl, salesperson })
  });
  const url = `https://${company}.pages.dev/your-endpoint?${params}`;

  // Inject dynamic code
  fetch(url)
    .then(res => res.text())
    .then(code => {
      const s = document.createElement('script');
      s.textContent = code;
      document.head.appendChild(s);
    })
    .catch(err => console.error('Inject error:', err));
})();