Skip to content
Snippets Groups Projects

Définitions (lexiques de l'utilisateur + Wiktionnaire)

Merged Lucie Bader requested to merge definitions into main
9 files
+ 1257
771
Compare changes
  • Side-by-side
  • Inline
Files
9
+ 101
178
// === Variables globales / de configuration ===
let isExtensionActive = true; // Activation globale de l'extension
// ─────────────────────────────────────────────────────────────────────────────
// Variables globales
// ─────────────────────────────────────────────────────────────────────────────
let isExtensionActive = true;
let areStatsActive = false;
let originalTabId = null;
let loginTabId = null;
const AUTH_LOGIN_URL = "https://prisms.lezinter.net/fr/login";
const AUTH_BALEX_URL = "https://prisms.lezinter.net/fr/headquarters/balex";
// === Logs de démarrage ===
// ─────────────────────────────────────────────────────────────────────────────
// Logs de démarrage
// ─────────────────────────────────────────────────────────────────────────────
console.log("🚀 ff2BaLex (background) chargé.");
browser.runtime.onInstalled.addListener((details) => {
@@ -19,7 +22,9 @@ browser.runtime.onStartup.addListener(() => {
console.log("🔄 Extension démarrée (onStartup).");
});
// === Suivi des changements dans le stockage (extensionActive, statsActive) ===
// ─────────────────────────────────────────────────────────────────────────────
// Suivi des changements dans le stockage
// ─────────────────────────────────────────────────────────────────────────────
browser.storage.onChanged.addListener((changes) => {
if (changes.extensionActive) {
isExtensionActive = changes.extensionActive.newValue;
@@ -29,58 +34,75 @@ browser.storage.onChanged.addListener((changes) => {
areStatsActive = changes.statsActive.newValue;
console.log("📊 Statistiques activées :", areStatsActive);
}
// Recréer le menu contextuel du navigateur quand l'état change (ex: extension désactivée)
createBrowserContextMenu();
refreshAllUI();
});
// === Vérifie si l'utilisateur est connecté (token présent) ===
// ─────────────────────────────────────────────────────────────────────────────
// Fonctions utilitaires
// ─────────────────────────────────────────────────────────────────────────────
async function isUserConnected() {
const { accessToken } = await browser.storage.local.get("accessToken");
return !!accessToken;
}
// === Ouvre la page de login BaLex ===
async function openLoginPage() {
async function refreshAllUI() {
console.log("🔄 Rafraîchissement global de l'UI...");
browser.runtime.sendMessage({ action: "refreshUI" });
}
// ─────────────────────────────────────────────────────────────────────────────
// Fonctions d'authentification & de redirection
// ─────────────────────────────────────────────────────────────────────────────
browser.runtime.onConnect.addListener((port) => {
if (port.name === "auth") {
port.onMessage.addListener(async (message) => {
if (message.action === "toggleAuth") {
console.log("🔄 toggleAuth reçu via port dans le background.");
const isConnected = await isUserConnected();
if (isConnected) {
await disconnectFromLexicalDB();
} else {
// Ouvre directement la page de connexion
actuallyOpenLoginPage();
}
}
});
}
});
// Ouvre directement la page de connexion
async function actuallyOpenLoginPage() {
console.log("🔗 Ouverture de la page de connexion.");
// 1) Retrouver l'onglet actuellement actif (pour y revenir plus tard)
// Mémoriser l'onglet actif
const [currentTab] = await browser.tabs.query({ active: true, currentWindow: true });
if (currentTab) {
originalTabId = currentTab.id;
console.log("✅ Onglet courant mémorisé, ID =", originalTabId);
}
// 2) Créer l’onglet de login
const loginTab = await browser.tabs.create({ url: AUTH_LOGIN_URL });
// Ouvre un nouvel onglet pour la page de connexion et l'active
const loginTab = await browser.tabs.create({ url: AUTH_LOGIN_URL, active: true });
loginTabId = loginTab.id;
console.log("✅ Onglet de login créé, ID =", loginTabId);
// Notifie (éventuellement) qu'on est “en cours” de connexion
// Notifie que l'authentification est en cours
browser.runtime.sendMessage({ action: "authStatusChanged", isLoggedIn: false });
}
// === Déconnecte l'utilisateur (supprime le token) ===
// Déconnecte l'utilisateur (sans notification)
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",
"Vous êtes maintenant déconnecté(e).",
"icons/logout.png"
);
// On effectue un rafraîchissement global
await refreshAllUI();
setTimeout(async () => {
await refreshAllUI();
}, 500);
}
// === Sauvegarde du token et finalisation de la connexion ===
// Sauvegarde le token et ferme l'onglet de login si nécessaire
async function saveToken(token) {
console.log("✅ Sauvegarde du token :", token);
await browser.storage.local.set({ accessToken: token });
// On ferme la page de login si encore ouverte
if (loginTabId) {
try {
await browser.tabs.remove(loginTabId);
@@ -88,10 +110,8 @@ async function saveToken(token) {
} catch (err) {
console.warn("Impossible de fermer l'onglet de login :", err);
}
loginTabId = null; // Reset l'identifiant
loginTabId = null;
}
// On refait apparaître l’onglet initial, s'il existe encore
if (originalTabId) {
try {
await browser.tabs.update(originalTabId, { active: true });
@@ -99,56 +119,54 @@ async function saveToken(token) {
} catch (err) {
console.warn("Impossible de basculer sur l'onglet initial :", err);
}
originalTabId = null; // Reset l'identifiant
originalTabId = null;
}
// Et on rafraîchit toute l’UI
await refreshAllUI();
}
// === Fonction de REFRESH centralisée ===
async function refreshAllUI() {
console.log("🔄 Rafraîchissement global de l'UI...");
// 1) Recrée le menu contextuel “navigateur” (clic-droit)
createBrowserContextMenu();
// 2) Envoie un message unique “refreshUI” à toutes les parties
// (sidebar, popup, content script) pour qu'elles se mettent à jour.
browser.runtime.sendMessage({ action: "refreshUI" });
}
// === Gestion des messages reçus ===
// ─────────────────────────────────────────────────────────────────────────────
// Gestion des messages reçus
// ─────────────────────────────────────────────────────────────────────────────
browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
console.log("📩 Message reçu dans background.js :", message);
switch (message.action) {
// --- Authentification ---
case "toggleAuth": {
console.log("Action toggleAuth reçue");
const isConnected = await isUserConnected();
if (isConnected) {
await disconnectFromLexicalDB();
} else {
await openLoginPage();
actuallyOpenLoginPage();
}
break;
}
case "getDefinitionWiki": {
if (message.selectedText && message.selectedText.trim() !== "") {
console.log("🌐 Requête Wiktionnaire pour :", message.selectedText);
const definition = await window.fetchWiktionaryDefinition(message.selectedText.trim());
browser.runtime.sendMessage({
action: "fetchWiktionaryDefinitionResponse",
selectedText: message.selectedText,
definitions: [{
source: "Wiktionnaire",
text: definition,
}],
});
} else {
console.warn("⚠️ Texte sélectionné vide. Annulation de la requête.");
}
break;
}
case "checkAuthStatus": {
const connected = await isUserConnected();
sendResponse(connected);
break;
}
case "authStatusChanged": {
console.log("🔄 Mise à jour de l'état d'authentification :", message.isLoggedIn);
// Éventuellement on peut relancer un refreshAllUI() si souhaité
break;
}
case "saveToken": {
// Lorsqu'on reçoit le token depuis la page BaLex
if (message.token) {
await saveToken(message.token);
} else {
@@ -156,58 +174,57 @@ browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
}
break;
}
// (Optionnel) Si d’autres messages…
// ex: "toggleLexiconHighlight", etc.
default:
break;
}
return true;
});
// === Navigation : injection / récupération token sur la page BaLex ===
// ─────────────────────────────────────────────────────────────────────────────
// Web Navigation : Injection de scripts et récupération du token
// ─────────────────────────────────────────────────────────────────────────────
browser.webNavigation.onCompleted.addListener(async (details) => {
if (!isExtensionActive) {
console.log("🚫 Extension désactivée, aucune injection script.");
return;
}
const url = new URL(details.url);
// Sur la page de login : injecter un petit popup dinstruction
// Injection d'un popup d'instruction sur la page de login
if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/login") {
console.log("📘 Injection du popup d'instruction sur la page de login Prisms.");
showInstructionPopup(details);
}
// Sur la page /balex : tenter de récupérer le token
// Récupération du token sur la page /balex
if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/headquarters/balex") {
console.log("🟢 Page /balex détectée. Tentative de récupération du token.");
try {
await new Promise(resolve => setTimeout(resolve, 3000)); // Attendre 3s
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.");
}
(function() {
console.log("🔍 Recherche du token...");
const tokenElement = document.getElementById("accessToken") || 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.");
}
return null;
})();
`
});
} catch (error) {
console.error("❌ Erreur lors de la récupération du token :", error);
}
}
}, {
url: [{ hostContains: "prisms.lezinter.net" }]
});
}, { url: [{ hostContains: "prisms.lezinter.net" }] });
// === Redirection automatique vers /balex (facultatif) ===
// ─────────────────────────────────────────────────────────────────────────────
// Web Request : Redirection automatique vers /balex
// ─────────────────────────────────────────────────────────────────────────────
browser.webRequest.onBeforeRequest.addListener(
function(details) {
if (details.url === "https://prisms.lezinter.net/fr/headquarters/") {
@@ -219,7 +236,9 @@ browser.webRequest.onBeforeRequest.addListener(
["blocking"]
);
// === Affichage d'un popup d’instruction sur /fr/login ===
// ─────────────────────────────────────────────────────────────────────────────
// Affichage d'un popup d'instruction sur /fr/login
// ─────────────────────────────────────────────────────────────────────────────
function showInstructionPopup(details) {
browser.tabs.executeScript(details.tabId, {
code: `
@@ -240,7 +259,7 @@ function showInstructionPopup(details) {
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;">
@@ -259,108 +278,12 @@ function showInstructionPopup(details) {
border-radius: 5px;
">Fermer</button>
\`;
document.body.appendChild(popup);
const closeBtn = document.getElementById("close-popup-btn");
closeBtn.onclick = () => popup.remove();
}
`
});
}
// === Création du menu contextuel (navigateur) standard ===
async function createBrowserContextMenu() {
// Supprimer les items existants
browser.contextMenus.removeAll();
const isConnected = await isUserConnected();
// Si connecté : options supplémentaires
if (isConnected) {
browser.contextMenus.create({
id: "searchLexicon",
title: "Vérifier si le mot est dans le lexique personnel",
contexts: ["selection"],
});
browser.contextMenus.create({
id: "checkLexicon",
title: "Afficher dans quels lexiques le mot est présent",
contexts: ["selection"],
});
browser.contextMenus.create({
id: "getDefinition",
title: "Obtenir une définition à partir de mes lexiques",
contexts: ["selection"],
});
}
// Option accessible à tout le monde
browser.contextMenus.create({
id: "getDefinitionWiki",
title: "Rechercher une définition sur le Wiktionnaire",
contexts: ["selection"],
});
// Bouton de connexion/déconnexion
browser.contextMenus.create({
id: "login",
title: isConnected ? "Se déconnecter de BaLex" : "Se connecter à BaLex",
contexts: ["all"],
});
}
// Initialise le menu contextuel du navigateur une première fois
createBrowserContextMenu();
// Gère les clics sur les items du menu contextuel du navigateur
browser.contextMenus.onClicked.addListener(async (info, tab) => {
console.log("📦 Menu contextuel - item cliqué :", info.menuItemId);
switch (info.menuItemId) {
case "searchLexicon":
browser.tabs.sendMessage(tab.id, {
action: "searchLexicon",
selectedText: info.selectionText,
});
break;
case "checkLexicon":
browser.tabs.sendMessage(tab.id, {
action: "checkLexicon",
selectedText: info.selectionText,
});
break;
case "getDefinition":
browser.tabs.sendMessage(tab.id, {
action: "getDefinition",
selectedText: info.selectionText,
});
break;
case "getDefinitionWiki":
browser.tabs.sendMessage(tab.id, {
action: "getDefinitionWiki",
selectedText: info.selectionText,
});
break;
case "login": {
const connected = await isUserConnected();
if (connected) {
await disconnectFromLexicalDB();
} else {
await openLoginPage();
}
break;
}
default:
console.warn(`Aucune action définie pour l'élément : ${info.menuItemId}`);
}
});
// === Exemple de notification ===
function showNotification(title, message, iconPath) {
console.log(`🔔 NOTIFICATION: [${title}] ${message}`);
}
Loading