From feeda6dc60d3903dd74526012429ee7efd75bac6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 18 Jun 2026 20:44:38 -0400 Subject: [PATCH] x --- apps/admin/src/pages/PageBuilderPage.tsx | 96 +++++++- apps/backend/src/routes/pages.ts | 8 +- apps/website/src/app/products/[id]/page.tsx | 6 +- .../src/components/AddToCartSection.tsx | 6 +- apps/website/src/components/ProductCard.tsx | 4 +- .../dynamic/DynamicPageRenderer.tsx | 211 +++++++++++++----- apps/website/src/lib/localization.ts | 15 +- 7 files changed, 263 insertions(+), 83 deletions(-) diff --git a/apps/admin/src/pages/PageBuilderPage.tsx b/apps/admin/src/pages/PageBuilderPage.tsx index 5b8f7c5..0895649 100644 --- a/apps/admin/src/pages/PageBuilderPage.tsx +++ b/apps/admin/src/pages/PageBuilderPage.tsx @@ -44,6 +44,10 @@ interface Scent { export default function PageBuilderPage() { const frontendBase = (import.meta.env.VITE_FRONTEND_URL || window.location.origin).replace(/\/$/, ''); + const authHeaders = () => ({ + 'Content-Type': 'application/json', + Authorization: `Bearer ${localStorage.getItem('homaroma_admin_token')}`, + }); const [page, setPage] = useState(null); const [sections, setSections] = useState([]); const [categories, setCategories] = useState([]); @@ -53,6 +57,7 @@ export default function PageBuilderPage() { const [editingSection, setEditingSection] = useState | null>(null); const [uploadTarget, setUploadTarget] = useState<{ type: 'main' | 'slide'; index?: number } | null>(null); const [saveStatus, setSaveStatus] = useState<'idle' | 'saving' | 'saved' | 'error'>('idle'); + const [isSavingPageSettings, setIsSavingPageSettings] = useState(false); const [isMediaModalOpen, setIsMediaModalOpen] = useState(false); @@ -293,7 +298,7 @@ export default function PageBuilderPage() { try { const res = await fetch(`${API_BASE}/pages`, { method: 'POST', - headers: { 'Content-Type': 'application/json' }, + headers: authHeaders(), body: JSON.stringify({ title: newPageData.title, slug: newPageData.slug.toLowerCase().trim().replace(/\s+/g, '-') @@ -316,12 +321,43 @@ export default function PageBuilderPage() { } }; + const handleSavePageSettings = async () => { + if (!page) return; + + setIsSavingPageSettings(true); + try { + const res = await fetch(`${API_BASE}/pages`, { + method: 'POST', + headers: authHeaders(), + body: JSON.stringify({ + id: page.id, + slug: page.slug, + title: page.title, + isPublished: page.isPublished + }) + }); + const data = await res.json(); + if (res.ok && data && !data.error) { + setPage((prev) => (prev ? { ...prev, isPublished: data.isPublished ?? prev.isPublished } : prev)); + await fetchPagesList(); + } else { + alert(data.error || 'Failed to save page settings'); + } + } catch (err) { + console.error('Save page settings error:', err); + alert('Failed to save page settings due to network error'); + } finally { + setIsSavingPageSettings(false); + } + }; + const handleDeletePage = async () => { if (!page || page.slug === 'home') return; if (!confirm(`Are you sure you want to delete the page "${page.title}"? This will delete all of its section blocks permanently!`)) return; try { const res = await fetch(`${API_BASE}/pages/${page.id}`, { + headers: authHeaders(), method: 'DELETE' }); if (res.ok) { @@ -670,16 +706,31 @@ export default function PageBuilderPage() { {page && ( - - - Open Live - + <> + + + Open Live + + + )}