"use client"; import { useTransition, useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { createBlogPost, updateBlogPost } from '@/app/actions/blog'; import { Loader2, ArrowLeft, Save, Calendar, CheckCircle2, FileText, Archive } from 'lucide-react'; import Link from 'next/link'; import { toast } from 'react-hot-toast'; import RichTextEditor from './RichTextEditor'; import ImageUploader from './ImageUploader'; import TagInput from './TagInput'; import { ContentStatus } from '@prisma/client'; import { getAllTags } from '@/app/actions/taxonomies'; interface Props { initialData?: { id: string; title: string; excerpt: string; content: string; author: string; imageUrl: string; slug?: string | null; tags?: string[]; metaTitle?: string | null; metaDescription?: string | null; publishedAt?: Date | string | null; status?: ContentStatus; }; } export default function BlogForm({ initialData }: Props) { const router = useRouter(); const [isPending, startTransition] = useTransition(); const [content, setContent] = useState(initialData?.content || ''); const [imageUrl, setImageUrl] = useState(initialData?.imageUrl || ''); const [tags, setTags] = useState(initialData?.tags || []); const [allExistingTags, setAllExistingTags] = useState([]); const [publishedAtValue, setPublishedAtValue] = useState( initialData?.publishedAt ? new Date(initialData.publishedAt).toISOString().slice(0, 16) : new Date().toISOString().slice(0, 16) ); const isPublished = new Date(publishedAtValue) <= new Date(); useEffect(() => { getAllTags().then(setAllExistingTags); }, []); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); const formData = new FormData(event.currentTarget); const publishedAtStr = formData.get('publishedAt') as string; const data = { title: formData.get('title') as string, slug: formData.get('slug') as string, excerpt: formData.get('excerpt') as string, content: content, author: formData.get('author') as string, imageUrl: imageUrl, // Use state value tags: tags, // Use state value metaTitle: formData.get('metaTitle') as string, metaDescription: formData.get('metaDescription') as string, publishedAt: publishedAtStr ? new Date(publishedAtStr) : undefined, status: formData.get('status') as ContentStatus, }; if (!data.imageUrl) { toast.error("Une image est requise"); return; } startTransition(async () => { const result = initialData ? await updateBlogPost(initialData.id, data) : await createBlogPost(data); if (result.success) { toast.success(initialData ? "Article mis à jour" : "Article créé avec succès"); router.push('/blog'); router.refresh(); } else { toast.error(result.error || "Une erreur est survenue"); } }); }; return (

{initialData ? 'Modifier l\'article' : 'Nouvel Article'}

Informations Générales

setPublishedAtValue(e.target.value)} className="w-full bg-slate-900 border border-slate-700 rounded-lg p-3 pl-10 text-white focus:outline-none focus:border-indigo-500" />