'use client'; import { useState, useTransition } from 'react'; import { Button, Input } from '@/components/ui'; import { addGifMoodItem } from '@/actions/gif-mood'; import { GIF_MOOD_MAX_ITEMS } from '@/lib/types'; interface GifMoodAddFormProps { sessionId: string; currentCount: number; } export function GifMoodAddForm({ sessionId, currentCount }: GifMoodAddFormProps) { const [open, setOpen] = useState(false); const [gifUrl, setGifUrl] = useState(''); const [note, setNote] = useState(''); const [previewUrl, setPreviewUrl] = useState(''); const [error, setError] = useState(null); const [isPending, startTransition] = useTransition(); const remaining = GIF_MOOD_MAX_ITEMS - currentCount; function handleUrlBlur() { const trimmed = gifUrl.trim(); if (!trimmed) { setPreviewUrl(''); return; } try { new URL(trimmed); setPreviewUrl(trimmed); setError(null); } catch { setPreviewUrl(''); } } function handleSubmit(e: React.FormEvent) { e.preventDefault(); setError(null); const trimmed = gifUrl.trim(); if (!trimmed) { setError("L'URL est requise"); return; } try { new URL(trimmed); } catch { setError('URL invalide'); return; } startTransition(async () => { const result = await addGifMoodItem(sessionId, { gifUrl: trimmed, note: note.trim() || undefined, }); if (result.success) { setGifUrl(''); setNote(''); setPreviewUrl(''); setOpen(false); } else { setError(result.error || "Erreur lors de l'ajout"); } }); } // Collapsed state — placeholder card if (!open) { return ( ); } // Expanded form return (
Ajouter un GIF
{error && (

{error}

)} setGifUrl(e.target.value)} onBlur={handleUrlBlur} placeholder="https://media.giphy.com/…" disabled={isPending} /> {previewUrl && (
{/* eslint-disable-next-line @next/next/no-img-element */} Aperçu setPreviewUrl('')} />
)}