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() {