diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 6f9fa42a..304a4e50 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1379,6 +1379,14 @@ "message": "Spam Value", "description": "" }, + "Spam": { + "message": "Spam", + "description": "" + }, + "Valid": { + "message": "Valid", + "description": "" + }, "Moved_to_Spam": { "message": "Moved to Spam", "description": "" diff --git a/js/mzta-compose-script.js b/js/mzta-compose-script.js index 972a32de..3d74322e 100644 --- a/js/mzta-compose-script.js +++ b/js/mzta-compose-script.js @@ -617,9 +617,48 @@ switch (message.command) { break; + case "showSpamReport": + const data = message.data; + if(document.getElementById('mzta-spam-report-banner')) return Promise.resolve(true); + + const container = document.createElement('div'); + container.id = 'mzta-spam-report-banner'; + + const isDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; + + let bgColor = '#f8f9fa'; + let textColor = '#333'; + let borderColor = '#ccc'; + + if (data.spamValue < (data.SpamThreshold || 50)) { + bgColor = isDark ? '#5a1a1a' : '#ffe6e6'; + textColor = isDark ? '#ffcccc' : '#cc0000'; + borderColor = '#cc0000'; + } else { + bgColor = isDark ? '#1a401a' : '#e6ffe6'; + textColor = isDark ? '#ccffcc' : '#006600'; + borderColor = '#006600'; + } + + container.style.cssText = `background-color: ${bgColor}; color: ${textColor}; border-bottom: 1px solid ${borderColor}; padding: 8px 12px; font-family: system-ui, -apple-system, sans-serif; font-size: 13px; display: flex; align-items: center; gap: 15px; width: 100%; box-sizing: border-box;`; + + const scoreText = document.createElement('strong'); + scoreText.textContent = ((data.spamValue < (data.SpamThreshold || 50)) ? browser.i18n.getMessage("Spam") : browser.i18n.getMessage("Valid")) + " [" + data.spamValue + "/100]"; + + const reasonText = document.createElement('span'); + reasonText.textContent = browser.i18n.getMessage("Explanation") + ": " + data.explanation; + + container.appendChild(scoreText); + container.appendChild(reasonText); + + document.body.insertBefore(container, document.body.firstChild); + return Promise.resolve(true); + default: // do nothing return Promise.resolve(false); break; } -}); \ No newline at end of file +}); + +browser.runtime.sendMessage({ command: "checkSpamReport" }); \ No newline at end of file diff --git a/mzta-background.js b/mzta-background.js index 5fee2dd6..886f7384 100644 --- a/mzta-background.js +++ b/mzta-background.js @@ -358,6 +358,22 @@ messenger.runtime.onMessage.addListener((message, sender, sendResponse) => { case 'api_send_custom_text': browser.tabs.sendMessage(message.tabId, { command: "api_send_custom_text", custom_text: message.custom_text }); break; + case 'checkSpamReport': + async function _checkSpamReport(tabId) { + try { + if (sender.tab.type !== 'messageDisplay' && sender.tab.type !== 'mail') return; + let message = await browser.messageDisplay.getDisplayedMessage(tabId); + if (!message) return; + let report = await taSpamReport.loadReportData(message.headerMessageId); + if (report) { + browser.tabs.sendMessage(tabId, { command: "showSpamReport", data: report }); + } + } catch (e) { + taLog.error("Error in checkSpamReport: " + e); + } + } + _checkSpamReport(sender.tab.id); + break; default: break; }