"use client"; import { motion } from "framer-motion"; import Link from "next/link"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { ContestTimer } from "./contest-timer"; import { Progress } from "@/components/ui/progress"; import { Calendar, Users, FileCode2, Zap, Clock, Trophy } from "lucide-react"; import { cn } from "@/lib/utils"; interface Contest { id: number; title: string; description?: string; start_time: string; end_time: string; is_active: boolean; problems_count?: number; participants_count?: number; user_solved?: number; } interface ContestCardProps { contest: Contest; className?: string; } function getContestStatus(contest: Contest): "upcoming" | "running" | "ended" { const now = new Date(); const start = new Date(contest.start_time); const end = new Date(contest.end_time); if (now < start) return "upcoming"; if (now >= end) return "ended"; return "running"; } function formatDate(date: string): string { return new Date(date).toLocaleString("ru-RU", { day: "numeric", month: "short", hour: "2-digit", minute: "2-digit", }); } const statusConfig = { running: { color: "var(--color-neon-green)", borderColor: "border-[var(--color-neon-green)]/50", glowColor: "shadow-[0_0_20px_rgba(0,255,136,0.15)]", badge: { variant: "success" as const, text: "LIVE", pulse: true }, icon: Zap, }, upcoming: { color: "var(--color-neon-cyan)", borderColor: "border-[var(--color-neon-cyan)]/30", glowColor: "", badge: { variant: "cyan" as const, text: "СКОРО", pulse: false }, icon: Clock, }, ended: { color: "var(--color-neon-purple)", borderColor: "border-[var(--color-border)]", glowColor: "", badge: { variant: "purple" as const, text: "ЗАВЕРШЁН", pulse: false }, icon: Trophy, }, }; export function ContestCard({ contest, className }: ContestCardProps) { const status = getContestStatus(contest); const config = statusConfig[status]; const progress = contest.problems_count && contest.user_solved !== undefined ? (contest.user_solved / contest.problems_count) * 100 : 0; const StatusIcon = config.icon; return ( {/* Top accent line */}
{/* Corner decorations */}
{contest.title}
{config.badge.text}
{/* Timer */} {status !== "ended" && (
)} {/* Stats */}
{formatDate(contest.start_time)}
{contest.problems_count !== undefined && (
{contest.problems_count}
)} {contest.participants_count !== undefined && (
{contest.participants_count}
)}
{/* Progress (if user has participated) */} {contest.user_solved !== undefined && contest.problems_count && (
PROGRESS {contest.user_solved}/{contest.problems_count}
)} {/* Hover effect line */}
); }