-
Lucie Bader authorede2d3a55c
sidebar.js 36.00 KiB
// ─────────────────────────────────────────────────────────────────────────────
// ▌ Variables globales et logs
// ─────────────────────────────────────────────────────────────────────────────
log("sidebar.js chargé.");
let authToken = window.authToken; // Token d'authentification de l'utilisateur
window.authToken = authToken; // Stockage du token dans l'objet window
let isUpdatingLexicons = false; // Indicateur pour savoir si les lexiques sont en cours de mise à jour
// ─────────────────────────────────────────────────────────────────────────────
// ▌ Fonctions liées à la connexion et à l'activation de l'analyse
// ─────────────────────────────────────────────────────────────────────────────
/**
* Récupère le token d'authentification depuis le stockage local.
* @returns {Promise<string|null>} Le token d'authentification ou null si non trouvé.
*/
async function getAuthTokenFromStorage() {
try {
const { accessToken } = await browser.storage.local.get("accessToken");
if (accessToken) {
log(`Token récupéré depuis le stockage local : [${accessToken}]`);
authToken = accessToken;
window.authToken = accessToken;
return authToken;
}
log("️ Aucun token trouvé dans le stockage local.");
} catch (error) {
log("Erreur lors de la récupération du token :", error);
}
return null;
}
/**
* Gère le clic sur le bouton d'authentification.
* Envoie un message pour basculer l'état d'authentification et actualise l'interface.
*/
async function handleAuthButtonClick() {
await browser.runtime.sendMessage({ action: "toggleAuth" });
await refreshSidebarState();
const messageContainer = document.getElementById("messageContainer");
if (messageContainer) {
messageContainer.style.display = "block";
messageContainer.innerHTML = "Veuillez vous connecter pour utiliser l'extension.";
}
}
/**
* Vérifie l'état d'activation de l'extension.
* @returns {Promise<boolean>} L'état d'activation de l'extension.
*/
async function checkAnalysisStatus() {
const { extensionActive } = await browser.storage.local.get("extensionActive");
return extensionActive;
}
// ─────────────────────────────────────────────────────────────────────────────
// ▌ Mise à jour de l'interface utilisateur (UI)
// ─────────────────────────────────────────────────────────────────────────────
/**
* Met à jour le texte du bouton d'authentification en fonction de l'état de connexion.
* @param {boolean} isLoggedIn - Indique si l'utilisateur est connecté.
*/
function updateAuthButton(isLoggedIn) {
const authButton = document.getElementById("auth-button");
if (authButton) {
authButton.textContent = isLoggedIn ? "Se déconnecter" : "Se connecter";
log("Bouton d'authentification mis à jour :", authButton.textContent);
} else {
console.warn("️ Bouton d'authentification (#auth-button) introuvable.");
}
}
/**
* Bascule la visibilité des éléments en fonction de l'état de connexion.
* @param {boolean} isLoggedIn - Indique si l'utilisateur est connecté.
*/
function toggleElementsVisibility(isLoggedIn) {
const elementsToShowOrHide = [
{ id: "add-to-lexiques", shouldShow: isLoggedIn },
{ id: "possible-definitions", shouldShow: isLoggedIn },
{ id: "mesLexiquesContainer", shouldShow: isLoggedIn },
];
elementsToShowOrHide.forEach(({ id, shouldShow }) => {
const element = document.getElementById(id);
if (element) {
element.style.display = shouldShow ? "block" : "none";
log(`Élément #${id} ${shouldShow ? "affiché" : "masqué"}.`);
} else {
console.warn(`️ Élément #${id} introuvable.`);
}
});
}
/**
* Affichage ou non le message de surlignage en fonction de l'état de connexion.
* @param {boolean} isLoggedIn - Indique si l'utilisateur est connecté.
*/
function toggleHighlightMessage(isLoggedIn) {
const highlightNote = document.getElementById("highlight-note");
if (highlightNote) {
highlightNote.style.display = isLoggedIn ? "block" : "none";
}
}
/**
* Met à jour l'état global de la barre latérale (bouton d'authentification, etc.)
*/
async function refreshSidebarState() {
log("Début de l'actualisation de la barre latérale...");
// Récupère le token d'authentification et détermine si l'utilisateur est connecté
const token = await getAuthTokenFromStorage();
const isLoggedIn = !!token;
// Met à jour l'état du bouton d'authentification et la visibilité des éléments
updateAuthButton(isLoggedIn);
toggleElementsVisibility(isLoggedIn);
toggleHighlightMessage(isLoggedIn);
// Vérifie si l'analyse est activée
const isAnalysisEnabled = await checkAnalysisStatus();
if (isLoggedIn) {
// Si l'utilisateur est connecté, gère l'affichage des blocs et récupère les lexiques
hideBlocks(!isAnalysisEnabled);
// Met à jour les couleurs des lexiques si ce n'est pas déjà fait
if (!window.lexiconColorsUpdated) {
await updateLexiconColors(authToken);
window.lexiconColorsUpdated = true;
}
await fetchLexicons();
} else {
// Si l'utilisateur n'est pas connecté, masque les blocs et affiche un message
hideBlocks(true);
const lexiquesContainer = document.getElementById("lexiques");
if (lexiquesContainer) {
lexiquesContainer.textContent = "Veuillez vous connecter pour voir vos lexiques.";
lexiquesContainer.style.textAlign = "center";
lexiquesContainer.style.fontStyle = "italic";
}
const lexiconResultElement = document.getElementById("lexiconResult");
if (lexiconResultElement) {
lexiconResultElement.innerHTML = "";
}
}
// Affiche un message d'activation de l'analyse selon le statut de connexion
const messageContainer = document.getElementById("messageContainer");
if (!isLoggedIn) {
if (messageContainer) {
messageContainer.style.display = "block";
messageContainer.innerHTML = "Veuillez vous connecter pour utiliser l'extension.";
}
} else if (!isAnalysisEnabled) {
if (messageContainer) {
messageContainer.style.display = "block";
messageContainer.innerHTML = "L'analyse est <strong>désactivée</strong>.<br>Pour utiliser l'extension, cliquez sur le bouton <strong>Activer l'analyse</strong> dans le menu d'extension.";
}
} else {
if (messageContainer) {
messageContainer.style.display = "none";
}
}
log("Barre latérale actualisée. Utilisateur connecté :", isLoggedIn);
}
// ─────────────────────────────────────────────────────────────────────────────
// ▌ Gestion des blocs (Affichage)
// ─────────────────────────────────────────────────────────────────────────────
/**
* Bascule l'affichage d'un bloc.
* @param {string} blockId - L'ID du conteneur à basculer.
* @param {HTMLElement} btn - Le bouton qui déclenche la bascule, pour mettre à jour son texte.
*/
function toggleBlock(blockId, btn) {
const block = document.getElementById(blockId);
if (block) {
if (block.classList.contains("hidden")) {
block.classList.remove("hidden");
if (btn) btn.textContent = "–";
} else {
block.classList.add("hidden");
if (btn) btn.textContent = "+";
}
}
}
/**
* Ouvre un bloc s'il est fermé et met à jour le bouton de bascule.
* @param {string} blockId - L'ID du conteneur à ouvrir.
* @param {HTMLElement} [btn] - (Optionnel) Le bouton de bascule à mettre à jour.
*/
function openBlock(blockId, btn) {
const block = document.getElementById(blockId);
if (block && block.classList.contains("hidden")) {
block.classList.remove("hidden");
if (btn) {
btn.textContent = "–";
} else {
const header = block.previousElementSibling;
if (header) {
const toggleBtn = header.querySelector(".toggle-btn");
if (toggleBtn) {
toggleBtn.textContent = "–";
}
}
}
}
}
/**
* Ferme un bloc s'il est ouvert et met à jour le bouton de bascule.
* @param {string} blockId - L'ID du conteneur à fermer.
* @param {HTMLElement} [btn] - (Optionnel) Le bouton de bascule à mettre à jour.
*/
function closeBlock(blockId, btn) {
const block = document.getElementById(blockId);
if (block && !block.classList.contains("hidden")) {
block.classList.add("hidden");
if (btn) {
btn.textContent = "+";
} else {
const header = block.previousElementSibling;
if (header) {
const toggleBtn = header.querySelector(".toggle-btn");
if (toggleBtn) {
toggleBtn.textContent = "+";
}
}
}
}
}
/**
* Masque ou affiche les blocs en fonction de l'état spécifié.
* @param {boolean} shouldHide - Indique si les blocs doivent être masqués.
*/
function hideBlocks(shouldHide) {
const blockIds = ["menu", "etat", "definitionContainer"];
blockIds.forEach(blockId => {
const block = document.getElementById(blockId);
if (block) {
if (shouldHide) {
block.classList.add("hidden");
} else {
block.classList.remove("hidden");
}
}
});
}
// ─────────────────────────────────────────────────────────────────────────────
// ▌ Gestion de l'affichage des lexiques et du surlignage
// ─────────────────────────────────────────────────────────────────────────────
/**
* Récupère les lexiques depuis l'API.
*/
async function fetchLexicons() {
try {
log("Début de la récupération des lexiques...");
log("Token utilisé :", authToken);
// Vérifie si le token d'authentification est disponible
if (!authToken) {
throw new Error("️ Aucun token disponible. Veuillez vous connecter.");
}
// Récupère les lexiques depuis l'API
const lexicons = await getLexicons(authToken);
log("Réponse brute de l'API :", lexicons);
// Vérifie si la réponse est un tableau et s'il contient des lexiques
if (!Array.isArray(lexicons) || lexicons.length === 0) {
throw new Error("️ Aucun lexique trouvé.");
}
// Vide la carte des lexiques existants
lexiconMap.clear();
lexicons.forEach((lex) => {
let lexiconName = "";
// Crée le nom du lexique en fonction de sa catégorie
if (lex.category === "User") {
lexiconName = DEBUG
? `Lexique personnel : ${lex.user?.pseudo || "Inconnu"} (${lex.id})`
: `Lexique personnel : ${lex.user?.pseudo || "Inconnu"}`;
if (lex.language) {
lexiconName += ` [${lex.language}]`;
}
} else if (lex.category === "Group") {
lexiconName = DEBUG
? `Lexique de groupe : ${lex.group?.name || "Inconnu"} (${lex.id})`
: `Lexique de groupe : ${lex.group?.name || "Inconnu"}`
} else {
lexiconName = DEBUG ? `Lexique : ${lex.id}` : "Lexique" ;
}
// Ajoute le lexique à la carte avec son ID comme clé
lexiconMap.set(lex.id, lexiconName);
});
// Affiche les lexiques avec des checkboxes
await displayLexiconsWithCheckbox(lexicons.map((lex) => ({
lexiconName:
lex.category === "User"
? DEBUG
? `Lexique personnel : ${lex.user?.pseudo || "Inconnu"} (${lex.id})${(lex.language) ? ` [${lex.language}]` : ""}`
: `Lexique personnel : ${lex.user?.pseudo || "Inconnu"}${(lex.language) ? ` [${lex.language}]` : ""}`
: DEBUG
? `Lexique de groupe : ${lex.group?.name || "Inconnu"} (${lex.id})${(lex.language) ? ` [${lex.language}]` : ""}`
: `Lexique de groupe : ${lex.group?.name || "Inconnu"}${(lex.language) ? ` [${lex.language}]` : ""}`,
lexiconId: lex.id,
active: lex.active || false,
})));
// Restaure l'état des boutons de surlignage
await restoreHighlightingState();
} catch (error) {
// Gère les erreurs lors du chargement des lexiques
log("Erreur lors du chargement des lexiques :", error.message);
const lexiquesContainer = document.getElementById("lexiques");
if (lexiquesContainer) {
lexiquesContainer.textContent = error.message || "Erreur lors du chargement des lexiques.";
}
}
}
/**
* Affiche la liste des lexiques avec des checkboxes dans la barre latérale.
* @param {Array} lexicons - Liste des lexiques à afficher.
*/
async function displayLexiconsWithCheckbox(lexicons) {
const lexiquesContainer = document.getElementById("lexiques");
// Vérifie si le conteneur des lexiques existe
if (!lexiquesContainer) {
console.warn("️ Élément #lexiques introuvable.");
return;
}
// Vide le conteneur avant d'afficher les nouveaux lexiques
lexiquesContainer.innerHTML = "";
// Vérifie si la liste des lexiques est vide
if (lexicons.length === 0) {
log("️ Aucun lexique à afficher.");
lexiquesContainer.textContent = "Aucun lexique disponible.";
return;
}
// Parcourt chaque lexique pour créer et afficher les éléments correspondants
for (const { lexiconName, lexiconId, active } of lexicons) {
// Vérifie si le lexique est déjà affiché
if (lexiquesContainer.querySelector(`div[data-lexicon-id="${lexiconId}"]`)) {
continue;
}
// Crée un conteneur pour le lexique
const lexiqueDiv = document.createElement("div");
lexiqueDiv.className = "lexique-item";
// Récupère la couleur associée au lexique et crée un cercle de couleur
const color = await getColorForLexicon(lexiconId);
const circleIcon = createColorCircle(color, 24);
// Crée un conteneur pour l'icône de couleur
const iconDiv = document.createElement("div");
iconDiv.className = "lexique-icon";
iconDiv.appendChild(circleIcon);
// Crée un élément pour le nom du lexique
const labelSpan = document.createElement("span");
labelSpan.className = "lexique-label";
labelSpan.textContent = lexiconName;
// Conteneur pour la checkbox (avec tooltip)
const checkboxContainer = document.createElement("label");
checkboxContainer.className = "tooltip-container lexique-checkbox-container";
const addCheckbox = document.createElement("input");
addCheckbox.type = "checkbox";
addCheckbox.className = "lexique-checkbox";
addCheckbox.dataset.lexiconId = lexiconId;
const checkboxTooltip = document.createElement("span");
checkboxTooltip.className = "tooltip";
checkboxTooltip.textContent = "Ajouter le mot à ce lexique";
checkboxContainer.appendChild(addCheckbox);
checkboxContainer.appendChild(checkboxTooltip);
// Conteneur pour le bouton de surlignage (avec tooltip)
const highlightButton = document.createElement("button");
highlightButton.className = "tooltip-container lexique-highlight-toggle";
if (active) {
highlightButton.classList.add('active');
}
highlightButton.dataset.lexiconId = lexiconId;
highlightButton.dataset.active = active ? "true" : "false";
const feutreIcon = document.createElement("img");
feutreIcon.src = "../assets/icons/feutre.png";
feutreIcon.alt = "Feutre";
feutreIcon.className = "feutre-icon";
const highlightTooltip = document.createElement("span");
highlightTooltip.className = "tooltip";
highlightTooltip.textContent = "Activer/Désactiver le surlignage des mots du lexique";
// Mise à jour du gestionnaire d'événements pour le bouton de surlignage
highlightButton.addEventListener("click", async () => {
let currentState = highlightButton.dataset.active === "true";
let newState = !currentState;
try {
await toggleLexiconHighlight(lexiconId, newState);
highlightButton.dataset.active = newState ? "true" : "false";
highlightButton.classList.toggle("active", newState);
// Sauvegarde l'état dans le stockage local
const activeLexicons = Array.from(document.querySelectorAll('.lexique-highlight-toggle[data-active="true"]'))
.map(btn => parseInt(btn.dataset.lexiconId));
await browser.storage.local.set({ activeLexicons });
} catch (error) {
log("Erreur lors du toggle de surlignage pour le lexique", lexiconId, ":", error);
}
});
// Ajoute les éléments au conteneur du lexique
highlightButton.appendChild(feutreIcon);
highlightButton.appendChild(highlightTooltip);
lexiqueDiv.appendChild(iconDiv);
lexiqueDiv.appendChild(labelSpan);
lexiqueDiv.appendChild(checkboxContainer);
lexiqueDiv.appendChild(highlightButton);
lexiquesContainer.appendChild(lexiqueDiv);
}
// Ajuste la position des tooltips après un court délai
setTimeout(() => {
const menu = document.getElementById("menu");
if (!menu) return;
const menuRect = menu.getBoundingClientRect();
const containers = document.querySelectorAll('.tooltip-container');
containers.forEach(container => {
const tooltip = container.querySelector('.tooltip');
if (!tooltip) return;
tooltip.style.left = '50%';
tooltip.style.transform = 'translateX(-50%) translateY(-5px)';
const tooltipRect = tooltip.getBoundingClientRect();
// Ajuste la position du tooltip si elle déborde du menu
if (tooltipRect.left < menuRect.left) {
const overflowLeft = menuRect.left - tooltipRect.left;
tooltip.style.transform = `translateX(calc(-100% + ${overflowLeft}px)) translateY(-5px)`;
} else if (tooltipRect.right > menuRect.right) {
const overflowRight = tooltipRect.right - menuRect.right;
tooltip.style.transform = `translateX(calc(-100% - ${overflowRight}px)) translateY(-5px)`;
}
});
}, 100);
}
/**
* Met à jour l'affichage des lexiques.
*/
async function updateLexiconsDisplay() {
const token = await getAuthTokenFromStorage();
if (!token) {
console.warn("️ Aucun token d'authentification disponible.");
return;
}
const lexicons = await getLexicons(token);
await displayLexiconsWithCheckbox(lexicons);
}
/**
* Restaure l'état des boutons de surlignage au chargement.
*/
async function restoreHighlightingState() {
try {
const { activeLexicons } = await browser.storage.local.get("activeLexicons");
if (activeLexicons && Array.isArray(activeLexicons)) {
const buttons = document.querySelectorAll('.lexique-highlight-toggle');
buttons.forEach(button => {
const lexiconId = parseInt(button.dataset.lexiconId);
const isActive = activeLexicons.includes(lexiconId);
button.dataset.active = isActive ? "true" : "false";
button.classList.toggle("active", isActive);
});
}
} catch (error) {
log("Erreur lors de la restauration de l'état des boutons:", error);
}
}
/**
* Initialise la boîte modale pour l'affichage des définitions.
*/
function initModal() {
log("initModal appelé");
const modalOverlay = document.getElementById("modalOverlay");
const modalFullText = document.getElementById("modalFullText");
const closeModalBtn = document.getElementById("closeModalBtn");
log("closeModalBtn =", closeModalBtn);
if (!modalOverlay || !modalFullText || !closeModalBtn) {
log("Les éléments modaux ne sont pas trouvés !");
return;
}
closeModalBtn.addEventListener("click", () => {
log("clic sur closeModalBtn !");
closeDefinitionPopup();
});
modalOverlay.addEventListener("click", (event) => {
if (event.target === modalOverlay) closeDefinitionPopup();
});
}
document.addEventListener("DOMContentLoaded", initModal);
/**
* Bascule l'état de surlignage d'un lexique.
* @param {number} lexiconId - L'ID du lexique à basculer.
* @param {boolean} isActive - Indique si le surlignage doit être activé ou désactivé.
*/
async function toggleLexiconHighlight(lexiconId, isActive) {
try {
const button = document.querySelector(`button[data-lexicon-id="${lexiconId}"]`);
if (button) {
button.dataset.active = isActive.toString();
button.classList.toggle('active', isActive);
}
await browser.tabs.query({ active: true, currentWindow: true }).then((tabs) => {
browser.tabs.sendMessage(tabs[0].id, {
command: isActive ? "activate-highlighting" : "deactivate-highlighting",
lexiconId: lexiconId
});
});
log(`Surlignage ${isActive ? 'activé' : 'désactivé'} pour le lexique ${lexiconId}`);
} catch (error) {
log(`Erreur lors du toggle du surlignage pour le lexique ${lexiconId}:`, error);
}
}
// ─────────────────────────────────────────────────────────────────────────────
// ▌ Ajout d'un mot au(x) lexique(s)
// ─────────────────────────────────────────────────────────────────────────────
/**
* Gère le clic sur le bouton d'ajout de mot.
* Vérifie le token et le mot sélectionné, puis ajoute le mot aux lexiques sélectionnés.
*/
async function handleAddWordClick() {
openBlock("menuContent");
// 1) Vérifier la présence du token et du mot
if (!authToken) {
console.warn("️Pas de token d'authentification : impossible d'ajouter le mot.");
return;
}
const selectedWordElement = document.getElementById("motSelectionne");
const lexiconResultElement = document.getElementById("lexiconResult");
// Vérifie si l'élément contenant le mot sélectionné existe
if (!selectedWordElement) {
console.warn("️Élément #motSelectionne introuvable.");
return;
}
// Récupère le mot sélectionné et le "nettoie"
const selectedWord = selectedWordElement.textContent.trim();
if (!selectedWord || selectedWord === "Aucun mot sélectionné") {
console.warn("️Aucun mot à ajouter.");
if (lexiconResultElement) lexiconResultElement.textContent = "Aucun mot à ajouter.";
return;
}
// 2) Récupérer les IDs des lexiques sélectionnés
const checkboxList = document.querySelectorAll("#lexiques .lexique-checkbox:checked");
const selectedLexiconIds = Array.from(checkboxList).map(cb => parseInt(cb.dataset.lexiconId, 10));
// Vérifie si au moins un lexique a été sélectionné
if (selectedLexiconIds.length === 0) {
console.warn("️Aucun lexique sélectionné.");
if (lexiconResultElement) lexiconResultElement.textContent = "Veuillez cocher au moins un lexique.";
return;
}
// 3) Vérifier si le mot existe déjà dans l'un des lexiques sélectionnés
let definitions = [];
try {
definitions = await fetchLexiconDefinitions(selectedWord);
} catch (error) {
log("Erreur lors de la récupération des définitions pour vérification :", error);
}
const existingLexiconIds = new Set();
// Vérifie si le mot existe déjà dans les lexiques sélectionnés
if (Array.isArray(definitions)) {
for (const def of definitions) {
if (selectedLexiconIds.includes(def.lexiconId)) {
existingLexiconIds.add(def.lexiconId);
}
}
}
// 4) Déterminer les lexiques où ajouter le mot
const lexiconsToAdd = selectedLexiconIds.filter(id => !existingLexiconIds.has(id));
// Si le mot existe déjà dans certains lexiques, on affiche le message
if (existingLexiconIds.size > 0) {
const existingLexiconsNames = Array.from(existingLexiconIds)
.map(id => lexiconMap.get(id) || id)
.join(", ");
if (lexiconResultElement) {
lexiconResultElement.innerHTML =
"Le mot <strong>" + selectedWord + "</strong> existe déjà dans le(s) lexique(s) : " +
"<strong>" + existingLexiconsNames + "</strong>.";
}
}
// Si aucun lexique n'est disponible pour ajouter le mot, on sort de la fonction
if (lexiconsToAdd.length === 0) {
return;
}
// Construction du message de succès avec les noms des lexiques où le mot va être ajouté
const lexiconsNames = lexiconsToAdd
.map(id => lexiconMap.get(id) || id)
.join(", ");
// 5) Envoi d'une seule requête pour tous les lexiques restants
try {
log(`Envoi de l'ajout du mot "${selectedWord}" dans les lexiques :`, lexiconsToAdd);
const result = await window.AddWord(authToken, selectedWord, lexiconsToAdd, false);
log("Réponse API :", result);
// Rafraîchir l'UI et la liste des entrées
await new Promise(resolve => setTimeout(resolve, 300));
browser.runtime.sendMessage({ action: "refreshUI" });
// 6) Affichage du message de succès
if (lexiconResultElement) {
lexiconResultElement.innerHTML +=
"<br>✅ Mot <strong>" + selectedWord + "</strong> ajouté avec succès dans : " +
lexiconsNames + ".";
}
} catch (error) {
log("Erreur lors de l'ajout du mot :", error);
if (lexiconResultElement) {
lexiconResultElement.textContent = "Erreur lors de l'ajout : " + error.message;
}
}
}
// ─────────────────────────────────────────────────────────────────────────────
// ▌ Réception des messages
// ─────────────────────────────────────────────────────────────────────────────
let refreshTimeout = null;
browser.runtime.onMessage.addListener(async (message) => {
log("Message reçu dans sidebar.js :", message);
// Vérifie si le message contient une action
if (message.action)
switch (message.action) {
case "refreshUI":
if (refreshTimeout) {
clearTimeout(refreshTimeout);
}
refreshTimeout = setTimeout(async () => {
await refreshSidebarState();
refreshTimeout = null;
}, 500);
break;
case "closeAllBlocks":
closeBlock("menuContent");
closeBlock("etatContent");
closeBlock("definitionContent");
break;
case "mot_selectionne":
// Gère le mot sélectionné
if (message.selectedText) {
log("️ Mot sélectionné :", message.selectedText);
const selectedWordElement = document.getElementById("motSelectionne");
if (selectedWordElement) {
selectedWordElement.textContent = message.selectedText;
} else {
console.warn("️ Élément #motSelectionne introuvable.");
}
const lexiconResultElement = document.getElementById("lexiconResult");
if (lexiconResultElement) {
lexiconResultElement.innerHTML = "";
}
openBlock("etatContent");
}
break;
case "getDefinition":
// Recherche des définitions pour le mot sélectionné
if (message.selectedText) {
log("Recherche des définitions pour :", message.selectedText);
openBlock("definitionContent");
await window.showDefinitions(message.selectedText);
}
break;
case "showDefinitions":
// Affiche les définitions reçues
if (Array.isArray(message.definitions)) {
window.displayDefinitions(message.definitions);
}
break;
case "fetchWiktionaryDefinitionResponse":
// Gère la réponse de définition du Wiktionnaire
if (message.selectedText) {
log(`Réception de la définition du Wiktionnaire pour '${message.selectedText}'`);
window.displayDefinitions(message.definitions);
}
break;
case "showLexiconResult":
// Affiche le résultat des lexiques reçus
log("Résultat des lexiques reçus :", message.lexicons);
window.displayLexiconResults(message.lexicons);
break;
case "addWordResult":
// Met à jour le résultat de l'ajout de mot
const lexiconResultElement = document.getElementById("lexiconResult");
if (lexiconResultElement) {
lexiconResultElement.innerHTML = message.lexicons;
}
break;
case "addToLexicon":
// Gère l'ajout d'un mot au lexique
handleAddWordClick();
break;
case "openLexiconBlock":
// Ouvre le bloc des lexiques
openBlock("menuContent");
break;
case "toggleAuth":
break;
case "authStatusChanged":
break;
case "updateUI":
// Met à jour l'interface utilisateur en fonction de l'état de l'extension
if (!message.extensionActive) {
hideBlocks(true);
} else {
hideBlocks(false);
await refreshSidebarState();
}
break;
case "pyodide-simplemma-ready":
return;
case "saveToken":
// Sauvegarde le token d'authentification
authToken = message.token;
break;
case "closeSidebarBlocks":
// Masque les blocs de la barre latérale
hideBlocks(true);
break;
}
// Vérifie si le message contient une commande
if (message.command) {
switch (message.command) {
case "activate-highlighting":
// Active le surlignage pour le lexique spécifié
const highlightButton = document.querySelector(`button[data-lexicon-id="${message.lexiconId}"]`);
if (highlightButton) {
highlightButton.dataset.active = "true";
highlightButton.classList.add("active");
}
break;
case "deactivate-highlighting":
// Désactive le surlignage pour le lexique spécifié
const highlightButtonOff = document.querySelector(`button[data-lexicon-id="${message.lexiconId}"]`);
if (highlightButtonOff) {
highlightButtonOff.dataset.active = "false";
highlightButtonOff.classList.remove("active");
}
break;
case "register-stats-script":
break;
case "register-highlighting-script":
// Enregistre le script de surlignage et met à jour le token d'authentification
log("Script de surlignage enregistré");
browser.runtime.sendMessage({
command: "updateAuthToken",
token: authToken
});
break;
case "updateAuthToken":
// Met à jour le token d'authentification
authToken = message.token;
window.authToken = message.token;
break;
default:
// Gère les actions inconnues
console.warn("️ Action inconnue reçue :", message.command);
}
}
});
// ─────────────────────────────────────────────────────────────────────────────
// ▌ DOMContentLoaded
// ─────────────────────────────────────────────────────────────────────────────
document.addEventListener("DOMContentLoaded", async () => {
log("DOM entièrement chargé. Initialisation de la sidebar.");
// Récupère le token d'authentification et l'assigne à l'objet window
authToken = await getAuthTokenFromStorage();
window.authToken = authToken;
// Actualise l'état de la barre latérale
await refreshSidebarState();
// Gère le clic sur le bouton d'authentification
const authButton = document.getElementById("auth-button");
if (authButton) {
authButton.addEventListener("click", handleAuthButtonClick);
}
// Gère le clic sur le bouton de recherche de définition
const chercherDefButton = document.querySelector("#chercherDef");
if (chercherDefButton) {
chercherDefButton.addEventListener("click", async () => {
openBlock("definitionContent");
const selectedWord = document.getElementById("motSelectionne")?.textContent?.trim();
if (selectedWord && selectedWord !== "Aucun mot sélectionné") {
log(`Recherche des définitions pour '${selectedWord}'`);
await window.showDefinitions(selectedWord);
} else {
console.warn("️Aucun mot sélectionné pour la recherche.");
}
});
log("Bouton #chercherDef détecté dans le DOM.");
chercherDefButton.style.pointerEvents = "auto";
chercherDefButton.style.display = "block";
chercherDefButton.style.visibility = "visible";
chercherDefButton.disabled = false;
} else {
log("ERREUR : Bouton #chercherDef introuvable.");
}
// Écouteur pour la case à cocher "toggle-definitions"
const toggleCheckbox = document.getElementById("toggle-definitions");
if (toggleCheckbox) {
toggleCheckbox.addEventListener("change", (event) => {
const showAll = event.target.checked;
const lexiconContents = document.querySelectorAll("#mesLexiquesList .lexicon-content");
lexiconContents.forEach(content => {
if (showAll) {
content.classList.remove("hidden");
} else {
content.classList.add("hidden");
}
});
});
}
// Gère le clic sur le bouton "Ajouter le mot sélectionné"
const addWordButton = document.getElementById("add-word-button");
if (addWordButton) {
addWordButton.addEventListener("click", handleAddWordClick);
} else {
console.warn("️ Bouton #add-word-button introuvable dans le DOM.");
}
// Gère les boutons de bascule pour afficher/masquer les blocs
const toggleButtons = document.querySelectorAll(".toggle-btn");
toggleButtons.forEach((btn) => {
if (!btn.textContent.trim()) {
btn.textContent = "-";
btn.style.fontSize = "15px";
}
btn.addEventListener("click", (event) => {
event.stopPropagation();
const header = btn.parentElement;
const content = header.nextElementSibling;
if (content) {
content.classList.toggle("hidden");
btn.textContent = content.classList.contains("hidden") ? "+" : "–";
}
});
// Masque tous les blocs au chargement
document.querySelectorAll('.block-content').forEach(block => {
block.classList.add('hidden');
});
// Réinitialise les boutons de bascule
document.querySelectorAll('.toggle-btn').forEach(btn => {
btn.textContent = '+';
btn.style.fontSize = '15px';
btn.addEventListener('click', (event) => {
event.stopPropagation();
const header = btn.parentElement;
const content = header.nextElementSibling;
if (content) {
content.classList.toggle('hidden');
btn.textContent = content.classList.contains('hidden') ? '+' : '–';
}
});
});
});
});
// Gère les clics sur les boutons de bascule
document.querySelectorAll('.toggle-btn').forEach(btn => {
btn.addEventListener('click', function() {
const blockContent = this.parentElement.nextElementSibling;
if (blockContent.classList.contains('hidden')) {
blockContent.classList.remove('hidden');
this.textContent = '–';
} else {
blockContent.classList.add('hidden');
this.textContent = '+';
}
});
});