diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..a5b75d7 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,7 @@ +{ + "permissions": { + "allow": [ + "Bash(rtk tsc *)" + ] + } +} diff --git a/frontend/src/components/EpisodeCard.tsx b/frontend/src/components/EpisodeCard.tsx index 67d7bce..7dd3196 100644 --- a/frontend/src/components/EpisodeCard.tsx +++ b/frontend/src/components/EpisodeCard.tsx @@ -1,16 +1,17 @@ import React from 'react'; import { Episode } from '../services/episodeService'; -import { Play, Calendar, Activity, Check, Sparkles } from 'lucide-react'; +import { Play, Pause, Calendar, Activity, Check, CheckCircle2, Circle } from 'lucide-react'; import { useAudio } from '../context/AudioContext'; interface EpisodeCardProps { episode: Episode; onPlay: (episode: Episode) => void; onDetails?: (episode: Episode) => void; + onToggleRead?: (episode: Episode, completed: boolean) => void; } -export default function EpisodeCard({ episode, onPlay, onDetails }: EpisodeCardProps) { - const { currentEpisode, isPlaying } = useAudio(); +export default function EpisodeCard({ episode, onPlay, onDetails, onToggleRead }: EpisodeCardProps) { + const { currentEpisode, isPlaying, togglePlay } = useAudio(); const isCurrent = currentEpisode?._id === episode._id; const podcast = typeof episode.podcastId === 'object' ? episode.podcastId : null; const pubDate = new Date(episode.pubDate).toLocaleDateString('fr-FR', { @@ -41,7 +42,16 @@ export default function EpisodeCard({ episode, onPlay, onDetails }: EpisodeCardP const handlePlayClick = (e: React.MouseEvent) => { e.stopPropagation(); - onPlay(episode); + if (isCurrent) { + togglePlay(); + } else { + onPlay(episode); + } + }; + + const handleToggleRead = (e: React.MouseEvent) => { + e.stopPropagation(); + if (onToggleRead) onToggleRead(episode, !isCompleted); }; return ( @@ -72,12 +82,15 @@ export default function EpisodeCard({ episode, onPlay, onDetails }: EpisodeCardP {/* Hover Play Button Overlay */} -
-
+
- + {isCurrent && isPlaying + ? + : + }
@@ -113,6 +126,23 @@ export default function EpisodeCard({ episode, onPlay, onDetails }: EpisodeCardP {pubDate}
+ {onToggleRead && ( + + )} diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index af44935..23eb70d 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -40,6 +40,25 @@ export default function Dashboard() { setIsDetailsOpen(true); }; + const handleToggleRead = async (episode: Episode, completed: boolean) => { + 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 + ) + ); + } catch (error) { + console.error('Failed to toggle read state:', error); + } + }; + // Load user useEffect(() => { const loadUser = async () => { @@ -191,6 +210,7 @@ export default function Dashboard() { episode={episode} onPlay={playEpisode} onDetails={handleOpenDetails} + onToggleRead={handleToggleRead} /> ))} @@ -223,6 +243,7 @@ export default function Dashboard() { episode={episode} onPlay={playEpisode} onDetails={handleOpenDetails} + onToggleRead={handleToggleRead} /> ))}