import Services from '../services/service'; import { addSubscription } from './subscription.utils'; import QRCode from 'qrcode'; //Copy Address export async function copyToClipboard(fullAddress: string) { try { await navigator.clipboard.writeText(fullAddress); alert('Adresse copiée dans le presse-papiers !'); } catch (err) { console.error('Failed to copy the address: ', err); } } //Generate emojis list export function generateEmojiList(): string[] { const emojiRanges = [ [0x1f600, 0x1f64f], [0x1f300, 0x1f5ff], [0x1f680, 0x1f6ff], [0x1f700, 0x1f77f], ]; const emojiList: string[] = []; for (const range of emojiRanges) { const [start, end] = range; for (let i = start; i <= end && emojiList.length < 256; i++) { emojiList.push(String.fromCodePoint(i)); } if (emojiList.length >= 256) { break; } } return emojiList.slice(0, 256); } //Adress to emojis export async function addressToEmoji(text: string): Promise { //Adress to Hash const encoder = new TextEncoder(); const data = encoder.encode(text); const hashBuffer = await crypto.subtle.digest('SHA-256', data); const hash = new Uint8Array(hashBuffer); const bytes = hash.slice(-4); //Hash slice to emojis const emojiList = generateEmojiList(); const emojis = Array.from(bytes) .map((byte) => emojiList[byte]) .join(''); return emojis; } //Get emojis from other device async function emojisPairingRequest() { try { const container = document.getElementById('containerId'); const urlParams: URLSearchParams = new URLSearchParams(window.location.search); const sp_adress: string | null = urlParams.get('sp_address'); if (!sp_adress) { // console.error("No 'sp_adress' parameter found in the URL."); return; } const emojis = await addressToEmoji(sp_adress); const emojiDisplay = container?.querySelector('.pairing-request'); if (emojiDisplay) { emojiDisplay.textContent = '(Request from: ' + emojis + ')'; } } catch (err) { console.error(err); } } // Display address emojis and other device emojis export async function displayEmojis(text: string) { console.log('🚀 ~ Services ~ adressToEmoji'); try { const container = document.getElementById('containerId'); const emojis = await addressToEmoji(text); const emojiDisplay = container?.querySelector('.emoji-display'); if (emojiDisplay) { emojiDisplay.textContent = emojis; } emojisPairingRequest(); initAddressInput(); } catch (err) { console.error(err); } } // Verify Other address export function initAddressInput() { const addressInput = document.getElementById('addressInput') as HTMLInputElement; const emojiDisplay = document.getElementById('emoji-display-2'); const okButton = document.getElementById('okButton'); addSubscription(addressInput, 'input', async () => { let address = addressInput.value; // Vérifie si l'adresse est une URL try { const url = new URL(address); // Si c'est une URL valide, extraire le paramètre sp_address const urlParams = new URLSearchParams(url.search); const extractedAddress = urlParams.get('sp_address') || ''; // Prend sp_address ou une chaîne vide if (extractedAddress) { address = extractedAddress; addressInput.value = address; // Met à jour l'input pour afficher uniquement l'adresse extraite } } catch (e) { // Si ce n'est pas une URL valide, on garde l'adresse originale console.log("Ce n'est pas une URL valide, on garde l'adresse originale."); } if (address) { const emojis = await addressToEmoji(address); if (emojiDisplay) { emojiDisplay.innerHTML = emojis; } if (okButton) { okButton.style.display = 'inline-block'; } } else { if (emojiDisplay) { emojiDisplay.innerHTML = ''; } if (okButton) { okButton.style.display = 'none'; } } }); if (okButton) { addSubscription(okButton, 'click', () => { onOkButtonClick(); }); } } async function onOkButtonClick() { const service = await Services.getInstance(); const addressInput = (document.getElementById('addressInput') as HTMLInputElement).value; const member = { sp_addresses: [addressInput], } try { await service.connectMember([member]); // await service.sendPairingTx(addressInput); } catch (e) { console.error('onOkButtonClick error:', e); } } export async function generateQRCode(spAddress: string) { try { const container = document.getElementById('containerId'); const currentUrl = 'https://' + window.location.host; const url = await QRCode.toDataURL(currentUrl + '?sp_address=' + spAddress); const qrCode = container?.querySelector('.qr-code img'); qrCode?.setAttribute('src', url); //Generate Address CopyBtn const address = container?.querySelector('.sp-address-btn'); if (address) { address.textContent = 'Copy address'; } const copyBtn = document.getElementById('copyBtn'); if (copyBtn) { addSubscription(copyBtn, 'click', () => copyToClipboard(currentUrl + '?sp_address=' + spAddress)); } } catch (err) { console.error(err); } }