// 静的ストアのフロント。公開エンドポイント(/catalog, /checkout, /store/order)を叩く。 (function () { var API = (window.STORE_CONFIG && window.STORE_CONFIG.apiBase || "").replace(/\/$/, ""); var yen = function (n) { return "¥" + Number(n).toLocaleString("ja-JP"); }; function esc(s){ var d=document.createElement("div"); d.textContent=s==null?"":String(s); return d.innerHTML; } // ---- プラン一覧(index) ---- function renderPlans(el) { fetch(API + "/catalog").then(function (r) { return r.json(); }).then(function (data) { var plans = data.plans || [], options = data.options || []; function renderFor(interval) { return options.find(function (o) { return o.optionKey === "render" && o.interval === interval; }); } if (!plans.length) { el.innerHTML = '
プランを取得できませんでした。
'; return; } el.innerHTML = plans.map(function (p) { var per = p.interval === "year" ? "年" : "月"; var render = renderFor(p.interval); var opt = render ? '' : ""; return '

' + esc(p.label) + '

' + '
' + yen(p.amount) + ' / ' + per + '(税別)
' + opt + '
'; }).join(""); el.querySelectorAll("button[data-plan]").forEach(function (btn) { btn.addEventListener("click", function () { var sku = btn.getAttribute("data-plan"); var chk = el.querySelector('input[data-render="' + sku + '"]'); var withRender = !!(chk && chk.checked); btn.disabled = true; btn.textContent = "処理中..."; fetch(API + "/checkout", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ plan: sku, render: withRender }) }).then(function (r) { return r.json(); }).then(function (res) { if (res.url) { window.location = res.url; } else { btn.disabled = false; btn.textContent = "このプランで申し込む"; alert("エラー: " + (res.error || "checkout")); } }).catch(function () { btn.disabled = false; btn.textContent = "このプランで申し込む"; alert("通信エラー"); }); }); }); }).catch(function () { el.innerHTML = '
カタログ取得に失敗しました。
'; }); } // ---- 完了画面(success) ---- function renderSuccess(el) { var sid = new URLSearchParams(location.search).get("session_id"); if (!sid) { el.innerHTML = '
session_id がありません。
'; return; } var tries = 0; function poll() { tries++; fetch(API + "/store/order?session_id=" + encodeURIComponent(sid)) .then(function (r) { return r.json(); }).then(function (o) { if (o.licenseCodes && o.licenseCodes.length) { var codes = o.licenseCodes.map(function (c) { return '

' + esc(c) + "

"; }).join(""); var pdfs = (o.licenses || []).map(function (l) { return '
  • ' + esc(l.licenseCode) + " のPDF
  • "; }).join(""); el.innerHTML = '
    ライセンスを発行しました。
    ' + codes + (pdfs ? "

    ライセンス証書(PDF)

    " : '
    PDFは生成中です。
    '); } else if (tries < 20) { el.innerHTML = '
    ライセンスを発行中です…(自動で更新)
    '; setTimeout(poll, 3000); } else { el.innerHTML = '
    発行に時間がかかっています。このページを再読み込みしてください。
    '; } }).catch(function () { if (tries < 20) setTimeout(poll, 3000); }); } poll(); } window.Store = { renderPlans: renderPlans, renderSuccess: renderSuccess }; })();