(function() {
function initBadge() {
if (!document.getElementById('gojd-badge-widget')) {
setTimeout(initBadge, 50);
return;
}
var apiUrl = 'https://clever-coyote-64-08jr16jhr172.deno.dev/api/functions/getBadgeData';
var badgeToken = '14sq9qq31fqmjd944p8';
var widgetUrl = 'https://clever-coyote-64-08jr16jhr172.deno.dev/#/BadgeWidget?token=14sq9qq31fqmjd944p8';
var shadowMap = {
'none': 'none',
'light': '0 2px 4px rgba(0,0,0,0.1)',
'medium': '0 4px 6px rgba(0,0,0,0.1)',
'heavy': '0 8px 16px rgba(0,0,0,0.2)'
};
function openModal() {
var modal = document.createElement('div');
modal.id = 'gojd-modal';
modal.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);z-index:99999;display:flex;align-items:center;justify-content:center;';
var modalContent = document.createElement('div');
modalContent.style.cssText = 'position:relative;width:90%;max-width:500px;height:600px;background:white;border-radius:12px;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,0.3);';
var closeBtn = document.createElement('button');
closeBtn.textContent = '×';
closeBtn.style.cssText = 'position:absolute;top:10px;right:10px;width:30px;height:30px;border:none;background:rgba(0,0,0,0.1);color:#333;font-size:24px;line-height:1;cursor:pointer;border-radius:50%;z-index:1;';
closeBtn.onclick = function() { document.body.removeChild(modal); };
var iframe = document.createElement('iframe');
iframe.src = widgetUrl;
iframe.style.cssText = 'width:100%;height:100%;border:none;';
modalContent.appendChild(closeBtn);
modalContent.appendChild(iframe);
modal.appendChild(modalContent);
modal.onclick = function(e) {
if (e.target === modal) document.body.removeChild(modal);
};
document.body.appendChild(modal);
}
var requestUrl = apiUrl + '?badge_token=' + encodeURIComponent(badgeToken) + '&referrer=' + encodeURIComponent(window.location.href);
console.log('[Badge] Fetching from:', requestUrl);
fetch(requestUrl, {
method: 'GET',
mode: 'cors',
credentials: 'include'
})
.then(function(res) {
console.log('[Badge] Response status:', res.status);
console.log('[Badge] Response headers:', res.headers);
console.log('[Badge] Response CORS header:', res.headers.get('Access-Control-Allow-Origin'));
return res.text().then(function(text) {
console.log('[Badge] Raw response:', text);
try {
return JSON.parse(text);
} catch (e) {
console.error('[Badge] Failed to parse JSON:', e);
return { error: 'Invalid JSON response', rawText: text };
}
});
})
.then(function(data) {
console.log('[Badge] Parsed data:', data);
if (!data.success || data.error) {
console.error('Badge error:', data.error, data.message);
var errorDiv = document.createElement('div');
errorDiv.style.cssText = 'display:inline-block;padding:12px;background:#fee;border:1px solid #fcc;border-radius:8px;color:#c33;font-size:12px;max-width:250px;';
errorDiv.textContent = data.message || data.error || 'Unable to load badge';
document.getElementById('gojd-badge-widget').appendChild(errorDiv);
return;
}
var badgeSize = data.badge ? data.badge.size : 100;
var borderRadius = data.badge ? data.badge.borderRadius : 8;
var shadowIntensity = data.badge ? data.badge.shadowIntensity : 'medium';
var boxShadow = shadowMap[shadowIntensity] || shadowMap['medium'];
var badge = document.createElement('div');
badge.style.cssText = 'display:inline-block;cursor:pointer;transition:transform 0.2s;';
var img = document.createElement('img');
img.src = data.badge ? data.badge.url : 'https://via.placeholder.com/100x100/4F46E5/ffffff?text=Member';
img.style.cssText = 'width:'+badgeSize+'px;height:'+badgeSize+'px;border-radius:'+borderRadius+'px;box-shadow:'+boxShadow+';';
badge.appendChild(img);
badge.onmouseover = function() { badge.style.transform = 'scale(1.05)'; };
badge.onmouseout = function() { badge.style.transform = 'scale(1)'; };
badge.onclick = openModal;
document.getElementById('gojd-badge-widget').appendChild(badge);
})
.catch(function(err) {
console.error('[Badge] Fetch error:', err);
console.error('[Badge] Error details:', {
message: err.message,
name: err.name,
stack: err.stack,
url: requestUrl
});
var errorDiv = document.createElement('div');
errorDiv.style.cssText = 'display:inline-block;padding:12px;background:#fee;border:1px solid #fcc;border-radius:8px;color:#c33;font-size:12px;max-width:250px;';
errorDiv.innerHTML = 'Unable to load badge
' + err.message + '';
document.getElementById('gojd-badge-widget').appendChild(errorDiv);
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initBadge);
} else {
initBadge();
}
})();