Statut de connexion au serveur
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
87
main.js
@@ -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 =>
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
52
renderer.js
52
renderer.js
@@ -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';
|
||||||
|
}
|
||||||
|
}
|
||||||
58
styles.css
58
styles.css
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user