'use client'; import { useState, useEffect, useCallback, useTransition } from 'react'; import { DailyCheckbox } from '@/lib/types'; import { tasksClient } from '@/clients/tasks-client'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { addTodoToTask, toggleCheckbox } from '@/actions/daily'; interface RelatedTodosProps { taskId: string; } export function RelatedTodos({ taskId }: RelatedTodosProps) { const [checkboxes, setCheckboxes] = useState([]); const [loading, setLoading] = useState(true); const [newTodoText, setNewTodoText] = useState(''); const [newTodoDate, setNewTodoDate] = useState(''); const [showAddForm, setShowAddForm] = useState(false); const [isPending, startTransition] = useTransition(); const loadCheckboxes = useCallback(async () => { try { setLoading(true); const data = await tasksClient.getTaskCheckboxes(taskId); setCheckboxes(data); } catch (error) { console.error('Erreur lors du chargement des todos:', error); } finally { setLoading(false); } }, [taskId]); useEffect(() => { loadCheckboxes(); }, [loadCheckboxes]); const handleAddTodo = () => { if (!newTodoText.trim()) return; startTransition(async () => { try { // Si une date est spécifiée, l'utiliser, sinon undefined (aujourd'hui par défaut) const targetDate = newTodoDate ? new Date(newTodoDate) : undefined; const result = await addTodoToTask(taskId, newTodoText, targetDate); if (result.success) { // Recharger les checkboxes await loadCheckboxes(); setNewTodoText(''); setNewTodoDate(''); setShowAddForm(false); } else { console.error('Erreur lors de l\'ajout du todo:', result.error); } } catch (error) { console.error('Erreur lors de l\'ajout du todo:', error); } }); }; const handleToggleCheckbox = (checkboxId: string) => { startTransition(async () => { try { const result = await toggleCheckbox(checkboxId); if (result.success) { // Recharger les checkboxes await loadCheckboxes(); } else { console.error('Erreur lors du toggle:', result.error); } } catch (error) { console.error('Erreur lors du toggle:', error); } }); }; const formatDate = (date: Date | string) => { try { const dateObj = typeof date === 'string' ? new Date(date) : date; if (isNaN(dateObj.getTime())) { return 'Date invalide'; } return new Intl.DateTimeFormat('fr-FR', { day: 'numeric', month: 'short', year: 'numeric' }).format(dateObj); } catch (error) { console.error('Erreur formatage date:', error, date); return 'Date invalide'; } }; if (loading) { return (
Chargement...
); } return (
{/* Liste des todos existants */} {checkboxes.length > 0 ? (
{checkboxes.map((checkbox) => (
handleToggleCheckbox(checkbox.id)} disabled={isPending} className="w-4 h-4 mt-0.5 rounded border-[var(--border)] bg-[var(--input)] text-[var(--primary)] cursor-pointer disabled:cursor-not-allowed disabled:opacity-50" />
{checkbox.text}
📅 {formatDate(checkbox.date)}
))}
) : (
Aucun todo relié à cette tâche
)} {/* Section d'ajout */}
{!showAddForm ? ( ) : (
Nouveau todo
setNewTodoText(e.target.value)} disabled={isPending} autoFocus />
setNewTodoDate(e.target.value)} disabled={isPending} placeholder="Date (optionnel)" className="flex-1" />
{!newTodoDate && (
💡 Sans date, le todo sera ajouté à aujourd'hui
)}
)}
); }