Interne Vorschau-Seite /demo-abo/ für Konto mit aktivem Abo

Neue, nicht verlinkte Seite (noindex, aus der Sitemap ausgeschlossen), die
beim Aufruf ein Demo-Konto mit aktivem "Großes Abo" (14 bezahlte Monate,
verfügbare + bereits eingelöste Teddy-Prämien, mehrere Benachrichtigungen,
laufender Treuebonus-Fortschritt) ins localStorage DES AUFRUFENDEN BROWSERS
schreibt und direkt zum Abo-Tab im Kundenkonto weiterleitet — ändert nichts
an echten Kundendaten, jede Person sieht die Vorschau nur bei sich selbst.

Dafür neu: Layout.astro bekommt eine noindex-Prop, und die Kontoseite
unterstützt jetzt Deep-Links per URL-Hash (#abo, #treuebonus, …), damit die
Vorschau direkt im richtigen Tab landet.

Separat per `wrangler pages deploy --branch=vorschau-abo` auf eine eigene
Vorschau-URL deployed (vorschau-abo.vans-diy-bastelbedarf.pages.dev) —
komplett getrennt von der normalen Produktions-URL, wird nicht durch den
GitHub-Actions-Workflow (nur branch=main) überschrieben.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
qcigano
2026-08-03 17:34:06 +02:00
co-authored by Claude Sonnet 5
parent 380a32db87
commit fec6626d1a
4 changed files with 83 additions and 2 deletions
+4 -1
View File
@@ -8,7 +8,10 @@ const SITE_URL = 'https://www.vans-diy-bastelbedarf.de';
export default defineConfig({ export default defineConfig({
site: SITE_URL, site: SITE_URL,
integrations: [sitemap()], // /demo-abo/ ist eine interne Vorschau-Seite (simuliertes aktives Abo, für VanVan und mich zum
// Anschauen) — soll nie in der Sitemap/Suchmaschinen auftauchen (siehe zusätzlich noindex-Meta
// in der Seite selbst).
integrations: [sitemap({ filter: (page) => !page.includes('/demo-abo/') })],
vite: { vite: {
server: { server: {
// Erlaubt Zugriff über den temporären cloudflared-Quick-Tunnel (nur für lokale // Erlaubt Zugriff über den temporären cloudflared-Quick-Tunnel (nur für lokale
+5
View File
@@ -13,6 +13,9 @@ interface Props {
path?: string; path?: string;
/** Seite existiert nur auf Deutsch (Rechtstexte) — siehe LanguageSwitcher. */ /** Seite existiert nur auf Deutsch (Rechtstexte) — siehe LanguageSwitcher. */
legalOnly?: boolean; legalOnly?: boolean;
/** Interne Vorschau-/Demoseiten (z.B. /demo-abo/) sollen nie von Suchmaschinen indexiert
* werden — setzt zusätzlich zum Sitemap-Ausschluss noch ein robots-Meta. */
noindex?: boolean;
} }
const { const {
title, title,
@@ -20,6 +23,7 @@ const {
lang = defaultLocale, lang = defaultLocale,
path = "/", path = "/",
legalOnly = false, legalOnly = false,
noindex = false,
} = Astro.props; } = Astro.props;
const t = useTranslations(lang); const t = useTranslations(lang);
@@ -39,6 +43,7 @@ const p = (href: string) => `${localePrefix(lang)}${href}`;
<link rel="manifest" href="/manifest.webmanifest" /> <link rel="manifest" href="/manifest.webmanifest" />
<title>{title} · Van's DIY & Bastelbedarf</title> <title>{title} · Van's DIY & Bastelbedarf</title>
<meta name="description" content={description} /> <meta name="description" content={description} />
{noindex && <meta name="robots" content="noindex, nofollow" />}
<link rel="canonical" href={new URL(Astro.url.pathname, Astro.site ?? "https://vans-diy-bastelbedarf.de").toString()} /> <link rel="canonical" href={new URL(Astro.url.pathname, Astro.site ?? "https://vans-diy-bastelbedarf.de").toString()} />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:site_name" content="Van's DIY & Bastelbedarf" /> <meta property="og:site_name" content="Van's DIY & Bastelbedarf" />
+69
View File
@@ -0,0 +1,69 @@
---
import Layout from "../../layouts/Layout.astro";
import type { Locale } from "../../i18n/config";
const lang: Locale = "de";
// Rein internes Vorschau-Konto (nicht verlinkt, nicht in der Sitemap, noindex) — zeigt, wie das
// Kundenkonto MIT aktivem Abo aussieht: Großes Abo, 14 durchgehend bezahlte Monate, ein noch
// verfügbarer kleiner Teddy, ein bereits eingelöster großer Teddy, ein paar realistische
// Benachrichtigungen und laufender Treuebonus-Fortschritt (nur mit aktivem Abo überhaupt aktiv,
// siehe scripts/account.ts). Wird per JS ins localStorage DIESES Browsers geschrieben, sobald
// die Seite aufgerufen wird — ändert nichts an echten Kundendaten, jede Person, die den Link
// öffnet (auch VanVan), sieht die Vorschau in ihrem eigenen Browser.
const demoAccount = {
loggedIn: true,
name: "Vorschau Kundin",
username: "Vorschau",
email: "[email protected]",
photo: "",
bewerteteBestellungen: [],
treueBestellungen: 6,
treuebonusAktiv: false,
treuebonusArtikelSlug: null,
abo: {
stufe: "gross",
startDatum: "2025-06-03",
bezahltBisDatum: "2026-09-03",
bezahlteMonate: 14,
gekuendigt: false,
gekuendigtAm: null,
kleinTeddyFreigeschaltetGesamt: 2,
grossTeddyFreigeschaltetGesamt: 1,
kleinTeddyEingeloest: 1,
grossTeddyEingeloest: 1,
historie: [],
},
benachrichtigungen: [
{ key: "abo_teddy_klein_frei", datum: "2026-07-03", gelesen: false },
{ key: "abo_zahlung_erfolgreich", datum: "2026-07-03", gelesen: true },
{ key: "abo_zahlung_erfolgreich", datum: "2026-06-03", gelesen: true },
{ key: "abo_teddy_gross_eingeloest", datum: "2026-06-01", gelesen: true },
{ key: "abo_gewechselt", stufe: "gross", datum: "2026-01-15", gelesen: true },
{ key: "abo_abgeschlossen", datum: "2025-06-03", gelesen: true },
],
};
---
<Layout
title="Vorschau: Konto mit aktivem Abo"
description="Interne Vorschau-Seite — zeigt das Kundenkonto mit einem simulierten aktiven Abo."
lang={lang}
path="/demo-abo/"
noindex={true}
>
<section class="section-tight">
<div class="container">
<p class="todo-note">
Interne Vorschau für VanVan — zeigt das Kundenkonto so, wie es mit einem aktiven "Großes Abo"
aussieht (Prämien, Benachrichtigungen, Treuebonus). Wird nur in DEINEM Browser simuliert,
ändert nichts an echten Kundendaten. Du wirst gleich automatisch weitergeleitet …
</p>
<p><a href="/konto/angemeldet/#abo" id="demo-weiter-link">Falls die Weiterleitung nicht klappt: hier klicken →</a></p>
</div>
</section>
</Layout>
<script define:vars={{ demoAccount }}>
localStorage.setItem("vandiy_account_v1", JSON.stringify(demoAccount));
window.location.href = "/konto/angemeldet/#abo";
</script>
+5 -1
View File
@@ -503,7 +503,11 @@ const angekommeneBestellungen = beispielBestellungen.filter((b) => b.status ===
datenSection?.scrollIntoView({ behavior: "smooth", block: "start" }); datenSection?.scrollIntoView({ behavior: "smooth", block: "start" });
}); });
setActiveTab(null); // Deep-Link per URL-Hash (z.B. /konto/angemeldet/#abo) — springt direkt zum passenden Tab,
// genutzt u.a. von der Vorschau-Seite /demo-abo/.
const hashTab = location.hash.replace("#", "");
const gueltigeHashTabs = ["bestellungen", "offene", "wunschliste", "daten", "treuebonus", "abo"];
setActiveTab(gueltigeHashTabs.includes(hashTab) ? hashTab : null);
</script> </script>
<script> <script>
import { getAccount, isLoggedIn, logout, setUsername, setPhoto, hatBestellungBewertet, anzeigeName, treueFortschritt, aboStatus, aboAbschliessen, aboZahlungSimulieren, aboKuendigen, teddyEinloesen } from "../../scripts/account"; import { getAccount, isLoggedIn, logout, setUsername, setPhoto, hatBestellungBewertet, anzeigeName, treueFortschritt, aboStatus, aboAbschliessen, aboZahlungSimulieren, aboKuendigen, teddyEinloesen } from "../../scripts/account";