From ec249c786503f252f4e33742ba4591afbceb73fd Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 9 Mar 2026 22:17:28 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20add=20SettingsPage=20=E2=80=94=20kennel?= =?UTF-8?q?=20name,=20tagline,=20address,=20phone,=20website,=20email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/SettingsPage.jsx | 160 ++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 client/src/pages/SettingsPage.jsx diff --git a/client/src/pages/SettingsPage.jsx b/client/src/pages/SettingsPage.jsx new file mode 100644 index 0000000..9fbcc0f --- /dev/null +++ b/client/src/pages/SettingsPage.jsx @@ -0,0 +1,160 @@ +import { useState, useEffect } from 'react' +import { Settings, Save, CheckCircle } from 'lucide-react' +import { useSettings } from '../hooks/useSettings' + +const FIELDS = [ + { key: 'kennel_name', label: 'Kennel / App Name', placeholder: 'BREEDR', type: 'text', required: true }, + { key: 'kennel_tagline', label: 'Tagline', placeholder: 'Raising champions since...', type: 'text' }, + { key: 'kennel_address', label: 'Address', placeholder: '123 Main St, City, ST', type: 'text' }, + { key: 'kennel_phone', label: 'Phone', placeholder: '(555) 000-0000', type: 'tel' }, + { key: 'kennel_email', label: 'Email', placeholder: 'kennel@example.com', type: 'email'}, + { key: 'kennel_website', label: 'Website', placeholder: 'https://yourdomain.com', type: 'url' }, + { key: 'kennel_akc_id', label: 'AKC Kennel ID', placeholder: 'Optional', type: 'text' }, + { key: 'kennel_breed', label: 'Primary Breed', placeholder: 'e.g. Labrador Retriever', type: 'text' }, +] + +export default function SettingsPage() { + const { settings, saveSettings } = useSettings() + const [form, setForm] = useState({}) + const [saving, setSaving] = useState(false) + const [saved, setSaved] = useState(false) + const [error, setError] = useState(null) + + useEffect(() => { + setForm({ + kennel_name: settings.kennel_name || '', + kennel_tagline: settings.kennel_tagline || '', + kennel_address: settings.kennel_address || '', + kennel_phone: settings.kennel_phone || '', + kennel_email: settings.kennel_email || '', + kennel_website: settings.kennel_website || '', + kennel_akc_id: settings.kennel_akc_id || '', + kennel_breed: settings.kennel_breed || '', + }) + }, [settings]) + + const handleChange = (key, value) => { + setForm(prev => ({ ...prev, [key]: value })) + setSaved(false) + } + + const handleSubmit = async (e) => { + e.preventDefault() + if (!form.kennel_name?.trim()) { + setError('Kennel name is required.') + return + } + setSaving(true) + setError(null) + try { + await saveSettings(form) + setSaved(true) + setTimeout(() => setSaved(false), 3000) + } catch (err) { + setError('Failed to save settings. Please try again.') + } finally { + setSaving(false) + } + } + + return ( +
+ {/* Header */} +
+
+ +
+
+

Settings

+

+ Kennel profile & app configuration +

+
+
+ +
+ +
+
+

Kennel Information

+ + {error &&
{error}
} + +
+ {FIELDS.map(field => ( +
+ + handleChange(field.key, e.target.value)} + /> +
+ ))} +
+ +
+ + {/* Preview */} + {form.kennel_name && ( +
+

Header Preview

+
+ + {form.kennel_name} + + {form.kennel_tagline && ( + + — {form.kennel_tagline} + + )} +
+
+ )} + +
+ {saved && ( + + Saved! + + )} + +
+
+ +
+ ) +}