Angi Subject & Body Copy UI

Dropdown to pick a canned response; buttons above subject & email to copy subject/body

// ==UserScript==
// @name         Angi Subject & Body Copy UI
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Dropdown to pick a canned response; buttons above subject & email to copy subject/body
// @match        https://office.angi.com/*
// @grant        GM_setClipboard
// @license      MIT
// ==/UserScript==

(function() {
  'use strict';

  // canned responses
  const messages = [
    {
      label: "Rodents",
      subject: "Looking for help with rodents? — Senate Termite and Pest Control",
      body: `We are reaching out from Senate Termite & Pest Control regarding your recent rodent inquiry.

To begin combating rodent activity, we advise setting up a no-cost, no-obligation professional inspection as soon as possible.

Our top-to-bottom inspection will focus on:
- Identifying where the rodents are getting in
- What is attracting them
- Determining the size of the colony active in your home

Once this information is gathered, we will present our findings and service options.

Call our office today at 703-257-1585 for more information.`
    },
    {
      label: "General Pest Control",
      subject: "Looking for help with pests? — Senate Termite and Pest Control",
      body: `We are reaching out from Senate Termite & Pest Control regarding your recent pest control inquiry.

We advise setting up a no-cost, no-obligation professional inspection as soon as possible.

Our top-to-bottom inspection will focus on:
- Identifying any pest-related issues you're having
- Locating the origin of the pest problem

Once this information is gathered, we will present our findings and service options.

Call our office today at 703-257-1585 for more information.`
    },
    {
      label: "Small Animals",
      subject: "Looking for help with animal removal? — Senate Termite and Pest Control",
      body: `We are reaching out from Senate Termite & Pest Control regarding your recent inquiry about small animal removal.

We advise setting up a no-cost, no-obligation professional attic inspection as soon as possible.

Our top-to-bottom inspection will focus on:
- Identifying the openings animals are using to access your attic
- Presenting options for trapping and removal
- Sealing up attic space from inside to prevent future issues

Once this information is gathered, we will present our findings and service options.

Call our office today at 703-257-1585 for more information.`
    },
    {
      label: "Cockroaches",
      subject: "Looking for help with cockroach extermination? — Senate Termite and Pest Control",
      body: `We are reaching out from Senate Termite & Pest Control regarding your recent cockroach extermination inquiry.

To begin combating cockroach activity, we advise setting up a no-cost, no-obligation professional inspection as soon as possible.

Our top-to-bottom inspection will focus on:
- Determining what type of cockroaches are present
- Identifying what is attracting them
- Locating their congregating areas

Once this information is gathered, we will present our findings and service options.

Call our office today at 703-257-1585 for more information.`
    },
    {
      label: "Termites",
      subject: "Looking for help with termites? — Senate Termite and Pest Control",
      body: `We are reaching out from Senate Termite & Pest Control regarding your recent termite inquiry.

To begin combating termite activity, we advise setting up a no-cost, no-obligation professional inspection as soon as possible.

Our top-to-bottom inspection will focus on:
- Identifying the location of the infestation
- Assessing the damage caused

Once this information is gathered, we will present our findings and service options.

Call our office today at 703-257-1585 for more information.`
    },
    {
      label: "Bedbugs",
      subject: "Looking for help with bedbugs? — Senate Termite and Pest Control",
      body: `We are reaching out from Senate Termite & Pest Control regarding your recent bedbug inquiry.

To begin combating bedbug activity, we advise setting up a no-cost, no-obligation professional inspection as soon as possible.

Our top-to-bottom inspection will focus on:
- Identifying where they are located
- Determining what is attracting them
- Assessing the size of the colony

Once this information is gathered, we will present our findings and service options.

Call our office today at 703-257-1585 for more information.`
    },
    {
  label: "Attic Wildlife",
  subject: "Concerned about animals in your attic? — Senate Termite and Pest Control",
  body: `We are reaching out from Senate Termite & Pest Control regarding your recent inquiry about animal activity in the attic.

We recommend setting up a no-cost, no-obligation professional inspection to assess the situation.

Our top-to-bottom inspection will focus on:
- Identifying entry points used by squirrels, raccoons, or other wildlife
- Evaluating any damage caused to insulation or structure
- Presenting options for removal and future prevention

Once this information is gathered, we will present our findings and service options.

Call our office today at 703-257-1585 for more information.`
},
{
  label: "Bees",
  subject: "Looking for help with bees or stinging insects? — Senate Termite and Pest Control",
  body: `We are reaching out from Senate Termite & Pest Control regarding your recent inquiry about bees.

To safely address bee activity on your property, we recommend scheduling a no-cost, no-obligation professional inspection.

Our top-to-bottom inspection will focus on:
- Identifying the type of bee and the location of the hive or active area
- Determining appropriate treatment options based on the findings

Once this information is gathered, we will present our findings and service options.

Call our office today at 703-257-1585 for more information.`
}
  ];
  // track chosen index
  let chosenIndex = -1;

  // inject both UIs
  function injectUI() {
    // SUBJECT UI
    const subjGroup = document.querySelector('#email-subject')?.closest('.form-group');
    if (subjGroup && !document.getElementById('angiSubjUI')) {
      const wrap = document.createElement('div');
      wrap.id = 'angiSubjUI';
      wrap.style.display = 'flex';
      wrap.style.alignItems = 'center';
      wrap.style.marginBottom = '8px';

      const sel = document.createElement('select');
      sel.style.flex = '1';
      sel.style.marginRight = '8px';
      sel.innerHTML = `<option disabled selected>Choose response…</option>` +
        messages.map((m,i)=>`<option value="${i}">${m.label}</option>`).join('');
      sel.addEventListener('change', e => chosenIndex = +e.target.value);

      const btnSubj = document.createElement('button');
      btnSubj.textContent = 'Copy Subject';
      btnSubj.style.padding = '4px 8px';
      btnSubj.style.cursor = 'pointer';
      btnSubj.addEventListener('click', () => {
        if (chosenIndex < 0) return alert('Select a response first');
        GM_setClipboard(messages[chosenIndex].subject);
        btnSubj.textContent = '✓ Copied';
        setTimeout(()=> btnSubj.textContent = 'Copy Subject', 1200);
      });

      wrap.append(sel, btnSubj);
      subjGroup.parentNode.insertBefore(wrap, subjGroup);
    }

    // BODY UI
    const bodyGroup = document.querySelector('#email-content')?.closest('.form-group');
    if (bodyGroup && !document.getElementById('angiBodyUI')) {
      const wrapB = document.createElement('div');
      wrapB.id = 'angiBodyUI';
      wrapB.style.margin = '0 0 8px';

      const btnBody = document.createElement('button');
      btnBody.textContent = 'Copy Body';
      btnBody.style.padding = '4px 8px';
      btnBody.style.cursor = 'pointer';
      btnBody.addEventListener('click', () => {
        if (chosenIndex < 0) return alert('Select a response above');
        GM_setClipboard(messages[chosenIndex].body);
        btnBody.textContent = '✓ Copied';
        setTimeout(()=> btnBody.textContent = 'Copy Body', 1200);
      });

      wrapB.appendChild(btnBody);
      bodyGroup.parentNode.insertBefore(wrapB, bodyGroup);
    }
  }

  // watch for dynamic form load
  new MutationObserver(injectUI).observe(document.body, { childList: true, subtree: true });
})();