angelicpretty

automatically submit basic data to order

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         angelicpretty
// @namespace    [email protected]
// @version      1.0
// @description  automatically submit basic data to order
// @author       lli
// @match        *://angelicpretty.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

function addPersistentNumberInputToTopLeft(options = {}) {
  const STORAGE_KEY = "persistent_number_input"; // 本地存储的键名
  const STORAGE_SUBMIT_DIRECTLY = "STORAGE_SUBMIT_DIRECTLY";
  const config = {
    placeholder: "input quantity",
    onInput: null,
    onBlur: null,
    ...options,
  };

  const container = document.createElement("div");
  container.style.position = "fixed";
  container.style.top = "10px";
  container.style.left = "10px";
  container.style.zIndex = "9999";
  container.style.backgroundColor = "white";
  container.style.padding = "10px";
  container.style.borderRadius = "4px";
  container.style.boxShadow = "0 2px 10px rgba(0,0,0,0.1)";

  const input = document.createElement("input");
  input.id = "abcdefghijk";
  input.type = "number";
  input.placeholder = config.placeholder;
  input.style.padding = "8px";
  input.style.border = "1px solid #ccc";
  input.style.borderRadius = "4px";
  input.style.fontSize = "14px";

  // 新增:创建checkbox和标签
  const checkboxWrapper = document.createElement("div");
  checkboxWrapper.style.marginTop = "8px";
  checkboxWrapper.style.display = "flex";
  checkboxWrapper.style.alignItems = "center";

  const checkbox = document.createElement("input");
  checkbox.type = "checkbox";
  checkbox.id = "cbAutoSubmit";
  checkbox.style.marginRight = "6px";

  const checkboxLabel = document.createElement("label");
  checkboxLabel.htmlFor = "cbAutoSubmit";
  checkboxLabel.textContent = "自动提交";
  checkboxLabel.style.fontSize = "14px";
  checkboxLabel.style.color = "#333";

  checkboxWrapper.appendChild(checkbox);
  checkboxWrapper.appendChild(checkboxLabel);

  const errorMsg = document.createElement("div");
  errorMsg.style.color = "red";
  errorMsg.style.fontSize = "12px";
  errorMsg.style.marginTop = "5px";
  errorMsg.style.height = "15px";

  container.appendChild(input);
  container.appendChild(checkboxWrapper);
  container.appendChild(errorMsg);
  document.body.appendChild(container);

  // ===== 新增:从 localStorage 恢复值 =====
  const savedValue = localStorage.getItem(STORAGE_KEY);
  if (savedValue !== null) {
    input.value = savedValue;
  }
  const autoSubmit = localStorage.getItem(STORAGE_SUBMIT_DIRECTLY);
  if (autoSubmit != null) {
    checkbox.checked = autoSubmit == "true";
  }

  // 事件监听
  input.addEventListener("input", function () {
    const value = this.value;
    errorMsg.textContent = "";

    // 实时保存到 localStorage
    localStorage.setItem(STORAGE_KEY, value);

    if (typeof config.onInput === "function") {
      config.onInput(value);
    }
  });

  input.addEventListener("blur", function () {
    const value = this.value;
    if (value && !/^\d+$/.test(value)) {
      errorMsg.textContent = "请输入有效的整数!";
      this.value = "";
      localStorage.removeItem(STORAGE_KEY); // 清除无效值
    } else if (typeof config.onBlur === "function") {
      config.onBlur(value);
    }
  });

  checkbox.addEventListener("change", function () {
    localStorage.setItem(STORAGE_SUBMIT_DIRECTLY, this.checked);
  });

  return {
    input,
    clearStorage: () => localStorage.removeItem(STORAGE_KEY),
  };
}

function isCart() {
  const currentURL = window.location.href;
  const targetURL = "https://angelicpretty.com/Form/Order/CartList.aspx";
  return currentURL === targetURL;
}

function isOrderPayment() {
  const currentURL = window.location.href;
  const targetURL = "https://angelicpretty.com/Form/Order/OrderPayment.aspx";
  return currentURL === targetURL;
}

function isConfirm() {
  const currentURL = window.location.href;
  const targetURL = "https://angelicpretty.com/Form/Order/OrderConfirm.aspx";
  return currentURL === targetURL;
}

function blockThreadForSeconds(seconds) {
  const startTime = Date.now();
  while (Date.now() - startTime < seconds * 1000) {}
}

(function () {
  "use strict";
  addPersistentNumberInputToTopLeft();
  const testName = "カートに入れる";
  document.addEventListener("click", (e) => {
    if (e.target.matches(`input[alt="${testName}"]`)) {
      console.log("input was clicked");
    }
  });

  if (isCart()) {
    const countInputs = document.querySelectorAll('input[name*="tbProductCount"]');
    const tempValue = document.getElementById("abcdefghijk")?.value;
    countInputs.forEach((input, idx) => {
      input.value = tempValue;
    });
    const linkBtn = document.querySelector('a[href*="WebForm_DoPostBackWithOptions"]');
    linkBtn.click();
  }

  if (isOrderPayment()) {
    const confirmButton = [...document.querySelectorAll("a")].find((a) => a.textContent.includes("ご注文内容確認へ"));
    confirmButton.click();
  }

  if (isConfirm()) {
    const submitBtn = document.querySelector('[id*="lbCompleteAfterComfirmPayment"]');
    if (localStorage.getItem(STORAGE_SUBMIT_DIRECTLY, false) == "true") {
      console.log("自动提交");
      //   submitBtn.click();
    }
  }
})();