import React, { useState } from 'react'; import { AuthenticatedLayout } from '../layout/AuthenticatedLayout'; import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; import { Button } from '../ui/button'; import { Input } from '../ui/input'; import { Label } from '../ui/label'; import { Textarea } from '../ui/textarea'; import { Badge } from '../ui/badge'; import { toast } from "sonner@2.0.3"; import { ArrowLeft, Upload, X, Plus } from 'lucide-react'; interface NewBlogProps { onNavigate: (route: string) => void; onLogout: () => void; user: any; formData?: any; onAutoSave?: (data: any) => void; onClearAutoSave?: (route?: string) => void; } export function NewBlog({ onNavigate, onLogout, user, formData, onAutoSave, onClearAutoSave }: NewBlogProps) { const [blogData, setBlogData] = useState(() => ({ title: formData?.title || '', slug: formData?.slug || '', metaTitle: formData?.metaTitle || '', metaDescription: formData?.metaDescription || '', body: formData?.body || '', bannerImage: formData?.bannerImage || null, bannerAltText: formData?.bannerAltText || '', tags: formData?.tags || [], category: formData?.category || '', status: formData?.status || 'draft' })); const [newTag, setNewTag] = useState(''); const [isUploading, setIsUploading] = useState(false); // Auto-save functionality React.useEffect(() => { if (onAutoSave) { const timer = setTimeout(() => { onAutoSave(blogData); }, 1000); return () => clearTimeout(timer); } }, [blogData, onAutoSave]); const handleInputChange = (field: string, value: any) => { setBlogData(prev => ({ ...prev, [field]: value })); // Auto-generate slug from title if (field === 'title' && !blogData.slug) { const slug = value.toLowerCase() .replace(/[^a-z0-9\s-]/g, '') .replace(/\s+/g, '-') .replace(/-+/g, '-') .trim(); setBlogData(prev => ({ ...prev, slug })); } }; const handleImageUpload = async (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; if (!file.type.startsWith('image/')) { toast.error('Please select a valid image file'); return; } setIsUploading(true); try { // Simulate upload await new Promise(resolve => setTimeout(resolve, 1500)); const imageUrl = URL.createObjectURL(file); handleInputChange('bannerImage', { url: imageUrl, name: file.name, size: file.size }); toast.success('Banner image uploaded successfully'); } catch (error) { toast.error('Failed to upload image'); } finally { setIsUploading(false); } }; const addTag = () => { if (newTag.trim() && !blogData.tags.includes(newTag.trim())) { handleInputChange('tags', [...blogData.tags, newTag.trim()]); setNewTag(''); } }; const removeTag = (tagToRemove: string) => { handleInputChange('tags', blogData.tags.filter((tag: string) => tag !== tagToRemove)); }; const handleSave = async (status: 'draft' | 'published') => { if (!blogData.title.trim()) { toast.error('Please enter a blog title'); return; } if (!blogData.body.trim()) { toast.error('Please enter blog content'); return; } try { const blogToSave = { ...blogData, status, id: Date.now().toString(), createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), author: user.name }; // Simulate API call await new Promise(resolve => setTimeout(resolve, 1000)); if (onClearAutoSave) { onClearAutoSave(); } toast.success(`Blog ${status === 'draft' ? 'saved as draft' : 'published'} successfully`); onNavigate('/content'); } catch (error) { toast.error('Failed to save blog'); } }; const categories = ['Technology', 'Business', 'Marketing', 'Design', 'Development', 'Other']; return (

Create New Blog Post

Write and publish a new blog post for your audience

{/* Main Content */}
Blog Content
handleInputChange('title', e.target.value)} placeholder="Enter blog title" className="min-h-[44px] focus-visible:ring-2 focus-visible:ring-[var(--color-brand-primary)] focus-visible:ring-opacity-50" />
handleInputChange('slug', e.target.value)} placeholder="blog-url-slug" className="min-h-[44px] focus-visible:ring-2 focus-visible:ring-[var(--color-brand-primary)] focus-visible:ring-opacity-50" />

URL: /blog/{blogData.slug || 'blog-url-slug'}