◆ Portail Antalaha

Annuaire › Code ouvert

Carnet de caisse du marché d'Antalaha

tutorial · Voir le site ↗
Connectez-vous pour copier ce site

Code publié par son auteur, en lecture seule. « Copier dans mon espace » crée un nouveau site à vous (non publié) que vous pouvez modifier librement.

js/stockage.js · 2.9 Ko

/* ============================================================
   Fichier : js/stockage.js
   Rôle    : petit module de sauvegarde qui NE PLANTE JAMAIS.
             Il essaie localStorage ; s'il est interdit, il garde
             les données en mémoire (perdues au rechargement).
   Dépend de : rien (aucun autre fichier).
   Utilisé par : js/app.js (qui doit être chargé APRÈS ce fichier).
   Expose : l'objet global « Stockage » avec lire(), ecrire(), mode().
   ------------------------------------------------------------
   POURQUOI CE FICHIER ?
   Les sites du Portail tournent dans un « bac à sable » (sandbox) :
   la page a une origine « opaque » et le navigateur refuse l'accès à
   localStorage en levant une SecurityError (même lire la propriété
   window.localStorage peut échouer !). Un programme qui ne prévoit pas
   ce cas s'arrête net. Ici, chaque accès est protégé par try/catch.
   ============================================================ */

/* On utilise une IIFE (fonction exécutée immédiatement) :
   les variables à l'intérieur restent PRIVÉES ; seul l'objet renvoyé
   à la fin est visible de l'extérieur. */
const Stockage = (function () {

  /** Mémoire de secours : un simple objet { clé: texte }. */
  const memoire = {};

  /** true tant que localStorage fonctionne ; passe à false au premier échec. */
  let navigateurDisponible = true;

  /**
   * Écrit une valeur (texte) sous une clé.
   * @param {string} cle    - le nom sous lequel on range la donnée
   * @param {string} valeur - le texte à ranger
   * @returns {void}
   */
  function ecrire(cle, valeur) {
    memoire[cle] = valeur; // on écrit TOUJOURS en mémoire : c'est la copie de secours
    if (!navigateurDisponible) { return; }
    try {
      window.localStorage.setItem(cle, valeur);
    } catch (erreur) {
      // SecurityError (bac à sable), QuotaExceededError (stockage plein)…
      navigateurDisponible = false;
    }
  }

  /**
   * Lit la valeur rangée sous une clé.
   * @param {string} cle - le nom de la donnée
   * @returns {string|null} le texte trouvé, ou null s'il n'y a rien
   */
  function lire(cle) {
    if (navigateurDisponible) {
      try {
        const valeur = window.localStorage.getItem(cle);
        if (valeur !== null) { return valeur; }
      } catch (erreur) {
        navigateurDisponible = false;
      }
    }
    // Repli : la mémoire (undefined si rien -> on renvoie null pour rester cohérent)
    return Object.prototype.hasOwnProperty.call(memoire, cle) ? memoire[cle] : null;
  }

  /**
   * Indique où sont réellement gardées les données.
   * Attention : ne pas appeler avant un premier lire()/ecrire(), car
   * la disponibilité n'est connue qu'après un premier essai.
   * @returns {string} "navigateur" ou "memoire"
   */
  function mode() {
    return navigateurDisponible ? "navigateur" : "memoire";
  }

  // Ce que l'on rend public :
  return { lire: lire, ecrire: ecrire, mode: mode };
})();