diff --git a/src/background/background.js b/src/background/background.js index 65ce6f0f30bbd97b902b68b9586eb754cba8b5c8..cd3d0126e50b61e76c825b31e464ed2f9e77e2e9 100644 --- a/src/background/background.js +++ b/src/background/background.js @@ -347,6 +347,10 @@ function initWorker() { } } +function handleWorkerError(error) { + console.error("Erreur du WebWorker :", error.message); +} + function handleWorkerMessage(event) { const data = event.data; console.log("[Background] Message du WebWorker :", data); @@ -357,6 +361,10 @@ function handleWorkerMessage(event) { console.log("[Background] Pyodide et Simplemma prêts. Mise à jour de l'état."); browser.storage.local.set({ pyodideSimplemmaReady: true }); checkAndUpdateTracking(); + } else if (data.status === "error") { + console.error("[Background] Erreur lors du chargement :", data.message); + } else if (data.status === "already_loaded") { + console.log("[Background] Pyodide et Simplemma déjà chargés."); } break; case "update-frequencies": @@ -376,10 +384,6 @@ function handleWorkerMessage(event) { } } -function handleWorkerError(error) { - console.error("[Background] Erreur dans le WebWorker :", error); -} - // Initialisation du worker dès le démarrage initWorker(); @@ -411,6 +415,7 @@ browser.runtime.onMessage.addListener(async (message, sender, sendResponse) => { return true; }); + // ───────────────────────────────────────────────────────────────────────────── // Chargement et sauvegarde des fréquences stockées // ───────────────────────────────────────────────────────────────────────────── @@ -538,8 +543,3 @@ function sendStoplistToWorker() { browser.runtime.onStartup.addListener(loadStoplist); browser.runtime.onInstalled.addListener(loadStoplist); -// ───────────────────────────────────────────────────────────────────────────── -// (Code commenté concernant l'activation/désactivation de l'analyse) -// ───────────────────────────────────────────────────────────────────────────── -// async function initializeExtensionState() { ... } -// initializeExtensionState(); diff --git a/src/popup/popup.html b/src/popup/popup.html index b9c17fddfb04dec8a1da18f3cc299c4e0bf35c65..33f6c8c372b71e04963be5910ffe3c16baef763c 100644 --- a/src/popup/popup.html +++ b/src/popup/popup.html @@ -348,9 +348,10 @@ <button id="toggleExtensionBtn">Activer/Désactiver</button> <button id="toggleStatsBtn">Statistiques</button> <button id="open-stats">Afficher les statistiques</button> + <div id="pyodide-loading"></div> <div id="stats-options" class="option-container"> - <div class="option-row auto-add-row"> + <div id="auto-add-container" class="option-row auto-add-row"> <span>Ajout automatique</span> <label class="toggle-switch"> <input type="checkbox" id="auto-add"> diff --git a/src/popup/popup.js b/src/popup/popup.js index 8ccc3fc7a8c0bfe94054880a340beec952ca25bf..ddbec903c1aa28ababcb6b3150e05768a3fdc695 100644 --- a/src/popup/popup.js +++ b/src/popup/popup.js @@ -46,12 +46,9 @@ async function updateLanguageSelection() { return; } - // Utilisation de la fonction de récupération de lexiques - // Choisissez ici entre getLexicons et getUserLexicons en fonction de votre implémentation const lexicons = await getLexicons(accessToken); const userLanguages = [...new Set(lexicons.map(lex => lex.language))]; - // Récupérer les langues suivies depuis le stockage const { trackedLanguages } = await browser.storage.local.get("trackedLanguages") || { trackedLanguages: [] }; languageSelection.innerHTML = ""; @@ -84,6 +81,11 @@ async function updateOptionsUI() { const accessToken = await getAccessToken(); const isLoggedIn = !!accessToken; const statsOptions = document.getElementById("stats-options"); + + if (statsOptions) { + statsOptions.style.display = isLoggedIn ? "block" : "none"; + } + const autoAddContainer = document.getElementById("auto-add")?.parentElement; const autoAddCheckbox = document.getElementById("auto-add"); const autoAddOptions = document.getElementById("auto-add-options"); @@ -92,10 +94,10 @@ async function updateOptionsUI() { const toggleStatsBtn = document.getElementById("toggleStatsBtn"); const openStats = document.getElementById("open-stats"); - // Affichage de l'option "Ajout automatique" selon la connexion - if (autoAddContainer) { - autoAddContainer.style.display = isLoggedIn ? "block" : "none"; - } + // // Affichage de l'option "Ajout automatique" selon la connexion + // if (autoAddContainer) { + // autoAddContainer.style.display = isLoggedIn ? "block" : "none"; + // } // Chargement des préférences const { isTrackingActive, autoAdd, threshold } = await browser.storage.local.get([ @@ -210,6 +212,23 @@ async function proceedToggleExtension() { await updateOptionsUI(); } +async function displayLoadingMessage() { + const statusContainer = document.getElementById('pyodide-loading'); + if (!statusContainer) return; + + const { pyodideSimplemmaReady } = await browser.storage.local.get("pyodideSimplemmaReady"); + const accessToken = await getAccessToken(); + + if (!accessToken) { + statusContainer.innerHTML = ""; + } else if (!pyodideSimplemmaReady) { + statusContainer.innerHTML = "<p style='color: gray; text-align: center; font-size: 10px;'>Activation en cours, veuillez patienter...</p>"; + } else { + statusContainer.innerHTML = ""; + } +} + + // ========================== // Écouteurs d'événements // ========================== @@ -220,6 +239,18 @@ document.addEventListener("DOMContentLoaded", async () => { await updateExtensionToggleButton(); }); +document.addEventListener("DOMContentLoaded", () => { + displayLoadingMessage(); + const loadingCheck = setInterval(async () => { + await displayLoadingMessage(); + const { pyodideSimplemmaReady } = await browser.storage.local.get("pyodideSimplemmaReady"); + if (pyodideSimplemmaReady) { + clearInterval(loadingCheck); + } + }, 500); +}); + + // Gestion des statistiques et options document.getElementById("toggleStatsBtn")?.addEventListener("click", async () => { const accessToken = await getAccessToken(); @@ -229,7 +260,6 @@ document.getElementById("toggleStatsBtn")?.addEventListener("click", async () => const newState = !current.isTrackingActive; await browser.storage.local.set({ isTrackingActive: newState }); - // Si désactivation, désactiver aussi l'ajout automatique if (!newState) { await browser.storage.local.set({ autoAdd: false }); document.getElementById("auto-add").checked = false; @@ -240,11 +270,9 @@ document.getElementById("toggleStatsBtn")?.addEventListener("click", async () => document.getElementById("toggleStatsBtn").textContent = newState ? "Désactiver les statistiques" : "Activer les statistiques"; document.getElementById("stats-options").classList.toggle("hidden", !newState); - // Envoi du message au background pour le changement de tracking browser.runtime.sendMessage({ command: "toggle-stats", isActive: newState }); if (newState) { log("[Popup] Demande d'initialisation de Pyodide et Simplemma"); - // Garder la commande de file 2 pour l'initialisation de Pyodide/Simplemma browser.runtime.sendMessage({ command: "pyodide-simplemma" }); } }); @@ -298,10 +326,8 @@ browser.runtime.onMessage.addListener(async (message) => { await updateConnectionButton(); await updateOptionsUI(); await updateLanguageSelection(); - // Possibilité de mettre à jour d'autres éléments via le message - } else if (message.action === "showNotification") { - // Gestion des notifications si besoin - showNotification(message.text); + } else if (message.action === "notify") { + alert(message.message); } }); @@ -331,3 +357,16 @@ function showNotification(message) { console.error("⌠Impossible d'afficher la notification : élément manquant."); } } + +function handleWorkerMessage(event) { + const data = event.data; + console.log("[Background] Message du WebWorker :", data); + + if (data.type === "process-text" && data.status === "error") { + browser.runtime.sendMessage({ + action: "notify", + message: data.message + }); + return; + } +} diff --git a/src/sidebar/sidebar.js b/src/sidebar/sidebar.js index 48b3e3727a3cf018be35202c364e8ee385c09c1f..fb257195746d627e04290543a4f93b08718f2e1e 100644 --- a/src/sidebar/sidebar.js +++ b/src/sidebar/sidebar.js @@ -46,8 +46,6 @@ function updateAuthButton(isLoggedIn) { } } - - function toggleElementsVisibility(isLoggedIn) { const elementsToShowOrHide = [ { id: "add-to-lexiques", shouldShow: isLoggedIn }, @@ -578,7 +576,6 @@ browser.runtime.onMessage.addListener(async (message) => { // ───────────────────────────────────────────────────────────────────────────── document.addEventListener("DOMContentLoaded", async () => { log("📦 DOM entièrement chargé. Initialisation de la sidebar."); - authToken = await getAuthTokenFromStorage(); window.authToken = authToken; await refreshSidebarState(); diff --git a/src/utils/stats.js b/src/utils/stats.js index 213f34a91d1b8f59401d25c0ccf9f5481fa0c672..c03c4a1077084b3ec238dee7c5e705b734c2bbb4 100644 --- a/src/utils/stats.js +++ b/src/utils/stats.js @@ -111,25 +111,12 @@ if (!readContent.has(text)) { startReadingTimer(element, text, minReadTime); } - highlightElement(element, true); } else { stopReadingTimer(element, text); - highlightElement(element, false); } }); } - /** - * Ajoute une bordure rouge autour de l'élément - */ - function highlightElement(element, shouldHighlight) { - if (shouldHighlight) { - element.style.outline = "3px solid red"; - } else { - element.style.outline = ""; - removeReadingIndicator(element); - } - } /** * Démarre un chronomètre pour vérifier si l'élément est lu diff --git a/src/workers/pyodide_worker.js b/src/workers/pyodide_worker.js index ca68c90ce2c935777186b5aad206ba938485ca45..29f199caabc4566fe2eef1df19e657eb4a8184f8 100644 --- a/src/workers/pyodide_worker.js +++ b/src/workers/pyodide_worker.js @@ -30,16 +30,16 @@ self.onmessage = async (event) => { if (!pyodideLoaded) { console.log("[Worker] Chargement de Pyodide..."); try { - importScripts(`${LATEST_BASE_URL}pyodide.js`); + importScripts(`${LATEST_BASE_URL}pyodide.js`); + pyodide = await loadPyodide({ indexURL: LATEST_BASE_URL }); + await pyodide.loadPackage("lzma"); + await pyodide.loadPackage("micropip"); + pyodideLoaded = true; } catch (err) { console.error("[Worker] Erreur lors de l'import de pyodide.js :", err); self.postMessage({ type: "pyodide-simplemma", status: "error", message: err.toString() }); return; } - pyodide = await loadPyodide({ indexURL: LATEST_BASE_URL }); - await pyodide.loadPackage("lzma"); - await pyodide.loadPackage("micropip"); - pyodideLoaded = true; console.log("[Worker] Pyodide chargé avec succès !"); } @@ -83,9 +83,10 @@ await main() // --- Traitement du texte envoyé par stats.js --- if (data.command === "process-text") { - if (!pyodideLoaded) { + if (!pyodideLoaded || !simplemmaLoaded) { + const errorMessage = "Les statistiques ne sont pas encore activées. Veuillez patienter..." console.log("[Worker] Pyodide non chargé."); - self.postMessage({ type: "process-text", status: "error", message: "Pyodide pas encore chargé" }); + self.postMessage({ type: "process-text", status: "error", message: errorMessage }); return; } console.log("[Worker] Texte reçu pour analyse :", data.text);