Version 1.0 - Stable

This commit is contained in:
2026-01-06 16:59:05 +00:00
parent 8de538cc29
commit 81b497517e
9 changed files with 7038 additions and 7068 deletions
+30 -96
View File
@@ -1,4 +1,4 @@
// app/events/[id]/results/page.tsx
// app/events/[event_id]/results/page.tsx
// Event championship results page with auto-refresh
import { query } from '@/lib/db';
@@ -22,7 +22,11 @@ interface TeamStanding {
}[];
}
async function getEventResults(eventId: string) {
async function getEventResults(eventId: number) {
if (eventId == undefined) {
return { event: null, standings: [] };
}
// Get event info
const eventSql = `
SELECT
@@ -34,7 +38,7 @@ async function getEventResults(eventId: string) {
FROM events
WHERE event_id = $1
`;
const events = await query(eventSql, [eventId]);
const events = await query(eventSql, [String(eventId)]);
const event = events[0];
// Get team standings with driver details
@@ -76,8 +80,18 @@ function getPositionColor(position: number): string {
return 'bg-white/5 border-white/10 text-white/60';
}
export default async function EventResultsPage({ params }: { params: { id: string } }) {
const { event, standings } = await getEventResults(params.id);
export default async function EventResultsPage({
params,
}: {
params: Promise<{ event_id: number }>;
}) {
const { event_id } = await params;
console.log('Fetching results for event ID:', event_id);
const { event, standings } = await getEventResults(event_id);
if (!event) {
return (
@@ -96,7 +110,7 @@ export default async function EventResultsPage({ params }: { params: { id: strin
<div className="max-w-7xl mx-auto px-6 py-16">
<div className="space-y-4">
<Link
href={`/events/${params.id}`}
href={`/events/${event_id}`}
className="inline-flex items-center space-x-2 text-white/60 hover:text-white transition-colors text-sm"
>
<span></span>
@@ -104,7 +118,6 @@ export default async function EventResultsPage({ params }: { params: { id: strin
</Link>
<div className="flex items-center space-x-3">
<TrophyIcon className="w-12 h-12 text-yellow-500" />
<div>
<h1 className="text-5xl font-bold tracking-tight">
CHAMPIONSHIP RESULTS
@@ -120,101 +133,22 @@ export default async function EventResultsPage({ params }: { params: { id: strin
{/* Team Championship Standings */}
<div className="max-w-7xl mx-auto px-6 py-12">
{standings.length === 0 ? (
<div className="border border-white/10 p-16 text-center bg-black">
<TrophyIcon className="w-16 h-16 mx-auto mb-6 text-white/20" />
<p className="text-white/40 text-base tracking-wider">NO RESULTS YET</p>
<p className="text-white/20 text-sm mt-2">Results will appear after the event concludes</p>
</div>
) : (
<div className="space-y-4">
{standings.map((team: TeamStanding, index: number) => (
<div
key={team.team_id}
className={`border p-6 transition-all ${getPositionColor(index + 1)}`}
>
<div className="flex items-start justify-between mb-4">
<div className="flex items-center space-x-4">
{/* Position Badge */}
<div className="w-16 h-16 border-2 flex items-center justify-center">
<span className="text-3xl font-bold">
{index + 1}
</span>
</div>
{/* Team Info */}
<div>
<h2 className="text-2xl font-bold tracking-tight">
{team.team_name}
</h2>
<div className="flex items-center space-x-4 mt-2 text-sm text-white/60">
<div className="flex items-center space-x-1">
<UsersIcon className="w-4 h-4" />
<span>{team.drivers.length} {team.drivers.length === 1 ? 'Driver' : 'Drivers'}</span>
</div>
<div className="flex items-center space-x-1">
<FlagIcon className="w-4 h-4" />
<span>Best Finish: P{team.best_finish}</span>
</div>
</div>
</div>
</div>
{/* Total Points */}
<div className="text-right">
<div className="text-5xl font-bold tracking-tight">
{team.total_points}
</div>
<div className="text-sm text-white/60 tracking-wider">POINTS</div>
</div>
</div>
{/* Driver Results */}
<div className="border-t border-white/10 pt-4 mt-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
{team.drivers.map((driver: any) => (
<div
key={driver.driver_guid}
className="flex items-center justify-between p-3 bg-black/30 border border-white/5"
>
<div className="flex items-center space-x-3">
<div className={`w-8 h-8 border flex items-center justify-center text-xs font-bold ${
driver.position <= 3 ? 'border-white/30' : 'border-white/10'
}`}>
P{driver.position}
</div>
<div>
<div className="font-semibold text-sm">{driver.driver_name}</div>
{driver.dnf && (
<div className="text-xs text-red-400">DNF</div>
)}
</div>
</div>
<div className="text-right">
<div className="font-bold text-lg">{driver.points_awarded}</div>
<div className="text-xs text-white/40">pts</div>
</div>
</div>
))}
</div>
</div>
</div>
))}
</div>
)}
<EventResultsClient
eventId={event_id}
initialStandings={standings}
/>
{/* Points System Info */}
<div className="mt-8 border border-white/10 p-6 bg-black">
<h3 className="text-sm font-bold tracking-wider text-white/60 mb-4">POINTS SYSTEM</h3>
<div className="grid grid-cols-2 md:grid-cols-5 gap-4 text-sm">
<div><span className="font-mono text-white/80">P1:</span> <span className="font-bold">25 pts</span></div>
<div><span className="font-mono text-white/80">P2:</span> <span className="font-bold">18 pts</span></div>
<div><span className="font-mono text-white/80">P3:</span> <span className="font-bold">15 pts</span></div>
<div><span className="font-mono text-white/80">P4:</span> <span className="font-bold">12 pts</span></div>
<div><span className="font-mono text-white/80">P5:</span> <span className="font-bold">10 pts</span></div>
<div className="grid grid-cols-2 md:grid-cols-4 gap-4 text-sm">
<div><span className="font-mono text-white/80">P1:</span> <span className="font-bold">5 pts</span></div>
<div><span className="font-mono text-white/80">P2:</span> <span className="font-bold">3 pts</span></div>
<div><span className="font-mono text-white/80">P3:</span> <span className="font-bold">2 pts</span></div>
<div><span className="font-mono text-white/80">P4...:</span> <span className="font-bold">1 pts</span></div>
</div>
<p className="text-xs text-white/40 mt-4">
Team points are the sum of all driver points from that team in the event
Team points are the sum of all driver points from that team in the event Updates every 5 seconds
</p>
</div>
</div>