diff --git "a/barre_lat\303\251rale/content.js" "b/barre_lat\303\251rale/content.js" index da428ce66fc6bc6ab1f6a4fb9930abf82d7e96d8..1b524aae836c80e33bb9159b9f4753bca4a08633 100644 --- "a/barre_lat\303\251rale/content.js" +++ "b/barre_lat\303\251rale/content.js" @@ -12,7 +12,7 @@ document.addEventListener('mouseup', () => { // 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é + mot: window.getSelection().toString().trim() // Le texte sélectionné }); } }); diff --git "a/barre_lat\303\251rale/sidebar.html" "b/barre_lat\303\251rale/sidebar.html" index 5c3949b65166ede91b9bc0f5595f3dd24ef951d6..55e12d5593c893291d7b81230180cb818133ab82 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 { @@ -18,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); } @@ -87,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; @@ -105,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> @@ -112,19 +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> + <div id="auth-section"> + <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> - <script src="sidebar.js"></script> </body> </html> diff --git "a/barre_lat\303\251rale/sidebar.js" "b/barre_lat\303\251rale/sidebar.js" index dbb8788c323e8cefc4dca9622a8b04b6c067914c..4a13c485e6c4e96d92a2c61d0fd25a72df469ea2 100644 --- "a/barre_lat\303\251rale/sidebar.js" +++ "b/barre_lat\303\251rale/sidebar.js" @@ -1,86 +1,198 @@ -// Confirme le chargement du script dans la console -console.log("sidebar.js chargé avec succès !"); +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 +let authToken = ''; + +// Gestionnaire global des erreurs +window.addEventListener('error', (e) => { + console.error("â—ï¸ Erreur globale détectée :", e.message, "dans", e.filename, ":", e.lineno); +}); + +// 📩 É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") { - // 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); + 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."); + } + } + + if (message.action === "updateUI") { + updateAuthButton(message.isLoggedIn); + toggleHighlightMessage(message.isLoggedIn); } }); -// 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); +// 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 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}]`); + return true; + } else { + console.error("⌠Token invalide ou non trouvé dans le stockage local."); + return false; + } +} + +// Affichage des lexiques avec cases à cocher et pictogrammes +function displayLexicons(lexicons) { + const lexiquesContainer = document.getElementById('lexiques'); + lexiquesContainer.innerHTML = ''; + + if (lexicons.length === 0) { + lexiquesContainer.textContent = 'Aucun lexique disponible.'; + return; + } + + // Ajouter les lexiques à la liste + lexicons.forEach(lexique => { + const lexiqueDiv = document.createElement('div'); + lexiqueDiv.className = 'lexique-item'; + + const iconDiv = document.createElement('div'); + iconDiv.className = 'lexique-icon'; + iconDiv.style.backgroundColor = '#ccc'; + + const labelSpan = document.createElement('span'); + labelSpan.className = 'lexique-label'; + labelSpan.textContent = lexique.name; + + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + 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); + + lexiquesContainer.appendChild(lexiqueDiv); + }); +} + +// 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."); + + 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; + } try { - // Effectue la requête API vers le Wiktionnaire - const response = await fetch(url); + 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) { - throw new Error(`Erreur HTTP : ${response.status}`); + const errorBody = await response.text(); + throw new Error(`⌠Erreur API Babalex : ${response.status} - ${errorBody}`); } - // Récupère et affiche la définition si elle existe - const data = await response.json(); - const definitionDiv = document.getElementById('definition'); - - 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>`; + 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 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 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'; + } } } -// 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."); +function toggleElementsVisibility(isLoggedIn) { + const addToLexiques = document.getElementById('add-to-lexiques'); + const possibleDefinitions = document.getElementById('possible-definitions'); + + if (addToLexiques) { + addToLexiques.style.display = isLoggedIn ? 'block' : 'none'; } -}); -// 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); - }); + 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(); + + // Gestion du bouton de connexion/déconnexion + const authButton = document.getElementById("auth-button"); + if (authButton) { + authButton.addEventListener("click", () => { + browser.runtime.sendMessage({ action: "toggleAuth" }).then(() => { + browser.runtime.sendMessage({ action: "checkAuthStatus" }).then((isLoggedIn) => { + updateAuthButton(isLoggedIn); + toggleHighlightMessage(isLoggedIn); + toggleElementsVisibility(isLoggedIn); + }); + }); + }); + } +}; + +function updateAuthButton(isLoggedIn) { + const authButton = document.getElementById("auth-button"); + if (authButton) { + authButton.textContent = isLoggedIn ? "Se déconnecter" : "Se connecter"; + } } -// Chargement des lexiques dès l'ouverture de la barre latérale -chargerLexiques(); diff --git a/menu_extension/manifest.json b/manifest.json similarity index 63% rename from menu_extension/manifest.json rename to manifest.json index b36ec6cbc65f6a2aa18394ccb1b7de2835223131..8a83e2dcf2f25a6584a09634be934b16d525eab7 100644 --- a/menu_extension/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 88538aa4409de3f11f4a7986afb6969a6063fe7a..584b3b1da6bf5ca942cea65aad114a1105f32be1 100644 --- a/menu_extension/background.js +++ b/menu_extension/background.js @@ -1,122 +1,214 @@ +// === 1. Variables globales === let isExtensionActive = true; let areStatsActive = false; -console.log("ff2BaLex est chargé."); +console.log("🚀 ff2BaLex est chargé."); -// === 1. Installation de l'extension === +// === 2. Installation de l'extension === browser.runtime.onInstalled.addListener(() => { - console.log("ff2BaLex est installé."); + console.log("🔔 Extension ff2BaLex installée."); +}); - // Création d'un bouton unique de connexion/déconnexion - browser.contextMenus.create({ - id: "toggle_connection", - title: "Se connecter à la base lexicale", - contexts: ["all"] - }); +browser.runtime.onStartup.addListener(() => { + console.log("🔄 Extension démarrée."); }); -// === 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); + 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); } }); -// === 3. Gestion des messages provenant du bouton Connexion/Déconnexion === -browser.runtime.onMessage.addListener(async (message) => { - if (message.action === "toggleConnection") { +// === 4. Gestion des connexions/déconnexions === +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) { - disconnectFromLexicalDB(); + 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); } + return true; }); -// === 4. Ouvrir la page de connexion Prisms === function openLoginPage() { const authUrl = "https://prisms.lezinter.net/fr/login"; + console.log("🔗 Ouverture de la page de connexion :", authUrl); browser.tabs.create({ url: authUrl }); + browser.runtime.sendMessage({ action: "authStatusChanged", isLoggedIn: false }); } -// === 5. Suivi du parcours de connexion et récupération du token === +// === 5. Afficher le popup après redirection vers Prisms === 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'..."); + console.log("📘 Injection du popup d'instruction sur Prisms."); + showInstructionPopup(details); } - // 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..."); - + console.log("🟢 L'utilisateur est sur la page /balex. Tentative de récupération du token."); 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; - })(); + 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."); + } ` - }).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(); - } else { - console.error("Token non trouvé sur la page Prisms."); - } }); } 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" }] }); -// === 6. Déconnexion === + +// === 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 dans la page === +function showInstructionPopup(details) { + console.log("📘 Injection du message d'instruction centré 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 = "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.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> + \`; + + document.body.appendChild(popup); + + document.getElementById("close-popup-btn").onclick = () => { + popup.remove(); + }; + } + ` + }); +} + + + +// === 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 }); + showNotification('Connexion réussie', 'La barre latérale va se recharger.', 'icons/success.png'); + refreshSidebar(); + refreshExtensionMenu(); + browser.runtime.sendMessage({ action: "updateUI", isLoggedIn: true }); + } +}); + async function disconnectFromLexicalDB() { + console.log("🔓 Déconnexion en cours..."); await browser.storage.local.remove("accessToken"); - console.log("Token supprimé, déconnexion réussie."); - alert("Déconnexion réussie."); - updateContextMenu(); + 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 }); } -// === 7. Vérifier si l'utilisateur est connecté === async function isUserConnected() { const result = await browser.storage.local.get("accessToken"); + console.log("🔑 État actuel du token :", result.accessToken); return result.accessToken !== undefined; } -// === 8. Mise à jour dynamique du menu contextuel === -browser.runtime.onStartup.addListener(() => { - updateContextMenu(); -}); +function refreshSidebar() { + console.log("🔄 Rafraîchissement de la barre latérale."); + 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() { + console.log("🔄 Rafraîchissement du menu de l'extension."); + 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é."); +function showNotification(title, message, iconUrl) { + console.log(`🔔 Notification : ${title} - ${message}`); + if (browser.notifications) { + browser.notifications.create({ + type: 'basic', + iconUrl: iconUrl || "icons/info.png", + title: title, + message: message + }); + } else { + console.warn("âš ï¸ Notifications non supportées."); + } } setInterval(() => { - refreshToken(); -}, 15 * 60 * 1000); // Désactivé faute d'API de rafraîchissement + console.warn("âš ï¸ Aucune API de rafraîchissement disponible."); +}, 15 * 60 * 1000); diff --git a/menu_extension/login.html b/menu_extension/login.html deleted file mode 100644 index 1f537473fb5d30a313f9da4f237993aa9450cdd5..0000000000000000000000000000000000000000 --- 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 04a877695d80c75da55a033587f2aac5bfc3cf7c..0000000000000000000000000000000000000000 --- 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/options.js b/menu_extension/options.js index cbfd4cfcb2274d8f74445918a52f9184b23e093a..22cba4c05d9dda2553051080e284eaccbbd1b921 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.html b/menu_extension/popup.html index 3c45bee873b39f4faa06584872d2763a65045f78..dbc12fff629458817cb2e5d275cfb26c3a122ab8 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 458e207b3e38b0c452426cdee2e3f93100c03ec4..702d38be02be801acf93282a7109ab031b83cb56 100644 --- a/menu_extension/popup.js +++ b/menu_extension/popup.js @@ -1,24 +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"); - 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: "toggleAuth" }); + }; + } 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. É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(); + } else if (message.action === "refreshMenu") { + console.log("🔄 Actualisation du menu de l'extension déclenchée."); + updateConnectionButton(); } }); -// === 2. 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; @@ -26,7 +34,6 @@ document.getElementById("toggleExtensionBtn").addEventListener("click", async () alert(`Extension ${newState ? "activée" : "désactivée"}.`); }); -// === 3. Activer/Désactiver les statistiques === document.getElementById("toggleStatsBtn").addEventListener("click", async () => { const { statsActive } = await browser.storage.local.get("statsActive"); const newState = !statsActive; @@ -34,25 +41,8 @@ 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 +// === 4. Initialisation === 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é."); - } + console.log("🌠Initialisation du menu de l'extension..."); + updateConnectionButton(); }); - diff --git "a/s\303\251lection_recherche/.gitkeep" "b/s\303\251lection_recherche/.gitkeep" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 Binary files "a/s\303\251lection_recherche/icons/border-48.png" and /dev/null differ 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 Binary files "a/s\303\251lection_recherche/icons/loupe-256.png" and /dev/null differ diff --git "a/s\303\251lection_recherche/main.js" "b/s\303\251lection_recherche/main.js" deleted file mode 100644 index aaa3124a34ddde087bcf340311212be0f6c878cb..0000000000000000000000000000000000000000 --- "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 163425207d2c6afcdbb96831e790dc50032ff4cd..0000000000000000000000000000000000000000 --- "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 60e994e0c3e489b7981b06a20af04964cd8c49b2..0000000000000000000000000000000000000000 --- "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 d1a05116c9ea5c3172fd4bcb43d453c48f7a5ce8..0000000000000000000000000000000000000000 --- "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