From a870f7f3dc7a3bfb6e127970c8a86259012f13d1 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Thu, 25 Sep 2025 21:36:13 +0200 Subject: [PATCH] feat: add initial pending tasks support in DailyPage - Updated `DailyPageClient` to accept and pass `initialPendingTasks` to the `PendingTasksSection`. - Modified `page.tsx` to fetch pending tasks from the service and handle graceful fallbacks. - Adjusted `PendingTasksSection` to initialize state with `initialPendingTasks` and prevent unnecessary loading when initial data is present. --- src/app/daily/DailyPageClient.tsx | 7 +++++-- src/app/daily/page.tsx | 10 ++++++++-- src/components/daily/PendingTasksSection.tsx | 18 +++++++++++++----- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/app/daily/DailyPageClient.tsx b/src/app/daily/DailyPageClient.tsx index 8d520eb..7149612 100644 --- a/src/app/daily/DailyPageClient.tsx +++ b/src/app/daily/DailyPageClient.tsx @@ -3,7 +3,7 @@ import { useState, useEffect } from 'react'; import React from 'react'; import { useDaily } from '@/hooks/useDaily'; -import { DailyView, DailyCheckboxType } from '@/lib/types'; +import { DailyView, DailyCheckboxType, DailyCheckbox } from '@/lib/types'; import { DeadlineMetrics } from '@/services/analytics/deadline-analytics'; import { Button } from '@/components/ui/Button'; import { Card } from '@/components/ui/Card'; @@ -20,13 +20,15 @@ interface DailyPageClientProps { initialDailyDates?: string[]; initialDate?: Date; initialDeadlineMetrics?: DeadlineMetrics | null; + initialPendingTasks?: DailyCheckbox[]; } export function DailyPageClient({ initialDailyView, initialDailyDates = [], initialDate, - initialDeadlineMetrics + initialDeadlineMetrics, + initialPendingTasks = [] }: DailyPageClientProps = {}) { const { dailyView, @@ -306,6 +308,7 @@ export function DailyPageClient({ onDeleteCheckbox={handleDeleteCheckbox} onRefreshDaily={refreshDailySilent} refreshTrigger={refreshTrigger} + initialPendingTasks={initialPendingTasks} /> {/* Footer avec stats - dans le flux normal */} diff --git a/src/app/daily/page.tsx b/src/app/daily/page.tsx index 4e397ef..d98d836 100644 --- a/src/app/daily/page.tsx +++ b/src/app/daily/page.tsx @@ -17,10 +17,15 @@ export default async function DailyPage() { const today = getToday(); try { - const [dailyView, dailyDates, deadlineMetrics] = await Promise.all([ + const [dailyView, dailyDates, deadlineMetrics, pendingTasks] = await Promise.all([ dailyService.getDailyView(today), dailyService.getDailyDates(), - DeadlineAnalyticsService.getDeadlineMetrics().catch(() => null) // Graceful fallback + DeadlineAnalyticsService.getDeadlineMetrics().catch(() => null), // Graceful fallback + dailyService.getPendingCheckboxes({ + maxDays: 7, + excludeToday: true, + limit: 50 + }).catch(() => []) // Graceful fallback ]); return ( @@ -29,6 +34,7 @@ export default async function DailyPage() { initialDailyDates={dailyDates} initialDate={today} initialDeadlineMetrics={deadlineMetrics} + initialPendingTasks={pendingTasks} /> ); } catch (error) { diff --git a/src/components/daily/PendingTasksSection.tsx b/src/components/daily/PendingTasksSection.tsx index 07637be..039a030 100644 --- a/src/components/daily/PendingTasksSection.tsx +++ b/src/components/daily/PendingTasksSection.tsx @@ -13,16 +13,18 @@ interface PendingTasksSectionProps { onDeleteCheckbox: (checkboxId: string) => Promise; onRefreshDaily?: () => Promise; // Pour rafraîchir la vue daily principale refreshTrigger?: number; // Pour forcer le refresh depuis le parent + initialPendingTasks?: DailyCheckbox[]; // Données SSR } export function PendingTasksSection({ onToggleCheckbox, onDeleteCheckbox, onRefreshDaily, - refreshTrigger + refreshTrigger, + initialPendingTasks = [] }: PendingTasksSectionProps) { - const [isCollapsed, setIsCollapsed] = useState(true); - const [pendingTasks, setPendingTasks] = useState([]); + const [isCollapsed, setIsCollapsed] = useState(false); // Open by default + const [pendingTasks, setPendingTasks] = useState(initialPendingTasks); const [loading, setLoading] = useState(false); const [isPending, startTransition] = useTransition(); const [filters, setFilters] = useState({ @@ -52,9 +54,15 @@ export function PendingTasksSection({ // Charger au montage et quand les filtres changent useEffect(() => { if (!isCollapsed) { - loadPendingTasks(); + // Si on a des données initiales et qu'on utilise les filtres par défaut, ne pas recharger + const hasInitialData = initialPendingTasks.length > 0; + const usingDefaultFilters = filters.maxDays === 7 && filters.type === 'all' && filters.limit === 50; + + if (!hasInitialData || !usingDefaultFilters) { + loadPendingTasks(); + } } - }, [isCollapsed, filters, refreshTrigger, loadPendingTasks]); + }, [isCollapsed, filters, refreshTrigger, loadPendingTasks, initialPendingTasks.length]); // Gérer l'archivage d'une tâche const handleArchiveTask = async (checkboxId: string) => {