"use client"; import { useTransition, useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { createSlide, updateSlide, searchBusinesses } from '@/app/actions/slides'; import { Loader2, ArrowLeft, Save, Search, Check, X, ImageIcon, Briefcase } from 'lucide-react'; import Link from 'next/link'; import { toast } from 'react-hot-toast'; import ImageUploader from './ImageUploader'; interface Props { initialData?: any; } export default function SlideForm({ initialData }: Props) { const router = useRouter(); const [isPending, startTransition] = useTransition(); // Form state const [type, setType] = useState(initialData?.type || 'CUSTOM'); const [imageUrl, setImageUrl] = useState(initialData?.imageUrl || ''); const [isActive, setIsActive] = useState(initialData?.isActive ?? true); // Business search state const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [selectedBusiness, setSelectedBusiness] = useState(initialData?.business || null); const [isSearching, setIsSearching] = useState(false); useEffect(() => { if (searchQuery.length > 1) { const delayDebounceFn = setTimeout(() => { setIsSearching(true); searchBusinesses(searchQuery).then(results => { setSearchResults(results); setIsSearching(false); }); }, 300); return () => clearTimeout(delayDebounceFn); } else { setSearchResults([]); } }, [searchQuery]); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); const formData = new FormData(event.currentTarget); const data = { type, businessId: type === 'BUSINESS' ? selectedBusiness?.id : null, title: formData.get('title') as string, subtitle: formData.get('subtitle') as string, imageUrl: type === 'CUSTOM' ? imageUrl : (selectedBusiness?.logoUrl || ''), linkUrl: type === 'CUSTOM' ? formData.get('linkUrl') as string : `/annuaire/${selectedBusiness?.id}`, order: parseInt(formData.get('order') as string) || 0, isActive, }; if (type === 'BUSINESS' && !data.businessId) { toast.error("Veuillez sélectionner une entreprise"); return; } if (type === 'CUSTOM' && !data.imageUrl) { toast.error("Une image est requise pour une slide personnalisée"); return; } startTransition(async () => { const result = initialData ? await updateSlide(initialData.id, data) : await createSlide(data); if (result.success) { toast.success(initialData ? "Slide mise à jour" : "Slide créée avec succès"); router.push('/slides'); router.refresh(); } else { toast.error(result.error || "Une erreur est survenue"); } }); }; return (

{initialData ? 'Modifier la Slide' : 'Nouvelle Slide'}

Type de Slide

{type === 'BUSINESS' ? (
{selectedBusiness ? (
{selectedBusiness.name}
{selectedBusiness.location}
) : (
setSearchQuery(e.target.value)} placeholder="Tapez le nom d'une entreprise..." 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" /> {isSearching && (
)} {searchResults.length > 0 && (
{searchResults.map((biz) => ( ))}
)}
)}
L'image, le titre et le lien seront automatiquement récupérés depuis la fiche de l'entreprise.
) : (
)}

Paramètres d'Affichage

Les slides sont triées par ordre croissant.

Statut de la slide
); }