feat: load homepage sections from supabase cms, fix passwort page auth

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
MBO-Tech-IT 2026-06-02 20:37:27 +02:00
parent 3eeea27b92
commit 074b4eb5d1
2 changed files with 92 additions and 6 deletions

View File

@ -1,10 +1,13 @@
export const dynamic = 'force-dynamic'
import { redirect } from 'next/navigation'
import { getAdminSession } from '@/lib/admin-auth'
import { cookies } from 'next/headers'
import { verifySessionToken } from '@/lib/admin-auth'
import PasswortAendern from '@/components/admin/PasswortAendern'
export default async function PasswortPage() {
const session = await getAdminSession()
const cookieStore = await cookies()
const token = cookieStore.get('admin_session')?.value
const session = token ? await verifySessionToken(token) : null
if (!session) redirect('/admin/login')
return (

View File

@ -1,3 +1,4 @@
import { createServiceClient } from "@/lib/supabase";
import Header from "@/components/Header";
import Hero from "@/components/Hero";
import TaglineBanner from "@/components/TaglineBanner";
@ -9,12 +10,73 @@ import PaperlessSection from "@/components/PaperlessSection";
import About from "@/components/About";
import Contact from "@/components/Contact";
import Footer from "@/components/Footer";
import { GalerieAnzeige } from "@/components/GalerieAnzeige";
export const dynamic = "force-dynamic";
export default async function Home() {
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL ?? "";
let hero = null,
badges: { text: string }[] = [],
ueberUns = null,
stats: { wert: string; label: string }[] = [],
galerie: { id: string; storage_path: string; alt_text: string }[] = [],
kontakt = null,
oeffnung: { tag: string; von: string; bis: string }[] = [];
try {
const db = createServiceClient();
const [
heroResult,
badgesResult,
ueberUnsResult,
statsResult,
galerieResult,
kontaktResult,
oeffnungResult,
] = await Promise.allSettled([
db.from("hero_content").select("*").limit(1).single(),
db.from("hero_badges").select("*").order("reihenfolge"),
db.from("ueber_uns_content").select("*").limit(1).single(),
db.from("ueber_uns_stats").select("*").order("reihenfolge"),
db.from("galerie_bilder").select("*").order("reihenfolge"),
db.from("kontakt_info").select("*").limit(1).single(),
db.from("kontakt_oeffnungszeiten").select("*").order("reihenfolge"),
]);
hero = heroResult.status === "fulfilled" ? heroResult.value.data : null;
badges = badgesResult.status === "fulfilled" ? (badgesResult.value.data ?? []) : [];
ueberUns = ueberUnsResult.status === "fulfilled" ? ueberUnsResult.value.data : null;
stats = statsResult.status === "fulfilled" ? (statsResult.value.data ?? []) : [];
galerie = galerieResult.status === "fulfilled" ? (galerieResult.value.data ?? []) : [];
kontakt = kontaktResult.status === "fulfilled" ? kontaktResult.value.data : null;
oeffnung = oeffnungResult.status === "fulfilled" ? (oeffnungResult.value.data ?? []) : [];
} catch {
// Supabase nicht konfiguriert — Fallback-Werte greifen
}
const galerieBilder = galerie.map((b) => ({
id: b.id,
src: `${supabaseUrl}/storage/v1/object/public/galerie-bilder/${b.storage_path}`,
alt: b.alt_text,
}));
export default function Home() {
return (
<main className="min-h-screen bg-[#f0f4f8] dark:bg-[#18212f]">
<Header />
<Hero />
<Hero
eyebrowText={hero?.eyebrow_text}
headline1={hero?.headline1}
subtext1={hero?.subtext1}
subtext2={hero?.subtext2}
cta1Text={hero?.cta1_text}
cta1Href={hero?.cta1_href}
cta2Text={hero?.cta2_text}
cta2Href={hero?.cta2_href}
bgImagePath={hero?.bg_image_path}
badges={badges.length > 0 ? badges.map((b) => b.text) : undefined}
/>
<TaglineBanner />
<StatsBar />
<Services />
@ -23,9 +85,30 @@ export default function Home() {
<DataSovereignty />
<TaglineBanner />
<Technologies />
<About />
<About
eyebrowText={ueberUns?.eyebrow_text}
absatz1={ueberUns?.absatz1}
absatz2={ueberUns?.absatz2}
stats={stats.length > 0 ? stats : undefined}
/>
{galerieBilder.length > 0 && (
<>
<TaglineBanner />
<section className="py-16 px-4 sm:px-6 lg:px-8">
<div className="max-w-7xl mx-auto">
<GalerieAnzeige bilder={galerieBilder} />
</div>
</section>
</>
)}
<TaglineBanner />
<Contact />
<Contact
telefon={kontakt?.telefon}
email={kontakt?.email}
adresseZeile1={kontakt?.adresse_zeile1}
adresseZeile2={kontakt?.adresse_zeile2}
oeffnungszeiten={oeffnung.length > 0 ? oeffnung : undefined}
/>
<Footer />
</main>
);