import React, { useState, useEffect } from 'react'; import { toast } from 'react-hot-toast'; import api from '../services/api'; import ConfirmModal from '../components/ui/ConfirmModal'; export interface HeroBanner { id: string; title: string; subtitle: string; imageUrl: string; isActive: boolean; } export interface VetTestimonial { id: string; vetName: string; clinicName: string; quote: string; } export default function CMS() { const [banners, setBanners] = useState([]); const [testimonials, setTestimonials] = useState([]); const [activeTab, setActiveTab] = useState<'banners' | 'testimonials'>('banners'); // Form States const [newTitle, setNewTitle] = useState(''); const [newSubtitle, setNewSubtitle] = useState(''); const [newImageUrl, setNewImageUrl] = useState(''); const [vetName, setVetName] = useState(''); const [clinicName, setClinicName] = useState(''); const [quote, setQuote] = useState(''); const [deleteBannerId, setDeleteBannerId] = useState(null); const [deleteTestimonialId, setDeleteTestimonialId] = useState(null); const fetchData = async () => { try { const [bannersRes, testimonialsRes] = await Promise.all([ api.get('/admin/cms/hero-banners').catch(() => ({ data: [] })), api.get('/admin/cms/vet-testimonials').catch(() => ({ data: [] })), ]); setBanners(bannersRes.data || []); setTestimonials(testimonialsRes.data || []); } catch (err) { console.error('Failed to fetch CMS data:', err); } }; useEffect(() => { let isSubscribed = true; Promise.all([ api.get('/admin/cms/hero-banners').catch(() => ({ data: [] })), api.get('/admin/cms/vet-testimonials').catch(() => ({ data: [] })), ]).then(([bannersRes, testimonialsRes]) => { if (!isSubscribed) return; setBanners(bannersRes.data || []); setTestimonials(testimonialsRes.data || []); }).catch(err => { console.error('Failed to fetch CMS data:', err); }); return () => { isSubscribed = false; }; }, []); const handleAddBanner = async (e: React.FormEvent) => { e.preventDefault(); try { await api.post('/admin/cms/hero-banners', { title: newTitle, subtitle: newSubtitle, imageUrl: newImageUrl || '/assets/images/hero-section-image.png', isActive: true, }); setNewTitle(''); setNewSubtitle(''); setNewImageUrl(''); fetchData(); toast.success('بنر با موفقیت ایجاد شد'); } catch { toast.error('خطا در ایجاد بنر'); } }; const handleAddTestimonial = async (e: React.FormEvent) => { e.preventDefault(); try { await api.post('/admin/cms/vet-testimonials', { vetName, clinicName, quote, rating: 5, isActive: true, }); setVetName(''); setClinicName(''); setQuote(''); fetchData(); toast.success('نظر دامپزشک ثبت شد'); } catch { toast.error('خطا در ایجاد نظر دامپزشک'); } }; const confirmDeleteBanner = async () => { if (!deleteBannerId) return; try { await api.delete(`/admin/cms/hero-banners/${deleteBannerId}`); toast.success('بنر با موفقیت حذف شد'); fetchData(); } catch { toast.error('خطا در حذف بنر'); } finally { setDeleteBannerId(null); } }; const confirmDeleteTestimonial = async () => { if (!deleteTestimonialId) return; try { await api.delete(`/admin/cms/vet-testimonials/${deleteTestimonialId}`); toast.success('نظر با موفقیت حذف شد'); fetchData(); } catch { toast.error('خطا در حذف نظر'); } finally { setDeleteTestimonialId(null); } }; return (

مدیریت محتوای پویا (CMS) — بنرها و نظرات دامپزشکان

{activeTab === 'banners' && (

افزودن بنر جدید

setNewTitle(e.target.value)} className="w-full border rounded-xl p-2.5 text-sm" placeholder="تخصص آلمانی در خدمت سلامت پت..." />