**Motivations :** - Éliminer la duplication de code pour la vérification PBKDF2 key - Éliminer la duplication de code pour la vérification du wallet avec retries - Supprimer les imports commentés (code mort) - Centraliser la logique de vérification des prérequis dans un utilitaire **Modifications :** - Créer src/utils/prerequisites.utils.ts avec checkPBKDF2Key() et checkWalletWithRetries() - Remplacer toutes les occurrences dupliquées dans router.ts, home.ts, birthday-setup.ts, block-sync.ts, wallet-setup.ts - Supprimer les imports commentés dans device-management.ts, pairing.service.ts, modal.service.ts - Utiliser pbkdf2KeyResult.key au lieu de récupérer la clé plusieurs fois dans wallet-setup.ts **Pages affectées :** - src/utils/prerequisites.utils.ts (nouveau fichier utilitaire) - src/router.ts (utilise checkPBKDF2Key) - src/pages/home/home.ts (utilise checkPBKDF2Key, checkWalletWithRetries) - src/pages/birthday-setup/birthday-setup.ts (utilise checkPBKDF2Key, checkWalletWithRetries) - src/pages/block-sync/block-sync.ts (utilise checkPBKDF2Key, checkWalletWithRetries) - src/pages/wallet-setup/wallet-setup.ts (utilise checkPBKDF2Key, pbkdf2KeyResult.key) - src/services/service.ts (supprime imports commentés) - src/components/device-management/device-management.ts (supprime import commenté) - src/services/pairing.service.ts (supprime imports commentés) - src/services/modal.service.ts (supprime import commenté)
190 lines
8.8 KiB
TypeScript
190 lines
8.8 KiB
TypeScript
/**
|
|
* 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<void>((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}%`;
|
|
}
|
|
});
|