From d44be3b0296c4e96f0fe171d2c4ca06c8b071151 Mon Sep 17 00:00:00 2001 From: Zan <62830223+Zan1456@users.noreply.github.com> Date: Thu, 15 Jan 2026 17:56:40 +0100 Subject: [PATCH] Message attachments --- messages/messages.css | 8 ++--- messages/messages.js | 35 ++++++++++++++++-- tools/background.js | 83 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 118 insertions(+), 8 deletions(-) diff --git a/messages/messages.css b/messages/messages.css index 507f336..6576795 100644 --- a/messages/messages.css +++ b/messages/messages.css @@ -525,7 +525,7 @@ body.modal-open { } .message-info { - background-color: var(--card-card); + background-color: var(--button-secondaryFill); padding: 15px; border-radius: 6px; margin-bottom: 20px; @@ -564,7 +564,7 @@ body.modal-open { } .message-text { - background-color: var(--card-card); + background-color: var(--button-secondaryFill); border-radius: 6px; padding: 15px; line-height: 1.6; @@ -591,14 +591,14 @@ body.modal-open { } .message-attachments { - background: #f9f9f9; + background: var(--button-secondaryFill); padding: 15px; border-radius: 6px; } .message-attachments h4 { margin: 0 0 10px 0; - color: #333; + color: var(--text-secondary); font-size: 1.1em; } diff --git a/messages/messages.js b/messages/messages.js index 3cde600..158a2f1 100644 --- a/messages/messages.js +++ b/messages/messages.js @@ -321,14 +321,17 @@ const attachTitle = document.createElement('h4'); attachTitle.textContent = 'Mellékletek:'; messageAttachments.appendChild(attachTitle); - + const attachList = document.createElement('ul'); message.csatolmanyok.forEach(attachment => { const li = document.createElement('li'); const a = document.createElement('a'); a.href = '#'; - a.textContent = sanitizeHTML(attachment.nev); - a.onclick = () => downloadAttachment(attachment.azonosito); + a.textContent = sanitizeHTML(attachment.fajlNev || attachment.nev || 'Ismeretlen fájl'); + a.onclick = (e) => { + e.preventDefault(); + downloadAttachment(attachment.azonosito, attachment.fajlNev || attachment.nev); + }; li.appendChild(a); attachList.appendChild(li); }); @@ -346,6 +349,32 @@ } document.body.classList.remove('modal-open'); } + + async function downloadAttachment(azonosito, fileName) { + try { + const response = await chrome.runtime.sendMessage({ + action: 'download_attachment', + azonosito: azonosito, + fileName: fileName + }); + + if (response.success && response.data) { + const a = document.createElement('a'); + a.href = response.data; + a.download = response.fileName || 'letoltes'; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + } else { + console.error('Melléklet letöltési hiba:', response.error); + alert('Nem sikerült letölteni a mellékletet.'); + } + } catch (error) { + console.error('Melléklet letöltési hiba:', error); + alert('Hiba történt a melléklet letöltése során.'); + } + } + window.openMessageModal = openMessageModal; window.closeMessageModal = closeMessageModal; diff --git a/tools/background.js b/tools/background.js index 370fbd1..acddd8c 100644 --- a/tools/background.js +++ b/tools/background.js @@ -34,6 +34,11 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { sendResponse({ success: true }); break; + case 'download_attachment': + const downloadResult = await handleDownloadAttachment(request.azonosito, request.fileName); + sendResponse(downloadResult); + break; + default: console.warn('[Background] Unknown action:', request.action); sendResponse({ success: false, error: 'Unknown action' }); @@ -79,7 +84,7 @@ async function handleStorageClear() { try { const allData = await chrome.storage.sync.get(null); const firkaKeys = Object.keys(allData).filter(key => key.startsWith('firka_')); - + if (firkaKeys.length > 0) { await chrome.storage.sync.remove(firkaKeys); } @@ -89,6 +94,82 @@ async function handleStorageClear() { } } +async function handleDownloadAttachment(azonosito, fileName) { + try { + const apiUrl = `https://eugyintezes.e-kreta.hu/api/v1/dokumentumok/uzenetek/${azonosito}`; + + const redirectResponse = await fetch(apiUrl, { + method: 'GET', + credentials: 'include', + headers: { + 'Accept': 'application/json, text/plain, */*', + 'x-csrf': '1', + 'x-uzenet-json-formatum': 'CamelCase', + 'x-uzenet-lokalizacio': 'hu-HU', + 'x-uzenet-verzio-szam': '1.2.3' + }, + redirect: 'manual' + }); + + let fileUrl; + if (redirectResponse.type === 'opaqueredirect' || redirectResponse.status === 0) { + const followResponse = await fetch(apiUrl, { + method: 'GET', + credentials: 'include', + headers: { + 'Accept': 'application/json, text/plain, */*', + 'x-csrf': '1', + 'x-uzenet-json-formatum': 'CamelCase', + 'x-uzenet-lokalizacio': 'hu-HU', + 'x-uzenet-verzio-szam': '1.2.3' + }, + redirect: 'follow' + }); + + if (followResponse.ok) { + const blob = await followResponse.blob(); + const base64 = await blobToBase64(blob); + return { success: true, data: base64, fileName: fileName }; + } + } else if (redirectResponse.status === 302 || redirectResponse.status === 301) { + fileUrl = redirectResponse.headers.get('location'); + } + + if (fileUrl) { + const fileResponse = await fetch(fileUrl, { + method: 'GET', + headers: { + 'Accept': 'application/json, text/plain, */*', + 'x-csrf': '1', + 'x-uzenet-json-formatum': 'CamelCase', + 'x-uzenet-lokalizacio': 'hu-HU', + 'x-uzenet-verzio-szam': '1.2.3' + } + }); + + if (fileResponse.ok) { + const blob = await fileResponse.blob(); + const base64 = await blobToBase64(blob); + return { success: true, data: base64, fileName: fileName }; + } + } + + return { success: false, error: 'Nem sikerült letölteni a mellékletet.' }; + } catch (error) { + console.error('[Background] Attachment download error:', error); + return { success: false, error: error.message }; + } +} + +function blobToBase64(blob) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onloadend = () => resolve(reader.result); + reader.onerror = reject; + reader.readAsDataURL(blob); + }); +} + chrome.storage.onChanged.addListener((changes, namespace) => { if (namespace === 'sync') { const firkaChanges = Object.keys(changes).filter(key => key.startsWith('firka_'));