connexion avec signalR

This commit is contained in:
Pierre Marx
2025-09-04 14:18:36 -04:00
parent d6f89ed686
commit 6069a7238b
3 changed files with 389 additions and 48 deletions

View File

@@ -65,9 +65,41 @@ document.addEventListener('DOMContentLoaded', async () => {
ipcRenderer.on('incoming-call', (event, callData) => {
handleIncomingCall(callData);
});
// Écouter les événements SignalR de basculement de centre
ipcRenderer.on('switch-to-center', (event, data) => {
console.log('Basculement vers le centre:', data.centreName);
// Trouver le centre et basculer automatiquement
const centre = currentCentres.find(c => c.id === data.centreId);
if (centre) {
selectCenter(data.centreId);
// Afficher une notification
showNotification(`Appel entrant sur ${data.centreName}`, 'info');
// Mettre à jour le statut
updateAgentStatus('EN APPEL');
}
});
// Écouter la libération de centre après raccrochage
ipcRenderer.on('release-center', (event, data) => {
console.log('Libération de la file:', data.queueName);
// Mettre à jour le statut
updateAgentStatus('DISPONIBLE');
// Incrementer le compteur d'appels
callStats.calls++;
updateCallStats();
// Afficher une notification
showNotification('Appel terminé', 'success');
});
});
// Connexion
// Connexion via SignalR
async function handleLogin(e) {
e.preventDefault();
@@ -75,6 +107,7 @@ async function handleLogin(e) {
const password = document.getElementById('password').value;
const terminal = document.getElementById('terminal').value;
const errorDiv = document.getElementById('loginError');
const loginBtn = document.querySelector('#loginForm button[type="submit"]');
// Vérifier que le terminal est sélectionné et valide
if (!terminal) {
@@ -91,24 +124,38 @@ async function handleLogin(e) {
// Sauvegarder le terminal sélectionné pour la prochaine fois
localStorage.setItem('last-terminal', terminal);
// Pour l'instant, utiliser l'authentification locale (simulation)
// TODO: Intégrer l'authentification SignalR
const config = await ipcRenderer.invoke('get-config');
const agent = config.agents.find(a =>
a.email === `${accessCode}@callcenter.fr` &&
a.password === password
);
// Désactiver le bouton pendant la connexion
loginBtn.disabled = true;
loginBtn.textContent = 'Connexion en cours...';
errorDiv.textContent = '';
if (agent) {
currentAgent = agent;
currentAgent.terminal = terminal; // Ajouter le terminal sélectionné
currentCentres = config.centres.filter(c =>
agent.centresAssignes.includes(c.id)
);
errorDiv.textContent = '';
showMainPage();
} else {
errorDiv.textContent = 'Code d\'accès ou mot de passe incorrect';
try {
// Préparer les credentials pour SignalR
const credentials = {
email: accessCode, // Utiliser directement le code agent comme email
password: password,
terminal: terminal
};
// Appeler l'authentification SignalR
const result = await ipcRenderer.invoke('login-agent', credentials);
if (result.success) {
currentAgent = result.agent;
currentCentres = result.centres;
errorDiv.textContent = '';
console.log('Connexion réussie:', currentAgent.name, 'sur le poste', terminal);
showMainPage();
} else {
errorDiv.textContent = result.message || 'Identifiants incorrects';
loginBtn.disabled = false;
loginBtn.textContent = 'Se connecter';
}
} catch (error) {
console.error('Erreur lors de la connexion:', error);
errorDiv.textContent = 'Erreur de connexion. Veuillez réessayer.';
loginBtn.disabled = false;
loginBtn.textContent = 'Se connecter';
}
}
@@ -421,6 +468,76 @@ function playNotificationSound() {
oscillator.stop(audioContext.currentTime + 0.2);
}
// Fonction pour mettre à jour le statut de l'agent
function updateAgentStatus(status) {
const statusElement = document.getElementById('statusText');
const indicatorElement = document.getElementById('statusIndicator');
if (statusElement && indicatorElement) {
switch(status) {
case 'DISPONIBLE':
updateStatus('available');
break;
case 'EN APPEL':
updateStatus('incall');
break;
case 'HORS LIGNE':
updateStatus('offline');
break;
default:
statusElement.textContent = status;
}
}
}
// Fonction pour afficher une notification
function showNotification(message, type = 'info') {
// Créer un élément de notification temporaire
const notification = document.createElement('div');
notification.className = `notification notification-${type}`;
notification.textContent = message;
// Styles de base pour la notification
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
padding: 15px 20px;
background: ${type === 'success' ? '#4caf50' : type === 'error' ? '#f44336' : '#2196f3'};
color: white;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
z-index: 10000;
animation: slideIn 0.3s ease;
`;
document.body.appendChild(notification);
// Retirer la notification après 3 secondes
setTimeout(() => {
notification.style.animation = 'slideOut 0.3s ease';
setTimeout(() => notification.remove(), 300);
}, 3000);
// Jouer un son si c'est une notification d'appel
if (type === 'info' && message.includes('Appel entrant')) {
playNotificationSound();
}
}
// Fonction pour mettre à jour les statistiques d'appels
function updateCallStats() {
const callCountElement = document.getElementById('callCount');
const appointmentCountElement = document.getElementById('appointmentCount');
if (callCountElement) {
callCountElement.textContent = callStats.calls;
}
if (appointmentCountElement) {
appointmentCountElement.textContent = callStats.appointments;
}
}
async function saveNotes() {
const notes = document.getElementById('quickNotes').value;
if (!notes.trim()) return;