import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Layout } from '@/components/Layout'; import { useAuth } from '@/hooks/useAuth'; import { supabase } from '@/integrations/supabase/client'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Card, CardContent } from '@/components/ui/card'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Switch } from '@/components/ui/switch'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { toast } from '@/hooks/use-toast'; import { Skeleton } from '@/components/ui/skeleton'; import { Plus, Pencil, Trash2 } from 'lucide-react'; import { CurriculumEditor } from '@/components/admin/CurriculumEditor'; interface Product { id: string; title: string; slug: string; type: string; description: string; content: string; meeting_link: string | null; recording_url: string | null; price: number; sale_price: number | null; is_active: boolean; } const emptyProduct = { title: '', slug: '', type: 'consulting', description: '', content: '', meeting_link: '', recording_url: '', price: 0, sale_price: null as number | null, is_active: true }; export default function Admin() { const { user, isAdmin, loading: authLoading } = useAuth(); const navigate = useNavigate(); const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); const [dialogOpen, setDialogOpen] = useState(false); const [editingProduct, setEditingProduct] = useState(null); const [form, setForm] = useState(emptyProduct); const [saving, setSaving] = useState(false); const [activeTab, setActiveTab] = useState('details'); useEffect(() => { if (!authLoading) { if (!user) navigate('/auth'); else if (!isAdmin) { toast({ title: 'Access denied', description: 'Admin access required', variant: 'destructive' }); navigate('/dashboard'); } else fetchProducts(); } }, [user, isAdmin, authLoading, navigate]); const fetchProducts = async () => { const { data, error } = await supabase.from('products').select('*').order('created_at', { ascending: false }); if (!error && data) setProducts(data); setLoading(false); }; const generateSlug = (title: string) => title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, ''); const handleEdit = (product: Product) => { setEditingProduct(product); setForm({ title: product.title, slug: product.slug, type: product.type, description: product.description, content: product.content || '', meeting_link: product.meeting_link || '', recording_url: product.recording_url || '', price: product.price, sale_price: product.sale_price, is_active: product.is_active }); setActiveTab('details'); setDialogOpen(true); }; const handleNew = () => { setEditingProduct(null); setForm(emptyProduct); setActiveTab('details'); setDialogOpen(true); }; const handleSave = async () => { if (!form.title || !form.slug || form.price <= 0) { toast({ title: 'Validation error', description: 'Please fill in all required fields', variant: 'destructive' }); return; } setSaving(true); const productData = { title: form.title, slug: form.slug, type: form.type, description: form.description, content: form.content, meeting_link: form.meeting_link || null, recording_url: form.recording_url || null, price: form.price, sale_price: form.sale_price || null, is_active: form.is_active }; if (editingProduct) { const { error } = await supabase.from('products').update(productData).eq('id', editingProduct.id); if (error) toast({ title: 'Error', description: 'Failed to update product', variant: 'destructive' }); else { toast({ title: 'Success', description: 'Product updated' }); setDialogOpen(false); fetchProducts(); } } else { const { error } = await supabase.from('products').insert(productData); if (error) toast({ title: 'Error', description: error.message, variant: 'destructive' }); else { toast({ title: 'Success', description: 'Product created' }); setDialogOpen(false); fetchProducts(); } } setSaving(false); }; const handleDelete = async (id: string) => { if (!confirm('Are you sure you want to delete this product?')) return; const { error } = await supabase.from('products').delete().eq('id', id); if (error) toast({ title: 'Error', description: 'Failed to delete product', variant: 'destructive' }); else { toast({ title: 'Success', description: 'Product deleted' }); fetchProducts(); } }; if (authLoading || loading) return (
); return (

Admin Panel

Manage your products

{editingProduct ? 'Edit Product' : 'New Product'} Details {editingProduct && form.type === 'bootcamp' && Curriculum}
setForm({ ...form, title: e.target.value, slug: generateSlug(e.target.value) })} className="border-2" />
setForm({ ...form, slug: e.target.value })} className="border-2" />