From 8d4a2d5e504d6ad988bc56ff31f0321c6e8942c5 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 28 Nov 2025 20:49:55 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20persister=20l'=C3=A9tat=20du=20Pomodoro?= =?UTF-8?q?=20Timer=20avec=20localStorage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Sauvegarder l'état du timer (mode, temps restant, état running, sessions) dans localStorage - Restaurer l'état au montage du composant - Le timer ne se réinitialise plus quand le modal se ferme et se rouvre - Simplifier le PomodoroModal pour utiliser children directement --- src/components/PomodoroModal.tsx | 8 +++---- src/components/PomodoroTimer.tsx | 38 ++++++++++++++++++++++++++++---- src/pages/Index.tsx | 9 +++++--- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/components/PomodoroModal.tsx b/src/components/PomodoroModal.tsx index 47c83cf..538e148 100644 --- a/src/components/PomodoroModal.tsx +++ b/src/components/PomodoroModal.tsx @@ -1,18 +1,18 @@ +import { ReactNode } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; -import { PomodoroTimer } from "./PomodoroTimer"; interface PomodoroModalProps { open: boolean; onOpenChange: (open: boolean) => void; - onTimerStateChange?: (isRunning: boolean, timeLeft: number, mode: string) => void; + children: ReactNode; } -export function PomodoroModal({ open, onOpenChange, onTimerStateChange }: PomodoroModalProps) { +export function PomodoroModal({ open, onOpenChange, children }: PomodoroModalProps) { return ( @@ -20,7 +20,7 @@ export function PomodoroModal({ open, onOpenChange, onTimerStateChange }: Pomodo Pomodoro Timer
- + {children}
diff --git a/src/components/PomodoroTimer.tsx b/src/components/PomodoroTimer.tsx index 351a055..0aaa4a8 100644 --- a/src/components/PomodoroTimer.tsx +++ b/src/components/PomodoroTimer.tsx @@ -20,12 +20,42 @@ interface PomodoroTimerProps { } export function PomodoroTimer({ onStateChange }: PomodoroTimerProps = {}) { - const [mode, setMode] = useState('work'); - const [timeLeft, setTimeLeft] = useState(TIMER_DURATIONS.work); - const [isRunning, setIsRunning] = useState(false); - const [sessionsCompleted, setSessionsCompleted] = useState(0); + // Load initial state from localStorage + const [mode, setMode] = useState(() => { + const saved = localStorage.getItem('pomodoroMode'); + return (saved as TimerMode) || 'work'; + }); + const [timeLeft, setTimeLeft] = useState(() => { + const saved = localStorage.getItem('pomodoroTimeLeft'); + return saved ? parseInt(saved) : TIMER_DURATIONS.work; + }); + const [isRunning, setIsRunning] = useState(() => { + const saved = localStorage.getItem('pomodoroIsRunning'); + return saved === 'true'; + }); + const [sessionsCompleted, setSessionsCompleted] = useState(() => { + const saved = localStorage.getItem('pomodoroSessionsCompleted'); + return saved ? parseInt(saved) : 0; + }); const intervalRef = useRef(null); + // Save state to localStorage whenever it changes + useEffect(() => { + localStorage.setItem('pomodoroMode', mode); + }, [mode]); + + useEffect(() => { + localStorage.setItem('pomodoroTimeLeft', timeLeft.toString()); + }, [timeLeft]); + + useEffect(() => { + localStorage.setItem('pomodoroIsRunning', isRunning.toString()); + }, [isRunning]); + + useEffect(() => { + localStorage.setItem('pomodoroSessionsCompleted', sessionsCompleted.toString()); + }, [sessionsCompleted]); + // Function to play notification sound using Web Audio API const playNotificationSound = () => { try { diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 677d175..ffef0e6 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -1,4 +1,5 @@ -import { useEffect, useState, useRef, useCallback } from "react"; +import { useEffect, useState, useRef, useCallback, useId } from "react"; +import { createPortal } from "react-dom"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; @@ -38,6 +39,7 @@ import { TemplateSelector } from "@/components/TemplateSelector"; import type { NoteTemplate } from "@/utils/noteTemplates"; import { AdvancedSearch, type SearchFilters, type TagOption } from "@/components/AdvancedSearch"; import { PomodoroModal } from "@/components/PomodoroModal"; +import { PomodoroTimer } from "@/components/PomodoroTimer"; import { KanbanBoard } from "@/components/KanbanBoard"; import { getSmartTagSuggestions } from "@/utils/smartTags"; import { QuickCaptureWidget } from "@/components/QuickCaptureWidget"; @@ -3217,8 +3219,9 @@ const Index = () => { + > + + {/* Quick Capture Widget */}