92 lines
2.7 KiB
TypeScript
92 lines
2.7 KiB
TypeScript
// app/dashboard/page.tsx
|
|
// Dashboard - now with auto-refresh!
|
|
|
|
import { query } from '@/lib/db';
|
|
import { LiveDotIcon } from '@/components/ui/icons';
|
|
import DashboardClient from '@/components/dashboard/DashboardClient';
|
|
export const dynamic = "force-dynamic";
|
|
|
|
async function getConnectedDrivers() {
|
|
const sql = `
|
|
SELECT
|
|
u.driver_guid,
|
|
u.driver_name,
|
|
u.driver_team,
|
|
u.car_model,
|
|
u.car_skin,
|
|
u.user_rank,
|
|
u.laps_completed,
|
|
s.server_id,
|
|
s.server_name,
|
|
s.server_track,
|
|
s.server_config,
|
|
s.session_type,
|
|
s.session_flag,
|
|
s.session_time,
|
|
s.session_laps,
|
|
s.session_elapsed_time,
|
|
s.session_ambient_temp,
|
|
s.session_road_temp,
|
|
s.connected_players
|
|
FROM users u
|
|
INNER JOIN servers s ON u.current_server = s.server_id
|
|
WHERE u.is_connect = true
|
|
ORDER BY s.server_id, u.user_rank ASC
|
|
`;
|
|
|
|
const rows = await query(sql);
|
|
|
|
return rows.map((row: any) => ({
|
|
driver_guid: row.driver_guid,
|
|
driver_name: row.driver_name,
|
|
driver_team: row.driver_team,
|
|
car_model: row.car_model,
|
|
car_skin: row.car_skin,
|
|
laps_completed: row.laps_completed,
|
|
user_rank: row.user_rank,
|
|
server: {
|
|
server_id: row.server_id,
|
|
server_name: row.server_name,
|
|
server_track: row.server_track,
|
|
server_config: row.server_config,
|
|
session_type: row.session_type,
|
|
session_flag: row.session_flag,
|
|
session_time: row.session_time,
|
|
session_laps: row.session_laps,
|
|
session_elapsed_time: row.session_elapsed_time,
|
|
session_ambient_temp: row.session_ambient_temp,
|
|
session_road_temp: row.session_road_temp,
|
|
connected_players: row.connected_players,
|
|
},
|
|
}));
|
|
}
|
|
|
|
export default async function DashboardPage() {
|
|
const initialDrivers = await getConnectedDrivers();
|
|
|
|
return (
|
|
<>
|
|
{/* Hero */}
|
|
<div className="relative border-b border-white/10 grid-overlay">
|
|
<div className="max-w-7xl mx-auto px-6 py-16">
|
|
<div className="space-y-4">
|
|
<div className="inline-flex items-center space-x-2 px-3 py-1 border border-white/20">
|
|
<LiveDotIcon className="w-2 h-2 text-white animate-pulse" />
|
|
<span className="text-xs font-medium tracking-wider">LIVE SYSTEM</span>
|
|
</div>
|
|
<h1 className="text-6xl font-bold tracking-tight">
|
|
LIVE DASHBOARD
|
|
</h1>
|
|
<p className="text-white/60 text-lg max-w-2xl">
|
|
Real-time telemetry and session monitoring across all OpenWheels Racing infrastructure
|
|
</p>
|
|
</div>
|
|
|
|
{/* Client component with auto-refresh */}
|
|
<DashboardClient initialDrivers={initialDrivers} />
|
|
</div>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|