-
Prénom Nom authored18b1902a
browser_context_menu.js 6.82 KiB
log("browser_context_menu.js chargé correctement");
let authToken = null;
let selectedLexicons = new Set();
/**
* Charge le token depuis le stockage local et le stocke dans la variable globale authToken.
*/
async function loadAuthToken() {
try {
const result = await browser.storage.local.get("accessToken");
authToken = result.accessToken;
log("🔑 Token chargé au démarrage :", authToken);
} catch (error) {
console.error("❌ Erreur lors de la récupération du token :", error);
}
}
/**
* Crée le menu contextuel en fonction de l'authentification.
* Si l'utilisateur est connecté, on ajoute un item pour la recherche et
* un menu parent pour l'ajout du mot avec des cases à cocher pour chaque lexique
* et un item de confirmation.
*/
async function createContextMenu() {
await browser.contextMenus.removeAll();
if (authToken) {
// Item 1 : Recherche dans les lexiques de l’utilisateur
browser.contextMenus.create({
id: "searchInLexicons",
title: "Rechercher dans mes lexiques",
contexts: ["selection"],
icons: { "16": "src/assets/icons/quel_lexique.png" },
});
// Item 2 : Ajouter le mot au(x) lexique(s) de l’utilisateur
browser.contextMenus.create({
id: "addToLexicon",
title: "Ajouter ce mot à mes lexiques",
contexts: ["selection"],
icons: { "16": "src/assets/icons/ajout_lexique.png" },
});
}
// Séparateur
browser.contextMenus.create({
id: "separatorExtension",
type: "separator",
contexts: ["all"],
});
// Item 3 : Recherche globale de définition (Lexiques + Wiktionnaire)
browser.contextMenus.create({
id: "getDefinition",
title: "Obtenir une définition",
contexts: ["selection"],
icons: { "16": "src/assets/icons/definition.png" },
});
browser.contextMenus.create({
id: "separatorAfterExtension",
type: "separator",
contexts: ["all"],
});
// Item de connexion/déconnexion
browser.contextMenus.create({
id: "login",
title: authToken ? "Se déconnecter de BaLex" : "Se connecter à BaLex",
contexts: ["all"],
});
}
loadAuthToken().then(createContextMenu);
browser.runtime.onMessage.addListener((message) => {
if (message.action === "refreshUI") {
log("🔄 refreshUI reçu dans browser_context_menu.js");
loadAuthToken().then(createContextMenu);
}
});
browser.storage.onChanged.addListener((changes, area) => {
if (area === "local" && changes.accessToken) {
log("🔄 Token modifié, actualisation du menu contextuel.");
loadAuthToken().then(createContextMenu);
}
});
// ─────────────────────────────────────────────────────────────────────────────
// Gestion des clics sur le menu contextuel
// ─────────────────────────────────────────────────────────────────────────────
browser.contextMenus.onClicked.addListener(async (info, tab) => {
log("Item de menu cliqué :", info.menuItemId);
// Action pour le bouton de connexion/déconnexion
if (info.menuItemId === "login") {
log("🔄 Action login/déconnexion demandée.");
if (typeof actuallyOpenLoginPage === "function") {
actuallyOpenLoginPage();
} else {
console.error("La fonction actuallyOpenLoginPage n'est pas accessible.");
}
return;
}
if (!info.selectionText) {
console.warn("Aucun texte sélectionné pour cette action :", info.menuItemId);
return;
}
const selectedText = info.selectionText.trim();
log(`📩 Texte sélectionné : ${selectedText}`);
// Item "Ajouter ce mot à mes lexiques"
if (info.menuItemId === "addToLexicon") {
if (!authToken) {
alert("⚠️ Vous devez être connecté pour ajouter un mot à un lexique.");
return;
}
browser.runtime.sendMessage({
action: "addToLexicon",
selectedText,
});
return;
}
// Item "Obtenir une définition"
if (info.menuItemId === "getDefinition") {
await browser.runtime.sendMessage({
action: "getDefinition",
selectedText,
});
return;
}
// Item "Rechercher dans mes lexiques"
switch (info.menuItemId) {
case "searchInLexicons":
if (!authToken) {
alert("⚠️ Vous devez être connecté pour utiliser cette fonction.");
return;
}
await searchInLexicons(selectedText);
break;
}
console.error(`❌ Action inconnue : ${info.menuItemId}`);
});
// ─────────────────────────────────────────────────────────────────────────────
// Fonctions liées aux définitions
// ─────────────────────────────────────────────────────────────────────────────
async function getDefinition(selectedText) {
try {
let lexiconDefs = [];
if (authToken) {
lexiconDefs = await fetchLexiconDefinitions(selectedText);
}
const wikiDefs = await fetchWiktionaryDefinition(selectedText);
const allDefinitions = [...lexiconDefs, ...wikiDefs];
log("📝 Définitions combinées :", allDefinitions);
browser.runtime.sendMessage({
action: "showDefinitions",
selectedText,
definitions: allDefinitions,
});
} catch (error) {
console.error("❌ Erreur lors de la recherche combinée des définitions :", error);
}
}
async function searchInLexicons(selectedText) {
try {
log("🔎 Recherche dans mes lexiques :", selectedText);
const allDefinitions = await fetchLexiconDefinitions(selectedText);
if (!allDefinitions || allDefinitions.length === 0) {
log("❌ Aucun lexique trouvé pour ce mot.");
browser.runtime.sendMessage({
action: "showLexiconResult",
lexicons: [],
selectedText,
});
return;
}
const lexMap = new Map();
for (const def of allDefinitions) {
if (def.lexiconId) {
lexMap.set(def.lexiconId, def.source);
}
}
const foundInLexicons = [];
for (const [id, name] of lexMap.entries()) {
foundInLexicons.push({ id, name });
}
log("📩 Envoi du message 'showLexiconResult' avec :", foundInLexicons);
browser.runtime.sendMessage({
action: "showLexiconResult",
lexicons: foundInLexicons,
selectedText,
});
} catch (error) {
console.error("❌ Erreur lors de la recherche dans les lexiques :", error);
browser.runtime.sendMessage({
action: "showLexiconResult",
lexicons: [],
selectedText,
});
}
}