Files
football-next/app/matches/page.tsx
a.alinaghipour aa9ed69dd2 first commit
2026-04-05 15:53:20 +03:30

83 lines
3.0 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { db } from "@/lib/db";
const stageLabel: Record<string, string> = {
GROUP: "مرحله گروهی",
ROUND_OF_16: "یک‌هشتم نهایی",
QUARTER_FINAL: "یک‌چهارم نهایی",
SEMI_FINAL: "نیمه‌نهایی",
THIRD_PLACE: "رده‌بندی",
FINAL: "فینال",
};
const statusStyle: Record<string, string> = {
SCHEDULED: "bg-gray-100 text-gray-600",
LIVE: "bg-red-100 text-red-600 animate-pulse",
FINISHED: "bg-green-100 text-green-700",
};
const statusLabel: Record<string, string> = {
SCHEDULED: "برنامه‌ریزی شده",
LIVE: "🔴 زنده",
FINISHED: "پایان یافته",
};
export default async function MatchesPage() {
const matches = await db.match.findMany({
include: { homeTeam: true, awayTeam: true, round: true },
orderBy: { matchDate: "asc" },
});
const grouped = matches.reduce((acc, m) => {
const key = m.stage;
if (!acc[key]) acc[key] = [];
acc[key].push(m);
return acc;
}, {} as Record<string, typeof matches>);
return (
<div className="max-w-4xl mx-auto py-10 px-6">
<h1 className="text-3xl font-bold mb-8">بازیها</h1>
{Object.entries(grouped).map(([stage, stageMatches]) => (
<div key={stage} className="mb-10">
<h2 className="text-xl font-bold text-green-800 mb-4 border-b-2 border-green-200 pb-2">
{stageLabel[stage] ?? stage}
</h2>
<div className="flex flex-col gap-3">
{stageMatches.map((m) => (
<div key={m.id} className="bg-white rounded-2xl shadow p-5 flex items-center justify-between">
<div className="flex items-center gap-4 flex-1 justify-end">
<span className="font-bold text-lg">{m.homeTeam.name}</span>
<span className="text-2xl">{m.homeTeam.flagUrl ?? "🏳️"}</span>
</div>
<div className="mx-6 text-center min-w-[100px]">
{m.status === "FINISHED" || m.status === "LIVE" ? (
<div className="text-3xl font-bold">
{m.homeScore} - {m.awayScore}
</div>
) : (
<div className="text-sm text-gray-500">
{new Date(m.matchDate).toLocaleDateString("fa-IR")}
</div>
)}
<span className={`text-xs px-2 py-0.5 rounded-full mt-1 inline-block ${statusStyle[m.status]}`}>
{statusLabel[m.status]}
</span>
</div>
<div className="flex items-center gap-4 flex-1 justify-start">
<span className="text-2xl">{m.awayTeam.flagUrl ?? "🏳️"}</span>
<span className="font-bold text-lg">{m.awayTeam.name}</span>
</div>
</div>
))}
</div>
</div>
))}
{matches.length === 0 && (
<div className="text-center text-gray-400 py-20">هنوز بازیای ثبت نشده</div>
)}
</div>
);
}