const instanceColor = getComputedStyle(document.documentElement).getPropertyValue('--instance-color').trim() || '#ff6347'; const backgroundColor = getComputedStyle(document.documentElement).getPropertyValue('--background-color').trim() || '#ff6347'; document.addEventListener('DOMContentLoaded', function() { const accountsContainer = document.querySelector('#account-list'); let accounts = Array.from(document.querySelectorAll('.account')); // Separate Favoriten und gemischte Accounts const favoriteAccounts = accounts.filter(account => account.dataset.favorite === "true"); const otherAccounts = accounts.filter(account => !account.dataset.favorite); // Mische übrige Accounts const seed = Date.now(); const shuffledOtherAccounts = seededShuffle(otherAccounts, seed); const sortedAccounts = [...favoriteAccounts, ...shuffledOtherAccounts]; accountsContainer.innerHTML = ''; sortedAccounts.forEach(account => accountsContainer.appendChild(account)); sortedAccounts.forEach(function(account) { try { const url = new URL(account.getAttribute('href')); const pathParts = url.pathname.split('/'); if (pathParts.length > 1 && pathParts[1].startsWith('@')) { const handle = pathParts[1].substring(1); const instance = url.hostname; const lookupUrl = `https://${config.homeInstance}/api/v1/accounts/lookup?acct=${handle}@${instance}`; fetch(lookupUrl) .then(response => response.json()) .then(data => { const link = document.createElement('a'); link.classList.add('account-card-link'); link.href = account.href; link.target = '_blank'; const card = document.createElement('div'); card.classList.add('account-card'); const avatarImage = document.createElement('img'); avatarImage.classList.add('account-avatar'); avatarImage.alt = data.avatar ? `Profilbild von ${data.username}` : 'Profilbild nicht verfügbar'; avatarImage.src = data.avatar || ''; const infoContainer = document.createElement('div'); infoContainer.classList.add('account-info'); const displayNameElement = document.createElement('p'); displayNameElement.classList.add('display-name'); displayNameElement.textContent = data.display_name || handle; const handleElement = document.createElement('p'); handleElement.classList.add('handle'); const serverHandleElement = document.createElement('span'); serverHandleElement.classList.add('server-handle'); serverHandleElement.textContent = `@${instance}`; if (instance === config.homeInstance) { serverHandleElement.style.backgroundColor = instanceColor; } handleElement.innerHTML = `@${data.username}`; handleElement.appendChild(serverHandleElement); // QR-Code Button const qrButton = document.createElement('button'); qrButton.classList.add('qr-code-button'); qrButton.innerHTML = ` `; qrButton.addEventListener('click', function(event) { event.preventDefault(); showQrPopup(link.href); }); infoContainer.appendChild(displayNameElement); infoContainer.appendChild(handleElement); card.appendChild(avatarImage); card.appendChild(infoContainer); card.appendChild(qrButton); link.appendChild(card); account.replaceWith(link); }) .catch(error => { console.error('Fehler beim Abrufen des Profils:', error); }); } else { console.error('Ungültiger Benutzer-Handle in URL:', url.href); } } catch (error) { console.error('Fehler bei der Verarbeitung der URL:', error); } }); }); // QR-Code anzeigen function showQrPopup(profileUrl) { // QR-Overlay für Abdunkelung const overlay = document.createElement('div'); overlay.classList.add('qr-overlay'); // Popup-Container const popup = document.createElement('div'); popup.classList.add('qr-popup'); // Schließen-Button const closeButton = document.createElement('button'); closeButton.classList.add('close-popup'); closeButton.textContent = 'x'; closeButton.innerHTML = ` `; closeButton.addEventListener('click', function () { overlay.remove(); }); // Event-Listener für das Overlay (schließt Popup bei Klick auf Hintergrund) overlay.addEventListener('click', function (event) { if (event.target === overlay) { // Nur schließen, wenn außerhalb des Popups geklickt wurde overlay.remove(); } }); // QR-Code-Container const qrContainer = document.createElement('div'); qrContainer.classList.add('qr-code-container'); // QR-Code mit kjua generieren const qrCode = kjua({ render: 'canvas', text: profileUrl, size: 200, quiet: 2, ecLevel: 'H', }); qrContainer.appendChild(qrCode); // Extrahiere User-Handle und Server-Handle const url = new URL(profileUrl); const pathParts = url.pathname.split('/'); const userHandle = pathParts[1] || '@unbekannt'; const serverHandle = url.hostname || 'unbekannt'; // Handle unter dem QR-Code const handleContainer = document.createElement('p'); handleContainer.classList.add('qr-handle'); const userHandleText = document.createTextNode(userHandle); const serverHandleSpan = document.createElement('span'); serverHandleSpan.classList.add('qr-server-handle'); serverHandleSpan.textContent = `@${serverHandle}`; // Dynamisch die Hintergrundfarbe für Variable "config.homeInstance" setzen if (serverHandle === config.homeInstance) { serverHandleSpan.style.backgroundColor = instanceColor; qrCode.style.borderColor = instanceColor; } handleContainer.appendChild(userHandleText); handleContainer.appendChild(serverHandleSpan); // Popup zusammenfügen popup.appendChild(closeButton); popup.appendChild(qrContainer); popup.appendChild(handleContainer); // Overlay zusammenfügen overlay.appendChild(popup); document.body.appendChild(overlay); } function seededRandom(seed) { let x = Math.sin(seed++) * 10000; return x - Math.floor(x); } function seededShuffle(array, seed) { for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(seededRandom(seed) * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; seed++; } return array; }