From fa74fa5fefcc88e7ed0152dad556d4689036eae8 Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Fri, 17 Jan 2025 17:32:45 +0100
Subject: [PATCH 01/13] Ajout menu extension

---
 "barre_lat\303\251rale/content.js" | 31 ++++++++++----------
 manifest.json                      | 46 ++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 16 deletions(-)
 create mode 100644 manifest.json

diff --git "a/barre_lat\303\251rale/content.js" "b/barre_lat\303\251rale/content.js"
index da428ce..3693549 100644
--- "a/barre_lat\303\251rale/content.js"
+++ "b/barre_lat\303\251rale/content.js"
@@ -1,19 +1,18 @@
 // Écouteur d'événement qui se déclenche lorsqu'un utilisateur relâche le bouton de la souris
 document.addEventListener('mouseup', () => {
   
-    // Récupère le texte sélectionné par l'utilisateur et supprime les espaces inutiles
-    const selection = window.getSelection().toString().trim();
-  
-    // Vérifie si une sélection de texte a bien été effectuée
-    if (selection) {
-      // Affiche dans la console le mot ou texte sélectionné pour le débogage
-      console.log("Mot sélectionné :", selection);
-  
-      // Envoie un message au script de la barre latérale pour lui transmettre le mot sélectionné
-      browser.runtime.sendMessage({ 
-        action: "mot_selectionne", // Action identifiant le type de message
-        mot: selection              // Le texte sélectionné
-      });
-    }
-  });
-  
\ No newline at end of file
+  // Récupère le texte sélectionné par l'utilisateur et supprime les espaces inutiles
+  const selection = window.getSelection().toString().trim();
+
+  // Vérifie si une sélection de texte a bien été effectuée
+  if (selection) {
+    // Affiche dans la console le mot ou texte sélectionné pour le débogage
+    console.log("Mot sélectionné :", selection);
+
+    // Envoie un message au script de la barre latérale pour lui transmettre le mot sélectionné
+    browser.runtime.sendMessage({ 
+      action: "mot_selectionne", // Action identifiant le type de message
+      mot: selection              // Le texte sélectionné
+    });
+  }
+});
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..b36ec6c
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,46 @@
+{
+  "manifest_version": 2,
+  "name": "ff2BaLex",
+  "version": "1.0",
+  "description": "Extension Firefox avec paramètres personnalisés.",
+  "permissions": [
+  "storage",
+  "activeTab",
+  "tabs",
+  "contextMenus",
+  "webNavigation",
+  "scripting",
+  "*://babalex.lezinter.net/*",
+  "*://prisms.lezinter.net/*"],
+  "background": {
+    "scripts": ["menu_extension/background.js"],
+    "persistent": true
+  },
+  "browser_action": {
+    "default_popup": "menu_extension/popup.html",
+    "default_icon": {
+      "16": "icons/icon-16.png",
+      "48": "icons/icon-48.png",
+      "128": "icons/icon-128.png"
+    },
+    "default_title": "ff2BaLex"
+  },
+  "options_ui": {
+    "page": "menu_extension/options.html",
+    "open_in_tab": false
+  },
+  "sidebar_action": {
+    "default_title": "BaLex",
+    "default_panel": "barre_latérale/sidebar.html",
+    "default_icon": {
+      "16": "icons/icon-16.png",
+      "48": "icons/icon-48.png"
+    }
+  },
+  "content_scripts": [
+  {
+    "matches": ["<all_urls>"],
+    "js": ["barre_latérale/content.js"]
+  }
+  ]
+}
-- 
GitLab


From 490950267a3b8b7f07358b3eda5afbf5ef8e8d1b Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Fri, 17 Jan 2025 17:33:01 +0100
Subject: [PATCH 02/13] Ajout menu extension

---
 menu_extension/manifest.json | 46 ------------------------------------
 1 file changed, 46 deletions(-)
 delete mode 100644 menu_extension/manifest.json

diff --git a/menu_extension/manifest.json b/menu_extension/manifest.json
deleted file mode 100644
index b36ec6c..0000000
--- a/menu_extension/manifest.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "manifest_version": 2,
-  "name": "ff2BaLex",
-  "version": "1.0",
-  "description": "Extension Firefox avec paramètres personnalisés.",
-  "permissions": [
-  "storage",
-  "activeTab",
-  "tabs",
-  "contextMenus",
-  "webNavigation",
-  "scripting",
-  "*://babalex.lezinter.net/*",
-  "*://prisms.lezinter.net/*"],
-  "background": {
-    "scripts": ["menu_extension/background.js"],
-    "persistent": true
-  },
-  "browser_action": {
-    "default_popup": "menu_extension/popup.html",
-    "default_icon": {
-      "16": "icons/icon-16.png",
-      "48": "icons/icon-48.png",
-      "128": "icons/icon-128.png"
-    },
-    "default_title": "ff2BaLex"
-  },
-  "options_ui": {
-    "page": "menu_extension/options.html",
-    "open_in_tab": false
-  },
-  "sidebar_action": {
-    "default_title": "BaLex",
-    "default_panel": "barre_latérale/sidebar.html",
-    "default_icon": {
-      "16": "icons/icon-16.png",
-      "48": "icons/icon-48.png"
-    }
-  },
-  "content_scripts": [
-  {
-    "matches": ["<all_urls>"],
-    "js": ["barre_latérale/content.js"]
-  }
-  ]
-}
-- 
GitLab


From 06967b78bd487062f925f862819cdd87d6738e5d Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Fri, 17 Jan 2025 17:46:53 +0100
Subject: [PATCH 03/13] =?UTF-8?q?Corrections=20d=C3=A9connexion?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 "barre_lat\303\251rale/content.js"   |  31 +++---
 "barre_lat\303\251rale/sidebar.html" |   3 +-
 "barre_lat\303\251rale/sidebar.js"   | 154 +++++++++++++++------------
 menu_extension/background.js         |   3 +
 menu_extension/options.js            |  11 +-
 menu_extension/popup.js              |   5 +
 6 files changed, 119 insertions(+), 88 deletions(-)

