feat: implement dynamic hero image and header updates
This commit is contained in:
+6
-10
@@ -13,19 +13,15 @@ export default async function Home({ params }: { params: Promise<{ lang: string
|
|||||||
const { lang } = await params;
|
const { lang } = await params;
|
||||||
const dict = await getDictionary(lang);
|
const dict = await getDictionary(lang);
|
||||||
|
|
||||||
const dbPhotos = await prisma.gallery.findMany({
|
const [dbPhotos, dbServices, heroMediaList, dbSettings] = await Promise.all([
|
||||||
orderBy: { createdAt: 'desc' }
|
prisma.gallery.findMany({ orderBy: { createdAt: 'desc' } }),
|
||||||
});
|
prisma.service.findMany({ orderBy: { createdAt: 'asc' } }),
|
||||||
|
prisma.heroMedia.findMany(),
|
||||||
|
prisma.siteSettings.findFirst()
|
||||||
|
]);
|
||||||
|
|
||||||
const dbServices = await prisma.service.findMany({
|
|
||||||
orderBy: { createdAt: 'asc' }
|
|
||||||
});
|
|
||||||
|
|
||||||
const heroMediaList = await prisma.heroMedia.findMany();
|
|
||||||
const dbHeroMedia = heroMediaList.length > 0 ? heroMediaList[0] : null;
|
const dbHeroMedia = heroMediaList.length > 0 ? heroMediaList[0] : null;
|
||||||
|
|
||||||
const dbSettings = await prisma.siteSettings.findFirst();
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className="min-h-screen bg-brand-white">
|
<main className="min-h-screen bg-brand-white">
|
||||||
<Header dict={dict} lang={lang} dbSettings={dbSettings} />
|
<Header dict={dict} lang={lang} dbSettings={dbSettings} />
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import { prisma } from '@/lib/db';
|
import { prisma } from '@/lib/db';
|
||||||
import { createSession, deleteSession } from '@/lib/auth';
|
import { createSession, deleteSession } from '@/lib/auth';
|
||||||
import bcrypt from 'bcryptjs';
|
import bcrypt from 'bcryptjs';
|
||||||
|
import { revalidatePath } from 'next/cache';
|
||||||
|
|
||||||
// Auth Actions
|
// Auth Actions
|
||||||
export async function login(formData: FormData) {
|
export async function login(formData: FormData) {
|
||||||
@@ -75,6 +76,7 @@ export async function updateHeroMedia(url: string, type: string) {
|
|||||||
await prisma.heroMedia.create({
|
await prisma.heroMedia.create({
|
||||||
data: { url, type }
|
data: { url, type }
|
||||||
});
|
});
|
||||||
|
revalidatePath('/', 'layout');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Site Settings Actions
|
// Site Settings Actions
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect } from "react";
|
||||||
import { Menu, X } from "lucide-react";
|
import { Menu, X } from "lucide-react";
|
||||||
|
import Image from "next/image";
|
||||||
|
|
||||||
export default function Header({ dict, lang, dbSettings }: { dict: any, lang: string, dbSettings?: any }) {
|
export default function Header({ dict, lang, dbSettings }: { dict: any, lang: string, dbSettings?: any }) {
|
||||||
const [isScrolled, setIsScrolled] = useState(false);
|
const [isScrolled, setIsScrolled] = useState(false);
|
||||||
@@ -30,9 +31,11 @@ export default function Header({ dict, lang, dbSettings }: { dict: any, lang: st
|
|||||||
>
|
>
|
||||||
<div className="container mx-auto px-4 md:px-6 flex justify-between items-center">
|
<div className="container mx-auto px-4 md:px-6 flex justify-between items-center">
|
||||||
<a href="#" className="flex items-center">
|
<a href="#" className="flex items-center">
|
||||||
<img
|
<Image
|
||||||
src={dbSettings?.logoUrl || "/logo.png"}
|
src={dbSettings?.logoUrl || "/logo.png"}
|
||||||
alt="Moy Beach Logo"
|
alt="Moy Beach Logo"
|
||||||
|
width={120}
|
||||||
|
height={48}
|
||||||
className={`h-12 w-auto transition-all duration-300 ${(!isScrolled && !dbSettings?.logoUrl) ? "brightness-0 invert opacity-90" : ""}`}
|
className={`h-12 w-auto transition-all duration-300 ${(!isScrolled && !dbSettings?.logoUrl) ? "brightness-0 invert opacity-90" : ""}`}
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
Reference in New Issue
Block a user