diff --git a/frontend/src/components/EpisodeCard.tsx b/frontend/src/components/EpisodeCard.tsx index 6ce6655..b805a2e 100644 --- a/frontend/src/components/EpisodeCard.tsx +++ b/frontend/src/components/EpisodeCard.tsx @@ -139,7 +139,7 @@ export default function EpisodeCard({ episode, onPlay, onDetails, onToggleRead } ? : } - {isCompleted ? 'Lu' : 'Lu ?'} + {isCompleted ? 'Lu' : 'Marquer'} )} diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index 1853ef4..e232be9 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { useQuery } from '@tanstack/react-query'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; import { Link } from 'react-router-dom'; import { episodeService, Episode } from '../services/episodeService'; import { authService } from '../services/authService'; @@ -13,6 +13,7 @@ import { Sparkles, Play, Clock, TrendingUp, Loader, RefreshCcw } from 'lucide-re export default function Dashboard() { const { playEpisode, currentEpisode, closePlayer, setUserId } = useAudio(); + const queryClient = useQueryClient(); const [user, setUser] = useState(null); const [detailsEpisode, setDetailsEpisode] = useState(null); const [isDetailsOpen, setIsDetailsOpen] = useState(false); @@ -41,21 +42,29 @@ export default function Dashboard() { }; const handleToggleRead = async (episode: Episode, completed: boolean) => { + const newProgress = { position: completed ? episode.duration : 0, isCompleted: completed }; + // Optimistic update: local state + all cached query pages + setEpisodes(prev => + prev.map(ep => ep._id === episode._id ? { ...ep, progress: newProgress } : ep) + ); + queryClient.setQueriesData( + { queryKey: ['episodes', 'latest'], exact: false }, + (old: any) => { + if (!old?.episodes) return old; + return { + ...old, + episodes: old.episodes.map((ep: Episode) => + ep._id === episode._id ? { ...ep, progress: newProgress } : ep + ), + }; + } + ); try { - await episodeService.saveProgress( - episode._id, - completed ? episode.duration : 0, - completed - ); - setEpisodes(prev => - prev.map(ep => - ep._id === episode._id - ? { ...ep, progress: { position: completed ? ep.duration : 0, isCompleted: completed } } - : ep - ) - ); + await episodeService.saveProgress(episode._id, newProgress.position, completed); } catch (error) { console.error('Failed to toggle read state:', error); + // Revert on error + queryClient.invalidateQueries({ queryKey: ['episodes', 'latest'] }); } }; @@ -181,9 +190,9 @@ export default function Dashboard() { Reprendre : {episodesInProgress[0].title.substring(0, 20)}... ) : ( - + - Découvrir + Découvrir des podcasts )}