You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.9 KiB
65 lines
1.9 KiB
import { Video } from '../../types/api'; |
|
import './VideoCard.css'; |
|
|
|
interface VideoCardProps { |
|
video: Video; |
|
onClick: () => void; |
|
} |
|
|
|
export function VideoCard({ video, onClick }: VideoCardProps) { |
|
const formatViews = (count: number): string => { |
|
if (count >= 1000000) { |
|
return `${(count / 1000000).toFixed(1)}M`; |
|
} else if (count >= 1000) { |
|
return `${(count / 1000).toFixed(1)}K`; |
|
} |
|
return count.toString(); |
|
}; |
|
|
|
const getTimeAgo = (dateString: string): string => { |
|
const date = new Date(dateString); |
|
const now = new Date(); |
|
const diffMs = now.getTime() - date.getTime(); |
|
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); |
|
|
|
if (diffDays === 0) return 'Today'; |
|
if (diffDays === 1) return 'Yesterday'; |
|
if (diffDays < 7) return `${diffDays} days ago`; |
|
if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`; |
|
if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`; |
|
return `${Math.floor(diffDays / 365)} years ago`; |
|
}; |
|
|
|
return ( |
|
<div className="video-card" onClick={onClick}> |
|
<div className="video-thumbnail-container"> |
|
<img |
|
src={video.thumbnailUrl} |
|
alt={video.title} |
|
className="video-thumbnail" |
|
/> |
|
<span className="video-duration">{video.durationFormatted}</span> |
|
</div> |
|
|
|
<div className="video-info"> |
|
<img |
|
src={video.channelThumbnail} |
|
alt={video.channelName} |
|
className="channel-avatar" |
|
/> |
|
<div className="video-details"> |
|
<h3 className="video-title">{video.title}</h3> |
|
<p className="video-metadata"> |
|
<span className="channel-name">{video.channelName}</span> |
|
<span className="video-stats"> |
|
{formatViews(video.viewCount)} views • {getTimeAgo(video.publishedAt)} |
|
</span> |
|
</p> |
|
</div> |
|
</div> |
|
</div> |
|
); |
|
} |
|
|
|
|
|
|
|
|