"use client"; import { Play, Pause, Check, ArrowUpDown, CheckCircle } from "lucide-react"; import { cn } from "@/utils/cn"; import { Podcast, Episode } from "../types"; import { formatDuration, formatDate } from "../utils"; interface EpisodeListProps { podcast: Podcast; episodes: Episode[]; sortOrder: "newest" | "oldest"; onSortOrderChange: (order: "newest" | "oldest") => void; isEpisodePlaying: (episodeId: string) => boolean; isPlaying: boolean; onPlayPause: (episode: Episode) => void; onPlay: (episode: Episode) => void; onMarkComplete?: (episodeId: string, duration: number) => void; } export function EpisodeList({ podcast, episodes, sortOrder, onSortOrderChange, isEpisodePlaying, isPlaying, onPlayPause, onPlay, onMarkComplete, }: EpisodeListProps) { return (

All Episodes

{episodes.map((episode, index) => { const isCurrentEpisode = isEpisodePlaying(episode.id); const isInProgress = episode.progress && !episode.progress.isFinished && episode.progress.currentTime > 0; return (
{/* Progress bar at the bottom */} {episode.progress && episode.progress.progress > 0 && (
)}
{ if (!isCurrentEpisode) { onPlay(episode); } }} className="flex items-center gap-4 px-3 py-3 cursor-pointer" > {/* Number / Play/Pause Icon */}
{episode.progress?.isFinished ? ( ) : ( <> {index + 1} {isCurrentEpisode && isPlaying ? ( { e.stopPropagation(); onPlayPause(episode); }} /> ) : (
{/* Episode Info */}

{episode.title}

{formatDate(episode.publishedAt)} {episode.season && ( <> S{episode.season} )} {episode.episodeNumber && ( <> E{episode.episodeNumber} )} {episode.progress?.isFinished && ( <> Finished )} {isInProgress && episode.progress && ( <> {Math.floor(episode.progress.progress)}% )}
{/* Duration */} {formatDuration(episode.duration)} {/* Complete Button - visible on hover for incomplete episodes */} {onMarkComplete && !episode.progress?.isFinished && ( )}
); })}
); }