Newer
Older
veriq / frontend / assets / result.js
/* VerIQ result page logic */
(function () {
  "use strict";
  var $ = function (id) { return document.getElementById(id); };

  function showError(msg) {
    $("errorArea").textContent = msg;
    $("errorArea").style.display = "";
    $("loading").style.display = "none";
  }

  var m = window.location.pathname.match(/^\/result\/([A-Za-z0-9]{8})$/);
  if (!m) { showError("Invalid result link."); return; }
  var rid = m[1];

  fetch("/api/result/" + rid).then(function (r) {
    if (!r.ok) return r.json().then(function (e) { throw new Error(e.detail || r.status); });
    return r.json();
  }).then(function (d) {
    $("loading").style.display = "none";
    $("resultArea").style.display = "";

    $("iqScore").textContent = d.iq;
    var pct = d.percentile;
    $("percentileLine").textContent =
      "higher than " + pct + "% of test takers" +
      (d.calibrated === false ? " · preliminary calibration" : "");

    var badges = $("badges");
    badges.innerHTML = "";
    var b1 = document.createElement("span");
    b1.className = "badge " + (d.signature_valid ? "ok" : "bad");
    b1.textContent = d.signature_valid ? "signature valid" : "SIGNATURE INVALID";
    badges.appendChild(b1);
    if (d.flagged) {
      var bf = document.createElement("span");
      bf.className = "badge warn";
      bf.textContent = "flagged: implausible timing";
      badges.appendChild(bf);
    }
    var b2 = document.createElement("span");
    b2.className = "badge";
    b2.textContent = "bank v" + d.bank_version;
    badges.appendChild(b2);
    var b3 = document.createElement("span");
    b3.className = "badge";
    b3.textContent = d.completed_at;
    badges.appendChild(b3);

    if (d.identity) {
      var bi = document.createElement("span");
      bi.className = "badge ok";
      bi.textContent = "identity: " + d.identity;
      badges.appendChild(bi);
    }
    if (d.superseded) {
      var bs = document.createElement("span");
      bs.className = "badge warn";
      bs.textContent = "superseded by a newer result";
      badges.appendChild(bs);
    }

    var cats = $("cats");
    cats.innerHTML = "";
    var order = ["numeric", "matrix", "verbal", "spatial"];
    order.forEach(function (k) {
      var c = (d.categories || {})[k];
      if (!c) return;
      var row = document.createElement("div");
      row.className = "catrow";
      var name = document.createElement("span");
      name.className = "name";
      name.textContent = k;
      var bar = document.createElement("span");
      bar.className = "bar";
      var fill = document.createElement("span");
      fill.style.display = "block";
      fill.style.height = "100%";
      fill.style.width = Math.round(100 * c.correct / c.total) + "%";
      fill.style.background = "var(--accent2)";
      bar.appendChild(fill);
      var val = document.createElement("span");
      val.className = "val";
      val.textContent = c.correct + "/" + c.total;
      row.appendChild(name); row.appendChild(bar); row.appendChild(val);
      cats.appendChild(row);
    });

    var link = window.location.origin + "/v/" + rid;
    $("verifyLink").value = link;
    $("copyBtn").addEventListener("click", function () {
      var inp = $("verifyLink");
      inp.select();
      try { document.execCommand("copy"); } catch (e) {}
      if (navigator.clipboard) navigator.clipboard.writeText(link);
      $("copyBtn").textContent = "Copied ✓";
      setTimeout(function () { $("copyBtn").textContent = "Copy"; }, 1500);
    });


    var msg = "I scored " + d.iq + " on VerIQ — higher than " + pct +
      "% of test takers. Beat me: " + link;
    $("shareX").href = "https://twitter.com/intent/tweet?text=" +
      encodeURIComponent(msg);
    $("shareTg").href = "https://t.me/share/url?url=" +
      encodeURIComponent(link) + "&text=" +
      encodeURIComponent("I scored " + d.iq + " on VerIQ — higher than " + pct +
        "% of test takers. Beat me:");
  }).catch(function (e) {
    showError("Could not load result: " + e.message);
  });
})();