Skip to content
Snippets Groups Projects
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,
    });
  }
}