diff --git a/app/src/app/admin/settings/page.tsx b/app/src/app/admin/settings/page.tsx index a6f812b..35cd881 100644 --- a/app/src/app/admin/settings/page.tsx +++ b/app/src/app/admin/settings/page.tsx @@ -52,12 +52,19 @@ export default function AdminSettingsPage() { e.preventDefault() setSaving(true) setError('') + setMessage('') for (const key of ALL_KEYS) { - await fetch('/api/admin/settings', { + const res = await fetch('/api/admin/settings', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key, value: values[key] }), }) + if (!res.ok) { + const data = await res.json().catch(() => ({})) + setSaving(false) + setError(data.error || `Errore nel salvare "${key}" (${res.status})`) + return + } } setSaving(false) setMessage('Impostazioni salvate!') diff --git a/app/src/app/api/settings/route.ts b/app/src/app/api/settings/route.ts new file mode 100644 index 0000000..c15d26b --- /dev/null +++ b/app/src/app/api/settings/route.ts @@ -0,0 +1,14 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export const dynamic = 'force-dynamic' + +const PUBLIC_KEYS = ['site_name', 'site_description', 'footer_copyright', 'footer_links'] as const + +export async function GET() { + const rows = await prisma.siteSettings.findMany({ + where: { key: { in: [...PUBLIC_KEYS] } }, + }) + const settings = Object.fromEntries(rows.map((r) => [r.key, r.value])) + return NextResponse.json({ settings }) +} diff --git a/app/src/app/login/page.tsx b/app/src/app/login/page.tsx index 66a3c1f..cfb0385 100644 --- a/app/src/app/login/page.tsx +++ b/app/src/app/login/page.tsx @@ -1,6 +1,6 @@ 'use client' -import { Suspense, useState } from 'react' +import { Suspense, useState, useEffect } from 'react' import Link from 'next/link' import { useRouter, useSearchParams } from 'next/navigation' import { Input } from '@/components/ui/Input' @@ -21,11 +21,19 @@ function LoginForm() { const [password, setPassword] = useState('') const [error, setError] = useState('') const [loading, setLoading] = useState(false) + const [siteName, setSiteName] = useState('ShopX') const router = useRouter() const searchParams = useSearchParams() const redirect = searchParams.get('redirect') || '/' const { refreshUser } = useUser() + useEffect(() => { + fetch('/api/settings') + .then((r) => r.json()) + .then((data) => { if (data.settings?.site_name) setSiteName(data.settings.site_name as string) }) + .catch(() => {}) + }, []) + async function handleSubmit(e: React.FormEvent) { e.preventDefault() setError('') @@ -66,7 +74,7 @@ function LoginForm() {
- ShopX + {siteName}

Welcome back

Sign in to your account

diff --git a/app/src/app/page.tsx b/app/src/app/page.tsx index c59633f..f0ea5b7 100644 --- a/app/src/app/page.tsx +++ b/app/src/app/page.tsx @@ -14,8 +14,17 @@ async function getFeaturedProducts() { }) } +async function getSiteSettings() { + const rows = await prisma.siteSettings.findMany({ + where: { key: { in: ['site_name', 'site_description'] } }, + }) + return Object.fromEntries(rows.map((r) => [r.key, r.value as string])) +} + export default async function HomePage() { - const products = await getFeaturedProducts() + const [products, settings] = await Promise.all([getFeaturedProducts(), getSiteSettings()]) + const siteName = settings.site_name || 'ShopX' + const siteDescription = settings.site_description || 'Discover our curated collection of products' return (
@@ -24,9 +33,9 @@ export default async function HomePage() { {/* Hero */}
-

Welcome to ShopX

+

Welcome to {siteName}

- Discover our curated collection of products + {siteDescription}

-

© {new Date().getFullYear()} ShopX. All rights reserved.

+

© {new Date().getFullYear()} {siteName}. All rights reserved.

diff --git a/app/src/app/register/page.tsx b/app/src/app/register/page.tsx index 2fc389c..1f31755 100644 --- a/app/src/app/register/page.tsx +++ b/app/src/app/register/page.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState } from 'react' +import { useState, useEffect } from 'react' import Link from 'next/link' import { useRouter } from 'next/navigation' import { Input } from '@/components/ui/Input' @@ -14,9 +14,17 @@ export default function RegisterPage() { const [password, setPassword] = useState('') const [error, setError] = useState('') const [loading, setLoading] = useState(false) + const [siteName, setSiteName] = useState('ShopX') const router = useRouter() const { refreshUser } = useUser() + useEffect(() => { + fetch('/api/settings') + .then((r) => r.json()) + .then((data) => { if (data.settings?.site_name) setSiteName(data.settings.site_name as string) }) + .catch(() => {}) + }, []) + async function handleSubmit(e: React.FormEvent) { e.preventDefault() setError('') @@ -50,9 +58,9 @@ export default function RegisterPage() {
- ShopX + {siteName}

Create Account

-

Join ShopX today

+

Join {siteName} today

{error && {error}} diff --git a/app/src/components/storefront/Navbar.tsx b/app/src/components/storefront/Navbar.tsx index db0764f..ddb17f3 100644 --- a/app/src/components/storefront/Navbar.tsx +++ b/app/src/components/storefront/Navbar.tsx @@ -7,6 +7,7 @@ import { useUser } from '@/context/UserContext' export function Navbar() { const [cartCount, setCartCount] = useState(0) + const [siteName, setSiteName] = useState('ShopX') const { user, refreshUser } = useUser() const router = useRouter() @@ -16,6 +17,16 @@ export function Navbar() { setCartCount(count) }, []) + useEffect(() => { + fetch('/api/settings') + .then((r) => r.json()) + .then((data) => { + const name = data.settings?.site_name + if (name) setSiteName(name as string) + }) + .catch(() => {}) + }, []) + async function handleLogout() { await fetch('/api/auth/logout', { method: 'POST' }) await refreshUser() @@ -28,7 +39,7 @@ export function Navbar() {
- ShopX + {siteName}