feat: Ajout d'une animation de connexion avec spinner et feedback visuel

- Modal de progression pendant l'authentification SignalR
- Messages dynamiques selon le contexte (connexion normale ou forcée)
- Design cohérent avec la modal de déconnexion
- Transitions fluides entre les étapes du processus
- Amélioration de l'expérience utilisateur avec feedback continu
This commit is contained in:
Pierre Marx
2025-09-04 15:56:38 -04:00
parent c7bef13dcd
commit ef3ee22991
4 changed files with 130 additions and 0 deletions

View File

@@ -150,11 +150,17 @@ async function handleLogin(e) {
// Sauvegarder le terminal sélectionné pour la prochaine fois
localStorage.setItem('last-terminal', terminal);
// Afficher la modal de progression de connexion
showLoginProgress(forceDisconnect);
// Désactiver le bouton pendant la connexion
loginBtn.disabled = true;
loginBtn.textContent = forceDisconnect ? 'Reconnexion...' : 'Connexion en cours...';
errorDiv.textContent = '';
// Attendre un peu pour que l'animation soit visible
await new Promise(resolve => setTimeout(resolve, 300));
try {
// Préparer les credentials pour SignalR
const credentials = {
@@ -172,14 +178,27 @@ async function handleLogin(e) {
currentCentres = result.centres;
errorDiv.textContent = '';
console.log('Connexion réussie:', currentAgent.name, 'sur le poste', terminal);
// Mettre à jour le message de progression
updateLoginProgress('Chargement de vos centres...', 'Préparation de l\'interface...');
// Attendre encore un peu pour une transition fluide
await new Promise(resolve => setTimeout(resolve, 500));
// Masquer la modal et afficher la page principale
hideLoginProgress();
showMainPage();
} else {
// Masquer la modal en cas d'échec
hideLoginProgress();
errorDiv.textContent = result.message || 'Identifiants incorrects';
loginBtn.disabled = false;
loginBtn.textContent = 'Se connecter';
}
} catch (error) {
console.error('Erreur lors de la connexion:', error);
// Masquer la modal en cas d'erreur
hideLoginProgress();
errorDiv.textContent = 'Erreur de connexion. Veuillez réessayer.';
loginBtn.disabled = false;
loginBtn.textContent = 'Se connecter';
@@ -294,6 +313,43 @@ function hideLogoutProgress() {
buttons.style.display = 'flex';
}
// Afficher l'animation de progression de connexion
function showLoginProgress(isForceDisconnect = false) {
const modal = document.getElementById('loginModal');
const title = document.getElementById('loginTitle');
const text = document.getElementById('loginText');
const subtitle = document.getElementById('loginSubtitle');
// Afficher la modal
modal.classList.add('active');
// Adapter les textes selon le type de connexion
if (isForceDisconnect) {
title.textContent = 'Reconnexion en cours...';
text.textContent = 'Déconnexion de la session précédente';
subtitle.textContent = 'Puis authentification...';
} else {
title.textContent = 'Connexion en cours...';
text.textContent = 'Authentification auprès du serveur';
subtitle.textContent = 'Veuillez patienter...';
}
}
// Mettre à jour le texte de progression de connexion
function updateLoginProgress(text, subtitle) {
const textElement = document.getElementById('loginText');
const subtitleElement = document.getElementById('loginSubtitle');
if (textElement) textElement.textContent = text;
if (subtitleElement) subtitleElement.textContent = subtitle;
}
// Masquer l'animation de progression de connexion
function hideLoginProgress() {
const modal = document.getElementById('loginModal');
modal.classList.remove('active');
}
// === GESTION DES PAGES ===
function showLoginPage() {
document.getElementById('loginPage').classList.add('active');