/** * Page de configuration de la date anniversaire * Mise à jour de la date anniversaire et scan des blocs */ import { checkPBKDF2Key, checkWalletWithRetries } from '../../utils/prerequisites.utils'; document.addEventListener('DOMContentLoaded', async () => { console.log('🎂 Birthday setup page loaded'); const status = document.getElementById('status') as HTMLDivElement; const progressBar = document.getElementById('progressBar') as HTMLDivElement; const continueBtn = document.getElementById('continueBtn') as HTMLButtonElement; try { // Étape 1: Connexion aux relais updateStatus('🌐 Connexion aux relais...', 'loading'); updateProgress(20); try { console.log('🔄 Importing services...'); const serviceModule = await import('../../services/service'); console.log('✅ Service module imported:', Object.keys(serviceModule)); // La classe Services est exportée par défaut const Services = serviceModule.default; if (!Services) { throw new Error('Services class not found in default export'); } console.log('🔄 Getting existing services instance...'); // Utiliser l'instance existante des services avec gestion des erreurs de mémoire let services; try { services = await Services.getInstance(); console.log('✅ Services instance obtained successfully'); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); if (errorMessage.includes('Out of memory') || errorMessage.includes('insufficient memory')) { console.error('🚫 Memory error detected'); updateStatus('❌ Erreur: Mémoire insuffisante. Veuillez actualiser la page.', 'error'); throw new Error('WebAssembly initialization failed due to insufficient memory. Please refresh the page.'); } throw error; } // Vérifier les prérequis en base de données updateStatus('🔍 Vérification des prérequis...', 'loading'); updateProgress(20); // Vérifier que le PBKDF2 key existe d'abord (prérequis le plus basique) const pbkdf2KeyResult = await checkPBKDF2Key(); if (!pbkdf2KeyResult) { console.log('⚠️ PBKDF2 key not found in pbkdf2keys store, redirecting to security-setup...'); updateStatus('⚠️ Redirection vers la configuration de sécurité...', 'loading'); setTimeout(() => { window.location.href = '/src/pages/security-setup/security-setup.html'; }, 1000); return; } // Vérifier que le wallet existe en base (avec plusieurs tentatives pour gérer les problèmes de synchronisation) const wallet = await checkWalletWithRetries(); if (!wallet) { console.log('⚠️ Wallet still not found after retries, redirecting to wallet-setup...'); updateStatus('⚠️ Redirection vers la configuration du wallet...', 'loading'); setTimeout(() => { window.location.href = '/src/pages/wallet-setup/wallet-setup.html'; }, 1000); return; } // Vérifier que le wallet contient bien les données attendues if (wallet.sp_wallet?.birthday !== undefined) { console.log('✅ Wallet found in database with birthday:', wallet.sp_wallet.birthday); } else { throw new Error('Wallet found but missing required data (sp_wallet or birthday)'); } // Vérifier que tous les prérequis sont remplis const prerequisitesOk = wallet && pbkdf2KeyResult; if (prerequisitesOk) { console.log('✅ All prerequisites verified'); } else { throw new Error('Prerequisites verification failed'); } // Connexion aux relais await services.connectAllRelays(); // Attendre que la hauteur de bloc soit définie via le handshake updateStatus('⏳ Attente de la synchronisation avec le réseau...', 'loading'); updateProgress(40); // Attendre que le handshake arrive et que chain_tip soit défini await new Promise((resolve, reject) => { const timeout = setTimeout(() => { reject(new Error('Timeout waiting for block height from handshake')); }, 15000); // 15 secondes de timeout const checkBlockHeight = () => { const blockHeight = services.getCurrentBlockHeight(); if (blockHeight !== -1 && blockHeight > 0) { console.log(`✅ Block height set from handshake: ${blockHeight}`); clearTimeout(timeout); resolve(); } else { setTimeout(checkBlockHeight, 100); } }; checkBlockHeight(); }); // Vérifier que les relais sont connectés et que le handshake a été reçu const currentBlockHeight = services.getCurrentBlockHeight(); if (currentBlockHeight !== -1 && currentBlockHeight > 0) { console.log('✅ Relays connected successfully, chain_tip:', currentBlockHeight); console.log('✅ Communication handshake completed, chain_tip:', currentBlockHeight); } else { throw new Error('Handshake not received or chain_tip not set'); } // Mettre à jour la date anniversaire du wallet updateStatus('🎂 Mise à jour de la date anniversaire...', 'loading'); updateProgress(60); console.log('🔄 Calling updateDeviceBlockHeight()...'); await services.updateDeviceBlockHeight(); console.log('✅ updateDeviceBlockHeight() completed successfully'); // Vérifier que le birthday a bien été mis à jour en récupérant le wallet depuis la base updateStatus('🔍 Vérification de la mise à jour...', 'loading'); updateProgress(70); console.log('🔄 Verifying birthday update...'); const updatedWallet = await services.getDeviceFromDatabase(); if (updatedWallet?.sp_wallet?.birthday && updatedWallet.sp_wallet.birthday > 0) { console.log('✅ Birthday updated successfully:', updatedWallet.sp_wallet.birthday); } else { console.error('❌ Birthday update verification failed:', { birthday: updatedWallet?.sp_wallet?.birthday, hasSpWallet: !!updatedWallet?.sp_wallet }); throw new Error(`Birthday update verification failed: expected birthday > 0, got ${updatedWallet?.sp_wallet?.birthday}`); } // Redirection vers la page de synchronisation des blocs updateStatus('🔄 Redirection vers la synchronisation des blocs...', 'loading'); updateProgress(100); console.log('🎉 Birthday setup completed successfully - redirecting to block sync'); console.log('📍 Target URL: /src/pages/block-sync/block-sync.html'); console.log('⏰ Redirecting in 1 second...'); // Rediriger vers la page de synchronisation des blocs setTimeout(() => { console.log('🔄 Executing redirect now...'); window.location.href = '/src/pages/block-sync/block-sync.html'; }, 1000); } catch (error) { console.error('❌ Services not available:', error); updateStatus('❌ Erreur: Services non disponibles', 'error'); throw error; } } catch (error) { console.error('❌ Error during birthday setup:', error); updateStatus('❌ Erreur lors de la configuration de la date anniversaire', 'error'); } // Gestion du bouton continuer continueBtn.addEventListener('click', async () => { console.log('🏠 Redirecting to main application...'); // Rediriger vers l'application principale console.log('🎂 Birthday setup completed, checking storage state...'); const { checkStorageStateAndNavigate } = await import('../../router'); await checkStorageStateAndNavigate(); }); function updateStatus(message: string, type: 'loading' | 'success' | 'error') { status.textContent = message; status.className = `status ${type}`; } function updateProgress(percent: number) { progressBar.style.width = `${percent}%`; } });