// 静的ストアのフロント。公開エンドポイント(/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 };
})();