/** * 受保护下载按钮:先换取短期令牌,再用令牌地址下载。 * * 按钮由下载区模板输出,只携带随机 asset_key,不携带文件路径或公开 URL。 * * @package Jio */ (function () { 'use strict'; var i18n = (window.jioData && window.jioData.protectedDownload) || {}; var tokenUrl = i18n.tokenUrl || ''; function toast(message, type) { if (typeof window.notyf === 'function') { window.notyf(message, type || 'danger'); } } function message(data) { if (data && typeof data.message === 'string' && data.message !== '') { return data.message; } return i18n.error || '下载失败,请稍后重试'; } function download(button) { var assetKey = button.getAttribute('data-jio-protected-asset') || ''; var postId = button.getAttribute('data-jio-protected-post') || ''; if (!assetKey || !postId || !tokenUrl) { return; } if (button.getAttribute('aria-busy') === 'true') { return; } button.setAttribute('aria-busy', 'true'); var body = new URLSearchParams(); body.set('post_id', postId); body.set('asset_key', assetKey); fetch(tokenUrl, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-WP-Nonce': (window.jioData && window.jioData.restNonce) || '' }, body: body.toString() }) .then(function (response) { return response.json().then(function (data) { return { ok: response.ok, data: data }; }); }) .then(function (result) { if (!result.ok || !result.data || !result.data.url) { throw new Error(message(result.data)); } window.location.href = result.data.url; }) .catch(function (error) { toast(error && error.message ? error.message : (i18n.error || '下载失败,请稍后重试')); }) .finally(function () { button.removeAttribute('aria-busy'); }); } document.addEventListener('click', function (event) { var button = event.target.closest('[data-jio-protected-asset]'); if (!button) { return; } event.preventDefault(); download(button); }); })();