about summary refs log tree commit diff stats
path: root/src/pages/options/index.js
diff options
context:
space:
mode:
authorManeraKai <manerakai@protonmail.com>2024-07-24 12:20:49 +0300
committerManeraKai <manerakai@protonmail.com>2024-07-24 12:20:49 +0300
commit5be3c07ebf228b5595d872a7733371fe59675443 (patch)
tree98b79d65c4742fde3dd467dc6a7818c2e5726fae /src/pages/options/index.js
parentFormatting wiht prettier (diff)
downloadlibredirect-5be3c07ebf228b5595d872a7733371fe59675443.zip
Migrating UI to Svelte
Diffstat (limited to 'src/pages/options/index.js')
-rw-r--r--src/pages/options/index.js399
1 files changed, 0 insertions, 399 deletions
diff --git a/src/pages/options/index.js b/src/pages/options/index.js
deleted file mode 100644
index 8d5676e0..00000000
--- a/src/pages/options/index.js
+++ /dev/null
@@ -1,399 +0,0 @@
-import utils from "../../assets/javascripts/utils.js"
-
-let config,
-  options,
-  blacklist,
-  redirects,
-  divs = {}
-
-for (const a of document.getElementById("links").getElementsByTagName("a")) {
-  if (!a.href.includes("https://")) {
-    a.addEventListener("click", e => {
-      const path = a.getAttribute("href").replace("#", "")
-      loadPage(path)
-      e.preventDefault()
-    })
-  }
-}
-
-config = await utils.getConfig()
-options = await utils.getOptions()
-
-/**
- * @param {string} service
- */
-async function changeFrontendsSettings(service) {
-  options = await utils.getOptions()
-  const opacityDiv = document.getElementById(`${service}-opacity`)
-  if (document.getElementById(`${service}-enabled`).checked) {
-    opacityDiv.style.pointerEvents = "auto"
-    opacityDiv.style.opacity = 1
-    opacityDiv.style.userSelect = "auto"
-  } else {
-    opacityDiv.style.pointerEvents = "none"
-    opacityDiv.style.opacity = 0.4
-    opacityDiv.style.userSelect = "none"
-  }
-  for (const frontend in config.services[service].frontends) {
-    if (config.services[service].frontends[frontend].instanceList) {
-      const frontendDiv = document.getElementById(frontend)
-      if (typeof divs[service].frontend !== "undefined") {
-        if (
-          frontend == divs[service].frontend.value ||
-          (config.services[service].frontends[divs[service].frontend.value].desktopApp &&
-            divs[service].embedFrontend &&
-            frontend == divs[service].embedFrontend.value)
-        ) {
-          frontendDiv.style.display = ""
-          if (config.services[service].frontends[frontend].localhost === true) {
-            document.getElementById(`${service}-instance-div`).style.display = ""
-
-            if (options[service].instance == "localhost") {
-              frontendDiv.style.display = "none"
-            }
-          } else {
-            document.getElementById(`${service}-instance-div`).style.display = "none"
-          }
-        } else {
-          frontendDiv.style.display = "none"
-        }
-      }
-    }
-  }
-  if (document.getElementById(`${service}-redirectType`)) {
-    const frontend = options[service].frontend
-    if (config.services[service].frontends[frontend].embeddable) {
-      document.getElementById(`${service}-redirectType`).innerHTML = `
-			<option value="both" data-localise="__MSG_both__">both</options>
-			<option value="sub_frame" data-localise="__MSG_onlyEmbedded__">Only Embedded</option>
-			<option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
-			`
-    } else if (
-      config.services[service].frontends[frontend].desktopApp &&
-      Object.values(config.services[service].frontends).some(frontend => frontend.embeddable)
-    ) {
-      document.getElementById(`${service}-redirectType`).innerHTML = `
-			<option value="both" data-localise="__MSG_both__">both</options>
-			<option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
-			`
-      if (options[service].redirectType == "sub_frame") {
-        options[service].redirectType = "main_frame"
-        browser.storage.local.set({ options })
-      }
-    } else {
-      document.getElementById(`${service}-redirectType`).innerHTML =
-        '<option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>'
-      options[service].redirectType = "main_frame"
-
-      browser.storage.local.set({ options })
-    }
-    document.getElementById(`${service}-redirectType`).value = options[service].redirectType
-    if (config.services[service].frontends[frontend].desktopApp && options[service].redirectType != "main_frame") {
-      document.getElementById(`${service}-embedFrontend-div`).style.display = ""
-      document.getElementById(divs[service].embedFrontend.value).style.display = ""
-    } else if (
-      config.services[service].frontends[frontend].desktopApp &&
-      options[service].redirectType == "main_frame"
-    ) {
-      document.getElementById(`${service}-embedFrontend-div`).style.display = "none"
-      document.getElementById(divs[service].embedFrontend.value).style.display = "none"
-    } else {
-      document.getElementById(`${service}-embedFrontend-div`).style.display = "none"
-    }
-  }
-  const frontend_name_element = document.getElementById(`${service}_page`).getElementsByClassName("frontend_name")[0]
-  frontend_name_element.href = config.services[service].frontends[divs[service].frontend.value].url
-}
-
-/**
- * @param {string} path
- */
-async function loadPage(path) {
-  options = await utils.getOptions()
-  for (const section of document.getElementById("pages").getElementsByTagName("section")) section.style.display = "none"
-  document.getElementById(`${path}_page`).style.display = "block"
-
-  for (const element of document.getElementsByClassName("title")) {
-    const a = element.getElementsByTagName("a")[0]
-    if (a.getAttribute("href") == `#${path}`) {
-      element.classList.add("selected")
-    } else {
-      element.classList.remove("selected")
-    }
-  }
-
-  for (const service in config.services) {
-    if (options[service].enabled) {
-      document.getElementById(`${service}-link`).style.opacity = 1
-    } else {
-      document.getElementById(`${service}-link`).style.opacity = 0.4
-    }
-  }
-
-  window.history.pushState({ id: "100" }, "Page 2", `/pages/options/index.html#${path}`)
-
-  if (path != "general") {
-    const service = path
-    divs[service] = {}
-    for (const option in config.services[service].options) {
-      divs[service][option] = document.getElementById(`${service}-${option}`)
-      if (typeof config.services[service].options[option] == "boolean")
-        divs[service][option].checked = options[service][option]
-      else divs[service][option].value = options[service][option]
-      divs[service][option].addEventListener("change", async () => {
-        let options = await utils.getOptions()
-        if (typeof config.services[service].options[option] == "boolean")
-          options[service][option] = divs[service][option].checked
-        else options[service][option] = divs[service][option].value
-        browser.storage.local.set({ options })
-        changeFrontendsSettings(service)
-      })
-    }
-    changeFrontendsSettings(service)
-
-    blacklist = await utils.getBlacklist(options)
-    redirects = await utils.getList(options)
-    for (const frontend in config.services[service].frontends) {
-      if (config.services[service].frontends[frontend].instanceList) {
-        if (redirects == "disabled" || blacklist == "disabled") {
-          document.getElementById(frontend).getElementsByClassName("clearnet")[0].style.display = "none"
-          document.getElementById(frontend).getElementsByClassName("ping")[0].style.display = "none"
-        } else if (!redirects || !blacklist) {
-          document
-            .getElementById(frontend)
-            .getElementsByClassName("clearnet")[0]
-            .getElementsByClassName("checklist")[0]
-            .getElementsByClassName("loading")[0].innerHTML = "Could not fetch instances."
-        } else {
-          createList(frontend)
-        }
-      }
-    }
-
-    for (const frontend in config.services[service].frontends) {
-      if (config.services[service].frontends[frontend].instanceList) {
-        processCustomInstances(frontend)
-        document.getElementById(`ping-${frontend}`).addEventListener("click", async () => {
-          document.getElementById(`ping-${frontend}`).getElementsByTagName("x")[0].innerHTML = "Pinging..."
-          await ping(frontend)
-          document.getElementById(`ping-${frontend}`).getElementsByTagName("x")[0].innerHTML = "Ping instances"
-        })
-      }
-    }
-  }
-}
-
-async function calcCustomInstances(frontend) {
-  let options = await utils.getOptions()
-  let customInstances = options[frontend]
-  const pingCache = await utils.getPingCache()
-
-  document.getElementById(frontend).getElementsByClassName("custom-checklist")[0].innerHTML = customInstances
-    .map(x => {
-      const time = pingCache[x]
-      if (time) {
-        var { color, text } = processTime(time)
-      }
-      const timeText = time ? `<span class="ping" style="color:${color};">${text}</span>` : ""
-      const custom = isCustomInstance(frontend, x) ? "" : `<span>custom</span>`
-      return `<div>
-							<x>
-								<a href="${x}" target="_blank">${x}</a>
-								${timeText}
-								${custom}
-							</x>
-							<button class="add clear-${x}">
-								<svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
-									<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z" />
-								</svg>
-							</button>
-						</div>
-						<hr>`
-    })
-    .join("\n")
-  for (const item of customInstances) {
-    document
-      .getElementById(frontend)
-      .getElementsByClassName(`clear-${item}`)[0]
-      .addEventListener("click", async () => {
-        const index = customInstances.indexOf(item)
-        if (index > -1) customInstances.splice(index, 1)
-        options = await utils.getOptions()
-        options[frontend] = customInstances
-        browser.storage.local.set({ options }, async () => {
-          calcCustomInstances(frontend)
-          createList(frontend)
-        })
-      })
-  }
-}
-
-async function processCustomInstances(frontend) {
-  calcCustomInstances(frontend)
-  document
-    .getElementById(frontend)
-    .getElementsByClassName("custom-instance-form")[0]
-    .addEventListener("submit", async event => {
-      event.preventDefault()
-      let options = await utils.getOptions()
-      let customInstances = options[frontend]
-      let frontendCustomInstanceInput = document.getElementById(frontend).getElementsByClassName("custom-instance")[0]
-      try {
-        var url = new URL(frontendCustomInstanceInput.value)
-      } catch (error) {
-        return
-      }
-      let protocolHostVar = utils.protocolHost(url)
-      if (frontendCustomInstanceInput.validity.valid) {
-        if (!customInstances.includes(protocolHostVar)) {
-          customInstances.push(protocolHostVar)
-          options = await utils.getOptions()
-          options[frontend] = customInstances
-          browser.storage.local.set({ options }, () => {
-            frontendCustomInstanceInput.value = ""
-            calcCustomInstances(frontend)
-          })
-        }
-      }
-    })
-}
-
-/**
- * @param {string} frontend
- */
-async function createList(frontend) {
-  const pingCache = await utils.getPingCache()
-  const options = await utils.getOptions()
-  for (const network in config.networks) {
-    const checklist = document
-      .getElementById(frontend)
-      .getElementsByClassName(network)[0]
-      .getElementsByClassName("checklist")[0]
-
-    if (!redirects[frontend]) {
-      checklist.innerHTML = '<div class="block block-option">No instances found.</div>'
-      break
-    }
-
-    const instances = redirects[frontend][network]
-    if (!instances || instances.length === 0) continue
-
-    document.getElementById(frontend).getElementsByClassName("custom-instance")[0].placeholder =
-      redirects[frontend].clearnet[0]
-
-    instances.sort((a, b) => blacklist.cloudflare.includes(a) && !blacklist.cloudflare.includes(b))
-    const content = instances.map(x => {
-      const cloudflare = blacklist.cloudflare.includes(x)
-        ? `<a target="_blank" href="https://libredirect.github.io/docs.html#instances">
-                        <span style="color:red;">cloudflare</span>
-                    </a>`
-        : ""
-
-      let time = pingCache[x]
-      let timeText = ""
-      if (time) {
-        const { color, text } = processTime(time)
-        timeText = `<span class="ping" style="color:${color};">${text}</span>`
-      }
-
-      const chosen = options[frontend].includes(x) ? `<span style="color:grey;">chosen</span>` : ""
-
-      const warnings = [cloudflare, timeText, chosen].join(" ")
-      return `<div class="frontend">
-                            <x>
-                                <a href="${x}" target="_blank">${x}</a>
-								${warnings}
-                            </x>
-                            <button class="add add-${x}">
-                                <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
-                                    <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" />
-                                </svg>
-                            </button>
-                        </div>`
-    })
-
-    checklist.innerHTML = [
-      `<div class="block block-option">
-                <label>${utils.camelCase(network)}</label>
-            </div>`,
-      ...content,
-      "<br>",
-    ].join("\n<hr>\n")
-
-    for (const instance of instances) {
-      checklist.getElementsByClassName(`add-${instance}`)[0].addEventListener("click", async () => {
-        let options = await utils.getOptions()
-        if (!options[frontend].includes(instance)) {
-          options[frontend].push(instance)
-          browser.storage.local.set({ options }, () => {
-            calcCustomInstances(frontend)
-            createList(frontend)
-          })
-        }
-      })
-    }
-  }
-}
-
-const r = window.location.href.match(/#(.*)/)
-if (r) loadPage(r[1])
-else loadPage("general")
-
-/**
- * @param {string} frontend
- */
-async function ping(frontend) {
-  const instanceElements = [
-    ...document.getElementById(frontend).getElementsByClassName("custom-checklist")[0].getElementsByTagName("x"),
-    ...document.getElementById(frontend).getElementsByClassName("clearnet")[0].getElementsByTagName("x"),
-  ]
-
-  let pingCache = await utils.getPingCache()
-  let redundancyList = {}
-  for (const element of instanceElements) {
-    let span = element.getElementsByClassName("ping")[0]
-    if (!span) span = document.createElement("span")
-    span.classList = ["ping"]
-    span.innerHTML = '<span style="color:lightblue">pinging...</span>'
-    element.appendChild(span)
-    const href = element.getElementsByTagName("a")[0].href
-    const innerHTML = element.getElementsByTagName("a")[0].innerHTML
-    const time = redundancyList[innerHTML] ?? (await utils.ping(href))
-    const { color, text } = processTime(time)
-    span.innerHTML = `<span style="color:${color};">${text}</span>`
-    pingCache[innerHTML] = time
-    redundancyList[innerHTML] = time
-
-    browser.storage.local.set({ pingCache })
-  }
-}
-
-/**
- * @param {number} time
- */
-function processTime(time) {
-  let text
-  let color
-  if (time < 5000) {
-    text = `${time}ms`
-    if (time <= 1000) color = "green"
-    else if (time <= 2000) color = "orange"
-  } else if (time >= 5000) {
-    color = "red"
-    if (time == 5000) text = "5000ms+"
-    if (time > 5000) text = `Error: ${time - 5000}`
-  } else {
-    color = "red"
-    text = "Server not found"
-  }
-  return { color, text }
-}
-
-function isCustomInstance(frontend, instance) {
-  for (const network in config.networks) {
-    if (!redirects[frontend]) return false
-    const instances = redirects[frontend][network]
-    if (instances.includes(instance)) return true
-  }
-  return false
-}