- EpisodeCard: change 'Lu ?' → 'Marquer' so the toggle button no longer
shows a confusing question mark next to completed episodes
- Dashboard: fix episodes reappearing in 'Continuer l'écoute' after
navigation. handleToggleRead now does an optimistic update on BOTH
local state AND all TanStack Query cache pages (setQueriesData),
so the 'lu' state survives page navigation without a server roundtrip.
On error, cache is invalidated to revert to server truth.
- Dashboard: 'Découvrir' button now links to /add (discover new podcasts)
instead of /trending — was identical to 'Parcourir les tendances' button
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- AudioPlayer is now purely presentational — no internal <audio> element or state.
All playback state (currentTime, duration, volume, speed, mute, error, isResuming)
comes from AudioContext, which holds the persistent <audio> at provider level.
This prevents audio from cutting when navigating between pages.
- userId is synced into AudioContext via setUserId() so progress saving/loading
works without the player needing to manage it locally.
- EpisodeCard: isCompleted now triggers at ≥90% listened (progressPercent >= 0.9)
in addition to the isCompleted flag, so the LU badge appears correctly.
Progress bar also hidden when ≥90%.
- Dashboard: episodesInProgress now excludes episodes at ≥90% listened,
removing them from the "Continuer l'écoute" section once effectively finished.
setUserId() called after user loads to wire context progress saving.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the old compact floating bar (h-88px rounded-2rem with expand
button) with the same clean mini-bar design as the Dashboard sticky
sub-bar — artwork + title + seeks + play + time + speed/volume/expand/
close + thin progress bar. The Dashboard hero inline player is kept.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Refresh podcast title/author/imageUrl/description on RSS sync (fixes
legacy 'Unknown Podcast' records)
- Always-visible Resync button on Library cards
- LU badge on completed episodes, NOUVEAU badge on <7-day-old episodes
- AudioPlayer gains mode='inline' that embeds in the Dashboard hero card
- Floating player suppressed on /dashboard to avoid dual audio
- Sticky mini-bar appears via IntersectionObserver when inline player
scrolls out of view (shares the same <audio> element)
- Fix: 'Reprendre' button called undefined setSelectedEpisode; now calls
playEpisode
- Add progress field to Episode TS interface
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Traduit toutes les pages et composants en français (Dashboard, Login, Discover, Navigation, Header, EpisodeCard, AudioPlayer)
- Corrige l'erreur 500 sur /api/podcasts/discover : z.coerce.number() au lieu de z.number() pour limit/offset (paramètres query string)
- Corrige l'abonnement manuel via URL RSS : crée le podcast depuis le flux RSS au lieu de renvoyer 400
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>