Files
football-next/app/(admin)/admin/teams/TeamApprovalRow.tsx
a.alinaghipour aa9ed69dd2 first commit
2026-04-05 15:53:20 +03:30

83 lines
3.5 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.
"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
import PositionBadge from "@/components/PositionBadge";
export default function TeamApprovalRow({ team }: { team: any }) {
const router = useRouter();
const [loading, setLoading] = useState(false);
const [open, setOpen] = useState(false);
async function updateStatus(status: "APPROVED" | "REJECTED") {
setLoading(true);
await fetch(`/api/admin/teams/${team.id}`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ status }),
});
router.refresh();
setLoading(false);
}
const starters = team.players.filter((tp: any) => !tp.isBench);
const bench = team.players.filter((tp: any) => tp.isBench);
return (
<div className="bg-white rounded-2xl shadow border-2 border-yellow-200">
<div className="p-5 flex items-center justify-between">
<div>
<div className="font-bold text-lg">{team.name}</div>
<div className="text-sm text-gray-500">{team.user.name ?? team.user.email} · ترکیب {team.formation} · {team.players.length} بازیکن</div>
</div>
<div className="flex items-center gap-3">
<button onClick={() => setOpen((v) => !v)} className="text-sm text-blue-600 hover:underline">
{open ? "بستن" : "مشاهده تیم"}
</button>
<button onClick={() => updateStatus("REJECTED")} disabled={loading}
className="bg-red-100 text-red-600 px-4 py-2 rounded-xl text-sm font-medium hover:bg-red-200 transition disabled:opacity-50">
رد
</button>
<button onClick={() => updateStatus("APPROVED")} disabled={loading}
className="bg-green-700 text-white px-4 py-2 rounded-xl text-sm font-medium hover:bg-green-800 transition disabled:opacity-50">
تایید
</button>
</div>
</div>
{open && (
<div className="border-t px-5 pb-5">
<div className="grid grid-cols-2 gap-4 mt-4">
<div>
<p className="text-sm font-medium text-gray-600 mb-2">ترکیب اصلی ({starters.length})</p>
<div className="flex flex-col gap-1">
{starters.map((tp: any) => (
<div key={tp.playerId} className="flex items-center justify-between text-sm bg-gray-50 rounded-lg px-3 py-1.5">
<span className="font-medium">{tp.player.name}</span>
<div className="flex items-center gap-2">
<span className="text-xs text-gray-400">{tp.player.country.flagUrl}</span>
<PositionBadge position={tp.player.position} />
{tp.isCaptain && <span className="text-yellow-600 text-xs font-bold">©</span>}
</div>
</div>
))}
</div>
</div>
<div>
<p className="text-sm font-medium text-gray-600 mb-2">ذخیرهها ({bench.length})</p>
<div className="flex flex-col gap-1">
{bench.map((tp: any) => (
<div key={tp.playerId} className="flex items-center justify-between text-sm bg-gray-50 rounded-lg px-3 py-1.5">
<span className="font-medium">{tp.player.name}</span>
<PositionBadge position={tp.player.position} />
</div>
))}
</div>
</div>
</div>
</div>
)}
</div>
);
}