From 51aa70685678d203366aa01c420ad575a13a8627 Mon Sep 17 00:00:00 2001 From: Dicken Date: Thu, 9 Jul 2026 10:03:46 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20K=C3=B6Pi=20-=20OfferCard=20Layout,=20Bi?= =?UTF-8?q?lder=20sequenziell,=20Badge=20Position?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/tools/koepi/routes.js | 5 +- frontend/src/tools/koepi.jsx | 143 +++++++++++++----------------- 2 files changed, 66 insertions(+), 82 deletions(-) diff --git a/backend/src/tools/koepi/routes.js b/backend/src/tools/koepi/routes.js index 9aa4348..577ad14 100644 --- a/backend/src/tools/koepi/routes.js +++ b/backend/src/tools/koepi/routes.js @@ -93,7 +93,8 @@ async function scrapeMarktguru() { const cookies = await page.cookies('https://cdn.marktguru.de'); const cookieStr = cookies.map(c => `${c.name}=${c.value}`).join('; '); - await Promise.all(offers.map(offer => new Promise(resolve => { + // Sequenziell laden damit Cookie-Session stabil bleibt + for (const offer of offers) { await new Promise(resolve => { if (!offer.image || !offer.image.startsWith('https://')) return resolve(); const req = require('https').get(offer.image, { headers: { @@ -114,7 +115,7 @@ async function scrapeMarktguru() { }); req.on('error', () => { offer.image = null; resolve(); }); req.setTimeout(8000, () => { req.destroy(); offer.image = null; resolve(); }); - }))); + }); } // Filtern auf Ziel-Händler + nur König Pilsener const filtered = offers.filter(o => { diff --git a/frontend/src/tools/koepi.jsx b/frontend/src/tools/koepi.jsx index e28b962..168436f 100644 --- a/frontend/src/tools/koepi.jsx +++ b/frontend/src/tools/koepi.jsx @@ -30,81 +30,68 @@ function OfferCard({ offer }) { const color = publisherColor(offer.retailer); return (
- {/* Produktbild */} - {offer.image && ( -
- König Pilsener { e.target.parentElement.style.display='none'; }} - /> - {offer.oldPrice && ( -
- -29% -
- )} + {/* Oben: Bild links + Info rechts */} +
+ {/* Bild */} +
+ {offer.image + ? König Pilsener { e.target.parentElement.style.background='transparent'; e.target.style.display='none'; }} + /> + : 🍺 + }
- )} - -
- {/* Händler Badge + Adresse */} -
-
{offer.retailer}
+ {/* Info */} +
+
+ {offer.retailer} + {offer.oldPrice && -29%} +
{offer.address && ( -
+
📍 {offer.address}
)} -
- - {/* König Pilsener */} -
- König Pilsener -
- - {/* Flaschengröße/Beschreibung */} - {offer.description && ( -
- {offer.description} +
+ König Pilsener
- )} + {offer.description && ( +
+ {offer.description} +
+ )} +
+
- {/* Preis */} -
- - {offer.price} + {/* Preis */} +
+ + {offer.price} + + {offer.oldPrice && ( + + {offer.oldPrice} - {offer.oldPrice && ( - - {offer.oldPrice} - - )} -
+ )} +
- {/* Gültigkeit */} -
- {offer.validity && ( -
- ⏰ {offer.validity} -
- )} - {offer.dateRange && ( -
- 📅 Gültig: {offer.dateRange} -
- )} -
+ {/* Gültigkeit */} +
+ {offer.validity && ( + ⏰ {offer.validity} + )} + {offer.dateRange && ( + 📅 {offer.dateRange} + )}
); @@ -121,23 +108,19 @@ function ProspektCard({ b }) { ...S.card, padding:0, overflow:'hidden', cursor:'pointer', border: expiring ? '1px solid rgba(239,68,68,0.4)' : '1px solid rgba(255,255,255,0.08)', }}> -
- {b.image && ( - {b.title} { e.target.style.display='none'; }} - /> - )} - {expiring && ( -
- ENDET BALD -
- )} -
+ {b.image && ( + {b.title} { e.target.style.display='none'; }} + /> + )}
-
- {b.publisher} +
+
+ {b.publisher} +
+ {expiring && ENDET BALD}
{b.title}