'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { Input } from '@/components/ui/Input'; export interface CheckboxItemData { id: string; text: string; isChecked: boolean; type?: 'task' | 'meeting' | string; taskId?: string; task?: { id: string; title: string; }; } interface CheckboxItemProps { item: CheckboxItemData; onToggle: (itemId: string) => Promise; onUpdate: (itemId: string, text: string, type?: string, taskId?: string) => Promise; onDelete: (itemId: string) => Promise; saving?: boolean; showTypeIndicator?: boolean; showTaskLink?: boolean; showEditButton?: boolean; showDeleteButton?: boolean; className?: string; } export function CheckboxItem({ item, onToggle, onUpdate, onDelete, saving = false, showTaskLink = true, showEditButton = true, showDeleteButton = true, className = '' }: CheckboxItemProps) { const [inlineEditingId, setInlineEditingId] = useState(null); const [inlineEditingText, setInlineEditingText] = useState(''); const [optimisticChecked, setOptimisticChecked] = useState(null); // État optimiste local pour une réponse immédiate const isChecked = optimisticChecked !== null ? optimisticChecked : item.isChecked; // Synchroniser l'état optimiste avec les changements externes useEffect(() => { if (optimisticChecked !== null && optimisticChecked === item.isChecked) { // L'état serveur a été mis à jour, on peut reset l'optimiste setOptimisticChecked(null); } }, [item.isChecked, optimisticChecked]); // Handler optimiste pour le toggle const handleOptimisticToggle = async () => { const newCheckedState = !isChecked; // Mise à jour optimiste immédiate setOptimisticChecked(newCheckedState); try { await onToggle(item.id); // Reset l'état optimiste après succès setOptimisticChecked(null); } catch (error) { // Rollback en cas d'erreur setOptimisticChecked(null); console.error('Erreur lors du toggle:', error); } }; // Édition inline simple const handleStartInlineEdit = () => { setInlineEditingId(item.id); setInlineEditingText(item.text); }; const handleSaveInlineEdit = async () => { if (!inlineEditingText.trim()) return; try { await onUpdate(item.id, inlineEditingText.trim(), item.type, item.taskId); setInlineEditingId(null); setInlineEditingText(''); } catch (error) { console.error('Erreur lors de la modification:', error); } }; const handleCancelInlineEdit = () => { setInlineEditingId(null); setInlineEditingText(''); }; const handleInlineEditKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault(); handleSaveInlineEdit(); } else if (e.key === 'Escape') { e.preventDefault(); handleCancelInlineEdit(); } }; // Obtenir la couleur de bordure selon le type const getTypeBorderColor = () => { if (item.type === 'meeting') return 'border-l-blue-500'; return 'border-l-green-500'; }; return (
{/* Checkbox */} {/* Contenu principal */} {inlineEditingId === item.id ? ( setInlineEditingText(e.target.value)} onKeyDown={handleInlineEditKeyPress} onBlur={handleSaveInlineEdit} autoFocus className="flex-1 h-7 text-sm" /> ) : (
{/* Texte cliquable pour édition inline */} {item.text} {/* Icône d'édition avancée */} {showEditButton && ( )}
)} {/* Lien vers la tâche si liée */} {showTaskLink && item.task && ( {item.task.title} )} {/* Bouton de suppression */} {showDeleteButton && ( )}
); }