import { useState, useEffect } from 'react'; import { api, S } from '../lib.js'; const GOLD = '#f59e0b'; function getMyRole() { try { return JSON.parse(atob(localStorage.getItem('sk_token').split('.')[1])).role; } catch { return null; } } function fmtDate(str) { if (!str) return null; try { return new Date(str).toLocaleDateString('de-DE', { day:'2-digit', month:'2-digit', year:'numeric' }); } catch { return str; } } function publisherColor(name) { if (!name) return '#555'; const n = name.toLowerCase(); if (n.includes('rewe')) return '#e2001a'; if (n.includes('edeka')) return '#e8a800'; if (n.includes('e center')) return '#e8a800'; if (n.includes('netto')) return '#0057a8'; if (n.includes('trinkgut')) return '#e87722'; if (n.includes('penny')) return '#e2001a'; if (n.includes('aldi')) return '#00538f'; if (n.includes('lidl')) return '#f5c900'; if (n.includes('hit')) return '#e2001a'; if (n.includes('alldrink')) return '#2ecc71'; if (n.includes('getränke')) return '#3498db'; return '#666'; } // ── Prospekt-Angebot Karte ──────────────────────────────────────────────────── function BrochureOfferCard({ offer }) { const color = publisherColor(offer.store); return (
{/* Prospektseite als Bild */} {offer.productImage && (
{`König { e.target.style.display='none'; }} /> {offer.isNew && ( NEU )}
)}
{/* Händler + Logo */}
{offer.publisherLogo && ( {offer.store} { e.target.style.display='none'; }} /> )} {offer.store}
{/* Prospekttitel + Seite */} {offer.title && (
📄 „{offer.title}" {offer.page && Seite {offer.page}}
)} {/* Gültigkeit */} {offer.validity && (
🕐 {offer.validity}
)} {offer.dateRange && (
{offer.dateRange}
)}
); } // ── Grid-Angebot Karte (mit Preis) ──────────────────────────────────────────── function GridOfferCard({ offer }) { const color = publisherColor(offer.store); return (
{offer.image && (
{offer.name} { e.target.parentElement.style.display='none'; }} />
)}
{offer.brand && (
{offer.brand}
)}
{offer.name}
{offer.price && (
{offer.price}
)} {offer.baseUnit && (
{offer.baseUnit}
)} {offer.store && (
{offer.store}
)}
); } // ── Prospekt-Karte (shelf) ──────────────────────────────────────────────────── function ProspektCard({ b }) { const color = publisherColor(b.publisher); const expiring = b.badges?.includes('expiring_soon'); const fresh = b.badges?.includes('new'); return (
{b.image && ( {b.title} { e.target.style.display='none'; }} /> )}
{fresh && NEU} {expiring && ENDET BALD}
{b.publisher}
{b.title}
📍 {b.store}{b.city && b.store !== b.city ? ` · ${b.city}` : ''}
{b.street &&
{b.street}
} {(b.validFrom || b.validTo) && (
{b.validFrom && `Ab ${fmtDate(b.validFrom)}`}{b.validFrom && b.validTo && ' · '}{b.validTo && `Bis ${fmtDate(b.validTo)}`}
)}
); } // ── Hauptkomponente ─────────────────────────────────────────────────────────── export default function Koepi({ toast }) { const [tab, setTab] = useState('angebote'); const [offers, setOffers] = useState(null); const [prospekte, setProspekte] = useState(null); const [loading, setLoading] = useState(false); const [showAll, setShowAll] = useState(false); const isAdmin = getMyRole() === 'admin'; const loadOffers = async () => { if (offers) return; setLoading(true); try { setOffers(await api('/tools/koepi/offers')); } catch(e) { toast?.(e.message || 'Fehler', 'error'); } finally { setLoading(false); } }; const loadProspekte = async () => { if (prospekte) return; setLoading(true); try { setProspekte(await api('/tools/koepi/prospekte')); } catch(e) { toast?.(e.message || 'Fehler', 'error'); } finally { setLoading(false); } }; useEffect(() => { if (tab === 'angebote') loadOffers(); else loadProspekte(); }, [tab]); const clearCache = async () => { try { await api('/tools/koepi/clear-cache', { body:{} }); setOffers(null); setProspekte(null); toast('Cache geleert'); if (tab === 'angebote') { setLoading(true); setOffers(await api('/tools/koepi/offers')); setLoading(false); } else { setLoading(true); setProspekte(await api('/tools/koepi/prospekte')); setLoading(false); } } catch(e) { toast?.(e.message, 'error'); } }; return (

🍺 KÖPI — König Pilsener Angebote

{isAdmin && ( )}
Raum Duisburg/Essen/Düsseldorf · Quelle: kaufDA.de · Cache 1h
{/* Tabs */}
{[['angebote','🍺 Angebote'],['prospekte','📋 Alle Prospekte']].map(([t, label]) => ( ))}
{loading && (
⏳ Lade Angebote… (kann bis zu 15 Sekunden dauern)
)} {/* Angebote Tab */} {!loading && tab === 'angebote' && offers && (
{/* Grid-Angebote mit Preisen */} {offers.gridOffers?.length > 0 && ( <>
AKTUELLE ANGEBOTE MIT PREIS ({offers.gridOffers.length})
{offers.gridOffers.map((o, i) => )}
)} {/* BrochureBox: Prospektseiten mit KöPi */} {offers.brochureOffers?.length > 0 && ( <>
KÖNIG PILSENER IN DIESEN PROSPEKTEN ({offers.brochureOffers.length})
{offers.brochureOffers.map((o, i) => )}
)} {!offers.gridOffers?.length && !offers.brochureOffers?.length && (
Aktuell keine König Pilsener Angebote gefunden.
)}
→ Alle Angebote auf kaufDA.de
)} {/* Prospekte Tab */} {!loading && tab === 'prospekte' && prospekte && (
{prospekte.targeted?.length > 0 && ( <>
REWE · EDEKA · NETTO · TRINKGUT & mehr ({prospekte.targeted.length})
{prospekte.targeted.map(b => )}
)} {prospekte.others?.length > 0 && ( <> {showAll && (
{prospekte.others.map(b => )}
)} )} {!prospekte.targeted?.length && !prospekte.others?.length && (
Keine Prospekte gefunden.
)}
)}
); }