diff --git "a/barre_lat\303\251rale/content.js" "b/barre_lat\303\251rale/content.js" index 1b524aae836c80e33bb9159b9f4753bca4a08633..051ce61303bc10b340205aae4183883080aaea35 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: window.getSelection().toString().trim() // 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: window.getSelection().toString().trim() // Le texte sélectionné + }); + } +}); diff --git "a/barre_lat\303\251rale/sidebar.js" "b/barre_lat\303\251rale/sidebar.js" index 4a13c485e6c4e96d92a2c61d0fd25a72df469ea2..9252351aec889b08889bc86374f85b042289bf57 100644 --- "a/barre_lat\303\251rale/sidebar.js" +++ "b/barre_lat\303\251rale/sidebar.js" @@ -1,7 +1,20 @@ console.log("✅ sidebar.js chargé avec succès !"); -let authToken = ''; +// let authToken = ''; +//Variable globale qui contient le token +let authToken = null; + +// Fonction pour charger le token +async function loadAuthToken() { + try { + const result = await browser.storage.local.get("accessToken"); + authToken = result.accessToken; + console.log("🔑 Token chargé au démarrage :", authToken); + } catch (error) { + console.error("⌠Erreur lors de la récupération du token :", error); + } +} // Gestionnaire global des erreurs window.addEventListener('error', (e) => { console.error("â—ï¸ Erreur globale détectée :", e.message, "dans", e.filename, ":", e.lineno); @@ -60,12 +73,15 @@ function displayLexicons(lexicons) { lexiquesContainer.innerHTML = ''; if (lexicons.length === 0) { + console.log("âš ï¸ Aucun lexique à afficher."); lexiquesContainer.textContent = 'Aucun lexique disponible.'; return; } - // Ajouter les lexiques à la liste - lexicons.forEach(lexique => { + console.log("ðŸ–¼ï¸ Affichage des lexiques..."); + lexicons.forEach(({ lexiconName, lexiconId, active }) => { + console.log(`âž¡ï¸ Affichage du lexique : ${lexiconName} (ID: ${lexiconId})`); + const lexiqueDiv = document.createElement('div'); lexiqueDiv.className = 'lexique-item'; @@ -75,26 +91,30 @@ function displayLexicons(lexicons) { const labelSpan = document.createElement('span'); labelSpan.className = 'lexique-label'; - labelSpan.textContent = lexique.name; + labelSpan.textContent = lexiconName; const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.className = 'lexique-checkbox'; - checkbox.checked = lexique.active || false; + checkbox.checked = active; checkbox.addEventListener('change', () => { - console.log(`🔄 Changement de surlignage pour ${lexique.name}: ${checkbox.checked ? 'activé' : 'désactivé'}`); + console.log( + `🔄 Changement de surlignage pour ${lexiconName} (ID: ${lexiconId}): ${ + 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'); @@ -103,55 +123,56 @@ function toggleHighlightMessage(isLoggedIn) { } } -// Récupération des lexiques avec diagnostics détaillés +// Récupération des lexiques de l'utilisateur après la connexion de l'utilisateur async function fetchLexicons() { - console.log("🚀 La fonction fetchLexicons() est appelée."); + try { + console.log("🔄 Début de la récupération des lexiques..."); + console.log("🔑 Token utilisé :", authToken); + + if (!authToken) { + console.warn("âš ï¸ Aucun token disponible. Veuillez vous connecter."); + const lexiquesContainer = document.getElementById("lexiques"); + lexiquesContainer.textContent = "Veuillez vous connecter pour voir vos lexiques."; + return; + } - const lexiquesContainer = document.getElementById('lexiques'); - const authSection = document.getElementById('auth-section'); - lexiquesContainer.innerHTML = ''; + // Appel de l'API + const lexicons = await getLexicons(authToken, 52, 'fr'); + console.log("📚 Réponse brute de l'API :", lexicons); - if (!authToken) { - console.warn('âš ï¸ Token non disponible ou vide.'); - lexiquesContainer.textContent = 'Lexiques non disponibles. Veuillez vous connecter.'; - if (authSection) { - authSection.style.display = 'block'; + if (!Array.isArray(lexicons) || lexicons.length === 0) { + console.warn("âš ï¸ Aucun lexique trouvé."); + const lexiquesContainer = document.getElementById("lexiques"); + lexiquesContainer.textContent = "Aucun lexique disponible."; + return; } - return; - } - 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' - } + // Transformation des données + const results = lexicons.map((lexicon) => { + console.log("📋 Transformation du lexique :", lexicon); + return { + lexiconName: lexicon.category === 'User' + ? `Lexique personnel (${lexicon.user?.pseudo || 'Inconnu'})` + : `Lexique de groupe (${lexicon.group?.name || 'Inconnu'})`, + lexiconId: lexicon.id, + active: lexicon.active || false, + }; }); - 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}`); - } + console.log("Appel de displayLexicons avec :", results); - 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 - } + // Affichage des lexiques + displayLexicons(results); } 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'; - } + console.error("⌠Erreur lors du chargement des lexiques :", error.message); + console.error("Détails de l'erreur :", error); + const lexiquesContainer = document.getElementById("lexiques"); + lexiquesContainer.textContent = "Erreur lors du chargement des lexiques."; } } + + function toggleElementsVisibility(isLoggedIn) { const addToLexiques = document.getElementById('add-to-lexiques'); const possibleDefinitions = document.getElementById('possible-definitions'); @@ -196,3 +217,34 @@ function updateAuthButton(isLoggedIn) { } } + + +//----------------ENVOI A LA BARRE LATERALE----------------------------------------// +browser.runtime.onMessage.addListener((message) => { + if (message.action === "mot_et_lexiques") { + const { mot, lexiques } = message; + console.log("Mot reçu :", mot); + console.log("Liste des lexiques :", lexiques); + + // Mettre à jour l'affichage du mot sélectionné + document.getElementById('motSelectionne').textContent = mot; + + // Mettre à jour la liste des lexiques dans la barre latérale + const container = document.getElementById('lexiques'); + container.innerHTML = ''; //On supprime le contenu existant + + lexiques.forEach(({ lexiconName, lexiconId, isPresent }) => { + const div = document.createElement('div'); + div.className = 'lexique-item'; + + const status = isPresent ? 'Présent' : 'Non présent'; + + div.innerHTML = ` + <div>${lexiconName} (ID: ${lexiconId})</div> + <div>${status}</div> + `; + + container.appendChild(div); + }); + } +}); diff --git a/menu_extension/background.js b/menu_extension/background.js new file mode 100644 index 0000000000000000000000000000000000000000..584b3b1da6bf5ca942cea65aad114a1105f32be1 --- /dev/null +++ b/menu_extension/background.js @@ -0,0 +1,214 @@ +// === 1. Variables globales === +let isExtensionActive = true; +let areStatsActive = false; + +console.log("🚀 ff2BaLex est chargé."); + +// === 2. Installation de l'extension === +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) { + isExtensionActive = changes.extensionActive.newValue; + console.log("✅ Extension activée :", isExtensionActive); + } + if (changes.statsActive) { + areStatsActive = changes.statsActive.newValue; + console.log("📊 Statistiques activées :", areStatsActive); + } +}); + +// === 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) { + 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; +}); + +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. 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); + } + + 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 { + await new Promise(resolve => setTimeout(resolve, 3000)); + await browser.tabs.executeScript(details.tabId, { + code: ` + 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); + } + } +}, { url: [{ hostContains: "prisms.lezinter.net" }] }); + + +// === 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é 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 }); +} + +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" }); +} + +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(() => { + console.warn("âš ï¸ Aucune API de rafraîchissement disponible."); +}, 15 * 60 * 1000); diff --git a/menu_extension/options.html b/menu_extension/options.html new file mode 100644 index 0000000000000000000000000000000000000000..c9491e14ccca3a582c965ec79951a593ec129da4 --- /dev/null +++ b/menu_extension/options.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Paramètres ff2BaLex</title> + <style> + body { + font-family: Arial, sans-serif; + padding: 20px; + background-color: #323046; + color: white; + } + button { + width: 100%; + padding: 10px; + margin-bottom: 10px; + font-size: 15px; + color: #94608a; + font-weight: bold; + border: none; + cursor: pointer; + } + button:hover { + background-color: #94608a; + color: white; + } + </style> +</head> +<body> + <h3>Paramètres BaLex</h3> + <button id="connectBtn">Se connecter</button> + <button id="toggleExtensionBtn">Activer/Désactiver l'extension</button> + <button id="toggleStatsBtn">Activer/Désactiver les statistiques</button> + <script src="options.js"></script> +</body> +</html> diff --git a/menu_extension/options.js b/menu_extension/options.js new file mode 100644 index 0000000000000000000000000000000000000000..22cba4c05d9dda2553051080e284eaccbbd1b921 --- /dev/null +++ b/menu_extension/options.js @@ -0,0 +1,28 @@ +document.getElementById('connectBtn').addEventListener('click', () => { + browser.runtime.sendMessage({ action: "openLoginPage" }); +}); + +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"); + const newState = !extensionActive; + await browser.storage.local.set({ extensionActive: newState }); + alert(`Extension ${newState ? "activée" : "désactivée"}.`); +}); + +document.getElementById("toggleStatsBtn").addEventListener("click", async () => { + const { statsActive } = await browser.storage.local.get("statsActive"); + const newState = !statsActive; + await browser.storage.local.set({ statsActive: newState }); + alert(`Statistiques ${newState ? "activées" : "désactivées"}.`); +}); + diff --git a/menu_extension/popup.html b/menu_extension/popup.html new file mode 100644 index 0000000000000000000000000000000000000000..dbc12fff629458817cb2e5d275cfb26c3a122ab8 --- /dev/null +++ b/menu_extension/popup.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html lang="fr"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Extension BaLex</title> + <style> + body { + font-family: Arial, sans-serif; + margin: 20px; + width: 200px; + background-color: #323046; + color: white; + text-align: center; + } + button { + width: 100%; + padding: 10px; + margin-bottom: 10px; + font-size: 15px; + color: #94608a; + font-weight: bold; + border: none; + cursor: pointer; + } + button:hover { + background-color: #94608a; + color: white; + } + </style> +</head> +<body> + <h3>Extension BaLex</h3> + <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> +</body> +</html> diff --git a/menu_extension/popup.js b/menu_extension/popup.js new file mode 100644 index 0000000000000000000000000000000000000000..702d38be02be801acf93282a7109ab031b83cb56 --- /dev/null +++ b/menu_extension/popup.js @@ -0,0 +1,48 @@ +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("auth-button"); + + 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é."); + } +} + +// === 2. Écoute des messages depuis background.js === +browser.runtime.onMessage.addListener((message) => { + 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(); + } +}); + +// === 3. Gestion des actions des boutons === +document.getElementById("toggleExtensionBtn").addEventListener("click", async () => { + const { extensionActive } = await browser.storage.local.get("extensionActive"); + const newState = !extensionActive; + await browser.storage.local.set({ extensionActive: newState }); + alert(`Extension ${newState ? "activée" : "désactivée"}.`); +}); + +document.getElementById("toggleStatsBtn").addEventListener("click", async () => { + const { statsActive } = await browser.storage.local.get("statsActive"); + const newState = !statsActive; + await browser.storage.local.set({ statsActive: newState }); + alert(`Statistiques ${newState ? "activées" : "désactivées"}.`); +}); + +// === 4. Initialisation === +document.addEventListener("DOMContentLoaded", () => { + console.log("🌠Initialisation du menu de l'extension..."); + updateConnectionButton(); +});