/** * Site Settings (Advanced) * Phase 7: Advanced Site Management * Features: SEO (meta tags, Open Graph, schema.org) */ import React, { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { SettingsIcon, SearchIcon, Share2Icon, CodeIcon } from 'lucide-react'; import PageMeta from '../../components/common/PageMeta'; import { Card } from '../../components/ui/card'; import Button from '../../components/ui/button/Button'; import Label from '../../components/form/Label'; import SelectDropdown from '../../components/form/SelectDropdown'; import Checkbox from '../../components/form/input/Checkbox'; import TextArea from '../../components/form/input/TextArea'; import { useToast } from '../../components/ui/toast/ToastContainer'; import { fetchAPI } from '../../services/api'; export default function SiteSettings() { const { siteId } = useParams<{ siteId: string }>(); const navigate = useNavigate(); const toast = useToast(); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [site, setSite] = useState(null); const [activeTab, setActiveTab] = useState<'general' | 'seo' | 'og' | 'schema'>('general'); const [formData, setFormData] = useState({ name: '', slug: '', site_type: 'marketing', hosting_type: 'igny8_sites', is_active: true, // SEO fields meta_title: '', meta_description: '', meta_keywords: '', og_title: '', og_description: '', og_image: '', og_type: 'website', og_site_name: '', schema_type: 'Organization', schema_name: '', schema_description: '', schema_url: '', schema_logo: '', schema_same_as: '', }); useEffect(() => { if (siteId) { loadSite(); } }, [siteId]); const loadSite = async () => { try { setLoading(true); const data = await fetchAPI(`/v1/auth/sites/${siteId}/`); if (data) { setSite(data); const seoData = data.seo_metadata || data.metadata || {}; setFormData({ name: data.name || '', slug: data.slug || '', site_type: data.site_type || 'marketing', hosting_type: data.hosting_type || 'igny8_sites', is_active: data.is_active !== false, // SEO fields meta_title: seoData.meta_title || data.name || '', meta_description: seoData.meta_description || data.description || '', meta_keywords: seoData.meta_keywords || '', og_title: seoData.og_title || seoData.meta_title || data.name || '', og_description: seoData.og_description || seoData.meta_description || data.description || '', og_image: seoData.og_image || '', og_type: seoData.og_type || 'website', og_site_name: seoData.og_site_name || data.name || '', schema_type: seoData.schema_type || 'Organization', schema_name: seoData.schema_name || data.name || '', schema_description: seoData.schema_description || data.description || '', schema_url: seoData.schema_url || data.domain || '', schema_logo: seoData.schema_logo || '', schema_same_as: Array.isArray(seoData.schema_same_as) ? seoData.schema_same_as.join(', ') : seoData.schema_same_as || '', }); } } catch (error: any) { toast.error(`Failed to load site: ${error.message}`); } finally { setLoading(false); } }; const handleSave = async () => { try { setSaving(true); const { meta_title, meta_description, meta_keywords, og_title, og_description, og_image, og_type, og_site_name, schema_type, schema_name, schema_description, schema_url, schema_logo, schema_same_as, ...basicData } = formData; const payload = { ...basicData, seo_metadata: { meta_title, meta_description, meta_keywords, og_title, og_description, og_image, og_type, og_site_name, schema_type, schema_name, schema_description, schema_url, schema_logo, schema_same_as: schema_same_as ? schema_same_as.split(',').map((s) => s.trim()).filter(Boolean) : [], }, }; await fetchAPI(`/v1/auth/sites/${siteId}/`, { method: 'PUT', body: JSON.stringify(payload), }); toast.success('Site settings saved successfully'); loadSite(); } catch (error: any) { toast.error(`Failed to save settings: ${error.message}`); } finally { setSaving(false); } }; const SITE_TYPES = [ { value: 'marketing', label: 'Marketing Site' }, { value: 'ecommerce', label: 'Ecommerce Site' }, { value: 'blog', label: 'Blog' }, { value: 'portfolio', label: 'Portfolio' }, { value: 'corporate', label: 'Corporate' }, ]; const HOSTING_TYPES = [ { value: 'igny8_sites', label: 'IGNY8 Sites' }, { value: 'wordpress', label: 'WordPress' }, { value: 'shopify', label: 'Shopify' }, { value: 'multi', label: 'Multi-Destination' }, ]; if (loading) { return (
Loading site settings...
); } return (

Site Settings

Configure site type, hosting, and other settings

{/* Tabs */}
{/* General Tab */} {activeTab === 'general' && (
setFormData({ ...formData, name: e.target.value })} className="mt-1 w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md dark:bg-gray-800 dark:text-white" />
setFormData({ ...formData, slug: e.target.value })} className="mt-1 w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md dark:bg-gray-800 dark:text-white" />
setFormData({ ...formData, site_type: e.target.value })} />
setFormData({ ...formData, hosting_type: e.target.value })} />
setFormData({ ...formData, is_active: e.target.checked })} label="Active" />
)} {/* SEO Meta Tags Tab */} {activeTab === 'seo' && (
setFormData({ ...formData, meta_title: e.target.value })} placeholder="SEO title (recommended: 50-60 characters)" maxLength={60} className="mt-1 w-full px-3 py-2 border border-gray-300 dark:border-gray-700 rounded-md dark:bg-gray-800 dark:text-white" />

{formData.meta_title.length}/60 characters