Planificateur « Suggérer » : 4 stratégies (smart / meilleurs d'abord / équilibré / juste ce qu'il faut), compétences+niveaux par tech (édition inline), niveau requis par compétence + par job, carte des tournées (1 couleur/tech, domicile→arrêts, sélecteur de jour), fenêtre de dispatch auj.+demain (dates sélectionnées), règle week-end + placeholder « en attente du quart », clustering + lasso + filtre-date sur la carte, accès rapide « À assigner » (badge). Boîte : liste /conversations allégée (45 Mo → ~1 Mo, 17×) + messages chargés à l'ouverture. Rapports : cache SWR sur revenue-explorer (22×). Session : keep-alive + timeout fetch global + authFetch durci → fin des rechargements manuels. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
29 lines
1.8 KiB
JavaScript
29 lines
1.8 KiB
JavaScript
// Garde la session Authentik VIVANTE pour éviter la coupure « il faut recharger pour que les données/recherche reviennent ».
|
||
// Cause : la SPA + /api + /hub sont derrière Authentik ; la session (cookie) expire après une durée d'inactivité.
|
||
// Les appels /api (authFetch) se rechargent seuls (_reauth), MAIS les appels /hub (fetch nu) échouent en silence → données absentes.
|
||
// Solution : un battement régulier qui (a) RAFRAÎCHIT la session (fenêtre glissante) et (b) recharge proprement si elle est morte.
|
||
import { authFetch } from 'src/api/auth'
|
||
import { BASE_URL } from 'src/config/erpnext'
|
||
|
||
let _timer = null
|
||
let _started = false
|
||
|
||
// Ping léger à travers la porte Authentik. authFetch gère _reauth (recharge 1×/20 s si 401/redirection IdP/HTML).
|
||
async function ping () {
|
||
try { await authFetch(BASE_URL + '/auth/whoami') } catch (e) { /* réseau transitoire → on réessaie au prochain tick */ }
|
||
}
|
||
|
||
// Démarre le battement (prod uniquement — pas d'Authentik en dev local). Idempotent.
|
||
export function startSessionKeepAlive ({ minutes = 4 } = {}) {
|
||
if (_started) return
|
||
const host = window.location.hostname
|
||
if (host === 'localhost' || host === '127.0.0.1') return // dev : pas de front Authentik → inutile + éviterait les reloads
|
||
_started = true
|
||
_timer = setInterval(ping, Math.max(1, minutes) * 60 * 1000) // < timeout Authentik → la session ne meurt jamais tant que l'onglet est ouvert
|
||
// Retour sur l'onglet après une pause → vérifie/rafraîchit TOUT DE SUITE (le cas le plus courant de « c'est figé »).
|
||
document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'visible') ping() })
|
||
ping() // amorçage immédiat
|
||
}
|
||
|
||
export function stopSessionKeepAlive () { if (_timer) { clearInterval(_timer); _timer = null } _started = false }
|