/* Kundenansicht neu: Widerrufsstreifen. Läuft eine Widerrufsfrist, steht über der Leiste ein schmaler Streifen „Widerrufsfrist bis TT.MM. · Widerrufen“. Er ist nicht wegtippbar. Die Daten kommen von GET /api/fristen; jeder Fehler (404 auf einem Server ohne P5, 500, Netz weg) und anzeigen !== true ergeben keinen Streifen. Daten in Europe/Berlin. */ import { h, leeren } from './dom.js' /** Fristen vom Server holen; bei Fehlern jeder Art oder anzeigen !== true null. */ export async function ladeFristen(api) { try { const daten = await api('/api/fristen') return daten?.anzeigen === true ? daten : null } catch { return null } } /** Wie ladeFristen, aber für das Neuladen in der Sitzung: ein Fehler ergibt undefined (der bisherige Stand bleibt), keine Frist null. */ export async function ladeFristenNeu(api) { try { const daten = await api('/api/fristen') return daten?.anzeigen === true ? daten : null } catch { return undefined } } const datumBerlin = new Intl.DateTimeFormat('de-DE', { timeZone: 'Europe/Berlin', day: '2-digit', month: '2-digit' }) /** 'Widerrufsfrist bis TT.MM.' in der Zeit von Berlin; ohne gültiges Datum 'Widerrufsfrist läuft'. */ export function streifenText(iso) { const zeit = new Date(iso) if (!iso || Number.isNaN(zeit.getTime())) return 'Widerrufsfrist läuft' const teile = Object.fromEntries(datumBerlin.formatToParts(zeit).map((t) => [t.type, t.value])) return `Widerrufsfrist bis ${teile.day}.${teile.month}.` } /** Frühestes Ende als ISO-Text: fruehestesEnde, sonst das kleinste bis, sonst ''. */ export function fruehesteFrist(daten) { if (daten?.fruehestesEnde) return daten.fruehestesEnde const zeiten = (daten?.fristen ?? []).map((f) => f?.bis).filter((b) => b && !Number.isNaN(Date.parse(b))) return zeiten.sort((a, b) => Date.parse(a) - Date.parse(b))[0] ?? '' } /** * Streifen in `wurzel` füllen: setze(daten) nimmt die Fristen (null: keine), erlaube(ok) sagt, ob die gezeigte Seite den Streifen tragen darf * (nicht die Bestellseiten, siehe zeigtWiderrufsstreifen). Sichtbar ist er nur mit Fristen auf einer erlaubten Seite; am Körper steht dann `kn-hat-streifen`. */ export function baueStreifen(wurzel, { koerper = document.body } = {}) { wurzel.classList.add('kn-streifen') wurzel.setAttribute('role', 'region') wurzel.setAttribute('aria-label', 'Widerrufsfrist') let stand = null let erlaubt = true const zeichne = () => { leeren(wurzel) if (!stand || !erlaubt) { wurzel.hidden = true koerper.classList.remove('kn-hat-streifen') return } wurzel.append(streifenText(fruehesteFrist(stand)), ' · ', h('a', { class: 'kn-streifen-link', href: '/widerrufen.html' }, 'Widerrufen')) wurzel.hidden = false koerper.classList.add('kn-hat-streifen') } return { setze(daten) { stand = daten || null; zeichne() }, erlaube(ok) { if ((ok !== false) === erlaubt) return erlaubt = ok !== false zeichne() }, } }