diff --git "a/barre_lat\303\251rale/content.js" "b/barre_lat\303\251rale/content.js"
index 3693549..1b524aa 100644
--- "a/barre_lat\303\251rale/content.js"
+++ "b/barre_lat\303\251rale/content.js"
@@ -1,18 +1,19 @@
 // Écouteur d'événement qui se déclenche lorsqu'un utilisateur relâche le bouton de la souris
 document.addEventListener('mouseup', () => {
   
-  // Récupère le texte sélectionné par l'utilisateur et supprime les espaces inutiles
-  const selection = window.getSelection().toString().trim();
-
-  // Vérifie si une sélection de texte a bien été effectuée
-  if (selection) {
-    // Affiche dans la console le mot ou texte sélectionné pour le débogage
-    console.log("Mot sélectionné :", selection);
-
-    // Envoie un message au script de la barre latérale pour lui transmettre le mot sélectionné
-    browser.runtime.sendMessage({ 
-      action: "mot_selectionne", // Action identifiant le type de message
-      mot: selection              // Le texte sélectionné
-    });
-  }
-});
+    // Récupère le texte sélectionné par l'utilisateur et supprime les espaces inutiles
+    const selection = window.getSelection().toString().trim();
+  
+    // Vérifie si une sélection de texte a bien été effectuée
+    if (selection) {
+      // Affiche dans la console le mot ou texte sélectionné pour le débogage
+      console.log("Mot sélectionné :", selection);
+  
+      // Envoie un message au script de la barre latérale pour lui transmettre le mot sélectionné
+      browser.runtime.sendMessage({ 
+        action: "mot_selectionne", // Action identifiant le type de message
+        mot: window.getSelection().toString().trim()              // Le texte sélectionné
+      });
+    }
+  });
+  
\ No newline at end of file
diff --git "a/barre_lat\303\251rale/sidebar.html" "b/barre_lat\303\251rale/sidebar.html"
index 5c3949b..5ce8395 100644
--- "a/barre_lat\303\251rale/sidebar.html"
+++ "b/barre_lat\303\251rale/sidebar.html"
@@ -4,6 +4,7 @@
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>BaLex - Barre Latérale</title>
+  <script src="sidebar.js"></script>
   <style>
     /* Style global */
     body {
@@ -124,7 +125,7 @@
 
   <!-- Définition affichée -->
   <div id="definition"></div>
-  <script src="sidebar.js"></script>
+
 
 </body>
 </html>
diff --git "a/barre_lat\303\251rale/sidebar.js" "b/barre_lat\303\251rale/sidebar.js"
index dbb8788..cc4d67a 100644
--- "a/barre_lat\303\251rale/sidebar.js"
+++ "b/barre_lat\303\251rale/sidebar.js"
@@ -1,86 +1,102 @@
-// Confirme le chargement du script dans la console
-console.log("sidebar.js chargé avec succès !");
-
-// Écoute les messages envoyés par le script de contenu pour afficher le mot sélectionné dans la barre latérale
-browser.runtime.onMessage.addListener((message) => {
-  if (message.action === "mot_selectionne") {
-    // Met à jour l'affichage du mot sélectionné
-    document.getElementById('motSelectionne').textContent = message.mot;
-    console.log("Mot reçu dans la barre latérale :", message.mot);
-  }
+console.log("✅ sidebar.js chargé avec succès !");
+
+let authToken = '';
+
+// Gestionnaire global des erreurs
+window.addEventListener('error', (e) => {
+  console.error("❗️ Erreur globale détectée :", e.message, "dans", e.filename, ":", e.lineno);
 });
 
-// Recherche la définition d'un mot sur le Wiktionnaire
-async function chercherDefinition(mot) {
-  const url = `https://fr.wiktionary.org/api/rest_v1/page/summary/${encodeURIComponent(mot)}`;
-  console.log("URL de la requête :", url);
+// 📩 Écoute des messages pour afficher le mot sélectionné
+document.addEventListener('DOMContentLoaded', () => {
+  browser.runtime.onMessage.addListener((message) => {
+    console.log("📩 Message reçu dans la barre latérale :", message);
+
+    if (message.action === "mot_selectionne") {
+      const selectedWordElement = document.getElementById('motSelectionne');
+      if (selectedWordElement) {
+        selectedWordElement.textContent = message.mot;
+        console.log(`📝 Mot sélectionné affiché : ${message.mot}`);
+      } else {
+        console.warn("⚠️ Élément #motSelectionne introuvable.");
+      }
+    }
+  });
+});
+
+// Vérification du format du token
+function validateToken(token) {
+  const isValid = /^\S+\.\S+\.\S+$/.test(token);
+  if (!isValid) {
+    console.warn("⚠️ Le format du token semble incorrect :", token);
+  }
+  return isValid;
+}
+
+// Lecture du token
+async function readTokenFile() {
+  const tokenFilePath = browser.runtime.getURL('../token.txt');
+  console.log('📂 Tentative de lecture du fichier token :', tokenFilePath);
 
   try {
-    // Effectue la requête API vers le Wiktionnaire
-    const response = await fetch(url);
+    const response = await fetch(tokenFilePath);
+    console.log(`📥 Statut de la lecture du fichier token : ${response.status}`);
+
     if (!response.ok) {
-      throw new Error(`Erreur HTTP : ${response.status}`);
+      throw new Error(`❌ Erreur lors de la lecture du fichier token : ${response.statusText}`);
     }
 
-    // Récupère et affiche la définition si elle existe
-    const data = await response.json();
-    const definitionDiv = document.getElementById('definition');
+    const token = await response.text();
+    authToken = token.trim();
+    console.log(`🔑 Token récupéré : [${authToken}]`);
 
-    if (data.extract) {
-      definitionDiv.innerHTML = `<strong>Définition de ${mot} :</strong><p>${data.extract}</p>`;
-    } else {
-      definitionDiv.innerHTML = `<p>Aucune définition trouvée pour : ${mot}</p>`;
+    if (!validateToken(authToken)) {
+      throw new Error("❌ Le token récupéré est invalide.");
     }
   } catch (error) {
-    console.error("Erreur lors de la récupération de la définition :", error);
-    document.getElementById('definition').innerHTML = "<p>Erreur lors de la recherche de la définition.</p>";
+    console.error('❗️ Erreur lors de la lecture du fichier token :', error);
   }
 }
 
-// Lance la recherche de la définition lorsque le bouton est cliqué
-document.getElementById('chercherDef').addEventListener('click', () => {
-  const mot = document.getElementById('motSelectionne').textContent;
-  if (mot && mot !== "Aucun mot sélectionné") {
-    chercherDefinition(mot);
-  } else {
-    alert("Veuillez sélectionner un mot avant de rechercher sa définition.");
+// Récupération des lexiques avec diagnostics détaillés
+async function fetchLexicons() {
+  console.log("🚀 La fonction fetchLexicons() est appelée.");
+
+  if (!authToken) {
+    console.error('❌ Token non disponible ou vide.');
+    document.getElementById('lexiques').textContent = 'Token manquant, impossible de charger les lexiques.';
+    return;
   }
-});
 
-// Charge dynamiquement les lexiques de l'utilisateur avec des cases à cocher
-async function chargerLexiques() {
-  const lexiques = ["Lexique 1", "Lexique 2", "Lexique 3"];
-  const container = document.getElementById('lexiques');
-  container.innerHTML = '';
-
-  lexiques.forEach(lexique => {
-    const div = document.createElement('div');
-    div.className = 'lexique-item';
-  
-    // Pictogramme
-    const icon = document.createElement('div');
-    icon.className = 'lexique-icon';
-    icon.id = `icon_${lexique.replace(/\s/g, '_')}`;
-  
-    // Nom du lexique
-    const label = document.createElement('label');
-    label.htmlFor = `chk_${lexique}`;
-    label.className = 'lexique-label';
-    label.textContent = lexique;
-  
-    // Case à cocher
-    const checkbox = document.createElement('input');
-    checkbox.type = 'checkbox';
-    checkbox.id = `chk_${lexique}`;
-    checkbox.className = 'lexique-checkbox';
-  
-    // Ordre : Pictogramme → Nom → Case à cocher
-    div.appendChild(icon);
-    div.appendChild(label);
-    div.appendChild(checkbox);
-    container.appendChild(div);
-  });  
+  try {
+    console.log(`📡 Tentative d'envoi de la requête GET avec le token : Bearer ${authToken}`);
+    const response = await fetch('https://babalex.lezinter.net/api/user/lexicons', {
+      method: 'GET',
+      headers: {
+        'Authorization': `Bearer ${authToken}`,
+        'Content-Type': 'application/json'
+      }
+    });
+
+    console.log(`📊 Statut de la réponse API : ${response.status}`);
+
+    if (!response.ok) {
+      const errorBody = await response.text();
+      throw new Error(`❌ Erreur API Babalex : ${response.status} - ${errorBody}`);
+    }
+
+    const lexicons = await response.json();
+    console.log('📚 Lexiques récupérés :', lexicons);
+    displayLexicons(lexicons);
+  } catch (error) {
+    console.error('❗️ Erreur pendant la récupération des lexiques :', error);
+    document.getElementById('lexiques').textContent = 'Impossible de charger les lexiques. Vérifiez votre connexion ou le token.';
+  }
 }
 
-// Chargement des lexiques dès l'ouverture de la barre latérale
-chargerLexiques();
+// Lancement automatique après le chargement de la page
+window.onload = async () => {
+  console.log("📦 Page complètement chargée. Lecture du token et récupération des lexiques...");
+  await readTokenFile();
+  await fetchLexicons();
+};
\ No newline at end of file
diff --git a/menu_extension/background.js b/menu_extension/background.js
index 88538aa..8a0b0f8 100644
--- a/menu_extension/background.js
+++ b/menu_extension/background.js
@@ -92,6 +92,9 @@ async function disconnectFromLexicalDB() {
   console.log("Token supprimé, déconnexion réussie.");
   alert("Déconnexion réussie.");
   updateContextMenu();
+
+  // Envoi d'un message pour mettre à jour l'UI
+  browser.runtime.sendMessage({ action: "updateUI" });
 }
 
 // === 7. Vérifier si l'utilisateur est connecté ===
diff --git a/menu_extension/options.js b/menu_extension/options.js
index cbfd4cf..22cba4c 100644
--- a/menu_extension/options.js
+++ b/menu_extension/options.js
@@ -2,10 +2,15 @@ document.getElementById('connectBtn').addEventListener('click', () => {
   browser.runtime.sendMessage({ action: "openLoginPage" });
 });
 
-document.getElementById('disconnectBtn').addEventListener('click', async () => {
-  await browser.storage.local.remove(["accessToken", "refreshToken"]);
+async function disconnectFromLexicalDB() {
+  await browser.storage.local.remove("accessToken");
+  console.log("Token supprimé, déconnexion réussie.");
   alert("Déconnexion réussie.");
-});
+  updateContextMenu();
+
+  // Envoi d'un message pour mettre à jour l'UI
+  browser.runtime.sendMessage({ action: "updateUI" });
+}
   
 document.getElementById("toggleExtensionBtn").addEventListener("click", async () => {
   const { extensionActive } = await browser.storage.local.get("extensionActive");
diff --git a/menu_extension/popup.js b/menu_extension/popup.js
index 458e207..6d58b8b 100644
--- a/menu_extension/popup.js
+++ b/menu_extension/popup.js
@@ -56,3 +56,8 @@ document.addEventListener("DOMContentLoaded", () => {
   }
 });
 
+browser.runtime.onMessage.addListener((message) => {
+  if (message.action === "updateUI") {
+    updateConnectionButton();
+  }
+});
\ No newline at end of file
-- 
GitLab


From 32c2e97491092879101eacde340a6dbc0b2f3711 Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Fri, 17 Jan 2025 19:56:26 +0100
Subject: [PATCH 04/13] Correctifs

---
 "barre_lat\303\251rale/sidebar.js" | 78 ++++++++++++++++++++----------
 1 file changed, 53 insertions(+), 25 deletions(-)

diff --git "a/barre_lat\303\251rale/sidebar.js" "b/barre_lat\303\251rale/sidebar.js"
index cc4d67a..bcdc8fd 100644
--- "a/barre_lat\303\251rale/sidebar.js"
+++ "b/barre_lat\303\251rale/sidebar.js"
@@ -33,38 +33,66 @@ function validateToken(token) {
   return isValid;
 }
 
-// Lecture du token
-async function readTokenFile() {
-  const tokenFilePath = browser.runtime.getURL('../token.txt');
-  console.log('📂 Tentative de lecture du fichier token :', tokenFilePath);
+// Lecture du token depuis le local storage
+async function readTokenFromStorage() {
+  const { accessToken } = await browser.storage.local.get("accessToken");
+  if (accessToken && validateToken(accessToken)) {
+    authToken = accessToken;
+    console.log(`🔑 Token récupéré depuis le stockage local : [${authToken}]`);
+  } else {
+    console.error("❌ Token invalide ou non trouvé dans le stockage local.");
+  }
+}
 
-  try {
-    const response = await fetch(tokenFilePath);
-    console.log(`📥 Statut de la lecture du fichier token : ${response.status}`);
+// Affichage des lexiques avec cases à cocher et pictogrammes
+function displayLexicons(lexicons) {
+  const lexiquesContainer = document.getElementById('lexiques');
+  lexiquesContainer.innerHTML = '';
 
-    if (!response.ok) {
-      throw new Error(`❌ Erreur lors de la lecture du fichier token : ${response.statusText}`);
-    }
+  if (lexicons.length === 0) {
+    lexiquesContainer.textContent = 'Aucun lexique disponible.';
+    return;
+  }
 
-    const token = await response.text();
-    authToken = token.trim();
-    console.log(`🔑 Token récupéré : [${authToken}]`);
+  lexicons.forEach(lexique => {
+    const lexiqueDiv = document.createElement('div');
+    lexiqueDiv.className = 'lexique-item';
 
-    if (!validateToken(authToken)) {
-      throw new Error("❌ Le token récupéré est invalide.");
-    }
-  } catch (error) {
-    console.error('❗️ Erreur lors de la lecture du fichier token :', error);
-  }
+    // Pictogramme
+    const iconDiv = document.createElement('div');
+    iconDiv.className = 'lexique-icon';
+    iconDiv.style.backgroundColor = '#ccc';
+
+    // Nom du lexique
+    const labelSpan = document.createElement('span');
+    labelSpan.className = 'lexique-label';
+    labelSpan.textContent = lexique.name;
+
+    // Case à cocher
+    const checkbox = document.createElement('input');
+    checkbox.type = 'checkbox';
+    checkbox.className = 'lexique-checkbox';
+    checkbox.checked = lexique.active || false;
+
+    // Assemblage des éléments
+    lexiqueDiv.appendChild(iconDiv);
+    lexiqueDiv.appendChild(labelSpan);
+    lexiqueDiv.appendChild(checkbox);
+
+    lexiquesContainer.appendChild(lexiqueDiv);
+  });
 }
 
 // Récupération des lexiques avec diagnostics détaillés
 async function fetchLexicons() {
   console.log("🚀 La fonction fetchLexicons() est appelée.");
 
+  const lexiquesContainer = document.getElementById('lexiques');
+  lexiquesContainer.innerHTML = ''; // Vide le conteneur avant la récupération
+
   if (!authToken) {
-    console.error('❌ Token non disponible ou vide.');
-    document.getElementById('lexiques').textContent = 'Token manquant, impossible de charger les lexiques.';
+    console.warn('⚠️ Token non disponible ou vide.');
+    lexiquesContainer.textContent = 'Lexiques non disponibles. Veuillez vous connecter.';
     return;
   }
 
@@ -90,13 +118,13 @@ async function fetchLexicons() {
     displayLexicons(lexicons);
   } catch (error) {
     console.error('❗️ Erreur pendant la récupération des lexiques :', error);
-    document.getElementById('lexiques').textContent = 'Impossible de charger les lexiques. Vérifiez votre connexion ou le token.';
+    lexiquesContainer.textContent = 'Impossible de charger les lexiques. Vérifiez votre connexion ou le token.';
   }
 }
 
 // Lancement automatique après le chargement de la page
 window.onload = async () => {
-  console.log("📦 Page complètement chargée. Lecture du token et récupération des lexiques...");
-  await readTokenFile();
+  console.log("📦 Page complètement chargée. Récupération du token depuis le stockage local et récupération des lexiques...");
+  await readTokenFromStorage();
   await fetchLexicons();
-};
\ No newline at end of file
+};
-- 
GitLab


From 4c9e48cae24396445d6f820075a31ed2f3ac3e1b Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sat, 18 Jan 2025 10:27:01 +0100
Subject: [PATCH 05/13] =?UTF-8?q?Am=C3=A9lioration=20bouton=20connexion?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 "barre_lat\303\251rale/sidebar.js" | 37 ++++++-------
 menu_extension/background.js       | 89 +++++++++++++++---------------
 menu_extension/login.html          | 36 ------------
 menu_extension/login.js            | 36 ------------
 menu_extension/popup.js            | 53 +++++++-----------
 5 files changed, 80 insertions(+), 171 deletions(-)
 delete mode 100644 menu_extension/login.html
 delete mode 100644 menu_extension/login.js

diff --git "a/barre_lat\303\251rale/sidebar.js" "b/barre_lat\303\251rale/sidebar.js"
index bcdc8fd..454a175 100644
--- "a/barre_lat\303\251rale/sidebar.js"
+++ "b/barre_lat\303\251rale/sidebar.js"
@@ -7,21 +7,24 @@ window.addEventListener('error', (e) => {
   console.error("❗️ Erreur globale détectée :", e.message, "dans", e.filename, ":", e.lineno);
 });
 
-// 📩 Écoute des messages pour afficher le mot sélectionné
-document.addEventListener('DOMContentLoaded', () => {
-  browser.runtime.onMessage.addListener((message) => {
-    console.log("📩 Message reçu dans la barre latérale :", message);
-
-    if (message.action === "mot_selectionne") {
-      const selectedWordElement = document.getElementById('motSelectionne');
-      if (selectedWordElement) {
-        selectedWordElement.textContent = message.mot;
-        console.log(`📝 Mot sélectionné affiché : ${message.mot}`);
-      } else {
-        console.warn("⚠️ Élément #motSelectionne introuvable.");
-      }
+// 📩 Écoute des messages pour recharger la barre latérale
+browser.runtime.onMessage.addListener((message) => {
+  console.log("📩 Message reçu dans la barre latérale :", message);
+
+  if (message.action === "refreshSidebar") {
+    console.log("🔄 Rafraîchissement de la barre latérale déclenché.");
+    window.location.reload();
+  }
+
+  if (message.action === "mot_selectionne") {
+    const selectedWordElement = document.getElementById('motSelectionne');
+    if (selectedWordElement) {
+      selectedWordElement.textContent = message.mot;
+      console.log(`📝 Mot sélectionné affiché : ${message.mot}`);
+    } else {
+      console.warn("⚠️ Élément #motSelectionne introuvable.");
     }
-  });
+  }
 });
 
 // Vérification du format du token
@@ -58,23 +61,19 @@ function displayLexicons(lexicons) {
     const lexiqueDiv = document.createElement('div');
     lexiqueDiv.className = 'lexique-item';
 
-    // Pictogramme
     const iconDiv = document.createElement('div');
     iconDiv.className = 'lexique-icon';
     iconDiv.style.backgroundColor = '#ccc';
 
-    // Nom du lexique
     const labelSpan = document.createElement('span');
     labelSpan.className = 'lexique-label';
     labelSpan.textContent = lexique.name;
 
-    // Case à cocher
     const checkbox = document.createElement('input');
     checkbox.type = 'checkbox';
     checkbox.className = 'lexique-checkbox';
     checkbox.checked = lexique.active || false;
 
-    // Assemblage des éléments
     lexiqueDiv.appendChild(iconDiv);
     lexiqueDiv.appendChild(labelSpan);
     lexiqueDiv.appendChild(checkbox);
@@ -88,7 +87,7 @@ async function fetchLexicons() {
   console.log("🚀 La fonction fetchLexicons() est appelée.");
 
   const lexiquesContainer = document.getElementById('lexiques');
-  lexiquesContainer.innerHTML = ''; // Vide le conteneur avant la récupération
+  lexiquesContainer.innerHTML = '';
 
   if (!authToken) {
     console.warn('⚠️ Token non disponible ou vide.');
diff --git a/menu_extension/background.js b/menu_extension/background.js
index 8a0b0f8..528b04f 100644
--- a/menu_extension/background.js
+++ b/menu_extension/background.js
@@ -1,81 +1,67 @@
+// === 1. Variables globales ===
 let isExtensionActive = true;
 let areStatsActive = false;
 
 console.log("ff2BaLex est chargé.");
 
-// === 1. Installation de l'extension ===
+// === 2. Installation de l'extension ===
 browser.runtime.onInstalled.addListener(() => {
   console.log("ff2BaLex est installé.");
-
-  // Création d'un bouton unique de connexion/déconnexion
-  browser.contextMenus.create({
-    id: "toggle_connection",
-    title: "Se connecter à la base lexicale",
-    contexts: ["all"]
-  });
 });
 
-// === 2. Suivi des changements de paramètres ===
+// === 3. Suivi des changements de paramètres ===
 browser.storage.onChanged.addListener((changes) => {
   if (changes.extensionActive) {
     isExtensionActive = changes.extensionActive.newValue;
     console.log("Extension activée :", isExtensionActive);
   }
-
   if (changes.statsActive) {
     areStatsActive = changes.statsActive.newValue;
     console.log("Statistiques activées :", areStatsActive);
   }
 });
 
-// === 3. Gestion des messages provenant du bouton Connexion/Déconnexion ===
+// === 4. Gestion des connexions/déconnexions ===
 browser.runtime.onMessage.addListener(async (message) => {
   if (message.action === "toggleConnection") {
     const isConnected = await isUserConnected();
     if (isConnected) {
-      disconnectFromLexicalDB();
+      await disconnectFromLexicalDB();
     } else {
       openLoginPage();
     }
+  } else if (message.action === "showNotification") {
+    showNotification(message.title, message.message, message.iconUrl);
+  } else if (message.action === "updateExtensionUI") {
+    refreshExtensionMenu();
   }
 });
 
-// === 4. Ouvrir la page de connexion Prisms ===
 function openLoginPage() {
   const authUrl = "https://prisms.lezinter.net/fr/login";
   browser.tabs.create({ url: authUrl });
 }
 
-// === 5. Suivi du parcours de connexion et récupération du token ===
 browser.webNavigation.onCompleted.addListener(async (details) => {
   const url = new URL(details.url);
-
-  // Si connecté, rediriger vers la page BaLex dans Prisms
-  if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/login") {
-    console.log("Connecté à Prisms, veuillez cliquer sur 'Se connecter avec BaLex'...");
-  }
-
-  // Une fois sur la page du tableau de bord BaLex, récupérer le token
   if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/headquarters/balex") {
     console.log("Tentative de récupération du token depuis Prisms...");
-
     try {
-      await new Promise(resolve => setTimeout(resolve, 3000));  // Pause pour chargement complet
+      await new Promise(resolve => setTimeout(resolve, 3000));
       await browser.tabs.executeScript(details.tabId, {
         code: `
           (function() {
             const tokenElement = document.getElementById("accesToken");
-            console.log("Token détecté :", tokenElement ? tokenElement.innerText : "Non trouvé");
             return tokenElement ? tokenElement.innerText.trim() : null;
-          })();
-        `
+          })();`
       }).then(async (results) => {
         const token = results[0];
         if (token) {
           await browser.storage.local.set({ accessToken: token });
           console.log("Token récupéré et stocké :", token);
-          alert("Connexion réussie !");
-          updateContextMenu();
+          showNotification('Connexion réussie', 'La barre latérale va se recharger automatiquement.', 'icons/success.png');
+          refreshSidebar();
+          refreshExtensionMenu();
         } else {
           console.error("Token non trouvé sur la page Prisms.");
         }
@@ -86,40 +72,51 @@ browser.webNavigation.onCompleted.addListener(async (details) => {
   }
 }, { url: [{ hostContains: "prisms.lezinter.net" }] });
 
-// === 6. Déconnexion ===
 async function disconnectFromLexicalDB() {
   await browser.storage.local.remove("accessToken");
   console.log("Token supprimé, déconnexion réussie.");
-  alert("Déconnexion réussie.");
-  updateContextMenu();
-
-  // Envoi d'un message pour mettre à jour l'UI
-  browser.runtime.sendMessage({ action: "updateUI" });
+  showNotification('Déconnexion réussie', 'La barre latérale va se recharger automatiquement.', 'icons/logout.png');
+  refreshSidebar();
+  refreshExtensionMenu();
 }
 
-// === 7. Vérifier si l'utilisateur est connecté ===
 async function isUserConnected() {
   const result = await browser.storage.local.get("accessToken");
   return result.accessToken !== undefined;
 }
 
-// === 8. Mise à jour dynamique du menu contextuel ===
-browser.runtime.onStartup.addListener(() => {
-  updateContextMenu();
-});
+function refreshSidebar() {
+  browser.runtime.sendMessage({ action: "refreshSidebar" });
+}
 
-async function updateContextMenu() {
-  const isConnected = await isUserConnected();
-  browser.contextMenus.update("toggle_connection", {
-    title: isConnected ? "Se déconnecter de la base lexicale" : "Se connecter à la base lexicale"
-  });
+function refreshExtensionMenu() {
+  browser.runtime.sendMessage({ action: "refreshMenu" });
 }
 
-// === 9. Rafraîchissement périodique du token (désactivé) ===
 function refreshToken() {
   console.warn("Aucune API de rafraîchissement disponible. Rafraîchissement désactivé.");
 }
 
 setInterval(() => {
   refreshToken();
-}, 15 * 60 * 1000); // Désactivé faute d'API de rafraîchissement
+}, 15 * 60 * 1000);
+
+function showNotification(title, message, iconUrl) {
+  if (typeof browser.notifications !== "undefined") {
+    browser.notifications.create({
+      type: 'basic',
+      iconUrl: iconUrl,
+      title: title,
+      message: message
+    });
+  } else if (typeof chrome.notifications !== "undefined") {
+    chrome.notifications.create({
+      type: 'basic',
+      iconUrl: iconUrl,
+      title: title,
+      message: message
+    });
+  } else {
+    console.warn("Notifications non supportées.");
+  }
+}
diff --git a/menu_extension/login.html b/menu_extension/login.html
deleted file mode 100644
index 1f53747..0000000
--- a/menu_extension/login.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html lang="fr">
-<head>
-  <meta charset="UTF-8">
-  <title>Connexion à BaLex</title>
-  <style>
-    body {
-      background-color: #323046;
-      color: white;
-      font-family: Arial, sans-serif;
-      text-align: center;
-      padding-top: 50px;
-    }
-    input {
-      width: 80%;
-      padding: 10px;
-      margin: 10px 0;
-    }
-    button {
-      padding: 10px 20px;
-      background-color: #94608a;
-      color: white;
-      border: none;
-      cursor: pointer;
-    }
-  </style>
-</head>
-<body>
-  <h2>Connexion à BaLex</h2>
-  <input type="text" id="username" placeholder="Nom d'utilisateur"><br>
-  <input type="password" id="password" placeholder="Mot de passe"><br>
-  <button id="loginButton">Se connecter</button>
-
-  <script src="login.js"></script>
-</body>
-</html>
diff --git a/menu_extension/login.js b/menu_extension/login.js
deleted file mode 100644
index 04a8776..0000000
--- a/menu_extension/login.js
+++ /dev/null
@@ -1,36 +0,0 @@
-document.getElementById('loginButton').addEventListener('click', async () => {
-    const username = document.getElementById('username').value;
-    const password = document.getElementById('password').value;
-  
-    if (username && password) {
-      const apiUrl = "https://babalex.lezinter.net/login";
-  
-      try {
-        const response = await fetch(apiUrl, {
-          method: "POST",
-          headers: {
-            "Content-Type": "application/json"
-          },
-          body: JSON.stringify({ username, password })
-        });
-  
-        const data = await response.json();
-        if (data.accessToken && data.refreshToken) {
-          await browser.storage.local.set({
-            accessToken: data.accessToken,
-            refreshToken: data.refreshToken
-          });
-          alert("Connexion réussie !");
-          window.close();  // Ferme la fenêtre de connexion
-        } else {
-          alert("Identifiants incorrects.");
-        }
-      } catch (error) {
-        console.error("Erreur lors de la connexion :", error);
-        alert("Erreur de connexion.");
-      }
-    } else {
-      alert("Veuillez remplir tous les champs.");
-    }
-  });
-  
\ No newline at end of file
diff --git a/menu_extension/popup.js b/menu_extension/popup.js
index 6d58b8b..7cf2e68 100644
--- a/menu_extension/popup.js
+++ b/menu_extension/popup.js
@@ -3,22 +3,30 @@ async function updateConnectionButton() {
   const { accessToken } = await browser.storage.local.get("accessToken");
   const button = document.getElementById("connectBtn");
 
-  button.textContent = accessToken ? "Se déconnecter" : "Se connecter";
+  if (button) {
+    button.textContent = accessToken ? "Se déconnecter" : "Se connecter";
+    button.onclick = async () => {
+      await browser.runtime.sendMessage({ action: "toggleConnection" });
+    };
+  } else {
+    console.error("Le bouton de connexion n'a pas été trouvé.");
+  }
 }
 
-// Action au clic du bouton Connexion/Déconnexion
-document.getElementById("connectBtn").addEventListener("click", () => {
-  console.log("Redirection vers la page de connexion...");
-  browser.runtime.sendMessage({ action: "connectToBaLex" });
-});
-
+// === 2. Action au clic du bouton Connexion/Déconnexion ===
 browser.runtime.onMessage.addListener((message) => {
   if (message.action === "tokenSaved") {
     alert("Connexion réussie !");
+    updateConnectionButton();
+  }
+
+  if (message.action === "refreshMenu") {
+    console.log("🔄 Actualisation du menu de l'extension déclenchée.");
+    updateConnectionButton();
   }
 });
 
-// === 2. Activer/Désactiver l'extension ===
+// === 3. Activer/Désactiver l'extension ===
 document.getElementById("toggleExtensionBtn").addEventListener("click", async () => {
   const { extensionActive } = await browser.storage.local.get("extensionActive");
   const newState = !extensionActive;
@@ -26,7 +34,7 @@ document.getElementById("toggleExtensionBtn").addEventListener("click", async ()
   alert(`Extension ${newState ? "activée" : "désactivée"}.`);
 });
 
-// === 3. Activer/Désactiver les statistiques ===
+// === 4. Activer/Désactiver les statistiques ===
 document.getElementById("toggleStatsBtn").addEventListener("click", async () => {
   const { statsActive } = await browser.storage.local.get("statsActive");
   const newState = !statsActive;
@@ -34,30 +42,7 @@ document.getElementById("toggleStatsBtn").addEventListener("click", async () =>
   alert(`Statistiques ${newState ? "activées" : "désactivées"}.`);
 });
 
-// === 4. Mise à jour initiale du bouton Connexion/Déconnexion ===
-updateConnectionButton();
-
-// Vérification pour le bouton de connexion
+// === 5. Mise à jour initiale du bouton Connexion/Déconnexion ===
 document.addEventListener("DOMContentLoaded", () => {
-  const connectBtn = document.getElementById("connectBtn");
-
-  if (connectBtn) {
-    connectBtn.addEventListener("click", async () => {
-      console.log("Clic détecté sur le bouton Connexion");
-      try {
-        await browser.runtime.sendMessage({ action: "toggleConnection" });
-        console.log("Message envoyé au background.");
-      } catch (error) {
-        console.error("Erreur lors de l'envoi du message :", error);
-      }
-    });
-  } else {
-    console.error("Le bouton de connexion n'a pas été trouvé.");
-  }
+  updateConnectionButton();
 });
-
-browser.runtime.onMessage.addListener((message) => {
-  if (message.action === "updateUI") {
-    updateConnectionButton();
-  }
-});
\ No newline at end of file
-- 
GitLab


From ad9061fa1a95fafb8ad39286ca11de09802c4cf7 Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sat, 18 Jan 2025 12:03:56 +0100
Subject: [PATCH 06/13] =?UTF-8?q?Redirection=20auto=20vers=20le=20token=20?=
 =?UTF-8?q?d'authentification=20apr=C3=A8s=20connexion=20de=20l'utilisateu?=
 =?UTF-8?q?r?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 manifest.json                | 40 +++++++++++-----
 menu_extension/background.js | 90 ++++++++++++++++++++----------------
 2 files changed, 78 insertions(+), 52 deletions(-)

diff --git a/manifest.json b/manifest.json
index b36ec6c..8a83e2d 100644
--- a/manifest.json
+++ b/manifest.json
@@ -3,19 +3,25 @@
   "name": "ff2BaLex",
   "version": "1.0",
   "description": "Extension Firefox avec paramètres personnalisés.",
+  
   "permissions": [
-  "storage",
-  "activeTab",
-  "tabs",
-  "contextMenus",
-  "webNavigation",
-  "scripting",
-  "*://babalex.lezinter.net/*",
-  "*://prisms.lezinter.net/*"],
+    "storage",
+    "activeTab",
+    "tabs",
+    "contextMenus",
+    "webNavigation",
+    "webRequest",
+    "webRequestBlocking",
+    "notifications",
+    "*://babalex.lezinter.net/*",
+    "*://prisms.lezinter.net/*"
+  ],
+
   "background": {
     "scripts": ["menu_extension/background.js"],
     "persistent": true
   },
+
   "browser_action": {
     "default_popup": "menu_extension/popup.html",
     "default_icon": {
@@ -25,10 +31,12 @@
     },
     "default_title": "ff2BaLex"
   },
+
   "options_ui": {
     "page": "menu_extension/options.html",
     "open_in_tab": false
   },
+
   "sidebar_action": {
     "default_title": "BaLex",
     "default_panel": "barre_latérale/sidebar.html",
@@ -37,10 +45,18 @@
       "48": "icons/icon-48.png"
     }
   },
+
   "content_scripts": [
-  {
-    "matches": ["<all_urls>"],
-    "js": ["barre_latérale/content.js"]
-  }
+    {
+      "matches": ["https://prisms.lezinter.net/*"],
+      "js": ["barre_latérale/content.js"],
+      "run_at": "document_end"
+    }
+  ],
+
+  "web_accessible_resources": [
+    "icons/*",
+    "menu_extension/*",
+    "barre_latérale/*"
   ]
 }
diff --git a/menu_extension/background.js b/menu_extension/background.js
index 528b04f..45dc771 100644
--- a/menu_extension/background.js
+++ b/menu_extension/background.js
@@ -2,22 +2,22 @@
 let isExtensionActive = true;
 let areStatsActive = false;
 
-console.log("ff2BaLex est chargé.");
+console.log("🚀 ff2BaLex est chargé.");
 
 // === 2. Installation de l'extension ===
 browser.runtime.onInstalled.addListener(() => {
-  console.log("ff2BaLex est installé.");
+  console.log("🔔 Extension ff2BaLex installée.");
 });
 
 // === 3. Suivi des changements de paramètres ===
 browser.storage.onChanged.addListener((changes) => {
   if (changes.extensionActive) {
     isExtensionActive = changes.extensionActive.newValue;
-    console.log("Extension activée :", isExtensionActive);
+    console.log("✅ Extension activée :", isExtensionActive);
   }
   if (changes.statsActive) {
     areStatsActive = changes.statsActive.newValue;
-    console.log("Statistiques activées :", areStatsActive);
+    console.log("📊 Statistiques activées :", areStatsActive);
   }
 });
 
@@ -40,42 +40,63 @@ browser.runtime.onMessage.addListener(async (message) => {
 function openLoginPage() {
   const authUrl = "https://prisms.lezinter.net/fr/login";
   browser.tabs.create({ url: authUrl });
+  console.log("🔗 Page de connexion ouverte.");
 }
 
+// === 5. Redirection immédiate vers /balex via webRequest ===
+browser.webRequest.onBeforeRequest.addListener(
+  function(details) {
+    if (details.url === "https://prisms.lezinter.net/fr/headquarters/") {
+      console.log("🚀 Redirection immédiate vers /balex via webRequest.");
+      return { redirectUrl: "https://prisms.lezinter.net/fr/headquarters/balex" };
+    }
+  },
+  { urls: ["https://prisms.lezinter.net/fr/headquarters/*"] },
+  ["blocking"]
+);
+
+// === 6. Récupération automatique du token sur /balex ===
 browser.webNavigation.onCompleted.addListener(async (details) => {
   const url = new URL(details.url);
+
   if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/headquarters/balex") {
-    console.log("Tentative de récupération du token depuis Prisms...");
+    console.log("🟢 L'utilisateur est sur la page /balex. Tentative de récupération du token.");
     try {
       await new Promise(resolve => setTimeout(resolve, 3000));
       await browser.tabs.executeScript(details.tabId, {
         code: `
-          (function() {
-            const tokenElement = document.getElementById("accesToken");
-            return tokenElement ? tokenElement.innerText.trim() : null;
-          })();`
-      }).then(async (results) => {
-        const token = results[0];
-        if (token) {
-          await browser.storage.local.set({ accessToken: token });
-          console.log("Token récupéré et stocké :", token);
-          showNotification('Connexion réussie', 'La barre latérale va se recharger automatiquement.', 'icons/success.png');
-          refreshSidebar();
-          refreshExtensionMenu();
-        } else {
-          console.error("Token non trouvé sur la page Prisms.");
-        }
+          console.log("🔍 Recherche du token...");
+          const tokenElement = document.getElementById("accesToken");
+          if (tokenElement) {
+            const token = tokenElement.innerText.trim();
+            console.log("🔐 Token détecté :", token);
+            browser.runtime.sendMessage({ action: "saveToken", token });
+          } else {
+            console.error("❌ Token introuvable.");
+          }
+        `
       });
     } catch (error) {
-      console.error("Erreur lors de la récupération du token :", error);
+      console.error("❌ Erreur lors de la récupération du token :", error);
     }
   }
 }, { url: [{ hostContains: "prisms.lezinter.net" }] });
 
+// === 7. Sauvegarde du token ===
+browser.runtime.onMessage.addListener(async (message) => {
+  if (message.action === "saveToken" && message.token) {
+    await browser.storage.local.set({ accessToken: message.token });
+    console.log("✅ Token sauvegardé :", message.token);
+    showNotification('Connexion réussie', 'La barre latérale va se recharger.', 'icons/success.png');
+    refreshSidebar();
+    refreshExtensionMenu();
+  }
+});
+
 async function disconnectFromLexicalDB() {
   await browser.storage.local.remove("accessToken");
-  console.log("Token supprimé, déconnexion réussie.");
-  showNotification('Déconnexion réussie', 'La barre latérale va se recharger automatiquement.', 'icons/logout.png');
+  console.log("🔓 Déconnexion réussie.");
+  showNotification('Déconnexion réussie', 'La barre latérale va se recharger.', 'icons/logout.png');
   refreshSidebar();
   refreshExtensionMenu();
 }
@@ -93,30 +114,19 @@ function refreshExtensionMenu() {
   browser.runtime.sendMessage({ action: "refreshMenu" });
 }
 
-function refreshToken() {
-  console.warn("Aucune API de rafraîchissement disponible. Rafraîchissement désactivé.");
-}
-
-setInterval(() => {
-  refreshToken();
-}, 15 * 60 * 1000);
-
 function showNotification(title, message, iconUrl) {
-  if (typeof browser.notifications !== "undefined") {
+  if (browser.notifications) {
     browser.notifications.create({
       type: 'basic',
       iconUrl: iconUrl,
       title: title,
       message: message
     });
-  } else if (typeof chrome.notifications !== "undefined") {
-    chrome.notifications.create({
-      type: 'basic',
-      iconUrl: iconUrl,
-      title: title,
-      message: message
-    });
   } else {
-    console.warn("Notifications non supportées.");
+    console.warn("⚠️ Notifications non supportées.");
   }
 }
+
+setInterval(() => {
+  console.warn("⚠️ Aucune API de rafraîchissement disponible.");
+}, 15 * 60 * 1000);
-- 
GitLab


From 4fd8a6e512d006b861339f9cf88d9808caa4affc Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sat, 18 Jan 2025 12:30:06 +0100
Subject: [PATCH 07/13] Ajout popup instructions connexion utilisateur

---
 menu_extension/background.js | 83 +++++++++++++++++++++++++++++-------
 1 file changed, 68 insertions(+), 15 deletions(-)

diff --git a/menu_extension/background.js b/menu_extension/background.js
index 45dc771..d454913 100644
--- a/menu_extension/background.js
+++ b/menu_extension/background.js
@@ -9,6 +9,10 @@ browser.runtime.onInstalled.addListener(() => {
   console.log("🔔 Extension ff2BaLex installée.");
 });
 
+browser.runtime.onStartup.addListener(() => {
+  console.log("🔄 Extension démarrée.");
+});
+
 // === 3. Suivi des changements de paramètres ===
 browser.storage.onChanged.addListener((changes) => {
   if (changes.extensionActive) {
@@ -43,22 +47,15 @@ function openLoginPage() {
   console.log("🔗 Page de connexion ouverte.");
 }
 
-// === 5. Redirection immédiate vers /balex via webRequest ===
-browser.webRequest.onBeforeRequest.addListener(
-  function(details) {
-    if (details.url === "https://prisms.lezinter.net/fr/headquarters/") {
-      console.log("🚀 Redirection immédiate vers /balex via webRequest.");
-      return { redirectUrl: "https://prisms.lezinter.net/fr/headquarters/balex" };
-    }
-  },
-  { urls: ["https://prisms.lezinter.net/fr/headquarters/*"] },
-  ["blocking"]
-);
-
-// === 6. Récupération automatique du token sur /balex ===
+// === 5. Afficher le popup après redirection vers Prisms ===
 browser.webNavigation.onCompleted.addListener(async (details) => {
   const url = new URL(details.url);
 
+  if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/login") {
+    console.log("📘 Injection du popup d'instruction sur Prisms.");
+    showInstructionPopup(details);  // Injection directe dans la page
+  }
+
   if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/headquarters/balex") {
     console.log("🟢 L'utilisateur est sur la page /balex. Tentative de récupération du token.");
     try {
@@ -82,7 +79,62 @@ browser.webNavigation.onCompleted.addListener(async (details) => {
   }
 }, { url: [{ hostContains: "prisms.lezinter.net" }] });
 
-// === 7. Sauvegarde du token ===
+
+// === 6. Redirection immédiate vers /balex ===
+browser.webRequest.onBeforeRequest.addListener(
+  function(details) {
+    if (details.url === "https://prisms.lezinter.net/fr/headquarters/") {
+      console.log("🚀 Redirection automatique vers /balex.");
+      return { redirectUrl: "https://prisms.lezinter.net/fr/headquarters/balex" };
+    }
+  },
+  { urls: ["https://prisms.lezinter.net/fr/headquarters/*"] },
+  ["blocking"]
+);
+
+// === 7. Injection du popup directement dans la page ===
+function showInstructionPopup(details) {
+  console.log("📘 Injection du message d'instruction sur la page Prisms.");
+
+  browser.tabs.executeScript(details.tabId, {
+    code: `
+      if (!document.getElementById("balex-instruction-popup")) {
+        const popup = document.createElement("div");
+        popup.id = "balex-instruction-popup";
+        popup.style.position = "fixed";
+        popup.style.top = "20px";
+        popup.style.right = "20px";
+        popup.style.backgroundColor = "#007BFF";
+        popup.style.color = "white";
+        popup.style.padding = "15px";
+        popup.style.borderRadius = "8px";
+        popup.style.boxShadow = "0px 0px 10px rgba(0, 0, 0, 0.2)";
+        popup.style.zIndex = "10000";
+        popup.innerText = "🔔 Pour vous connecter à l'extension, cliquez sur 'Se connecter avec BaLex' après avoir renseigné vos identifiants.";
+
+        const closeButton = document.createElement("button");
+        closeButton.innerText = "Fermer";
+        closeButton.style.marginTop = "10px";
+        closeButton.style.padding = "5px 10px";
+        closeButton.style.backgroundColor = "white";
+        closeButton.style.color = "#007BFF";
+        closeButton.style.border = "none";
+        closeButton.style.borderRadius = "5px";
+        closeButton.style.cursor = "pointer";
+
+        closeButton.onclick = () => {
+          popup.remove();
+        };
+
+        popup.appendChild(closeButton);
+        document.body.appendChild(popup);
+      }
+    `
+  });
+}
+
+
+// === 8. Sauvegarde du token ===
 browser.runtime.onMessage.addListener(async (message) => {
   if (message.action === "saveToken" && message.token) {
     await browser.storage.local.set({ accessToken: message.token });
@@ -115,10 +167,11 @@ function refreshExtensionMenu() {
 }
 
 function showNotification(title, message, iconUrl) {
+  console.log(`🔔 Notification : ${title} - ${message}`);
   if (browser.notifications) {
     browser.notifications.create({
       type: 'basic',
-      iconUrl: iconUrl,
+      iconUrl: iconUrl || "icons/info.png",
       title: title,
       message: message
     });
-- 
GitLab


From 29f79d428a62c1b8e7946feaf935a21c5330f414 Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sat, 18 Jan 2025 12:37:47 +0100
Subject: [PATCH 08/13] Modification design popup instructions connexion

---
 menu_extension/background.js | 59 +++++++++++++++++++++---------------
 1 file changed, 34 insertions(+), 25 deletions(-)

diff --git a/menu_extension/background.js b/menu_extension/background.js
index d454913..d110771 100644
--- a/menu_extension/background.js
+++ b/menu_extension/background.js
@@ -92,9 +92,9 @@ browser.webRequest.onBeforeRequest.addListener(
   ["blocking"]
 );
 
-// === 7. Injection du popup directement dans la page ===
+// // === 7. Injection du popup dans la page ===
 function showInstructionPopup(details) {
-  console.log("📘 Injection du message d'instruction sur la page Prisms.");
+  console.log("📘 Injection du message d'instruction centré sur la page Prisms.");
 
   browser.tabs.executeScript(details.tabId, {
     code: `
@@ -102,32 +102,41 @@ function showInstructionPopup(details) {
         const popup = document.createElement("div");
         popup.id = "balex-instruction-popup";
         popup.style.position = "fixed";
-        popup.style.top = "20px";
-        popup.style.right = "20px";
-        popup.style.backgroundColor = "#007BFF";
-        popup.style.color = "white";
-        popup.style.padding = "15px";
-        popup.style.borderRadius = "8px";
-        popup.style.boxShadow = "0px 0px 10px rgba(0, 0, 0, 0.2)";
+        popup.style.top = "50%";
+        popup.style.left = "50%";
+        popup.style.transform = "translate(-50%, -50%)";
+        popup.style.backgroundColor = "#a08e9f";
+        popup.style.color = "#323046";
+        popup.style.padding = "20px";
+        popup.style.borderRadius = "10px";
+        popup.style.boxShadow = "0 2px 10px rgba(0, 0, 0, 0.3)";
         popup.style.zIndex = "10000";
-        popup.innerText = "🔔 Pour vous connecter à l'extension, cliquez sur 'Se connecter avec BaLex' après avoir renseigné vos identifiants.";
-
-        const closeButton = document.createElement("button");
-        closeButton.innerText = "Fermer";
-        closeButton.style.marginTop = "10px";
-        closeButton.style.padding = "5px 10px";
-        closeButton.style.backgroundColor = "white";
-        closeButton.style.color = "#007BFF";
-        closeButton.style.border = "none";
-        closeButton.style.borderRadius = "5px";
-        closeButton.style.cursor = "pointer";
-
-        closeButton.onclick = () => {
-          popup.remove();
-        };
+        popup.style.fontFamily = "Helvetica, sans-serif";
+        popup.style.fontSize = "14px";
+        popup.style.width = "300px";
+        popup.style.textAlign = "center";
+
+        popup.innerHTML = \`
+          <h5 style="color: #fff; font-weight: bold; margin-top: 0;">🔑 Connexion à l'extension</h5>
+          <p style="margin: 15px 0;">Après avoir renseigné vos identifiants, cliquez sur <strong>"Se connecter avec BaLex"</strong>.</p>
+          <button id="close-popup-btn" style="
+            width: 100%;
+            margin-top: 15px;
+            padding: 10px;
+            border: none;
+            background-color: #8d5c70;
+            color: #fbfcfc;
+            font-weight: bold;
+            cursor: pointer;
+            border-radius: 5px;
+          ">Fermer</button>
+        \`;
 
-        popup.appendChild(closeButton);
         document.body.appendChild(popup);
+
+        document.getElementById("close-popup-btn").onclick = () => {
+          popup.remove();
+        };
       }
     `
   });
-- 
GitLab


From fa859deba9870f89e44bb063918d2956a795e7cd Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sun, 19 Jan 2025 14:20:11 +0100
Subject: [PATCH 09/13] =?UTF-8?q?Ajout=20bouton=20connexion=20barre=20lat?=
 =?UTF-8?q?=C3=A9rale?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 "barre_lat\303\251rale/sidebar.html" |  5 ++++
 "barre_lat\303\251rale/sidebar.js"   | 40 ++++++++++++++++++++++++-
 menu_extension/background.js         | 44 +++++++++++++++++++++++-----
 menu_extension/popup.html            |  2 +-
 menu_extension/popup.js              | 26 +++++++++++++++-
 5 files changed, 106 insertions(+), 11 deletions(-)

diff --git "a/barre_lat\303\251rale/sidebar.html" "b/barre_lat\303\251rale/sidebar.html"
index 5ce8395..6d90eef 100644
--- "a/barre_lat\303\251rale/sidebar.html"
+++ "b/barre_lat\303\251rale/sidebar.html"
@@ -114,7 +114,11 @@
   <div id="menu">
     <h3>Lexiques</h3>
     <div id="lexiques">Chargement...</div>
+    <div id="auth-section">
+    <button id="auth-button">Se connecter</button>
+    </div>
   </div>
+  
 
   <!-- État de la sélection -->
   <div id="etat">
@@ -127,5 +131,6 @@
   <div id="definition"></div>
 
 
+
 </body>
 </html>
diff --git "a/barre_lat\303\251rale/sidebar.js" "b/barre_lat\303\251rale/sidebar.js"
index 454a175..35fd980 100644
--- "a/barre_lat\303\251rale/sidebar.js"
+++ "b/barre_lat\303\251rale/sidebar.js"
@@ -25,6 +25,10 @@ browser.runtime.onMessage.addListener((message) => {
       console.warn("⚠️ Élément #motSelectionne introuvable.");
     }
   }
+
+  if (message.action === "updateUI") {
+    updateAuthButton(message.isLoggedIn);
+  }
 });
 
 // Vérification du format du token
@@ -42,8 +46,10 @@ async function readTokenFromStorage() {
   if (accessToken && validateToken(accessToken)) {
     authToken = accessToken;
     console.log(`🔑 Token récupéré depuis le stockage local : [${authToken}]`);
+    return true;
   } else {
     console.error("❌ Token invalide ou non trouvé dans le stockage local.");
+    return false;
   }
 }
 
@@ -87,11 +93,15 @@ async function fetchLexicons() {
   console.log("🚀 La fonction fetchLexicons() est appelée.");
 
   const lexiquesContainer = document.getElementById('lexiques');
+  const authSection = document.getElementById('auth-section');
   lexiquesContainer.innerHTML = '';
 
   if (!authToken) {
     console.warn('⚠️ Token non disponible ou vide.');
     lexiquesContainer.textContent = 'Lexiques non disponibles. Veuillez vous connecter.';
+    if (authSection) {
+      authSection.style.display = 'block';
+    }
     return;
   }
 
@@ -115,15 +125,43 @@ async function fetchLexicons() {
     const lexicons = await response.json();
     console.log('📚 Lexiques récupérés :', lexicons);
     displayLexicons(lexicons);
+    if (authSection) {
+      authSection.style.display = 'block'; // Toujours afficher la section auth
+    }
   } catch (error) {
     console.error('❗️ Erreur pendant la récupération des lexiques :', error);
     lexiquesContainer.textContent = 'Impossible de charger les lexiques. Vérifiez votre connexion ou le token.';
+    if (authSection) {
+      authSection.style.display = 'block';
+    }
   }
 }
 
 // Lancement automatique après le chargement de la page
 window.onload = async () => {
   console.log("📦 Page complètement chargée. Récupération du token depuis le stockage local et récupération des lexiques...");
-  await readTokenFromStorage();
+  const isLoggedIn = await readTokenFromStorage();
+  updateAuthButton(isLoggedIn);
   await fetchLexicons();
+
+  // Ajout du bouton de connexion/déconnexion
+  const authButton = document.getElementById("auth-button");
+  const authSection = document.getElementById('auth-section');
+  if (authButton && authSection) {
+    authButton.addEventListener("click", () => {
+      browser.runtime.sendMessage({ action: "toggleAuth" }).then(() => {
+        browser.runtime.sendMessage({ action: "checkAuthStatus" }).then((isLoggedIn) => {
+          updateAuthButton(isLoggedIn);
+          authSection.style.display = 'block'; // Toujours afficher auth-section
+        });
+      });
+    });
+  }
 };
+
+function updateAuthButton(isLoggedIn) {
+  const authButton = document.getElementById("auth-button");
+  if (authButton) {
+    authButton.textContent = isLoggedIn ? "Se déconnecter" : "Se connecter";
+  }
+}
diff --git a/menu_extension/background.js b/menu_extension/background.js
index d110771..e87ca0b 100644
--- a/menu_extension/background.js
+++ b/menu_extension/background.js
@@ -26,25 +26,38 @@ browser.storage.onChanged.addListener((changes) => {
 });
 
 // === 4. Gestion des connexions/déconnexions ===
-browser.runtime.onMessage.addListener(async (message) => {
-  if (message.action === "toggleConnection") {
+browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
+  console.log("📩 Message reçu dans background.js :", message);
+
+  if (message.action === "toggleAuth") {
     const isConnected = await isUserConnected();
+    console.log("🔍 État actuel de connexion :", isConnected ? "Connecté" : "Déconnecté");
     if (isConnected) {
       await disconnectFromLexicalDB();
     } else {
       openLoginPage();
     }
+  } else if (message.action === "checkAuthStatus") {
+    const isConnected = await isUserConnected();
+    sendResponse(isConnected);
+  } else if (message.action === "authStatusChanged") {
+    console.log("🔄 Mise à jour de l'état d'authentification :", message.isLoggedIn);
+    browser.runtime.sendMessage({ action: "updateUI", isLoggedIn: message.isLoggedIn });
+  } else if (message.action === "refreshSidebar") {
+    refreshSidebar();
+  } else if (message.action === "refreshMenu") {
+    refreshExtensionMenu();
   } else if (message.action === "showNotification") {
     showNotification(message.title, message.message, message.iconUrl);
-  } else if (message.action === "updateExtensionUI") {
-    refreshExtensionMenu();
   }
+  return true; // Nécessaire pour les réponses asynchrones
 });
 
 function openLoginPage() {
   const authUrl = "https://prisms.lezinter.net/fr/login";
+  console.log("🔗 Ouverture de la page de connexion :", authUrl);
   browser.tabs.create({ url: authUrl });
-  console.log("🔗 Page de connexion ouverte.");
+  browser.runtime.sendMessage({ action: "authStatusChanged", isLoggedIn: false });
 }
 
 // === 5. Afficher le popup après redirection vers Prisms ===
@@ -53,7 +66,7 @@ browser.webNavigation.onCompleted.addListener(async (details) => {
 
   if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/login") {
     console.log("📘 Injection du popup d'instruction sur Prisms.");
-    showInstructionPopup(details);  // Injection directe dans la page
+    showInstructionPopup(details);
   }
 
   if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/headquarters/balex") {
@@ -143,35 +156,50 @@ function showInstructionPopup(details) {
 }
 
 
+
 // === 8. Sauvegarde du token ===
 browser.runtime.onMessage.addListener(async (message) => {
   if (message.action === "saveToken" && message.token) {
+    console.log("✅ Sauvegarde du token :", message.token);
     await browser.storage.local.set({ accessToken: message.token });
-    console.log("✅ Token sauvegardé :", message.token);
     showNotification('Connexion réussie', 'La barre latérale va se recharger.', 'icons/success.png');
     refreshSidebar();
     refreshExtensionMenu();
+    browser.runtime.sendMessage({ action: "authStatusChanged", isLoggedIn: true });
   }
 });
 
 async function disconnectFromLexicalDB() {
+  console.log("🔓 Déconnexion en cours...");
   await browser.storage.local.remove("accessToken");
-  console.log("🔓 Déconnexion réussie.");
+  console.log("🔓 Token supprimé avec succès.");
   showNotification('Déconnexion réussie', 'La barre latérale va se recharger.', 'icons/logout.png');
   refreshSidebar();
   refreshExtensionMenu();
+  browser.runtime.sendMessage({ action: "updateUI", isLoggedIn: false });
 }
 
+browser.runtime.onMessage.addListener(async (message) => {
+  if (message.action === "saveToken" && message.token) {
+    console.log("✅ Sauvegarde du token :", message.token);
+    await browser.storage.local.set({ accessToken: message.token });
+    browser.runtime.sendMessage({ action: "updateUI", isLoggedIn: true });
+  }
+});
+
 async function isUserConnected() {
   const result = await browser.storage.local.get("accessToken");
+  console.log("🔑 État actuel du token :", result.accessToken);
   return result.accessToken !== undefined;
 }
 
 function refreshSidebar() {
+  console.log("🔄 Rafraîchissement de la barre latérale.");
   browser.runtime.sendMessage({ action: "refreshSidebar" });
 }
 
 function refreshExtensionMenu() {
+  console.log("🔄 Rafraîchissement du menu de l'extension.");
   browser.runtime.sendMessage({ action: "refreshMenu" });
 }
 
diff --git a/menu_extension/popup.html b/menu_extension/popup.html
index 3c45bee..dbc12ff 100644
--- a/menu_extension/popup.html
+++ b/menu_extension/popup.html
@@ -31,7 +31,7 @@
 </head>
 <body>
   <h3>Extension BaLex</h3>
-  <button id="connectBtn">Se connecter</button>
+  <button id="auth-button">Se connecter</button>
   <button id="toggleExtensionBtn">Activer/Désactiver l'extension</button>
   <button id="toggleStatsBtn">Activer les statistiques</button>
   <script src="popup.js"></script>
diff --git a/menu_extension/popup.js b/menu_extension/popup.js
index 7cf2e68..b158753 100644
--- a/menu_extension/popup.js
+++ b/menu_extension/popup.js
@@ -44,5 +44,29 @@ document.getElementById("toggleStatsBtn").addEventListener("click", async () =>
 
 // === 5. Mise à jour initiale du bouton Connexion/Déconnexion ===
 document.addEventListener("DOMContentLoaded", () => {
-  updateConnectionButton();
+  const authButton = document.getElementById("auth-button");
+
+  // Vérification initiale de l'état
+  browser.runtime.sendMessage({ action: "checkAuthStatus" }).then((isLoggedIn) => {
+      updateAuthButton(isLoggedIn);
+  });
+
+  // Écoute des clics sur le bouton
+  authButton.addEventListener("click", () => {
+      browser.runtime.sendMessage({ action: "toggleAuth" });
+  });
+
+  // Écoute des mises à jour d'état
+  browser.runtime.onMessage.addListener((message) => {
+      if (message.action === "updateUI") {
+          updateAuthButton(message.isLoggedIn);
+      }
+  });
 });
+
+function updateAuthButton(isLoggedIn) {
+  const authButton = document.getElementById("auth-button");
+  if (authButton) {
+      authButton.textContent = isLoggedIn ? "Se déconnecter" : "Se connecter";
+  }
+}
-- 
GitLab


From 358cee84406bcf563940283b2aed4a4ac4148cca Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sun, 19 Jan 2025 15:27:19 +0100
Subject: [PATCH 10/13] Synchronisation boutons connexion menus

---
 menu_extension/background.js | 12 ++-------
 menu_extension/popup.js      | 52 ++++++++++--------------------------
 2 files changed, 16 insertions(+), 48 deletions(-)

diff --git a/menu_extension/background.js b/menu_extension/background.js
index e87ca0b..584b3b1 100644
--- a/menu_extension/background.js
+++ b/menu_extension/background.js
@@ -50,7 +50,7 @@ browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
   } else if (message.action === "showNotification") {
     showNotification(message.title, message.message, message.iconUrl);
   }
-  return true; // Nécessaire pour les réponses asynchrones
+  return true; 
 });
 
 function openLoginPage() {
@@ -165,7 +165,7 @@ browser.runtime.onMessage.addListener(async (message) => {
     showNotification('Connexion réussie', 'La barre latérale va se recharger.', 'icons/success.png');
     refreshSidebar();
     refreshExtensionMenu();
-    browser.runtime.sendMessage({ action: "authStatusChanged", isLoggedIn: true });
+    browser.runtime.sendMessage({ action: "updateUI", isLoggedIn: true });
   }
 });
 
@@ -179,14 +179,6 @@ async function disconnectFromLexicalDB() {
   browser.runtime.sendMessage({ action: "updateUI", isLoggedIn: false });
 }
 
-browser.runtime.onMessage.addListener(async (message) => {
-  if (message.action === "saveToken" && message.token) {
-    console.log("✅ Sauvegarde du token :", message.token);
-    await browser.storage.local.set({ accessToken: message.token });
-    browser.runtime.sendMessage({ action: "updateUI", isLoggedIn: true });
-  }
-});
-
 async function isUserConnected() {
   const result = await browser.storage.local.get("accessToken");
   console.log("🔑 État actuel du token :", result.accessToken);
diff --git a/menu_extension/popup.js b/menu_extension/popup.js
index b158753..702d38b 100644
--- a/menu_extension/popup.js
+++ b/menu_extension/popup.js
@@ -1,32 +1,32 @@
-// === 1. Gestion du bouton unique Connexion/Déconnexion ===
+console.log("✅ popup.js chargé avec succès !");
+
+// === 1. Mise à jour du bouton Connexion/Déconnexion ===
 async function updateConnectionButton() {
   const { accessToken } = await browser.storage.local.get("accessToken");
-  const button = document.getElementById("connectBtn");
+  const button = document.getElementById("auth-button");
 
   if (button) {
     button.textContent = accessToken ? "Se déconnecter" : "Se connecter";
     button.onclick = async () => {
-      await browser.runtime.sendMessage({ action: "toggleConnection" });
+      await browser.runtime.sendMessage({ action: "toggleAuth" });
     };
   } else {
-    console.error("Le bouton de connexion n'a pas été trouvé.");
+    console.error("❌ Le bouton de connexion n'a pas été trouvé.");
   }
 }
 
-// === 2. Action au clic du bouton Connexion/Déconnexion ===
+// === 2. Écoute des messages depuis background.js ===
 browser.runtime.onMessage.addListener((message) => {
-  if (message.action === "tokenSaved") {
-    alert("Connexion réussie !");
+  if (message.action === "updateUI") {
+    console.log("📩 Mise à jour reçue : État connecté :", message.isLoggedIn);
     updateConnectionButton();
-  }
-
-  if (message.action === "refreshMenu") {
+  } else if (message.action === "refreshMenu") {
     console.log("🔄 Actualisation du menu de l'extension déclenchée.");
     updateConnectionButton();
   }
 });
 
-// === 3. Activer/Désactiver l'extension ===
+// === 3. Gestion des actions des boutons ===
 document.getElementById("toggleExtensionBtn").addEventListener("click", async () => {
   const { extensionActive } = await browser.storage.local.get("extensionActive");
   const newState = !extensionActive;
@@ -34,7 +34,6 @@ document.getElementById("toggleExtensionBtn").addEventListener("click", async ()
   alert(`Extension ${newState ? "activée" : "désactivée"}.`);
 });
 
-// === 4. Activer/Désactiver les statistiques ===
 document.getElementById("toggleStatsBtn").addEventListener("click", async () => {
   const { statsActive } = await browser.storage.local.get("statsActive");
   const newState = !statsActive;
@@ -42,31 +41,8 @@ document.getElementById("toggleStatsBtn").addEventListener("click", async () =>
   alert(`Statistiques ${newState ? "activées" : "désactivées"}.`);
 });
 
-// === 5. Mise à jour initiale du bouton Connexion/Déconnexion ===
+// === 4. Initialisation ===
 document.addEventListener("DOMContentLoaded", () => {
-  const authButton = document.getElementById("auth-button");
-
-  // Vérification initiale de l'état
-  browser.runtime.sendMessage({ action: "checkAuthStatus" }).then((isLoggedIn) => {
-      updateAuthButton(isLoggedIn);
-  });
-
-  // Écoute des clics sur le bouton
-  authButton.addEventListener("click", () => {
-      browser.runtime.sendMessage({ action: "toggleAuth" });
-  });
-
-  // Écoute des mises à jour d'état
-  browser.runtime.onMessage.addListener((message) => {
-      if (message.action === "updateUI") {
-          updateAuthButton(message.isLoggedIn);
-      }
-  });
+  console.log("🌐 Initialisation du menu de l'extension...");
+  updateConnectionButton();
 });
-
-function updateAuthButton(isLoggedIn) {
-  const authButton = document.getElementById("auth-button");
-  if (authButton) {
-      authButton.textContent = isLoggedIn ? "Se déconnecter" : "Se connecter";
-  }
-}
-- 
GitLab


From fd8392b470cf6f2e5085139f322f5a73f0019b3e Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sun, 19 Jan 2025 18:31:25 +0100
Subject: [PATCH 11/13] =?UTF-8?q?Affichage=20fonctionnalit=C3=A9s=20selon?=
 =?UTF-8?q?=20statut=20de=20connexion?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 "barre_lat\303\251rale/sidebar.html" | 33 ++++++++++++++++++++---
 "barre_lat\303\251rale/sidebar.js"   | 39 +++++++++++++++++++++++++---
 2 files changed, 64 insertions(+), 8 deletions(-)

diff --git "a/barre_lat\303\251rale/sidebar.html" "b/barre_lat\303\251rale/sidebar.html"
index 6d90eef..a802107 100644
--- "a/barre_lat\303\251rale/sidebar.html"
+++ "b/barre_lat\303\251rale/sidebar.html"
@@ -88,6 +88,13 @@
       margin-left: 10px;
     }
 
+    /* Texte explicatif */
+    #highlight-note {
+      font-size: small;
+      margin-bottom: 10px;
+      text-align: center;
+    }
+
     /* Espace pour les pictogrammes */
     .lexique-icon {
         width: 25px;
@@ -106,6 +113,14 @@
       border-radius: 5px;
       color: white;
     }
+    
+
+    /* Activer/désactiver le surlignage */
+    #highlighting-options p {
+      margin: 5px 0;
+      font-size: small;
+      color: #333;
+    }
   </style>
 </head>
 <body>
@@ -113,24 +128,34 @@
   <!-- Menu des lexiques -->
   <div id="menu">
     <h3>Lexiques</h3>
+    <p id="highlight-note" style="display: none;">Cochez un/des lexique(s) pour activer le surlignage des mots sur la page.</p>
     <div id="lexiques">Chargement...</div>
+
     <div id="auth-section">
-    <button id="auth-button">Se connecter</button>
+      <button id="auth-button">Se connecter</button>
     </div>
   </div>
   
-
   <!-- État de la sélection -->
+  <hr>
   <div id="etat">
     <h3>Mot sélectionné</h3>
     <p id="motSelectionne">Aucun mot sélectionné</p>
+    <div id="add-to-lexiques" style="display: none;">
+      <button id="add-word-button">Ajouter le mot sélectionné</button>
+    </div>
+    
     <button id="chercherDef">Chercher la/les définition(s)</button>
+    <div id="possible-definitions" style="display: none;">
+      <label style="font-size: small;">
+        <input type="checkbox" id="toggle-definitions">
+        Afficher toutes les définitions
+      </label>
+    </div>
   </div>
 
   <!-- Définition affichée -->
   <div id="definition"></div>
 
-
-
 </body>
 </html>
diff --git "a/barre_lat\303\251rale/sidebar.js" "b/barre_lat\303\251rale/sidebar.js"
index 35fd980..4a13c48 100644
--- "a/barre_lat\303\251rale/sidebar.js"
+++ "b/barre_lat\303\251rale/sidebar.js"
@@ -28,6 +28,7 @@ browser.runtime.onMessage.addListener((message) => {
 
   if (message.action === "updateUI") {
     updateAuthButton(message.isLoggedIn);
+    toggleHighlightMessage(message.isLoggedIn);
   }
 });
 
@@ -63,6 +64,7 @@ function displayLexicons(lexicons) {
     return;
   }
 
+  // Ajouter les lexiques à la liste
   lexicons.forEach(lexique => {
     const lexiqueDiv = document.createElement('div');
     lexiqueDiv.className = 'lexique-item';
@@ -80,6 +82,11 @@ function displayLexicons(lexicons) {
     checkbox.className = 'lexique-checkbox';
     checkbox.checked = lexique.active || false;
 
+    checkbox.addEventListener('change', () => {
+      console.log(`🔄 Changement de surlignage pour ${lexique.name}: ${checkbox.checked ? 'activé' : 'désactivé'}`);
+      // Implémentez ici la logique pour activer/désactiver le surlignage
+    });
+
     lexiqueDiv.appendChild(iconDiv);
     lexiqueDiv.appendChild(labelSpan);
     lexiqueDiv.appendChild(checkbox);
@@ -88,6 +95,14 @@ function displayLexicons(lexicons) {
   });
 }
 
+// Gestion de l'affichage du message d'information
+function toggleHighlightMessage(isLoggedIn) {
+  const highlightNote = document.getElementById('highlight-note');
+  if (highlightNote) {
+    highlightNote.style.display = isLoggedIn ? 'block' : 'none';
+  }
+}
+
 // Récupération des lexiques avec diagnostics détaillés
 async function fetchLexicons() {
   console.log("🚀 La fonction fetchLexicons() est appelée.");
@@ -137,22 +152,37 @@ async function fetchLexicons() {
   }
 }
 
+function toggleElementsVisibility(isLoggedIn) {
+  const addToLexiques = document.getElementById('add-to-lexiques');
+  const possibleDefinitions = document.getElementById('possible-definitions');
+
+  if (addToLexiques) {
+    addToLexiques.style.display = isLoggedIn ? 'block' : 'none';
+  }
+
+  if (possibleDefinitions) {
+    possibleDefinitions.style.display = isLoggedIn ? 'block' : 'none';
+  }
+}
+
 // Lancement automatique après le chargement de la page
 window.onload = async () => {
   console.log("📦 Page complètement chargée. Récupération du token depuis le stockage local et récupération des lexiques...");
   const isLoggedIn = await readTokenFromStorage();
   updateAuthButton(isLoggedIn);
+  toggleHighlightMessage(isLoggedIn); 
+  toggleElementsVisibility(isLoggedIn);
   await fetchLexicons();
 
-  // Ajout du bouton de connexion/déconnexion
+  // Gestion du bouton de connexion/déconnexion
   const authButton = document.getElementById("auth-button");
-  const authSection = document.getElementById('auth-section');
-  if (authButton && authSection) {
+  if (authButton) {
     authButton.addEventListener("click", () => {
       browser.runtime.sendMessage({ action: "toggleAuth" }).then(() => {
         browser.runtime.sendMessage({ action: "checkAuthStatus" }).then((isLoggedIn) => {
           updateAuthButton(isLoggedIn);
-          authSection.style.display = 'block'; // Toujours afficher auth-section
+          toggleHighlightMessage(isLoggedIn);
+          toggleElementsVisibility(isLoggedIn);
         });
       });
     });
@@ -165,3 +195,4 @@ function updateAuthButton(isLoggedIn) {
     authButton.textContent = isLoggedIn ? "Se déconnecter" : "Se connecter";
   }
 }
+
-- 
GitLab


From 2343c0798102fd551e2adcaff638a1b6308e72df Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sun, 19 Jan 2025 18:42:08 +0100
Subject: [PATCH 12/13] Modifications CSS

---
 "barre_lat\303\251rale/sidebar.html" | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git "a/barre_lat\303\251rale/sidebar.html" "b/barre_lat\303\251rale/sidebar.html"
index a802107..55e12d5 100644
--- "a/barre_lat\303\251rale/sidebar.html"
+++ "b/barre_lat\303\251rale/sidebar.html"
@@ -19,8 +19,8 @@
     /* Conteneurs */
     #menu, #etat {
       padding: 10px;
-      margin-bottom: 10px;
-      border-radius: 5px;
+      margin-bottom: 0px;
+      border-radius: 10px;
       background-color: #a08e9f;
       box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
     }
-- 
GitLab


From f21a9e205e7bd59c547fb8a9d3994df5167e933b Mon Sep 17 00:00:00 2001
From: Lucie Bader <167515375+Lucie-Bdr@users.noreply.github.com>
Date: Sun, 19 Jan 2025 18:48:04 +0100
Subject: [PATCH 13/13] =?UTF-8?q?R=C3=A9organisation=20fichiers?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 "s\303\251lection_recherche/.gitkeep"         |   0
 .../icons/border-48.png"                      | Bin 225 -> 0 bytes
 .../icons/loupe-256.png"                      | Bin 13905 -> 0 bytes
 "s\303\251lection_recherche/main.js"          | 193 ------------------
 "s\303\251lection_recherche/manifest.json"    |  29 ---
 "s\303\251lection_recherche/style.css"        |  37 ----
 "s\303\251lection_recherche/token.txt"        |   1 -
 7 files changed, 260 deletions(-)
 delete mode 100644 "s\303\251lection_recherche/.gitkeep"
 delete mode 100644 "s\303\251lection_recherche/icons/border-48.png"
 delete mode 100644 "s\303\251lection_recherche/icons/loupe-256.png"
 delete mode 100644 "s\303\251lection_recherche/main.js"
 delete mode 100644 "s\303\251lection_recherche/manifest.json"
 delete mode 100644 "s\303\251lection_recherche/style.css"
 delete mode 100644 "s\303\251lection_recherche/token.txt"

diff --git "a/s\303\251lection_recherche/.gitkeep" "b/s\303\251lection_recherche/.gitkeep"
deleted file mode 100644
index e69de29..0000000
diff --git "a/s\303\251lection_recherche/icons/border-48.png" "b/s\303\251lection_recherche/icons/border-48.png"
deleted file mode 100644
index 90687de26d71e91b7c82565772a7df470ae277a6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 225
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmSQK*5Dp-y;YjHK@;M7UB8wRq
zxP?KOkzv*x37}xJr;B4qM&sM7j(iOY0?rpNR{Ym~eNUieh4I>d+mEvHuIy!K@bZ41
z<G=gpjAyae-$dK=GF;u(nO|M2nf#xLWrf-0#+>J}N$e^&*#q7kxbW`Aeg?)>n&l0$
z8xrIlb~3+dVExT-N;ZLA=LS%o!8+lf-GRA$F@Klex9jiV-^0Mj@Zdh*s&<Z;Pny1y
QfX-p?boFyt=akR{0F1y+Z~y=R

diff --git "a/s\303\251lection_recherche/icons/loupe-256.png" "b/s\303\251lection_recherche/icons/loupe-256.png"
deleted file mode 100644
index a34fc08ba086b2dcd791fe7962ffb74e6b17203b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 13905
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
LRR6iIQ|$i$aeW==

diff --git "a/s\303\251lection_recherche/main.js" "b/s\303\251lection_recherche/main.js"
deleted file mode 100644
index aaa3124..0000000
--- "a/s\303\251lection_recherche/main.js"
+++ /dev/null
@@ -1,193 +0,0 @@
-// Création de la zone blanche initiale(prototype menu contextuel)
-if (!document.getElementById('whiteBox')) {
-  // Création de la zone blanche
-  const whiteBox = document.createElement('div');
-  whiteBox.id = 'whiteBox';
-
-  // Ajout de contenu dans la zone
-  whiteBox.innerHTML = '<p id="selectedWord"> Mot sélectionné </p>';
-
-  // Ajouter la zone au document
-  document.body.appendChild(whiteBox);
-}
-
-
-
-// Variable globale pour stocker le token
-let authToken = '';
-
-// Fonction pour lire et afficher le contenu du fichier token
-function readTokenFile() {
-  const tokenFilePath = browser.runtime.getURL('token.txt');
-  console.log('Chemin du fichier token :', tokenFilePath);
-
-  return fetch(tokenFilePath)
-    .then((response) => {
-      if (!response.ok) {
-        throw new Error(`Erreur lors de la lecture du fichier token : ${response.statusText}`);
-      }
-      return response.text();
-    })
-    .then((token) => {
-      console.log('Contenu du fichier token :', token);
-      authToken = token.trim(); // Stocke le token dans une variable globale
-    })
-    .catch((error) => {
-      console.error('Erreur lors de la lecture du fichier token :', error);
-    });
-}
-
-// Appeler la fonction et attendre qu’elle soit terminée
-readTokenFile().then(() => {
-  console.log("Le token est bien enregistré : ", authToken);
-});
-
-
-
-// Ecouteur de la sélection de texte
-document.addEventListener('contextmenu', (event) => {
-  const selectedText = window.getSelection().toString().trim();  // Récupérer le texte sélectionné
-
-  // SI on a du texte sélectionné, on modifie le contenu et affiche le bouton de recherche dans le lexique
-  if (selectedText) {
-    console.log("Texte sélectionné :", selectedText);
-
-    // Modifier le contenu de la boîte blanche avec le texte sélectionné
-    const selectedWordElement = document.getElementById('selectedWord');
-    if (selectedWordElement) {
-      selectedWordElement.textContent = selectedText;
-    }
-
-
-
-    // Bouton de recherche dans le lexique perso
-    if (!document.getElementById('searchLexiconButton')) {
-      // Création du bouton "Rechercher dans le lexique" (lexique perso)
-      const searchLexiconButton = document.createElement('input');
-      searchLexiconButton.id = 'searchLexiconButton';
-      searchLexiconButton.type = 'button';
-      searchLexiconButton.value = 'Rechercher dans le lexique personnel';
-      searchLexiconButton.className = 'searchButton';
-
-      // Événement sur le bouton de recherche
-      searchLexiconButton.addEventListener('click', () => {
-        console.log("Recherche du mot dans le lexique:", selectedText);
-        searchInLexicon(selectedText); 
-      });
-
-      // Ajout du bouton sous le texte 
-      const whiteBox = document.getElementById('whiteBox');
-      whiteBox.appendChild(searchLexiconButton);
-    }
-
-
-
-    // Bouton de recherche requête sur le wiktionnaire
-    if (!document.getElementById('searchWikiButton')) {
-      // Création du bouton "Recherche sur le Wiktionnaire"
-      const searchWikiButton = document.createElement('input');
-      searchWikiButton.id = 'searchWikiButton';
-      searchWikiButton.type = 'button';
-      searchWikiButton.value = 'Rechercher sur le Wiktionnaire';
-      searchWikiButton.className = 'searchButton';
-
-      // // Évènement sur le bouton de recherche
-      searchWikiButton.addEventListener('click', () => {
-        console.log("Recherche du mot dans le Wiktionnaire:", selectedText);
-        searchInWiki(selectedText);
-      });
-
-      // Ajout du bouton sous le texte 
-      const whiteBox = document.getElementById('whiteBox');
-      whiteBox.appendChild(searchWikiButton);
-    }
-  }
-
-
-  
-// Définition des fonctions APPELS API
-
-// Fonction pour rechercher dans le lexique personnel (français)
-function searchInLexicon(selectedText) {
-  const lexiconsApiUrl = 'https://babalex.lezinter.net/api/user/lexicons';
-
-  if (!authToken) {
-    console.error('Token non disponible.');
-    return;
-  }
-
-  //Récupérer les lexiques de l'utilisateur
-  fetch(lexiconsApiUrl, {
-    method: 'GET',
-    headers: {
-      'Authorization': `Bearer ${authToken}`,
-      'Content-Type': 'application/json',
-    },
-  })
-    .then((response) => {
-      if (!response.ok) {
-        throw new Error(`Erreur lors de la récupération des lexiques : ${response.statusText}`);
-      }
-      return response.json();
-    })
-    .then((lexicons) => {
-      console.log('Lexiques de l’utilisateur :', lexicons);
-
-      //todo : Utiliser la variable "lang" pour chercher le mot dans le bon lexique
-
-      // Rechercher l'ID du lexique français
-      const frenchLexicon = lexicons.find((lexicon) => lexicon.language === 'fr');
-
-      if (!frenchLexicon) {
-        throw new Error('Aucun lexique pour la langue française trouvé.');
-      }
-
-      const idLexicon = frenchLexicon.id;
-      console.log('ID du lexique français :', idLexicon);
-
-      //Récupérer les graphies du lexique français
-      const entriesApiUrl = `https://babalex.lezinter.net/api/lexicon/entries/${idLexicon}`;
-
-      return fetch(entriesApiUrl, {
-        method: 'GET',
-        headers: {
-          'Authorization': `Bearer ${authToken}`,
-          'Content-Type': 'application/json',
-        },
-      });
-    })
-    .then((response) => {
-      if (!response.ok) {
-        throw new Error(`Erreur lors de la récupération des graphies : ${response.statusText}`);
-      }
-      return response.json();
-    })
-    .then((entries) => {
-      console.log('Graphies dans le lexique français :', entries);
-
-      //Comparer les graphies avec le mot sélectionné
-      let isWordPresent = false;
-      for (const entry of entries) {
-        console.log("Mots dans le lexique :", entry);
-        if (entry.graphy === selectedText) { 
-          isWordPresent = true;
-          break;
-        }
-      }
-      
-      if (isWordPresent) {
-        alert(`Mot présent dans le lexique : "${selectedText}"`);
-      } else {
-        alert(`Le mot "${selectedText}" n'est pas présent dans le lexique.`);
-      }
-    })
-    .catch((error) => {
-      console.error('Erreur lors de la requête API :', error);
-    });
-}
-
-//console.log('Token utilisé :', authToken);
-
-
-});
-
diff --git "a/s\303\251lection_recherche/manifest.json" "b/s\303\251lection_recherche/manifest.json"
deleted file mode 100644
index 1634252..0000000
--- "a/s\303\251lection_recherche/manifest.json"
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-    "manifest_version": 2,
-    "name": "Rechercher si le mot est dans le lexique",
-    "version": "1.0",
-    "description": "Sélectionne un mot et affiche le mot sélectionné dans la zone pour vérifier s'il est dans un lexique",
-    "icons": {
-      "48": "icons/loupe-256.png"
-    },
-    "permissions": [
-    "https://babalex.lezinter.net/*",
-    "activeTab"],
-    "content_scripts": [
-      {
-        "matches": ["<all_urls>"], 
-        "js": ["main.js"],
-        "css": ["style.css"]
-      }
-    ],
-    "web_accessible_resources": [
-      "token", 
-      "token.txt"
-    ],    
-    
-    "browser_action": {
-      "default_icon": "icons/loupe-256.png",
-      "default_title": "Recherche du mot"
-    }
-  }
-  
\ No newline at end of file
diff --git "a/s\303\251lection_recherche/style.css" "b/s\303\251lection_recherche/style.css"
deleted file mode 100644
index 60e994e..0000000
--- "a/s\303\251lection_recherche/style.css"
+++ /dev/null
@@ -1,37 +0,0 @@
-#whiteBox {
-  position: fixed;
-  top: 10px;  
-  right: 10px;  
-  background-color: rgb(255, 255, 255);
-  border: 5px solid rgb(0, 0, 0);
-  padding: 10px;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
-  z-index: 10000;
-}
-
-#selectedWord {
-  margin: 0;
-  font-size: 14px;
-  line-height: 1.5;
-  color: black; 
-  font-weight: bold;
-}
-
-/* Style des boutons */
-.searchButton {
-  margin-top: 10px;
-  padding: 8px 12px;
-  background-color: #4CAF50;
-  color: white;
-  border: none;
-  cursor: pointer;
-  font-size: 14px;
-  border-radius: 5px;
-  display: block;
-  width: 100%;
-}
-
-.searchButton:hover {
-  background-color: #45a049;
-}
-
diff --git "a/s\303\251lection_recherche/token.txt" "b/s\303\251lection_recherche/token.txt"
deleted file mode 100644
index d1a0511..0000000
--- "a/s\303\251lection_recherche/token.txt"
+++ /dev/null
@@ -1 +0,0 @@
-eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJwcmlzbXMiLCJqdGkiOiJkYWU4Mzc5OGJkMTk1Y2M1NzIyMGM5MTZiZDBjYjNjZDkwNjQ0NzYyNjViNWY4YzgwOWYwYTBkNWQyYzFlNjNhNTk1M2ZmZWM2ZmEzNWQ0YyIsImlhdCI6MTczNjk3Mjk4OS4wMjk2MiwibmJmIjoxNzM2OTcyOTg5LjAyOTYzMiwiZXhwIjoxNzM2OTc2NTg5LjAwNDQzMiwic3ViIjoiYXNvdW5hbGF0aCIsInNjb3BlcyI6WyJlbWFpbCIsInBzZXVkbyIsInV1aWQiXSwia2lkIjoiMSIsImN1c3RvbSI6eyJmb28iOiJiYXIifX0.AKd1wP8mCWSkZ9iPhuyDxb5OEeLf6pyu3b4iv4yDOYqzjEXEm3He2umAYHvvTLEt701NW_6_6uzzGKt8tm-sqsGp_sff6LEBZE9j2108nonBtYS6Hi4LtSTPS9Ls9DeKvQ_mRxpT2ENOF7Lnfgy2a7PHIYrxfV3Q4jc_1LE9K4rStJdwX-UjSyzdJzmlpJ651knsg32yLDAUWzgcfyf4Vn41vqMnwn3gXi3Yez4biVM1cxOX9iwL8QdIDiPlcF83KOULrtvErLSlWzKgmmwrT8b1o2PqxEdhbehSgkpiyAU9ewmwVoZSXqql4ITg9tzOvUcLR4qyJGceAnLrNJdRnw
\ No newline at end of file
-- 
GitLab