// /public/assets/js/fakecheck/fakecheck.serial.js (function () { if (!window.usbcheck) return; const { cfg, t, tFmt, log: logLine } = window.usbcheck; const rootSc = document.getElementById("serialcheck-root"); if (!rootSc) return; // Partial nicht eingebunden → nichts tun // Elemente const form = rootSc.querySelector("#serialcheck-form"); const errorBox = rootSc.querySelector("#serialcheck-error"); const resultBox = rootSc.querySelector("#serialcheck-result"); const manufacturerInput = rootSc.querySelector("#sc-manufacturer"); const vidInput = rootSc.querySelector("#sc-vid"); const pidInput = rootSc.querySelector("#sc-pid"); const serialInput = rootSc.querySelector("#sc-serial"); const apiUrl = cfg.apiBase.replace(/\/+$/, "") + "/quickcheck"; // ------------------------------------------------------- // Fehleranzeige // ------------------------------------------------------- function showScError(msgKey, fallback, vars = {}) { if (!errorBox) return; const msg = tFmt(msgKey, fallback, vars); errorBox.textContent = msg; errorBox.classList.remove("hidden"); if (resultBox) resultBox.classList.add("hidden"); } function clearScError() { if (!errorBox) return; errorBox.classList.add("hidden"); errorBox.textContent = ""; } // ------------------------------------------------------- // Ergebnis rendern // ------------------------------------------------------- function renderScResult(data) { if (!resultBox) return; clearScError(); resultBox.classList.remove("hidden"); const rating = data.rating || "unknown"; const input = data.input || {}; const vendorInfo = data.vendor_detected || {}; const serialInfo = data.serial_analysis || {}; const consistency = data.consistency || {}; // Rating → Label + Beschreibung const ratingLabel = t(`serial.rating.${rating}.label`, rating); const ratingDesc = t(`serial.rating.${rating}.desc`, ""); // Auffälligkeiten const issues = serialInfo.issues || []; const issuesHtml = issues.length ? '' : `${t("serial.issues_none", "Keine besonderen Auffälligkeiten.")}`; // Vendor const vendorLine = vendorInfo.found ? tFmt("serial.vendor_detected", "{vendor} (VID {vid})", { vendor: vendorInfo.vendor, vid: vendorInfo.vid }) : vendorInfo.vid ? tFmt("serial.vendor_unknown", "Unbekannter Hersteller für VID {vid}", { vid: vendorInfo.vid }) : t("serial.vendor_none", "Keine Vendor-ID angegeben"); // Konsistenz-Notizen const notes = consistency.notes || []; const notesHtml = notes.length ? '' : ""; // HTML einsetzen resultBox.innerHTML = `
${t("serial.rating_label", "Bewertung")}: ${ratingLabel}

${ratingDesc}

${t("serial.heading_input", "Eingabedaten")}

${t("serial.input.manufacturer", "Hersteller (Angabe):")}
${input.manufacturer || '' + t("serial.none", "keine Angabe") + ''}
${t("serial.input.vidpid", "VID/PID:")}
${(input.vid || "–") + " / " + (input.pid || "–")}
${t("serial.input.vendor_detected", "Vendor aus VID:")}
${vendorLine}

${t("serial.heading_analysis", "Seriennummer-Analyse")}

${t("serial.analysis.serial", "Seriennummer:")}
${serialInfo.serial || ""}
${t("serial.analysis.length", "Länge:")}
${serialInfo.length || 0} ${t("serial.chars", "Zeichen")}
${t("serial.analysis.category", "Kategorie:")}
${serialInfo.category || "-"}
${t("serial.analysis.score", "Score:")}
${typeof serialInfo.score === "number" ? serialInfo.score : "-"} / 100
${t("serial.analysis.issues", "Auffälligkeiten:")}
${issuesHtml}

${t("serial.heading_consistency", "Hersteller-Konsistenz")}

${notesHtml}

${t("serial.disclaimer", "Diese Einschätzung basiert auf Heuristiken und kann keine Echtheit garantieren.")}

`; } // ------------------------------------------------------- // Submit-Handler // ------------------------------------------------------- if (!form) return; form.addEventListener("submit", (e) => { e.preventDefault(); clearScError(); if (resultBox) resultBox.classList.add("hidden"); const payload = { manufacturer: manufacturerInput ? manufacturerInput.value.trim() : "", vid: vidInput ? vidInput.value.trim() : "", pid: pidInput ? pidInput.value.trim() : "", serial: serialInput ? serialInput.value.trim() : "" }; if (!payload.serial) { showScError("serial.error.no_serial", "Bitte gib eine Seriennummer ein."); return; } fetch(apiUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }) .then(res => { if (!res.ok) { throw new Error("HTTP " + res.status); } return res.json(); }) .then(data => { if (!data || !data.success) { throw new Error((data && data.error) || t("serial.error.unknown", "Unerwartete Antwort vom Server.")); } renderScResult(data); }) .catch(err => { showScError("serial.error.api", "Fehler bei der Prüfung: {msg}", { msg: err.message }); }); }); })();