From 3df9a67b97306918b7543804bfb78e74934f95ee Mon Sep 17 00:00:00 2001 From: Adriano Belisario Date: Sun, 3 May 2026 21:10:58 +0000 Subject: [PATCH] =?UTF-8?q?feat(admin):=20merge=20Site=20Settings=20and=20?= =?UTF-8?q?Wishlist=20into=20single=20Configura=C3=A7=C3=B5es=20panel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Single-wishlist apps no longer need two separate edit sections. Both siteTitle/homepageSubtext and wishlist fields now save together in one action from a unified Configurações card. Co-Authored-By: Claude Sonnet 4.6 --- app/admin/page.tsx | 159 +++++++++++++++----------- app/api/items/[id]/route.ts | 4 + app/api/wishlists/[id]/items/route.ts | 4 + components/admin/ItemForm.tsx | 21 ++++ lib/api.ts | 2 + 5 files changed, 126 insertions(+), 64 deletions(-) diff --git a/app/admin/page.tsx b/app/admin/page.tsx index 6ad32c8..b280518 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -14,7 +14,6 @@ import { } from '@/lib/api'; import Header from '@/components/header'; import Link from 'next/link'; -import SettingsSection from '@/components/admin/SettingsSection'; import ItemCard from '@/components/admin/ItemCard'; import ItemForm from '@/components/admin/ItemForm'; import ImageUpload from '@/components/image-upload'; @@ -42,7 +41,7 @@ function AdminPageContent() { homepageSubtext: '', }); - // Wishlist edit state + // Unified config edit state const [isEditingWishlist, setIsEditingWishlist] = useState(false); const [editForm, setEditForm] = useState({ name: '', @@ -51,6 +50,8 @@ function AdminPageContent() { preferences: '', imageUrl: '', isPublic: true, + siteTitle: '', + homepageSubtext: '', }); const [editError, setEditError] = useState(''); const [isWishlistImageUploading, setIsWishlistImageUploading] = useState(false); @@ -105,6 +106,8 @@ function AdminPageContent() { preferences: wishlist.preferences || '', imageUrl: wishlist.imageUrl || '', isPublic: wishlist.isPublic, + siteTitle: settings.siteTitle, + homepageSubtext: settings.homepageSubtext, }); setEditError(''); setIsEditingWishlist(true); @@ -115,11 +118,16 @@ function AdminPageContent() { if (!wishlist) return; setEditError(''); try { - const updated = await wishlistsApi.update(wishlist.id, editForm); + const { siteTitle, homepageSubtext, ...wishlistFields } = editForm; + const [updated] = await Promise.all([ + wishlistsApi.update(wishlist.id, wishlistFields), + settingsApi.updateSettings({ siteTitle, homepageSubtext }), + ]); setWishlist(updated); + setSettings({ siteTitle, homepageSubtext }); setIsEditingWishlist(false); } catch (error: any) { - setEditError(error.message || 'Failed to update wishlist'); + setEditError(error.message || 'Failed to update settings'); } }; @@ -181,10 +189,6 @@ function AdminPageContent() { } }; - const handleUpdateSettings = async (updatedSettings: Settings) => { - await settingsApi.updateSettings(updatedSettings); - setSettings(updatedSettings); - }; const editingItem = items.find((item) => item.id === editingItemId); @@ -229,55 +233,72 @@ function AdminPageContent() { ) : ( <> - {/* Settings Section */} - - - {/* Wishlist Info Section */} + {/* Unified Settings & Wishlist Config */} {wishlist && (
+
+

Configurações

+ {!isEditingWishlist && ( + + )} +
{isEditingWishlist ? (
-

- Editar Lista -

{editError && (
{editError}
)} - - setEditForm((prev) => ({ ...prev, imageUrl: url })) - } - onUploadStateChange={setIsWishlistImageUploading} - type="wishlist" - label="Imagem da Lista" - /> +
+
+ + setEditForm((prev) => ({ ...prev, siteTitle: e.target.value }))} + className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-gray-700 dark:text-white" + /> +
+
+ + setEditForm((prev) => ({ ...prev, name: e.target.value }))} + className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-gray-700 dark:text-white" + /> +
+
- - setEditForm((prev) => ({ ...prev, name: e.target.value })) - } +