Bs ToastPopup

Popup for toast

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.sleazyfork.org/scripts/578336/1863929/Bs%20ToastPopup.js

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

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

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

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

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

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

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

Advertisement:

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

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

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

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

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

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

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

Advertisement:

// ==UserScript==
// @name        Bsodergren Library
// @version     1.10.4
// @grant       GM_xmlhttpRequest
// @grant       nsafeWindow
// @license     MIT
// @namespace   https://greasyfork.org/users/984905
// ==/UserScript==

function showToast(message, duration = 3000, cmdElement = null)
{
  // Create toast container if it doesn't exist
  let container = document.getElementById('tm-toast-container')
  if (!container)
  {
    container = document.createElement('div')
    container.id = 'tm-toast-container'
    container.style.position = 'fixed'
    container.style.top = '20px'
    container.style.left = '20px'
    container.style.zIndex = '999999'
    container.style.display = 'flex'
    container.style.flexDirection = 'column'
    container.style.gap = '10px'
    document.body.appendChild(container)
  }

  // Create toast element
  const toast = document.createElement('div')
  toast.textContent = message
  toast.style.background = 'rgb(0, 0, 0)'
  toast.style.color = '#fff'
  toast.style.padding = '10px 16px'
  toast.style.borderRadius = '6px'
  toast.style.borderColor = 'white'
  toast.style.borderWidth = '3px'
  toast.style.borderStyle = 'double'
  toast.style.fontSize = '18px'
  toast.style.boxShadow = '0 2px 8px rgba(0,0,0,0.3)'
  toast.style.opacity = '0.5'
  toast.style.transition = 'opacity 0.3s ease'

  container.appendChild(toast)

  // Fade in
  requestAnimationFrame(() =>
  {
    toast.style.opacity = '1'
  })

  // Remove after duration
  setTimeout(() =>
  {
    toast.style.opacity = '0'
    toast.addEventListener('transitionend', () =>
    {
      toast.remove()
      if (cmdElement !== null)
      {
        cmdElement()
      }
    })
  }, duration)
}
// end function showToast

function waitForElement(selector, callback)
{
  const observer = new MutationObserver(() =>
  {
    const element = document.querySelector(selector)
    if (element)
    {
      observer.disconnect() // Stop observing
      callback(element)
    }
  })

  // Observe changes in the entire document
  observer.observe(document.body, {
    childList: true,
    subtree: true
  })
}

// end function WaitForElement


function jsonToUrlEncoded(jsonObj)
{
  if (typeof jsonObj !== 'object' || jsonObj === null)
  {
    throw new Error('Input must be a non-null object')
  }
  return Object.keys(jsonObj)
    .map(
      key => encodeURIComponent(key) + '=' + encodeURIComponent(jsonObj[key])
    )
    .join('&')
}

// end function jsonToUrlEncoded


function saveToLocalServer(postUrl, data, toast, command = null)
{
  postUrl = 'http://media.lan/plex/' + postUrl
  const encoded = jsonToUrlEncoded(data)

  GM_xmlhttpRequest({
    method: 'POST',
    url: postUrl,
    data: encoded,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    responseType: 'document',
    onload: function (response)
    {
      var responseXML = response.responseXML
      if (!responseXML)
      {
        try
        {
          responseXML = new DOMParser().parseFromString(
            response.responseText,
            'text/html'
          )
        } catch (err) { }
      }
      showToast(response.responseText, 3000, command)
      sentback(response.responseText)
    }
  })
}
// end saveToLocalServer


function sentback(str)
{
  newstr = str.replace('Saved as ', '')
  if (newstr.startsWith('x'))
  {
    favBtn = document.getElementById('favorites_del')
    if (favBtn !== null)
    {
      favBtn.click()
    }
    console.log(str)
  }
}
// end function sendback