import { login, register, getLinks, createLink, deleteLink, updateLink } from "./api.js"; const URL_SVR = "https://myapps_svr.patachina2.casacam.net"; let token = null; let autoIconURL = null; let editingId = null; // =============================== // MOSTRA DIMENSIONI IMMAGINE // =============================== function showImageSize(imgElement, sizeElement) { const img = new Image(); img.onload = () => { sizeElement.textContent = `${img.width} × ${img.height} px`; sizeElement.style.display = "block"; }; img.src = imgElement.src; } // =============================== // AUTH // =============================== function setToken(t) { token = t; document.getElementById("authSection").style.display = token ? "none" : "block"; document.getElementById("linkSection").style.display = token ? "block" : "none"; if (token) loadLinks(); } document.getElementById("loginForm").addEventListener("submit", async e => { e.preventDefault(); try { const t = await login(e.target.email.value, e.target.password.value); setToken(t); } catch (err) { document.getElementById("authStatus").textContent = err.message; } }); document.getElementById("registerForm").addEventListener("submit", async e => { e.preventDefault(); try { await register(e.target.email.value, e.target.password.value); document.getElementById("authStatus").textContent = "Registrato! Ora accedi."; } catch (err) { document.getElementById("authStatus").textContent = err.message; } }); // =============================== // LOAD LINKS // =============================== async function loadLinks() { const links = await getLinks(token); const list = document.getElementById("list"); list.innerHTML = links .map( link => `
` ) .join(""); } // =============================== // METADATA (icona automatica) // =============================== document.getElementById("fetchMetaBtn").addEventListener("click", async () => { const url = document.getElementById("urlInput").value.trim(); if (!url) return; const res = await fetch(`${URL_SVR}/metadata?url=${encodeURIComponent(url)}`); const data = await res.json(); document.getElementById("nameInput").value = data.name || ""; autoIconURL = data.icon || null; // L’icona automatica è l’ultima scelta → reset input manuale const fileInput = document.getElementById("iconInput"); fileInput.value = ""; const preview = document.getElementById("iconPreview"); const sizeBox = document.getElementById("iconSize"); if (autoIconURL) { preview.src = autoIconURL; preview.style.display = "block"; sizeBox.style.display = "none"; showImageSize(preview, sizeBox); } }); // =============================== // ANTEPRIMA ICONA MANUALE // =============================== document.getElementById("iconInput").addEventListener("change", e => { const file = e.target.files[0]; if (!file) return; autoIconURL = null; // manuale vince const preview = document.getElementById("iconPreview"); const sizeBox = document.getElementById("iconSize"); preview.src = URL.createObjectURL(file); preview.style.display = "block"; sizeBox.style.display = "none"; showImageSize(preview, sizeBox); }); // =============================== // CREAZIONE LINK // =============================== document.getElementById("linkForm").addEventListener("submit", async e => { e.preventDefault(); const raw = new FormData(e.target); const manualFile = raw.get("icon"); const hasManualFile = manualFile instanceof File && manualFile.size > 0; await createLink(token, { name: raw.get("name"), url: raw.get("url"), iconFile: hasManualFile ? manualFile : null, iconURL: !hasManualFile ? autoIconURL : null }); autoIconURL = null; document.getElementById("iconPreview").style.display = "none"; document.getElementById("iconSize").style.display = "none"; e.target.reset(); loadLinks(); }); // =============================== // EDIT // =============================== document.getElementById("list").addEventListener("click", e => { const id = e.target.dataset.id; if (!id) return; if (e.target.classList.contains("deleteBtn")) { deleteLink(token, id).then(loadLinks); return; } if (e.target.classList.contains("editBtn")) { editingId = id; const item = e.target.closest(".item"); const name = item.querySelector("strong").textContent; const url = item.querySelector("a").textContent; const form = document.getElementById("editForm"); form.name.value = name; form.url.value = url; document.getElementById("iconPreviewEdit").style.display = "none"; document.getElementById("iconSizeEdit").style.display = "none"; document.getElementById("editModal").style.display = "flex"; } }); // ANTEPRIMA MANUALE IN EDIT document.getElementById("iconInputEdit").addEventListener("change", e => { const file = e.target.files[0]; if (!file) return; const preview = document.getElementById("iconPreviewEdit"); const sizeBox = document.getElementById("iconSizeEdit"); preview.src = URL.createObjectURL(file); preview.style.display = "block"; sizeBox.style.display = "none"; showImageSize(preview, sizeBox); }); // SALVA EDIT document.getElementById("editForm").addEventListener("submit", async e => { e.preventDefault(); const name = e.target.name.value; const url = e.target.url.value; const iconFile = e.target.icon.files[0] || null; await updateLink(token, editingId, { name, url, iconFile, iconURL: null }); document.getElementById("editModal").style.display = "none"; loadLinks(); }); document.getElementById("closeModal").addEventListener("click", () => { document.getElementById("editModal").style.display = "none"; }); setToken(null);