2026-06-11 14:41:31 +08:00

146 lines
4.3 KiB
JavaScript

(function () {
var DEFAULT_ANDROID_URL =
'https://play.google.com/store/apps/details?id=com.org.laluparty';
var PREVIEW_IMAGES = [
{
src: './assets/carousel-home.png',
alt: 'Welcome to lalu preview',
},
{
src: './assets/carousel-voice-room.png',
alt: 'Meet friends by voice preview',
},
];
var params = new URLSearchParams(window.location.search);
var els = {
avatar: document.getElementById('inviterAvatar'),
name: document.getElementById('inviterName'),
track: document.getElementById('previewTrack'),
scroll: document.getElementById('previewScroll'),
downloadButton: document.getElementById('downloadButton'),
toast: document.getElementById('pageToast'),
};
function firstParam(names) {
for (var i = 0; i < names.length; i += 1) {
var value = String(params.get(names[i]) || '').trim();
if (value) return value;
}
return '';
}
function isIOS() {
return /iPad|iPhone|iPod/.test(window.navigator.userAgent);
}
function t(key, fallback) {
if (window.HyAppI18n && window.HyAppI18n.t) {
return window.HyAppI18n.t(key, fallback);
}
return fallback;
}
function showToast(message) {
els.toast.textContent = message;
els.toast.classList.add('show');
window.clearTimeout(showToast.timer);
showToast.timer = window.setTimeout(function () {
els.toast.classList.remove('show');
}, 1800);
}
function resolveDownloadURL() {
var commonURL = firstParam(['downloadUrl', 'download_url', 'url']);
var iosURL = firstParam(['iosUrl', 'ios_url']);
var androidURL =
firstParam(['androidUrl', 'android_url']) || DEFAULT_ANDROID_URL;
if (commonURL) return commonURL;
if (isIOS() && iosURL) return iosURL;
return androidURL;
}
function renderProfile() {
var name = firstParam(['name', 'nickname', 'inviterName', 'userName']);
var avatar = firstParam([
'avatar',
'avatarUrl',
'avatar_url',
'head',
'headUrl',
]);
if (name) {
els.name.textContent = name;
}
if (avatar) {
els.avatar.src = avatar;
}
}
function appendCard(image) {
var card = document.createElement('article');
var img = document.createElement('img');
card.className = 'preview-card';
img.src = image.src;
img.alt = image.alt;
card.appendChild(img);
els.track.appendChild(card);
}
function renderCarousel() {
var loop = PREVIEW_IMAGES.concat(PREVIEW_IMAGES);
loop.forEach(appendCard);
window.requestAnimationFrame(function () {
var half = els.track.scrollWidth / 2;
if (half > 0) {
els.track.style.setProperty('--loop-width', half + 'px');
}
});
}
function bindCarouselPause() {
['touchstart', 'pointerdown'].forEach(function (eventName) {
els.scroll.addEventListener(eventName, function () {
els.scroll.classList.add('is-dragging');
});
});
['touchend', 'touchcancel', 'pointerup', 'pointercancel'].forEach(
function (eventName) {
els.scroll.addEventListener(eventName, function () {
els.scroll.classList.remove('is-dragging');
});
}
);
}
function openDownload() {
var url = resolveDownloadURL();
if (!url) {
showToast(
t(
'invite_landing.openDownloadFailed',
'Download URL is not configured.'
)
);
return;
}
window.location.href = url;
}
function bindEvents() {
els.downloadButton.addEventListener('click', openDownload);
bindCarouselPause();
}
function init() {
renderProfile();
renderCarousel();
bindEvents();
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();