Statut de connexion au serveur

This commit is contained in:
Pierre Marx
2025-09-04 12:32:09 -04:00
parent e6eaba3018
commit 3f21bc0465
6 changed files with 210 additions and 1 deletions

View File

@@ -105,5 +105,10 @@
"autoConnexion": true, "autoConnexion": true,
"notificationSonore": true, "notificationSonore": true,
"affichageCompact": false "affichageCompact": false
},
"signalR": {
"serverUrl": "http://10.90.20.201:8002/signalR",
"serviceProvider": "RDVPREM",
"enabled": true
} }
} }

View File

@@ -11,6 +11,10 @@
<div id="loginPage" class="page active"> <div id="loginPage" class="page active">
<div class="login-container"> <div class="login-container">
<h1>SimpleConnect</h1> <h1>SimpleConnect</h1>
<div class="signalr-status">
<span class="signalr-indicator" id="signalrIndicator"></span>
<span class="signalr-text" id="signalrText">Connexion au serveur...</span>
</div>
<h2>Connexion Agent</h2> <h2>Connexion Agent</h2>
<form id="loginForm"> <form id="loginForm">
<input type="email" id="email" placeholder="Email" required> <input type="email" id="email" placeholder="Email" required>

87
main.js
View File

@@ -1,10 +1,13 @@
const { app, BrowserWindow, ipcMain, session } = require('electron'); const { app, BrowserWindow, ipcMain, session } = require('electron');
const path = require('path'); const path = require('path');
const fs = require('fs'); const fs = require('fs');
const signalR = require('@microsoft/signalr');
let mainWindow; let mainWindow;
let config; let config;
let currentAgent = null; let currentAgent = null;
let signalRConnection = null;
let signalRStatus = 'disconnected'; // disconnected, connecting, connected, error
// Charger la configuration // Charger la configuration
function loadConfig() { function loadConfig() {
@@ -42,6 +45,82 @@ function createWindow() {
}); });
} }
// === GESTION SIGNALR ===
function initializeSignalR() {
if (!config.signalR || !config.signalR.enabled) {
console.log('SignalR désactivé dans la configuration');
signalRStatus = 'disabled';
sendSignalRStatus();
return;
}
try {
// Créer la connexion SignalR
signalRConnection = new signalR.HubConnectionBuilder()
.withUrl(config.signalR.serverUrl)
.withAutomaticReconnect([0, 2000, 5000, 10000, 30000])
.configureLogging(signalR.LogLevel.Information)
.build();
// Gérer les changements d'état
signalRConnection.onreconnecting(() => {
console.log('SignalR: Reconnexion en cours...');
signalRStatus = 'connecting';
sendSignalRStatus();
});
signalRConnection.onreconnected(() => {
console.log('SignalR: Reconnecté');
signalRStatus = 'connected';
sendSignalRStatus();
});
signalRConnection.onclose(() => {
console.log('SignalR: Connexion fermée');
signalRStatus = 'disconnected';
sendSignalRStatus();
});
// Démarrer la connexion
startSignalRConnection();
} catch (error) {
console.error('Erreur initialisation SignalR:', error);
signalRStatus = 'error';
sendSignalRStatus();
}
}
async function startSignalRConnection() {
try {
signalRStatus = 'connecting';
sendSignalRStatus();
await signalRConnection.start();
console.log('SignalR: Connexion établie');
signalRStatus = 'connected';
sendSignalRStatus();
} catch (error) {
console.error('Erreur connexion SignalR:', error);
signalRStatus = 'error';
sendSignalRStatus();
// Réessayer dans 5 secondes
setTimeout(() => {
if (signalRConnection && signalRStatus !== 'connected') {
startSignalRConnection();
}
}, 5000);
}
}
function sendSignalRStatus() {
if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.webContents.send('signalr-status', signalRStatus);
}
}
// Initialisation de l'application // Initialisation de l'application
app.whenReady().then(() => { app.whenReady().then(() => {
// Configuration de la session pour éviter les problèmes CORS // Configuration de la session pour éviter les problèmes CORS
@@ -61,6 +140,9 @@ app.whenReady().then(() => {
loadConfig(); loadConfig();
createWindow(); createWindow();
// Initialiser SignalR après le chargement de la config
initializeSignalR();
}); });
// Quitter quand toutes les fenêtres sont fermées // Quitter quand toutes les fenêtres sont fermées
@@ -84,6 +166,11 @@ ipcMain.handle('get-config', () => {
return config; return config;
}); });
// Obtenir le statut SignalR
ipcMain.handle('get-signalr-status', () => {
return signalRStatus;
});
// Connexion agent // Connexion agent
ipcMain.handle('login-agent', (event, credentials) => { ipcMain.handle('login-agent', (event, credentials) => {
const agent = config.agents.find(a => const agent = config.agents.find(a =>

View File

@@ -65,5 +65,8 @@
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/simpleconnect/electron-app.git" "url": "https://github.com/simpleconnect/electron-app.git"
},
"dependencies": {
"@microsoft/signalr": "^9.0.6"
} }
} }

View File

@@ -12,6 +12,18 @@ let callStats = {
// === GESTION DE LA CONNEXION === // === GESTION DE LA CONNEXION ===
document.addEventListener('DOMContentLoaded', async () => { document.addEventListener('DOMContentLoaded', async () => {
// Initialiser l'indicateur SignalR
updateSignalRStatus();
// Écouter les changements de statut SignalR
ipcRenderer.on('signalr-status', (event, status) => {
updateSignalRIndicator(status);
});
// Obtenir le statut initial SignalR
const initialStatus = await ipcRenderer.invoke('get-signalr-status');
updateSignalRIndicator(initialStatus);
// Vérifier si un agent est déjà connecté // Vérifier si un agent est déjà connecté
const agentData = await ipcRenderer.invoke('get-current-agent'); const agentData = await ipcRenderer.invoke('get-current-agent');
if (agentData) { if (agentData) {
@@ -393,3 +405,43 @@ async function saveNotes() {
document.getElementById('quickNotes').value = ''; document.getElementById('quickNotes').value = '';
} }
} }
// === GESTION INDICATEUR SIGNALR ===
function updateSignalRStatus() {
// Fonction appelée au chargement pour initialiser l'interface
}
function updateSignalRIndicator(status) {
const indicator = document.getElementById('signalrIndicator');
const text = document.getElementById('signalrText');
if (!indicator || !text) return;
// Réinitialiser les classes
indicator.className = 'signalr-indicator';
switch(status) {
case 'connected':
indicator.classList.add('connected');
text.textContent = 'Connecté au serveur';
break;
case 'connecting':
indicator.classList.add('connecting');
text.textContent = 'Connexion en cours...';
break;
case 'disconnected':
indicator.classList.add('disconnected');
text.textContent = 'Serveur déconnecté';
break;
case 'error':
indicator.classList.add('error');
text.textContent = 'Erreur de connexion';
break;
case 'disabled':
indicator.classList.add('disabled');
text.textContent = 'SignalR désactivé';
break;
default:
text.textContent = 'État inconnu';
}
}

View File

@@ -47,6 +47,64 @@ body {
font-size: 32px; font-size: 32px;
} }
/* Indicateur de statut SignalR */
.signalr-status {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
margin: 15px 0;
padding: 10px;
background: #f8f9fa;
border-radius: 5px;
font-size: 14px;
}
.signalr-indicator {
width: 12px;
height: 12px;
border-radius: 50%;
background-color: #999;
animation: pulse 2s infinite;
}
.signalr-indicator.connected {
background-color: #4CAF50;
animation: none;
}
.signalr-indicator.connecting {
background-color: #FFC107;
animation: pulse 1s infinite;
}
.signalr-indicator.disconnected,
.signalr-indicator.error {
background-color: #F44336;
animation: none;
}
.signalr-indicator.disabled {
background-color: #999;
animation: none;
}
@keyframes pulse {
0% {
opacity: 1;
}
50% {
opacity: 0.5;
}
100% {
opacity: 1;
}
}
.signalr-text {
color: #666;
}
.login-container h2 { .login-container h2 {
text-align: center; text-align: center;
color: #666; color: #666;