转盘抽奖
This commit is contained in:
parent
30a06840f8
commit
4c0e3b2918
@ -1 +1 @@
|
||||
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><title>Yumi</title><link rel=icon href=./src/assets/logoFavicon.ico><link href=/agencypanel/static/css/app.a5e99046d79db05830c062cb43887024.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/agencypanel/static/js/wheel-gateway-api.js?v=20260519-idempotency></script><script type=text/javascript src=/agencypanel/static/js/wheel-target-fix.js?v=20260515-target></script><script type=text/javascript src=/agencypanel/static/js/wheel-tab-filter.js></script><script type=text/javascript src=/agencypanel/static/js/manifest.50b03fb9228447d5e5bd.js></script><script type=text/javascript src=/agencypanel/static/js/vendor.26202bf12488c03c4627.js></script><script type=text/javascript src=/agencypanel/static/js/app.114c97eb0e121b96529d.js></script></body></html>
|
||||
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><title>Yumi</title><link rel=icon href=./src/assets/logoFavicon.ico><link href=/agencypanel/static/css/app.a5e99046d79db05830c062cb43887024.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/agencypanel/static/js/wheel-gateway-api.js?v=20260520-preview-loader></script><script type=text/javascript src=/agencypanel/static/js/wheel-target-fix.js?v=20260515-target></script><script type=text/javascript src=/agencypanel/static/js/wheel-tab-filter.js></script><script type=text/javascript src=/agencypanel/static/js/manifest.50b03fb9228447d5e5bd.js></script><script type=text/javascript src=/agencypanel/static/js/vendor.26202bf12488c03c4627.js></script><script type=text/javascript src=/agencypanel/static/js/app.114c97eb0e121b96529d.js></script></body></html>
|
||||
|
||||
@ -1 +1 @@
|
||||
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><title>Yumi Wheel Local</title><link rel=icon href=./src/assets/logoFavicon.ico><link href=static/css/app.a5e99046d79db05830c062cb43887024.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=static/js/wheel-gateway-api.js?v=20260519-idempotency></script><script type=text/javascript src=static/js/wheel-target-fix.js?v=20260515-target></script><script type=text/javascript src=static/js/wheel-tab-filter.js></script><script type=text/javascript src=static/js/manifest.local.js></script><script type=text/javascript src=static/js/vendor.26202bf12488c03c4627.js></script><script type=text/javascript src=static/js/app.114c97eb0e121b96529d.js></script></body></html>
|
||||
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><title>Yumi Wheel Local</title><link rel=icon href=./src/assets/logoFavicon.ico><link href=static/css/app.a5e99046d79db05830c062cb43887024.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=static/js/wheel-gateway-api.js?v=20260520-preview-loader></script><script type=text/javascript src=static/js/wheel-target-fix.js?v=20260515-target></script><script type=text/javascript src=static/js/wheel-tab-filter.js></script><script type=text/javascript src=static/js/manifest.local.js></script><script type=text/javascript src=static/js/vendor.26202bf12488c03c4627.js></script><script type=text/javascript src=static/js/app.114c97eb0e121b96529d.js></script></body></html>
|
||||
|
||||
535
h5/yumi-wheel/h5/agencypanel/static/js/wheel-dynamic-preview.js
Normal file
535
h5/yumi-wheel/h5/agencypanel/static/js/wheel-dynamic-preview.js
Normal file
@ -0,0 +1,535 @@
|
||||
(function () {
|
||||
var STYLE_ID = 'yumi-wheel-dynamic-preview-style';
|
||||
var OVERLAY_CLASS = 'yumi-wheel-dynamic-preview-overlay';
|
||||
var PREVIEW_VERSION = '20260520-dynamic-preview-pag';
|
||||
var SVGA_SCRIPT_URLS = [
|
||||
'https://cdn.jsdelivr.net/npm/svgaplayerweb@2.3.2/build/svga.min.js',
|
||||
'https://unpkg.com/svgaplayerweb@2.3.2/build/svga.min.js'
|
||||
];
|
||||
var PAG_SCRIPT_URLS = [
|
||||
'https://cdn.jsdelivr.net/npm/libpag@4.2.84/lib/libpag.min.js',
|
||||
'https://unpkg.com/libpag@4.2.84/lib/libpag.min.js'
|
||||
];
|
||||
var PAG_WASM_URLS = [
|
||||
'https://cdn.jsdelivr.net/npm/libpag@4.2.84/lib/libpag.wasm',
|
||||
'https://unpkg.com/libpag@4.2.84/lib/libpag.wasm'
|
||||
];
|
||||
var svgaLoaderPromise = null;
|
||||
var pagLoaderPromise = null;
|
||||
var previousBodyOverflow = null;
|
||||
|
||||
function matches(node, selector) {
|
||||
if (!node || node.nodeType !== 1) return false;
|
||||
var fn = node.matches || node.webkitMatchesSelector || node.msMatchesSelector;
|
||||
return !!fn && fn.call(node, selector);
|
||||
}
|
||||
|
||||
function closest(node, selector) {
|
||||
while (node && node.nodeType === 1) {
|
||||
if (matches(node, selector)) return node;
|
||||
node = node.parentNode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function hasClass(node, name) {
|
||||
if (!node) return false;
|
||||
if (node.classList) return node.classList.contains(name);
|
||||
return (' ' + (node.className || '') + ' ').indexOf(' ' + name + ' ') >= 0;
|
||||
}
|
||||
|
||||
function injectStyle() {
|
||||
if (document.getElementById(STYLE_ID)) return;
|
||||
var style = document.createElement('style');
|
||||
style.id = STYLE_ID;
|
||||
style.textContent = [
|
||||
'.' + OVERLAY_CLASS + '{position:fixed;left:0;top:0;right:0;bottom:0;z-index:2147483000;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.88);touch-action:manipulation;-webkit-tap-highlight-color:transparent;}',
|
||||
'.yumi-wheel-dynamic-preview-stage{width:100vw;height:100vh;box-sizing:border-box;padding:24px;display:flex;align-items:center;justify-content:center;}',
|
||||
'.yumi-wheel-dynamic-preview-media{display:block;max-width:92vw;max-height:82vh;object-fit:contain;}',
|
||||
'.yumi-wheel-dynamic-preview-svga{width:92vw;height:92vw;max-width:420px;max-height:420px;}',
|
||||
'.yumi-wheel-dynamic-preview-pag{display:block;max-width:92vw;max-height:82vh;}',
|
||||
'.yumi-wheel-dynamic-preview-spinner{width:38px;height:38px;border-radius:50%;border:3px solid rgba(255,255,255,.28);border-top-color:#fff;animation:yumiWheelPreviewSpin .8s linear infinite;}',
|
||||
'@media (orientation:landscape){.yumi-wheel-dynamic-preview-media{max-width:82vw;max-height:88vh}.yumi-wheel-dynamic-preview-svga{width:72vh;height:72vh;max-width:520px;max-height:520px}}',
|
||||
'@keyframes yumiWheelPreviewSpin{to{transform:rotate(360deg)}}'
|
||||
].join('');
|
||||
document.head.appendChild(style);
|
||||
}
|
||||
|
||||
function clearNode(node) {
|
||||
while (node && node.firstChild) node.removeChild(node.firstChild);
|
||||
}
|
||||
|
||||
function firstString(source, keys) {
|
||||
if (!source) return '';
|
||||
for (var index = 0; index < keys.length; index++) {
|
||||
var value = source[keys[index]];
|
||||
if (value !== null && value !== undefined && String(value).trim() !== '') {
|
||||
return String(value).trim();
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
function dynamicURL(item) {
|
||||
var merchandise = (item && item.merchandise) || {};
|
||||
return (
|
||||
firstString(merchandise, ['animationUrl', 'resourceUrl', 'sourceUrl', 'url']) ||
|
||||
firstString(item, ['animationUrl', 'resourceUrl', 'sourceUrl', 'url'])
|
||||
);
|
||||
}
|
||||
|
||||
function coverURL(item) {
|
||||
var merchandise = (item && item.merchandise) || {};
|
||||
return firstString(merchandise, ['coverUrl', 'cover', 'image']) || firstString(item, ['coverUrl', 'cover', 'image']);
|
||||
}
|
||||
|
||||
function rewardName(item) {
|
||||
var merchandise = (item && item.merchandise) || {};
|
||||
return firstString(merchandise, ['name', 'resourceName']) || firstString(item, ['name', 'resourceName']);
|
||||
}
|
||||
|
||||
function itemPayload(item) {
|
||||
var url = dynamicURL(item);
|
||||
if (!url) return null;
|
||||
return {
|
||||
url: url,
|
||||
cover: coverURL(item),
|
||||
name: rewardName(item)
|
||||
};
|
||||
}
|
||||
|
||||
function indexOfNode(nodes, target) {
|
||||
for (var index = 0; index < nodes.length; index++) {
|
||||
if (nodes[index] === target) return index;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
function gridItemPayload(vm, img) {
|
||||
if (!img || hasClass(img, 'gift-webp')) return null;
|
||||
var gridItem = closest(img, '.grid-item');
|
||||
if (!gridItem || !vm.$el || !vm.$el.contains(gridItem)) return null;
|
||||
var grid = closest(gridItem, '.lottery-grid');
|
||||
if (!grid || !vm.$el.contains(grid)) return null;
|
||||
var index = indexOfNode(grid.querySelectorAll('.grid-item'), gridItem);
|
||||
if (index < 0) return null;
|
||||
return itemPayload((vm.gridItems || [])[index]);
|
||||
}
|
||||
|
||||
function currentRewardPayload(vm, img) {
|
||||
var box = closest(img, '.box-desc');
|
||||
if (!box || !vm.$el || !vm.$el.contains(box)) return null;
|
||||
var popup = closest(box, '.reward-content');
|
||||
if (!popup || !vm.$el.contains(popup)) return null;
|
||||
var boxes = popup.querySelectorAll('.box-desc');
|
||||
var index = indexOfNode(boxes, box);
|
||||
if (index < 0) return null;
|
||||
var rewards = (vm.currentReward && vm.currentReward.rewards) || [];
|
||||
return itemPayload(rewards[index]);
|
||||
}
|
||||
|
||||
function historyRewardPayload(vm, img) {
|
||||
var box = closest(img, '.box-desc');
|
||||
var list = closest(img, '.list');
|
||||
if (!box || !list || !vm.$el || !vm.$el.contains(list)) return null;
|
||||
var popup = closest(list, '.popup-content');
|
||||
if (!popup || !vm.$el.contains(popup)) return null;
|
||||
var recordIndex = indexOfNode(popup.querySelectorAll('.list'), list);
|
||||
var rewardIndex = indexOfNode(list.querySelectorAll('.box-desc'), box);
|
||||
var record = (vm.historyRecord || [])[recordIndex];
|
||||
if (!record || rewardIndex < 0) return null;
|
||||
return itemPayload((record.rewards || [])[rewardIndex]);
|
||||
}
|
||||
|
||||
function prizePayloadFromClick(vm, event) {
|
||||
var img = closest(event.target, 'img.img');
|
||||
if (!img || !vm.$el || !vm.$el.contains(img)) return null;
|
||||
return gridItemPayload(vm, img) || currentRewardPayload(vm, img) || historyRewardPayload(vm, img);
|
||||
}
|
||||
|
||||
function mediaKind(url) {
|
||||
var lower = String(url || '').toLowerCase();
|
||||
if (/^data:video\//.test(lower)) return 'video';
|
||||
if (/^data:image\//.test(lower)) return 'image';
|
||||
try {
|
||||
lower = new URL(url, window.location.href).pathname.toLowerCase();
|
||||
} catch (error) {
|
||||
lower = lower.split('?')[0].split('#')[0];
|
||||
}
|
||||
if (/\.(mp4|webm|mov|m4v)$/.test(lower)) return 'video';
|
||||
if (/\.(gif|webp|png|jpg|jpeg|svg)$/.test(lower)) return 'image';
|
||||
if (/\.svga$/.test(lower)) return 'svga';
|
||||
if (/\.pag$/.test(lower)) return 'pag';
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
function removeExistingOverlay() {
|
||||
var overlay = document.querySelector('.' + OVERLAY_CLASS);
|
||||
if (overlay) closeOverlay(overlay);
|
||||
}
|
||||
|
||||
function lockBodyScroll() {
|
||||
if (previousBodyOverflow === null && document.body) {
|
||||
previousBodyOverflow = document.body.style.overflow || '';
|
||||
document.body.style.overflow = 'hidden';
|
||||
}
|
||||
}
|
||||
|
||||
function unlockBodyScroll() {
|
||||
if (previousBodyOverflow !== null && document.body) {
|
||||
document.body.style.overflow = previousBodyOverflow;
|
||||
previousBodyOverflow = null;
|
||||
}
|
||||
}
|
||||
|
||||
function closeOverlay(overlay) {
|
||||
if (!overlay) return;
|
||||
if (overlay.__previewVideo) {
|
||||
try {
|
||||
overlay.__previewVideo.pause();
|
||||
} catch (error) {}
|
||||
}
|
||||
if (overlay.__svgaPlayer && typeof overlay.__svgaPlayer.stopAnimation === 'function') {
|
||||
try {
|
||||
overlay.__svgaPlayer.stopAnimation();
|
||||
} catch (error) {}
|
||||
}
|
||||
if (overlay.__pagView) {
|
||||
['pause', 'stop', 'destroy', 'free'].forEach(function (method) {
|
||||
if (overlay.__pagView && typeof overlay.__pagView[method] === 'function') {
|
||||
try {
|
||||
overlay.__pagView[method]();
|
||||
} catch (error) {}
|
||||
}
|
||||
});
|
||||
}
|
||||
if (overlay.parentNode) overlay.parentNode.removeChild(overlay);
|
||||
unlockBodyScroll();
|
||||
}
|
||||
|
||||
function createOverlay() {
|
||||
injectStyle();
|
||||
removeExistingOverlay();
|
||||
var overlay = document.createElement('div');
|
||||
var stage = document.createElement('div');
|
||||
var spinner = document.createElement('div');
|
||||
overlay.className = OVERLAY_CLASS;
|
||||
overlay.setAttribute('role', 'dialog');
|
||||
stage.className = 'yumi-wheel-dynamic-preview-stage';
|
||||
spinner.className = 'yumi-wheel-dynamic-preview-spinner';
|
||||
stage.appendChild(spinner);
|
||||
overlay.appendChild(stage);
|
||||
overlay.addEventListener('click', function () {
|
||||
closeOverlay(overlay);
|
||||
});
|
||||
document.body.appendChild(overlay);
|
||||
lockBodyScroll();
|
||||
return { overlay: overlay, stage: stage };
|
||||
}
|
||||
|
||||
function renderImage(stage, overlay, url, fallbackURL, name) {
|
||||
clearNode(stage);
|
||||
var image = document.createElement('img');
|
||||
image.className = 'yumi-wheel-dynamic-preview-media';
|
||||
image.alt = name || '';
|
||||
image.src = url;
|
||||
image.onerror = function () {
|
||||
if (fallbackURL && image.src !== fallbackURL) {
|
||||
image.src = fallbackURL;
|
||||
}
|
||||
};
|
||||
stage.appendChild(image);
|
||||
overlay.__previewImage = image;
|
||||
}
|
||||
|
||||
function renderVideo(stage, overlay, url, fallbackURL, name) {
|
||||
clearNode(stage);
|
||||
var video = document.createElement('video');
|
||||
video.className = 'yumi-wheel-dynamic-preview-media';
|
||||
video.src = url;
|
||||
video.loop = true;
|
||||
video.muted = true;
|
||||
video.autoplay = true;
|
||||
video.playsInline = true;
|
||||
video.setAttribute('playsinline', '');
|
||||
video.setAttribute('webkit-playsinline', '');
|
||||
video.setAttribute('aria-label', name || '');
|
||||
video.onerror = function () {
|
||||
renderImage(stage, overlay, fallbackURL || url, fallbackURL, name);
|
||||
};
|
||||
stage.appendChild(video);
|
||||
overlay.__previewVideo = video;
|
||||
var playResult = video.play && video.play();
|
||||
if (playResult && typeof playResult.catch === 'function') {
|
||||
playResult.catch(function () {});
|
||||
}
|
||||
}
|
||||
|
||||
function loadSVGAPlayer() {
|
||||
if (window.SVGA && window.SVGA.Player && window.SVGA.Parser) {
|
||||
return Promise.resolve(window.SVGA);
|
||||
}
|
||||
if (svgaLoaderPromise) return svgaLoaderPromise;
|
||||
svgaLoaderPromise = new Promise(function (resolve, reject) {
|
||||
function loadAt(index) {
|
||||
if (index >= SVGA_SCRIPT_URLS.length) {
|
||||
reject(new Error('svga player load failed'));
|
||||
return;
|
||||
}
|
||||
var script = document.createElement('script');
|
||||
script.async = true;
|
||||
script.crossOrigin = 'anonymous';
|
||||
script.src = SVGA_SCRIPT_URLS[index];
|
||||
script.onload = function () {
|
||||
if (window.SVGA && window.SVGA.Player && window.SVGA.Parser) {
|
||||
resolve(window.SVGA);
|
||||
} else {
|
||||
loadAt(index + 1);
|
||||
}
|
||||
};
|
||||
script.onerror = function () {
|
||||
loadAt(index + 1);
|
||||
};
|
||||
document.head.appendChild(script);
|
||||
}
|
||||
loadAt(0);
|
||||
});
|
||||
return svgaLoaderPromise;
|
||||
}
|
||||
|
||||
function loadScript(urls, ready, index) {
|
||||
index = index || 0;
|
||||
if (ready()) return Promise.resolve();
|
||||
if (index >= urls.length) return Promise.reject(new Error('script load failed'));
|
||||
return new Promise(function (resolve, reject) {
|
||||
var script = document.createElement('script');
|
||||
script.async = true;
|
||||
script.crossOrigin = 'anonymous';
|
||||
script.src = urls[index];
|
||||
script.onload = function () {
|
||||
if (ready()) {
|
||||
resolve();
|
||||
} else {
|
||||
reject(new Error('script loaded without api'));
|
||||
}
|
||||
};
|
||||
script.onerror = reject;
|
||||
document.head.appendChild(script);
|
||||
}).catch(function () {
|
||||
return loadScript(urls, ready, index + 1);
|
||||
});
|
||||
}
|
||||
|
||||
function initPAG(wasmIndex) {
|
||||
if (!window.libpag || typeof window.libpag.PAGInit !== 'function') {
|
||||
return Promise.reject(new Error('libpag missing'));
|
||||
}
|
||||
return window.libpag.PAGInit({
|
||||
locateFile: function (file) {
|
||||
if (/\.wasm(\?|#|$)/.test(String(file || ''))) {
|
||||
return PAG_WASM_URLS[wasmIndex] || PAG_WASM_URLS[0];
|
||||
}
|
||||
return file;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadPAGPlayer() {
|
||||
if (window.__YUMI_WHEEL_PAG__) return Promise.resolve(window.__YUMI_WHEEL_PAG__);
|
||||
if (pagLoaderPromise) return pagLoaderPromise;
|
||||
pagLoaderPromise = loadScript(PAG_SCRIPT_URLS, function () {
|
||||
return !!(window.libpag && window.libpag.PAGInit);
|
||||
}).then(function () {
|
||||
return initPAG(0).catch(function () {
|
||||
return initPAG(1);
|
||||
});
|
||||
}).then(function (PAG) {
|
||||
window.__YUMI_WHEEL_PAG__ = PAG;
|
||||
return PAG;
|
||||
});
|
||||
return pagLoaderPromise;
|
||||
}
|
||||
|
||||
function loadArrayBuffer(url) {
|
||||
if (window.fetch) {
|
||||
return window.fetch(url, { mode: 'cors' }).then(function (response) {
|
||||
if (!response.ok) throw new Error('pag file load failed');
|
||||
return response.arrayBuffer();
|
||||
});
|
||||
}
|
||||
return new Promise(function (resolve, reject) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('GET', url, true);
|
||||
xhr.responseType = 'arraybuffer';
|
||||
xhr.onload = function () {
|
||||
if (xhr.status >= 200 && xhr.status < 300) {
|
||||
resolve(xhr.response);
|
||||
} else {
|
||||
reject(new Error('pag file load failed'));
|
||||
}
|
||||
};
|
||||
xhr.onerror = reject;
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
|
||||
function renderSVGA(stage, overlay, url, fallbackURL, name) {
|
||||
var host = document.createElement('div');
|
||||
clearNode(stage);
|
||||
host.className = 'yumi-wheel-dynamic-preview-svga';
|
||||
stage.appendChild(host);
|
||||
loadSVGAPlayer()
|
||||
.then(function (SVGA) {
|
||||
if (!document.documentElement.contains(overlay)) return;
|
||||
var player = new SVGA.Player(host);
|
||||
var parser = new SVGA.Parser(host);
|
||||
overlay.__svgaPlayer = player;
|
||||
parser.load(
|
||||
url,
|
||||
function (videoItem) {
|
||||
if (!document.documentElement.contains(overlay)) return;
|
||||
player.setVideoItem(videoItem);
|
||||
player.loops = 0;
|
||||
player.startAnimation();
|
||||
},
|
||||
function () {
|
||||
renderImage(stage, overlay, fallbackURL || url, fallbackURL, name);
|
||||
}
|
||||
);
|
||||
})
|
||||
.catch(function () {
|
||||
renderImage(stage, overlay, fallbackURL || url, fallbackURL, name);
|
||||
});
|
||||
}
|
||||
|
||||
function renderPAG(stage, overlay, url, fallbackURL, name) {
|
||||
var canvas = document.createElement('canvas');
|
||||
clearNode(stage);
|
||||
canvas.className = 'yumi-wheel-dynamic-preview-pag';
|
||||
canvas.setAttribute('aria-label', name || '');
|
||||
stage.appendChild(canvas);
|
||||
loadPAGPlayer()
|
||||
.then(function (PAG) {
|
||||
if (!document.documentElement.contains(overlay)) return null;
|
||||
return loadArrayBuffer(url).then(function (buffer) {
|
||||
return PAG.PAGFile.load(buffer);
|
||||
}).then(function (pagFile) {
|
||||
if (!document.documentElement.contains(overlay)) return null;
|
||||
var width = Math.max(1, Number(pagFile.width && pagFile.width()) || 1);
|
||||
var height = Math.max(1, Number(pagFile.height && pagFile.height()) || 1);
|
||||
canvas.width = width;
|
||||
canvas.height = height;
|
||||
canvas.style.aspectRatio = width + ' / ' + height;
|
||||
return PAG.PAGView.init(pagFile, canvas).then(function (pagView) {
|
||||
if (!document.documentElement.contains(overlay)) {
|
||||
if (pagView && typeof pagView.destroy === 'function') pagView.destroy();
|
||||
return null;
|
||||
}
|
||||
overlay.__pagView = pagView;
|
||||
if (typeof pagView.play === 'function') {
|
||||
return pagView.play();
|
||||
}
|
||||
return null;
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch(function () {
|
||||
renderImage(stage, overlay, fallbackURL || url, fallbackURL, name);
|
||||
});
|
||||
}
|
||||
|
||||
function showDynamicPreview(url, fallbackURL, name) {
|
||||
if (!url) return;
|
||||
var nodes = createOverlay();
|
||||
var kind = mediaKind(url);
|
||||
if (kind === 'svga') {
|
||||
renderSVGA(nodes.stage, nodes.overlay, url, fallbackURL, name);
|
||||
} else if (kind === 'pag') {
|
||||
renderPAG(nodes.stage, nodes.overlay, url, fallbackURL, name);
|
||||
} else if (kind === 'video') {
|
||||
renderVideo(nodes.stage, nodes.overlay, url, fallbackURL, name);
|
||||
} else if (kind === 'image') {
|
||||
renderImage(nodes.stage, nodes.overlay, url, fallbackURL, name);
|
||||
} else {
|
||||
renderVideo(nodes.stage, nodes.overlay, url, fallbackURL, name);
|
||||
}
|
||||
}
|
||||
|
||||
function walkVue(vm, visitor, seen) {
|
||||
if (!vm || seen.indexOf(vm) >= 0) return;
|
||||
seen.push(vm);
|
||||
visitor(vm);
|
||||
(vm.$children || []).forEach(function (child) {
|
||||
walkVue(child, visitor, seen);
|
||||
});
|
||||
}
|
||||
|
||||
function visibleElement(el) {
|
||||
if (!el || !document.documentElement.contains(el)) return false;
|
||||
var rect = el.getBoundingClientRect();
|
||||
return rect.width > 0 && rect.height > 0;
|
||||
}
|
||||
|
||||
function wheelInstances() {
|
||||
var roots = [];
|
||||
var app = document.getElementById('app');
|
||||
if (app && app.__vue__) roots.push(app.__vue__);
|
||||
document.querySelectorAll('.lucky-box').forEach(function (node) {
|
||||
if (node.__vue__) roots.push(node.__vue__);
|
||||
});
|
||||
|
||||
var result = [];
|
||||
roots.forEach(function (root) {
|
||||
walkVue(root, function (vm) {
|
||||
if (
|
||||
vm &&
|
||||
Array.isArray(vm.gridItems) &&
|
||||
typeof vm.startLottery === 'function' &&
|
||||
visibleElement(vm.$el)
|
||||
) {
|
||||
result.push(vm);
|
||||
}
|
||||
}, []);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
function patchVm(vm) {
|
||||
if (vm.__wheelDynamicPreviewApplied) return;
|
||||
vm.__wheelDynamicPreviewApplied = true;
|
||||
vm.$el.addEventListener(
|
||||
'click',
|
||||
function (event) {
|
||||
var payload = prizePayloadFromClick(vm, event);
|
||||
if (!payload || !payload.url) return;
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
showDynamicPreview(payload.url, payload.cover, payload.name);
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
function patchAll() {
|
||||
wheelInstances().forEach(patchVm);
|
||||
}
|
||||
|
||||
var observer = new MutationObserver(patchAll);
|
||||
observer.observe(document.documentElement, { childList: true, subtree: true });
|
||||
setInterval(patchAll, 500);
|
||||
patchAll();
|
||||
|
||||
try {
|
||||
document.documentElement.setAttribute('data-yumi-wheel-dynamic-preview', PREVIEW_VERSION);
|
||||
document.addEventListener('yumi-wheel-dynamic-preview', function (event) {
|
||||
var detail = (event && event.detail) || {};
|
||||
showDynamicPreview(detail.url, detail.coverUrl || detail.cover, detail.name);
|
||||
});
|
||||
} catch (error) {}
|
||||
|
||||
window.__YUMI_WHEEL_DYNAMIC_PREVIEW__ = {
|
||||
show: showDynamicPreview,
|
||||
patchAll: patchAll,
|
||||
version: PREVIEW_VERSION
|
||||
};
|
||||
})();
|
||||
@ -3,6 +3,7 @@
|
||||
var productionGatewayBase = 'https://jvapi.haiyihy.com';
|
||||
var defaultGatewayBase = resolveDefaultGatewayBase();
|
||||
var defaultGatewayPrefix = '/go';
|
||||
var dynamicPreviewVersion = '20260520-dynamic-preview-pag';
|
||||
var defaultSysOrigin = 'LIKEI';
|
||||
var defaultReqClient = 'Android';
|
||||
var defaultReqAppIntel = {
|
||||
@ -314,6 +315,98 @@
|
||||
/\/api\/v1\/probability\/[^/]+\/draw$/.test(path);
|
||||
}
|
||||
|
||||
function scriptBaseURL(scriptName) {
|
||||
var script = document.currentScript;
|
||||
if (!script || !script.src) {
|
||||
var scripts = document.getElementsByTagName('script');
|
||||
for (var index = scripts.length - 1; index >= 0; index -= 1) {
|
||||
if (String(scripts[index].src || '').indexOf(scriptName) !== -1) {
|
||||
script = scripts[index];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
var src = script && script.src ? script.src : '';
|
||||
return src ? src.split('?')[0].replace(/[^/]*$/, '') : '';
|
||||
}
|
||||
|
||||
var dynamicPreviewScriptURL = scriptBaseURL('wheel-gateway-api.js') +
|
||||
'wheel-dynamic-preview.js?v=' + dynamicPreviewVersion;
|
||||
var dynamicPreviewLoaded = false;
|
||||
var dynamicPreviewTimer = null;
|
||||
var wheelAPIStarted = false;
|
||||
var wheelAPIPending = 0;
|
||||
var wheelAPILoadStartAt = Date.now();
|
||||
|
||||
function updatePreviewLoaderState() {
|
||||
window.__YUMI_WHEEL_DYNAMIC_PREVIEW_LOADER__ = {
|
||||
loaded: dynamicPreviewLoaded,
|
||||
pendingApis: wheelAPIPending,
|
||||
seenApi: wheelAPIStarted,
|
||||
scriptUrl: dynamicPreviewScriptURL
|
||||
};
|
||||
}
|
||||
|
||||
function loadDynamicPreviewScript() {
|
||||
if (dynamicPreviewLoaded || window.__YUMI_WHEEL_DYNAMIC_PREVIEW__) return;
|
||||
dynamicPreviewLoaded = true;
|
||||
updatePreviewLoaderState();
|
||||
var script = document.createElement('script');
|
||||
script.async = true;
|
||||
script.src = dynamicPreviewScriptURL;
|
||||
script.onerror = function () {
|
||||
dynamicPreviewLoaded = false;
|
||||
updatePreviewLoaderState();
|
||||
};
|
||||
(document.head || document.documentElement).appendChild(script);
|
||||
}
|
||||
|
||||
function scheduleDynamicPreviewLoad(delay) {
|
||||
clearTimeout(dynamicPreviewTimer);
|
||||
dynamicPreviewTimer = setTimeout(function () {
|
||||
if (dynamicPreviewLoaded || window.__YUMI_WHEEL_DYNAMIC_PREVIEW__) return;
|
||||
if (document.readyState === 'loading') {
|
||||
scheduleDynamicPreviewLoad(200);
|
||||
return;
|
||||
}
|
||||
if (wheelAPIPending > 0) {
|
||||
scheduleDynamicPreviewLoad(300);
|
||||
return;
|
||||
}
|
||||
if (!wheelAPIStarted && Date.now() - wheelAPILoadStartAt < 3000) {
|
||||
scheduleDynamicPreviewLoad(500);
|
||||
return;
|
||||
}
|
||||
loadDynamicPreviewScript();
|
||||
}, delay);
|
||||
}
|
||||
|
||||
function trackWheelAPI(xhr) {
|
||||
if (!xhr || xhr.__wheelGatewayPreviewTracked) return;
|
||||
xhr.__wheelGatewayPreviewTracked = true;
|
||||
wheelAPIStarted = true;
|
||||
wheelAPIPending += 1;
|
||||
updatePreviewLoaderState();
|
||||
var completed = false;
|
||||
var done = function (force) {
|
||||
force = force === true;
|
||||
if (completed) return;
|
||||
if (!force && xhr.readyState && xhr.readyState !== 4) return;
|
||||
completed = true;
|
||||
wheelAPIPending = Math.max(0, wheelAPIPending - 1);
|
||||
updatePreviewLoaderState();
|
||||
scheduleDynamicPreviewLoad(400);
|
||||
};
|
||||
xhr.__wheelGatewayPreviewDone = function () {
|
||||
done(true);
|
||||
};
|
||||
xhr.addEventListener('readystatechange', done);
|
||||
xhr.addEventListener('loadend', done);
|
||||
xhr.addEventListener('error', done);
|
||||
xhr.addEventListener('abort', done);
|
||||
xhr.addEventListener('timeout', done);
|
||||
}
|
||||
|
||||
function normalizeCompareValue(value) {
|
||||
return String(value || '').trim().toLowerCase();
|
||||
}
|
||||
@ -522,7 +615,8 @@
|
||||
XMLHttpRequest.prototype.open = function (method, url) {
|
||||
var originalPath = normalizedPath(url);
|
||||
var nextUrl = rewriteUrl(url);
|
||||
this.__wheelGatewayRequest = nextUrl !== url && isWheelApiPath(originalPath);
|
||||
this.__wheelGatewayWheelAPI = isWheelApiPath(originalPath);
|
||||
this.__wheelGatewayRequest = nextUrl !== url && this.__wheelGatewayWheelAPI;
|
||||
this.__wheelGatewayDrawRequest = this.__wheelGatewayRequest && isWheelDrawPath(originalPath);
|
||||
this.__wheelGatewayUrl = nextUrl;
|
||||
this.__wheelGatewayHeaders = {};
|
||||
@ -592,7 +686,15 @@
|
||||
} catch (error) {}
|
||||
}
|
||||
}
|
||||
return nativeSend.apply(this, arguments);
|
||||
if (this.__wheelGatewayWheelAPI) {
|
||||
trackWheelAPI(this);
|
||||
}
|
||||
try {
|
||||
return nativeSend.apply(this, arguments);
|
||||
} catch (error) {
|
||||
if (typeof this.__wheelGatewayPreviewDone === 'function') this.__wheelGatewayPreviewDone();
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
function stripRoomId(body) {
|
||||
@ -621,4 +723,9 @@
|
||||
},
|
||||
rewriteUrl: rewriteUrl
|
||||
};
|
||||
updatePreviewLoaderState();
|
||||
window.addEventListener('load', function () {
|
||||
scheduleDynamicPreviewLoad(500);
|
||||
});
|
||||
scheduleDynamicPreviewLoad(3000);
|
||||
})();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user