mirror of
				https://github.com/schmidt1024/monero-flyer.git
				synced 2025-11-04 12:11:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			189 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// script.js
 | 
						|
 | 
						|
// language and mode management
 | 
						|
let languages = ["en", "de", "fr", "es", "pt-br", "fa", "zh"]
 | 
						|
let rtlLanguages = ["fa"]
 | 
						|
let currentLanguage = localStorage.getItem("language")
 | 
						|
if (!currentLanguage) {
 | 
						|
  currentLanguage = window.navigator.language.slice(0, 2)
 | 
						|
  if (!languages.includes(currentLanguage)) currentLanguage = "en"
 | 
						|
  localStorage.setItem("language", currentLanguage)
 | 
						|
}
 | 
						|
let currentMode = localStorage.getItem("mode")
 | 
						|
if (!currentMode) {
 | 
						|
  currentMode = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"
 | 
						|
  localStorage.setItem("mode", currentMode)
 | 
						|
}
 | 
						|
 | 
						|
// dark mode toggle
 | 
						|
const setInitialMode = () => {
 | 
						|
  if (currentMode === "dark") {
 | 
						|
    document.body.classList.remove("light-mode")
 | 
						|
    document.body.classList.add("dark-mode")
 | 
						|
    document.querySelector(".mode-switcher").classList.remove("day")
 | 
						|
    document.querySelector(".mode-switcher .moon").classList.remove("sun")
 | 
						|
  } else {
 | 
						|
    document.body.classList.add("light-mode")
 | 
						|
    document.body.classList.remove("dark-mode")
 | 
						|
    document.querySelector(".mode-switcher").classList.add("day")
 | 
						|
    document.querySelector(".mode-switcher .moon").classList.add("sun")
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
const toggleMode = () => {
 | 
						|
  currentMode = currentMode === "light" ? "dark" : "light"
 | 
						|
  localStorage.setItem("mode", currentMode)
 | 
						|
  document.body.classList.toggle("light-mode")
 | 
						|
  document.body.classList.toggle("dark-mode")
 | 
						|
  document.querySelector(".mode-switcher").classList.toggle("day")
 | 
						|
  document.querySelector(".mode-switcher .moon").classList.toggle("sun")
 | 
						|
}
 | 
						|
 | 
						|
// loading language files dynamically
 | 
						|
loadLanguage = async (lang, save = true) => {
 | 
						|
  if (save) localStorage.setItem("language", lang)
 | 
						|
 | 
						|
  const response = await fetch(`i18n/${lang}/${lang}.json`)
 | 
						|
  const translations = await response.json()
 | 
						|
 | 
						|
  document.documentElement.lang = lang
 | 
						|
  rtlLanguages.includes(lang) ? document.documentElement.setAttribute("dir", "rtl") : document.documentElement.setAttribute("dir", "ltr")
 | 
						|
 | 
						|
  if (translations.website.page_language) document.querySelector('meta[name="language"]').setAttribute("content", translations.website.page_language)
 | 
						|
  if (translations.website.page_title) document.title = translations.website.page_title
 | 
						|
  if (translations.website.page_description) document.querySelector('meta[name="description"]').setAttribute("content", translations.website.page_description)
 | 
						|
  if (translations.website.page_keywords) document.querySelector('meta[name="keywords"]').setAttribute("content", translations.website.page_keywords)
 | 
						|
 | 
						|
  document.querySelectorAll("[data-i18n]").forEach((el) => {
 | 
						|
    const key = el.getAttribute("data-i18n")
 | 
						|
    if (translations.website[key]) {
 | 
						|
      el.innerHTML = translations.website[key]
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
  if (lang === "zh") {
 | 
						|
    const link = document.createElement("link")
 | 
						|
    link.href = "https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;700&display=swap"
 | 
						|
    link.rel = "stylesheet"
 | 
						|
    document.head.appendChild(link)
 | 
						|
    document.body.style.fontFamily = "'Noto Serif SC', serif"
 | 
						|
    document.querySelectorAll("h1, h2, h3").forEach((el) => {
 | 
						|
      el.style.fontFamily = "'Noto Serif SC', serif"
 | 
						|
    })
 | 
						|
  } else {
 | 
						|
    document.body.style.fontFamily = "'Poppins', sans-serif"
 | 
						|
    document.querySelectorAll("h1, h2, h3").forEach((el) => {
 | 
						|
      el.style.fontFamily = "'Raleway', sans-serif"
 | 
						|
    })
 | 
						|
  }
 | 
						|
 | 
						|
  setPreviewImages()
 | 
						|
}
 | 
						|
 | 
						|
// preview images
 | 
						|
const setPreviewImages = () => {
 | 
						|
  const lang = localStorage.getItem("language") || "en"
 | 
						|
  const previewLightImage = document.querySelector(".preview-flyer-light img")
 | 
						|
  const previewDarkImage = document.querySelector(".preview-flyer-dark img")
 | 
						|
  previewLightImage.src = `./i18n/${lang}/preview-flyer-light.webp`
 | 
						|
  previewDarkImage.src = `./i18n/${lang}/preview-flyer-dark.webp`
 | 
						|
  previewLightImage.alt = `Preview flyer in light mode (${lang})`
 | 
						|
  previewDarkImage.alt = `Preview flyer in dark mode (${lang})`
 | 
						|
  const previewLightPdfLinks = document.querySelectorAll(".preview-flyer-light a")
 | 
						|
  const previewDarkPdfLinks = document.querySelectorAll(".preview-flyer-dark a")
 | 
						|
  previewLightPdfLinks.forEach((link) => link.href = `./i18n/${lang}/flyer-light-${lang}.pdf`)
 | 
						|
  previewDarkPdfLinks.forEach((link) => link.href = `./i18n/${lang}/flyer-dark-${lang}.pdf`)
 | 
						|
}
 | 
						|
 | 
						|
// sorting
 | 
						|
const categoryOrder = {
 | 
						|
  comfort: ["cex", "kyc_light", "atomic", "no_kyc", "dex"],
 | 
						|
  privacy: ["atomic", "dex", "no_kyc", "kyc_light", "cex"],
 | 
						|
}
 | 
						|
if (currentLanguage === "fa") {
 | 
						|
  categoryOrder.comfort = ["cex", "no_kyc", "dex", "atomic"]
 | 
						|
  categoryOrder.privacy = ["atomic", "dex", "no_kyc", "cex"]
 | 
						|
}
 | 
						|
 | 
						|
const sortCategories = (mode) => {
 | 
						|
  const exchanges = document.querySelector("#exchanges")
 | 
						|
  const blocks = {}
 | 
						|
 | 
						|
  for (const id of Object.values(categoryOrder.comfort)) {
 | 
						|
    const h2 = document.getElementById(id)
 | 
						|
    const p = document.getElementById(id + "-desc")
 | 
						|
    const div = h2.nextElementSibling.nextElementSibling
 | 
						|
    blocks[id] = [h2, p, div]
 | 
						|
  }
 | 
						|
 | 
						|
  for (const block of Object.values(blocks).flat()) {
 | 
						|
    exchanges.removeChild(block)
 | 
						|
  }
 | 
						|
 | 
						|
  for (const id of categoryOrder[mode]) {
 | 
						|
    for (const el of blocks[id]) {
 | 
						|
      exchanges.appendChild(el)
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  localStorage.setItem("sortMode", mode)
 | 
						|
}
 | 
						|
 | 
						|
// initial
 | 
						|
document.addEventListener("DOMContentLoaded", () => {
 | 
						|
  // mode
 | 
						|
  setInitialMode()
 | 
						|
 | 
						|
  // language
 | 
						|
  const savedLang = localStorage.getItem("language")
 | 
						|
  const browserLang = navigator.language.slice(0, 2)
 | 
						|
  const lang = savedLang || browserLang
 | 
						|
  loadLanguage(lang, true)
 | 
						|
  // set option with value="lang" as selected
 | 
						|
  const langSwitcher = document.querySelector(".language-switcher")
 | 
						|
  langSwitcher.querySelectorAll("option").forEach((option) => {
 | 
						|
    if (option.value === lang) {
 | 
						|
      option.selected = true
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
  // preview images
 | 
						|
  setPreviewImages()
 | 
						|
 | 
						|
  // sorting
 | 
						|
  const savedSort = localStorage.getItem("sortMode") || "comfort"
 | 
						|
  const hasSorting = document.getElementById("sort-mode")
 | 
						|
  if (hasSorting) {
 | 
						|
    document.getElementById("sort-mode").value = savedSort
 | 
						|
    sortCategories(savedSort)
 | 
						|
  }
 | 
						|
})
 | 
						|
 | 
						|
// current year
 | 
						|
document.getElementById("current-year").textContent = new Date().getFullYear()
 | 
						|
 | 
						|
// micro animation
 | 
						|
const elements = document.querySelectorAll(".fade-in")
 | 
						|
const observer = new IntersectionObserver((entries) => {
 | 
						|
  entries.forEach((entry) => {
 | 
						|
    if (entry.isIntersecting) {
 | 
						|
      entry.target.classList.add("visible")
 | 
						|
    }
 | 
						|
  })
 | 
						|
})
 | 
						|
elements.forEach((el) => observer.observe(el))
 | 
						|
 | 
						|
// exceptions
 | 
						|
if (currentLanguage === "fa") {
 | 
						|
  const krakenLink = document.querySelector('a[href="https://kraken.com"]')
 | 
						|
  if (krakenLink) {
 | 
						|
    krakenLink.href = "https://nobitex.ir/"
 | 
						|
    krakenLink.textContent = "Nobitex Exchange"
 | 
						|
  }
 | 
						|
  krakenLink.nextElementSibling.remove()
 | 
						|
 | 
						|
  document.getElementById("kyc_light").remove()
 | 
						|
  document.getElementById("kyc_light-desc").remove()
 | 
						|
  document.getElementById("kyc_light-providers").remove()
 | 
						|
}
 |