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:
parent
3eeea27b92
commit
074b4eb5d1
|
|
@ -1,10 +1,13 @@
|
||||||
export const dynamic = 'force-dynamic'
|
export const dynamic = 'force-dynamic'
|
||||||
import { redirect } from 'next/navigation'
|
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'
|
import PasswortAendern from '@/components/admin/PasswortAendern'
|
||||||
|
|
||||||
export default async function PasswortPage() {
|
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')
|
if (!session) redirect('/admin/login')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
||||||
91
app/page.tsx
91
app/page.tsx
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { createServiceClient } from "@/lib/supabase";
|
||||||
import Header from "@/components/Header";
|
import Header from "@/components/Header";
|
||||||
import Hero from "@/components/Hero";
|
import Hero from "@/components/Hero";
|
||||||
import TaglineBanner from "@/components/TaglineBanner";
|
import TaglineBanner from "@/components/TaglineBanner";
|
||||||
|
|
@ -9,12 +10,73 @@ import PaperlessSection from "@/components/PaperlessSection";
|
||||||
import About from "@/components/About";
|
import About from "@/components/About";
|
||||||
import Contact from "@/components/Contact";
|
import Contact from "@/components/Contact";
|
||||||
import Footer from "@/components/Footer";
|
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 (
|
return (
|
||||||
<main className="min-h-screen bg-[#f0f4f8] dark:bg-[#18212f]">
|
<main className="min-h-screen bg-[#f0f4f8] dark:bg-[#18212f]">
|
||||||
<Header />
|
<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 />
|
<TaglineBanner />
|
||||||
<StatsBar />
|
<StatsBar />
|
||||||
<Services />
|
<Services />
|
||||||
|
|
@ -23,9 +85,30 @@ export default function Home() {
|
||||||
<DataSovereignty />
|
<DataSovereignty />
|
||||||
<TaglineBanner />
|
<TaglineBanner />
|
||||||
<Technologies />
|
<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 />
|
<TaglineBanner />
|
||||||
<Contact />
|
<Contact
|
||||||
|
telefon={kontakt?.telefon}
|
||||||
|
email={kontakt?.email}
|
||||||
|
adresseZeile1={kontakt?.adresse_zeile1}
|
||||||
|
adresseZeile2={kontakt?.adresse_zeile2}
|
||||||
|
oeffnungszeiten={oeffnung.length > 0 ? oeffnung : undefined}
|
||||||
|
/>
|
||||||
<Footer />
|
<Footer />
|
||||||
</main>
|
</main>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue