diff --git a/menu_extension/background.js b/menu_extension/background.js index 2c13d9651ffc0f112c557d5aa77f49a451d08740..88538aa4409de3f11f4a7986afb6969a6063fe7a 100644 --- a/menu_extension/background.js +++ b/menu_extension/background.js @@ -3,10 +3,19 @@ let areStatsActive = false; console.log("ff2BaLex est chargé."); +// === 1. 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 === browser.storage.onChanged.addListener((changes) => { if (changes.extensionActive) { isExtensionActive = changes.extensionActive.newValue; @@ -18,3 +27,96 @@ browser.storage.onChanged.addListener((changes) => { 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") { + const isConnected = await isUserConnected(); + if (isConnected) { + disconnectFromLexicalDB(); + } else { + openLoginPage(); + } + } +}); + +// === 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 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(); + } else { + console.error("Token non trouvé sur la page Prisms."); + } + }); + } catch (error) { + console.error("Erreur lors de la récupération du token :", error); + } + } +}, { 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(); +} + +// === 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(); +}); + +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" + }); +} + +// === 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 diff --git a/menu_extension/login.html b/menu_extension/login.html new file mode 100644 index 0000000000000000000000000000000000000000..1f537473fb5d30a313f9da4f237993aa9450cdd5 --- /dev/null +++ b/menu_extension/login.html @@ -0,0 +1,36 @@ +<!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 new file mode 100644 index 0000000000000000000000000000000000000000..04a877695d80c75da55a033587f2aac5bfc3cf7c --- /dev/null +++ b/menu_extension/login.js @@ -0,0 +1,36 @@ +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/manifest.json b/menu_extension/manifest.json index 1f8ec330a09670f0b0266e6bcf67e311e7dd2a91..02bfc7d08d08c90b2a5018a2f7b13bff88c747f3 100644 --- a/menu_extension/manifest.json +++ b/menu_extension/manifest.json @@ -3,7 +3,15 @@ "name": "ff2BaLex", "version": "1.0", "description": "Extension Firefox avec paramètres personnalisés.", - "permissions": ["storage", "activeTab"], + "permissions": [ + "storage", + "activeTab", + "tabs", + "contextMenus", + "webNavigation", + "scripting", + "*://babalex.lezinter.net/*", + "*://prisms.lezinter.net/*"], "background": { "scripts": ["background.js"], "persistent": true @@ -20,5 +28,6 @@ "128": "icon-128.png" }, "default_title": "ff2BaLex" - } + }, + "web_accessible_resources": ["login.html"] } diff --git a/menu_extension/options.js b/menu_extension/options.js index e80617fb5ca83a8a6b9919124fe95147d4dbf3aa..cbfd4cfcb2274d8f74445918a52f9184b23e093a 100644 --- a/menu_extension/options.js +++ b/menu_extension/options.js @@ -1,18 +1,23 @@ -document.getElementById("connectBtn").addEventListener("click", () => { - alert("Fonctionnalité de connexion non encore implémentée."); - }); - - 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"}.`); - }); +document.getElementById('connectBtn').addEventListener('click', () => { + browser.runtime.sendMessage({ action: "openLoginPage" }); +}); + +document.getElementById('disconnectBtn').addEventListener('click', async () => { + await browser.storage.local.remove(["accessToken", "refreshToken"]); + alert("Déconnexion réussie."); +}); +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.js b/menu_extension/popup.js index e80617fb5ca83a8a6b9919124fe95147d4dbf3aa..458e207b3e38b0c452426cdee2e3f93100c03ec4 100644 --- a/menu_extension/popup.js +++ b/menu_extension/popup.js @@ -1,18 +1,58 @@ +// === 1. Gestion du bouton unique Connexion/Déconnexion === +async function updateConnectionButton() { + const { accessToken } = await browser.storage.local.get("accessToken"); + const button = document.getElementById("connectBtn"); + + button.textContent = accessToken ? "Se déconnecter" : "Se connecter"; +} + +// Action au clic du bouton Connexion/Déconnexion document.getElementById("connectBtn").addEventListener("click", () => { - alert("Fonctionnalité de connexion non encore implémentée."); - }); - - 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"}.`); - }); - + console.log("Redirection vers la page de connexion..."); + browser.runtime.sendMessage({ action: "connectToBaLex" }); +}); + +browser.runtime.onMessage.addListener((message) => { + if (message.action === "tokenSaved") { + alert("Connexion réussie !"); + } +}); + +// === 2. Activer/Désactiver l'extension === +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"}.`); +}); + +// === 3. Activer/Désactiver les statistiques === +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. Mise à jour initiale du bouton Connexion/Déconnexion === +updateConnectionButton(); + +// Vérification pour le bouton de 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é."); + } +}); +