const homeReleases = "https://gitlab.com/api/v4/projects/vyla-entertainment%2Fhome/releases?per_page=100"; const goReleases = "https://gitlab.com/api/v4/projects/vyla-entertainment%2Fgo/releases?per_page=100"; async function loadDownloads() { try { const [homeResponse, goResponse] = await Promise.all([ fetch(homeReleases), fetch(goReleases) ]); if (!homeResponse.ok || !goResponse.ok) { throw new Error("Failed to fetch GitLab releases"); } const [homeReleasesData, goReleasesData] = await Promise.all([ homeResponse.json(), goResponse.json() ]); let windowsUrl = null; let macUrl = null; let androidUrl = null; for (const release of homeReleasesData) { const assets = release.assets?.links || []; const windows = assets.find(asset => /\.exe$/i.test(asset.name) || /\.exe$/i.test(asset.url) ); const mac = assets.find(asset => /\.dmg$/i.test(asset.name) || /\.dmg$/i.test(asset.url) ); if (!windowsUrl && windows) { windowsUrl = windows.url; } if (!macUrl && mac) { macUrl = mac.url; } if (windowsUrl && macUrl) { break; } } for (const release of goReleasesData) { const assets = release.assets?.links || []; const android = assets.find(asset => /\.apk$/i.test(asset.name) || /\.apk$/i.test(asset.url) ); if (android) { androidUrl = android.url; break; } } setDownload("windows-download", windowsUrl, "download windows (.exe)"); setDownload("mac-download", macUrl, "download mac (.dmg)"); setDownload("android-download", androidUrl, "download android (.apk)"); } catch { setDownload("windows-download", null, "unavailable"); setDownload("mac-download", null, "unavailable"); setDownload("android-download", null, "unavailable"); } } function setDownload(id, url, label) { const link = document.getElementById(id); if (!link) return; if (url) { link.href = url; link.textContent = label; } else { link.removeAttribute("href"); link.textContent = label; } } async function fetchJSON(path) { try { const res = await fetch(path); if (!res.ok) return null; return await res.json(); } catch { return null; } } async function loadData() { const [partners, reviews, faq] = await Promise.all([ fetchJSON("src/data/partners.json"), fetchJSON("src/data/reviews.json"), fetchJSON("src/data/faq.json") ]); const revContainer = document.getElementById("reviews-output"); if (revContainer && Array.isArray(reviews)) { let revText = "\nReviews:\n"; reviews.forEach(r => { revText += `"${r.text}" - ${r.name} (${r.handle})\n`; }); revContainer.textContent = revText; } const partContainer = document.getElementById("partners-output"); if (partContainer && Array.isArray(partners)) { partContainer.textContent = "\nPartners:\n"; partners.forEach(p => { const a = document.createElement("a"); a.href = p.link; a.target = "_blank"; a.rel = "noopener noreferrer"; a.textContent = `[${p.name}] ${p.link}`; a.setAttribute("aria-label", `Partner website: ${p.name}`); partContainer.appendChild(a); partContainer.appendChild(document.createTextNode("\n")); }); } const faqContainer = document.getElementById("faq-output"); if (faqContainer && Array.isArray(faq)) { let faqText = "\nFAQ:\n"; faq.forEach(f => { faqText += `Q: ${f.q}\nA: ${f.a}\n\n`; }); faqContainer.textContent = faqText; } } loadDownloads(); loadData();