1function validateEmail(email) { 2 const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 3 return regex.test(email); 4} 5 6document.addEventListener("DOMContentLoaded", () => { 7 landingPopupHandler(); 8 langDdHandler(); 9 10 const currentLang = getCookie("lang") || "en"; 11 applyFontForLang(currentLang); 12 loadTranslations(currentLang).then(() => { 13 applyTranslations(); 14 loadNews(currentLang); 15 changeLink(currentLang); 16 document.querySelector(".lang_val").innerHTML = currentLang; 17 }); 18 const form = document.getElementById("subscribeForm"); 19 const emailInput = document.getElementById("emailInput"); 20 const errorMessage = document.getElementById("errorMessage"); 21 const successPopup = document.getElementById("successPopup"); 22 const closePopup = document.getElementById("closePopup"); 23 24 const requestPopup = document.querySelector(".request_popup"); 25 const requestBtns = document.querySelectorAll(".request_btn, .provider_btn"); 26 const closeRequestPopup = document.querySelector("#closeRequestPopup"); 27 const closeSuccessPopup = document.querySelector("#closeSuccessRequestPopup"); 28 29 const nameInput = document.querySelector("#nameInput"); 30 const requestText = document.querySelector("#requestText"); 31 const nameError = document.querySelector("#nameError"); 32 const emailError = document.querySelector("#emailRequestError"); 33 const requestError = document.querySelector("#requestError"); 34 const submitBtn = document.querySelector("#submitRequestBtn"); 35 36 const burger = document.querySelector(".burger_menu_ico"); 37 const mobileMenu = document.querySelector(".mobile_menu"); 38 const menuWindow = document.querySelector(".mobile_menu__win"); 39 40 // ---------ÐобилÑное менÑ--------- 41 burger.addEventListener("click", function (e) { 42 e.stopPropagation(); 43 mobileMenu.classList.toggle("active"); 44 }); 45 46 mobileMenu.addEventListener("click", function (e) { 47 // еÑли клик вне окна Ð¼ÐµÐ½Ñ â закÑÑваем 48 if (!menuWindow.contains(e.target)) { 49 mobileMenu.classList.remove("active"); 50 } 51 }); 52 53 // заÑиÑа Ð¾Ñ ÑлÑÑайного закÑÑÑÐ¸Ñ Ð¿Ñи клике по ÑÐ°Ð¼Ð¾Ð¼Ñ Ð¾ÐºÐ½Ñ 54 menuWindow.addEventListener("click", function (e) { 55 e.stopPropagation(); 56 }); 57 // ---------ÐобилÑное менÑ--------- 58 59 // Open popups 60 requestBtns.forEach((btn) => { 61 btn.addEventListener("click", () => { 62 successPopup.querySelector("p").textContent = 63 "Your request has been sent successfully!"; 64 requestPopup.style.display = "flex"; 65 requestPopup.dataset.source = btn.innerText; // Ð¡Ð¾Ñ ÑанÑем иÑÑоÑник в dataset 66 }); 67 }); 68 69 // Close popups 70 closeRequestPopup?.addEventListener( 71 "click", 72 () => (requestPopup.style.display = "none") 73 ); 74 closeSuccessPopup?.addEventListener( 75 "click", 76 () => (successPopup.style.display = "none") 77 ); 78 79 // Form submission handler 80 submitBtn?.addEventListener("click", async () => { 81 // Validate fields 82 let isValid = true; 83 84 if (!nameInput?.value.trim()) { 85 nameError.style.display = "block"; 86 isValid = false; 87 } else { 88 nameError.style.display = "none"; 89 } 90 91 const emailRequestInput = document.querySelector("#emailRequestInput"); 92 if (!validateEmail(emailRequestInput.value.trim())) { 93 emailError.style.display = "block"; 94 isValid = false; 95 } else { 96 emailError.style.display = "none"; 97 } 98 99 if (!requestText?.value.trim()) { 100 requestError.style.display = "block"; 101 isValid = false; 102 } else { 103 requestError.style.display = "none"; 104 } 105 106 if (!isValid) return; 107 108 // Save data to file 109 try { 110 const response = await fetch("/save-request", { 111 method: "POST", 112 headers: { "Content-Type": "application/json" }, 113 body: JSON.stringify({ 114 name: nameInput.value.trim(), 115 email: emailInput.value.trim(), 116 request: requestText.value.trim(), 117 source: requestPopup.dataset.source || "Unknown", 118 }), 119 }); 120 121 if (response.ok) { 122 requestPopup.style.display = "none"; 123 successPopup.style.display = "flex"; 124 nameInput.value = ""; 125 emailInput.value = ""; 126 requestText.value = ""; 127 } else { 128 console.error("Error saving request:", await response.text()); 129 } 130 } catch (error) { 131 console.error("Request error:", error); 132 } 133 }); 134 135 form?.addEventListener("submit", async (event) => { 136 event.preventDefault(); // ÐÑедоÑвÑаÑаем оÑпÑÐ°Ð²ÐºÑ ÑоÑÐ¼Ñ 137 138 const email = emailInput?.value.trim(); 139 if (!validateEmail(email)) { 140 errorMessage.style.display = "block"; 141 return; 142 } 143 144 errorMessage.style.display = "none"; 145 146 try { 147 const response = await fetch("/subscribe", { 148 method: "POST", 149 headers: { "Content-Type": "application/json" }, 150 body: JSON.stringify({ email }), 151 }); 152 153 if (response.ok) { 154 successPopup.style.display = "flex"; 155 emailInput.value = ""; // ÐÑиÑÑиÑÑ Ð¿Ð¾Ð»Ðµ ввода 156 } else { 157 console.error("Subscription error:", await response.text()); 158 } 159 } catch (error) { 160 console.error("Request error:", error); 161 } 162 }); 163 164 closePopup?.addEventListener("click", () => { 165 successPopup.style.display = "none"; 166 }); 167}); 168 169let translations = {}; 170 171function loadTranslations(lang) { 172 return fetch("/translations.json") 173 .then((response) => response.json()) 174 .then((data) => { 175 translations = data[lang] || {}; 176 }) 177 .catch((error) => { 178 console.error("Error loading translations:", error); 179 }); 180} 181 182function applyTranslations() { 183 const elements = document.querySelectorAll("[data-translate]");
184 elements.forEach((el) => { 185 const textKey = el.getAttribute("data-translate"); 186 if (textKey) { 187 let translatedText = translations[textKey] || textKey; 188 189 el.innerHTML = translatedText; 190 } 191 }); 192} 193 194function changeLink(lang) { 195 const presLinksArr = { 196 ru: "https://store.dglab.dev/solana-validators.pdf", 197 en: "https://store.dglab.dev/solana-validators-en.pdf", 198 fr: "https://store.dglab.dev/solana-validators-fr.pdf", 199 }; 200 201 const becomeSolanaBtn = document.querySelector(".become_solana_btn"); 202 if (lang === "ru") { 203 becomeSolanaBtn.setAttribute("href", presLinksArr["ru"]); 204 } else if (lang === "fr") { 205 becomeSolanaBtn.setAttribute("href", presLinksArr["fr"]); 206 } else { 207 becomeSolanaBtn.setAttribute("href", presLinksArr["en"]); 208 } 209} 210 211function landingPopupHandler() { 212 const referralCode = document 213 .getElementById("registrationButton") 214 .getAttribute("data-referral-code"); 215 const registrationButton = document.getElementById("registrationButton"); 216 217 registrationButton.addEventListener("click", function () { 218 window.location.href = `https://lk.digiu.ai/auth/registration/${referralCode}`; 219 }); 220 221 const popups = document.querySelectorAll(".popup_ui"); 222 const showPopup = (popup) => popup.classList.add("show"); 223 const hidePopup = (popup) => popup.classList.remove("show"); 224 225 document.querySelectorAll(".login_btn, .subscribe_btn").forEach((button) => { 226 button.addEventListener("click", function () { 227 const popupClass = this.classList.contains("login_btn") 228 ? ".login_popup" 229 : ".success_popup"; 230 const popup = document.querySelector(popupClass); 231 if (popup) { 232 showPopup(popup); 233 popup.querySelector("p").textContent = "Subscription successful!"; 234 } 235 }); 236 }); 237 238 popups.forEach((popup) => { 239 const closeButton = popup.querySelector(".cross_ico"); 240 const popupWin = popup.querySelector(".popup_ui__win"); 241 const agreeButton = popup.querySelector(".subscr_agree_btn"); 242 243 if (closeButton) { 244 closeButton.addEventListener("click", (event) => { 245 hidePopup(popup); 246 event.stopPropagation(); 247 }); 248 } 249 250 popup.addEventListener("click", (event) => { 251 if (!popupWin.contains(event.target)) { 252 hidePopup(popup); 253 } 254 }); 255 256 if (agreeButton) { 257 agreeButton.addEventListener("click", () => hidePopup(popup)); 258 } 259 }); 260} 261 262function langDdHandler() { 263 const dropdowns = document.querySelectorAll(".lang_dropdown"); 264 265 dropdowns.forEach((dropdown) => { 266 const dropdownList = dropdown.querySelector(".lang_dropdown__dd_list"); 267 const selectedDisplay = dropdown.querySelector(".chosen_item"); 268 269 if (!dropdownList || !selectedDisplay) return; 270 271 // Ðлик по вÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ ÑлеменÑÑ â показаÑÑ/ÑпÑÑÑаÑÑ ÑпиÑок 272 dropdown.addEventListener("click", function (event) { 273 event.stopPropagation(); 274 dropdown.classList.toggle("active"); 275 }); 276 277 // Ðлик вне â закÑÑÑÑ Ð²Ñе dropdown 278 document.addEventListener("click", function () { 279 dropdown.classList.remove("active"); 280 }); 281 282 // Ðлик по ÑлеменÑÑ ÑпиÑка 283 dropdownList.addEventListener("click", function (event) { 284 const selectedItem = event.target.closest("li"); 285 if (selectedItem) { 286 event.stopPropagation(); 287 288 const selectedImgSrc = selectedItem.querySelector("img").src; 289 const selectedLang = selectedItem.getAttribute("data-lang"); 290 291 selectedDisplay.querySelector("img").src = selectedImgSrc; 292 selectedDisplay.querySelector(".lang_val").innerText = 293 selectedLang.toUpperCase(); 294 295 setCookie("lang", selectedLang); 296 applyFontForLang(selectedLang); 297 loadTranslations(selectedLang).then(() => { 298 applyTranslations(); 299 loadNews(selectedLang); 300 changeLink(selectedLang); 301 }); 302 303 dropdown.classList.remove("active"); 304 } 305 }); 306 }); 307} 308 309function applyFontForLang(lang) { 310 document.body.classList.toggle("font_montserrat", lang === "vn"); 311} 312 313const mapLang = { 314 ru: "ru-RU", 315 en: "en-US", 316 fr: "fr-FR", 317 es: "es-ES", 318 vn: "vi-VN", 319 hi: "hi-IN", 320 id: "id-ID", 321}; 322 323async function loadNews(language = "en") { 324 const response = await fetch( 325 `https://api-lk.digiu.ai/News/List?language=${mapLang[language]}`, 326 { 327 method: "POST", 328 headers: { "Content-Type": "application/json" }, 329 body: JSON.stringify({ 330 skip: 0, 331 take: 3, 332 sort: [{ selector: "datePublished", desc: true }], 333 requireTotalCount: false, 334 }), 335 } 336 ); 337 338 const result = await response.json(); 339 340 if (!result.success) { 341 console.error(result.error); 342 return; 343 } 344 345 console.log(mapLang[language]); 346 347 const newsData = result.data.data; // маÑÑив новоÑÑей 348 349 const newsContainer = document.getElementById("news-container"); 350 newsContainer.innerHTML = ""; 351 352 newsData.forEach((news) => { 353 const newsItem = document.createElement("a"); 354 newsItem.className = "news_sec__news_itm"; 355 newsItem.href = news.url;
356 newsItem.href = `https://lk.digiu.ai/newsDetails/${news.year}/${mapLang[language]}/${news.id}`; 357 newsItem.target = "_blank"; 358 newsItem.rel = "noopener noreferrer"; 359 360 newsItem.innerHTML = ` 361 <div class="news_sec__news_date">${news.datePublished}</div> 362 <div class="news_sec__news_img"> 363 <img src="${news.mainImage}" alt=""> 364 </div> 365 <div class="news_sec__news_h">${news.title}</div> 366 <div class="news_sec__news_txt">${news.titleText}</div>`; 367 368 newsContainer.appendChild(newsItem); 369 }); 370} 371 372function getCookie(name) { 373 const match = document.cookie.match(new RegExp("(^| )" + name + "=([^;]+)")); 374 return match ? match[2] : null; 375} 376 377function setCookie(name, value) { 378 document.cookie = `${name}=${value};path=/;max-age=31536000`; 379}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.