**Motivations :** - Implémentation du système de sélection de mode de sécurité - Séparation claire entre les données de sécurité et les données du wallet - Suppression des duplications entre 'encrypted-pbkdf2-key' et 'pbkdf2-key' - Architecture modulaire pour la gestion des credentials **Modifications :** - Ajout du composant security-mode-selector pour la sélection du mode de sécurité - Création des pages séquentielles : security-setup, wallet-setup, birthday-setup - Implémentation des services de credentials (encryption, storage, webauthn) - Ajout du service security-mode pour la gestion des modes de sécurité - Correction du stockage des clés PBKDF2 avec le securityMode dynamique - Suppression des méthodes redondantes dans StorageService - Nettoyage des appels redondants dans secure-credentials.service.ts **Pages affectées :** - src/components/security-mode-selector/ (nouveau composant) - src/pages/security-setup/ (nouvelle page) - src/pages/wallet-setup/ (nouvelle page) - src/pages/birthday-setup/ (nouvelle page) - src/services/credentials/ (nouveaux services) - src/services/security-mode.service.ts (nouveau service) - src/services/secure-credentials.service.ts (modifié) - src/services/database.service.ts (modifié) - src/router.ts (modifié) - src/pages/home/home.ts (modifié)
121 lines
4.6 KiB
TypeScript
121 lines
4.6 KiB
TypeScript
/**
|
|
* Page de configuration de la date anniversaire
|
|
* Mise à jour de la date anniversaire et scan des blocs
|
|
*/
|
|
|
|
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('🔄 Waiting for services to be ready...');
|
|
|
|
// Attendre que les services soient initialisés
|
|
let attempts = 0;
|
|
const maxAttempts = 30;
|
|
const delayMs = 2000;
|
|
|
|
let services;
|
|
while (attempts < maxAttempts) {
|
|
try {
|
|
console.log(`🔄 Attempting to get services (attempt ${attempts + 1}/${maxAttempts})...`);
|
|
services = await Services.getInstance();
|
|
console.log('✅ Services initialized successfully');
|
|
break;
|
|
} catch (error) {
|
|
console.log(`⏳ Services not ready yet (attempt ${attempts + 1}/${maxAttempts}):`, error.message);
|
|
attempts++;
|
|
if (attempts >= maxAttempts) {
|
|
throw new Error(`Services failed to initialize after ${maxAttempts} attempts.`);
|
|
}
|
|
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
}
|
|
}
|
|
|
|
// Connexion aux relais
|
|
await services.connectAllRelays();
|
|
console.log('✅ Relays connected successfully');
|
|
|
|
// Étape 2: Mise à jour de la date anniversaire
|
|
updateStatus('🎂 Mise à jour de la date anniversaire...', 'loading');
|
|
updateProgress(40);
|
|
|
|
// Attendre que les relais soient prêts
|
|
await services.getRelayReadyPromise();
|
|
console.log('✅ Communication handshake completed');
|
|
|
|
// Mettre à jour la date anniversaire du wallet
|
|
await services.updateDeviceBlockHeight();
|
|
console.log('✅ Birthday updated successfully');
|
|
|
|
// Étape 3: Scan des blocs
|
|
updateStatus('🔍 Scan des blocs en cours...', 'loading');
|
|
updateProgress(60);
|
|
|
|
// Effectuer le scan initial des blocs
|
|
await services.ensureCompleteInitialScan();
|
|
console.log('✅ Initial block scan completed');
|
|
|
|
// Étape 4: Synchronisation des processus
|
|
updateStatus('🔄 Synchronisation des processus...', 'loading');
|
|
updateProgress(80);
|
|
|
|
// Restaurer les processus depuis la base de données
|
|
await services.restoreProcessesFromDB();
|
|
console.log('✅ Process synchronization completed');
|
|
|
|
} catch (error) {
|
|
console.error('❌ Services not available:', error);
|
|
updateStatus('❌ Erreur: Services non disponibles', 'error');
|
|
throw error;
|
|
}
|
|
|
|
// Étape 5: Finalisation
|
|
updateStatus('✅ Configuration terminée avec succès!', 'success');
|
|
updateProgress(100);
|
|
|
|
// Activer le bouton continuer
|
|
continueBtn.disabled = false;
|
|
|
|
console.log('🎉 Birthday setup completed successfully');
|
|
|
|
} 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', () => {
|
|
console.log('🏠 Redirecting to main application...');
|
|
// Rediriger vers l'application principale
|
|
window.location.href = '/';
|
|
});
|
|
|
|
function updateStatus(message: string, type: 'loading' | 'success' | 'error') {
|
|
status.textContent = message;
|
|
status.className = `status ${type}`;
|
|
}
|
|
|
|
function updateProgress(percent: number) {
|
|
progressBar.style.width = `${percent}%`;
|
|
}
|
|
});
|