PageSourceSearch

https://digiu.ai/js/script.js

js digiu.ai collected 2026-10-04 10:41:44 UTC 11,651 bytes, 379 lines download raw bytes

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.