fix: updated from 9.3.3 to 15
This commit is contained in:
parent
27806f438f
commit
8589c83fb8
@ -43,7 +43,7 @@ export async function GET(request: Request) {
|
|||||||
const rows = await query(sql);
|
const rows = await query(sql);
|
||||||
|
|
||||||
// Transform to proper structure
|
// Transform to proper structure
|
||||||
const drivers: DriverWithServer[] = rows.map((row: any) => ({
|
const drivers: DriverWithServer[] = rows.map((row: unkown) => ({
|
||||||
driver_guid: row.driver_guid,
|
driver_guid: row.driver_guid,
|
||||||
driver_name: row.driver_name,
|
driver_name: row.driver_name,
|
||||||
driver_team: row.driver_team,
|
driver_team: row.driver_team,
|
||||||
@ -85,24 +85,3 @@ export async function GET(request: Request) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// POST endpoint for updating driver data (optional, for future use)
|
|
||||||
export async function POST(request: Request) {
|
|
||||||
try {
|
|
||||||
const body = await request.json();
|
|
||||||
|
|
||||||
// Add your update logic here
|
|
||||||
// Example: Update driver rank, stats, etc.
|
|
||||||
|
|
||||||
return NextResponse.json({
|
|
||||||
success: true,
|
|
||||||
message: 'Driver updated',
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error updating driver:', error);
|
|
||||||
return NextResponse.json(
|
|
||||||
{ success: false, error: 'Failed to update driver' },
|
|
||||||
{ status: 500 }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -51,7 +51,7 @@ export async function POST(request: Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if event exists and is open
|
// Check if event exists and is open
|
||||||
const eventCheck: any = await queryOne(
|
const eventCheck: unknown = await queryOne(
|
||||||
`SELECT event_id, event_status, max_participants,
|
`SELECT event_id, event_status, max_participants,
|
||||||
(SELECT COUNT(*) FROM event_registrations
|
(SELECT COUNT(*) FROM event_registrations
|
||||||
WHERE event_id = $1 AND status = 'REGISTERED') as current_registrations
|
WHERE event_id = $1 AND status = 'REGISTERED') as current_registrations
|
||||||
|
|||||||
@ -31,7 +31,7 @@ async function updateRankCache() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
rankCache.clear();
|
rankCache.clear();
|
||||||
users.forEach((row: any) => {
|
users.forEach((row: unknown) => {
|
||||||
rankCache.set(row.driver_guid.toString(), {
|
rankCache.set(row.driver_guid.toString(), {
|
||||||
rank: row.rank_position,
|
rank: row.rank_position,
|
||||||
rating: row.user_rank
|
rating: row.user_rank
|
||||||
@ -112,7 +112,7 @@ export async function GET(request: Request) {
|
|||||||
const heartbeat = setInterval(() => {
|
const heartbeat = setInterval(() => {
|
||||||
try {
|
try {
|
||||||
controller.enqueue(encoder.encode(`: heartbeat\n\n`));
|
controller.enqueue(encoder.encode(`: heartbeat\n\n`));
|
||||||
} catch (error) {
|
} catch {
|
||||||
clearInterval(heartbeat);
|
clearInterval(heartbeat);
|
||||||
}
|
}
|
||||||
}, 30000);
|
}, 30000);
|
||||||
@ -124,7 +124,7 @@ export async function GET(request: Request) {
|
|||||||
clearInterval(heartbeat);
|
clearInterval(heartbeat);
|
||||||
try {
|
try {
|
||||||
controller.close();
|
controller.close();
|
||||||
} catch (error) {
|
} catch {
|
||||||
// Controller already closed
|
// Controller already closed
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -36,7 +36,7 @@ async function getConnectedDrivers() {
|
|||||||
|
|
||||||
const rows = await query(sql);
|
const rows = await query(sql);
|
||||||
|
|
||||||
return rows.map((row: any) => ({
|
return rows.map((row: unknown) => ({
|
||||||
driver_guid: row.driver_guid,
|
driver_guid: row.driver_guid,
|
||||||
driver_name: row.driver_name,
|
driver_name: row.driver_name,
|
||||||
driver_team: row.driver_team,
|
driver_team: row.driver_team,
|
||||||
|
|||||||
@ -107,7 +107,7 @@ export default async function EventDetailPage({
|
|||||||
params: Promise<{ event_id: number }>;
|
params: Promise<{ event_id: number }>;
|
||||||
}) {
|
}) {
|
||||||
const { event_id } = await params;
|
const { event_id } = await params;
|
||||||
const event: any = await getEvent(event_id);
|
const event: unknown = await getEvent(event_id);
|
||||||
if (!event) {
|
if (!event) {
|
||||||
notFound();
|
notFound();
|
||||||
}
|
}
|
||||||
@ -205,7 +205,7 @@ export default async function EventDetailPage({
|
|||||||
{registrations.length === 0 ? (
|
{registrations.length === 0 ? (
|
||||||
<p className="text-white/40 text-sm">No registrations yet</p>
|
<p className="text-white/40 text-sm">No registrations yet</p>
|
||||||
) : (
|
) : (
|
||||||
registrations.map((reg: any, index: number) => (
|
registrations.map((reg: unknown, index: number) => (
|
||||||
<div key={reg.registration_id} className="border border-white/10 p-3">
|
<div key={reg.registration_id} className="border border-white/10 p-3">
|
||||||
<div className="flex items-start justify-between mb-2">
|
<div className="flex items-start justify-between mb-2">
|
||||||
<div className="flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
|
|||||||
@ -2,26 +2,11 @@
|
|||||||
// Event championship results page with auto-refresh
|
// Event championship results page with auto-refresh
|
||||||
|
|
||||||
import { query } from '@/lib/db';
|
import { query } from '@/lib/db';
|
||||||
import { TrophyIcon } from '@/components/ui/icons';
|
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import EventResultsClient from '@/components/events/EventResultsClient';
|
import EventResultsClient from '@/components/events/EventResultsClient';
|
||||||
|
|
||||||
export const dynamic = "force-dynamic";
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
interface TeamStanding {
|
|
||||||
team_id: number;
|
|
||||||
team_name: string;
|
|
||||||
total_points: number;
|
|
||||||
races_participated: number;
|
|
||||||
best_finish: number;
|
|
||||||
drivers: {
|
|
||||||
driver_guid: string;
|
|
||||||
driver_name: string;
|
|
||||||
position: number;
|
|
||||||
points_awarded: number;
|
|
||||||
}[];
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getEventResults(eventId: number) {
|
async function getEventResults(eventId: number) {
|
||||||
|
|
||||||
if (eventId == undefined) {
|
if (eventId == undefined) {
|
||||||
@ -72,15 +57,6 @@ async function getEventResults(eventId: number) {
|
|||||||
|
|
||||||
return { event, standings };
|
return { event, standings };
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPositionColor(position: number): string {
|
|
||||||
if (position === 1) return 'bg-yellow-500/20 border-yellow-500/50 text-yellow-400';
|
|
||||||
if (position === 2) return 'bg-gray-400/20 border-gray-400/50 text-gray-300';
|
|
||||||
if (position === 3) return 'bg-orange-600/20 border-orange-600/50 text-orange-400';
|
|
||||||
return 'bg-white/5 border-white/10 text-white/60';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export default async function EventResultsPage({
|
export default async function EventResultsPage({
|
||||||
params,
|
params,
|
||||||
|
|||||||
@ -67,7 +67,7 @@ export default async function EventsPage() {
|
|||||||
<p className="text-white/20 text-sm mt-2">Check back soon for new racing events</p>
|
<p className="text-white/20 text-sm mt-2">Check back soon for new racing events</p>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
events.map((event: any) => {
|
events.map((event: unknown) => {
|
||||||
const isOpen = event.event_status === 'OPEN';
|
const isOpen = event.event_status === 'OPEN';
|
||||||
const isFull = event.registrations_count >= event.max_participants;
|
const isFull = event.registrations_count >= event.max_participants;
|
||||||
const deadlinePassed = event.registration_deadline && new Date(event.registration_deadline) < new Date();
|
const deadlinePassed = event.registration_deadline && new Date(event.registration_deadline) < new Date();
|
||||||
|
|||||||
@ -12,7 +12,7 @@ interface LiveData {
|
|||||||
server_track: string;
|
server_track: string;
|
||||||
server_config: string;
|
server_config: string;
|
||||||
connected_players: number;
|
connected_players: number;
|
||||||
cars: any[];
|
cars: unknown[];
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getLiveData(): Promise<LiveData[]> {
|
async function getLiveData(): Promise<LiveData[]> {
|
||||||
@ -32,7 +32,7 @@ async function getLiveData(): Promise<LiveData[]> {
|
|||||||
|
|
||||||
// For each server, get connected cars with their positions
|
// For each server, get connected cars with their positions
|
||||||
const liveData = await Promise.all(
|
const liveData = await Promise.all(
|
||||||
servers.map(async (server: any) => {
|
servers.map(async (server: unknown) => {
|
||||||
const carsSql = `
|
const carsSql = `
|
||||||
SELECT
|
SELECT
|
||||||
u.driver_guid,
|
u.driver_guid,
|
||||||
@ -47,7 +47,7 @@ async function getLiveData(): Promise<LiveData[]> {
|
|||||||
const cars = await query(carsSql, [server.server_id]);
|
const cars = await query(carsSql, [server.server_id]);
|
||||||
|
|
||||||
// Add mock data for positions (real data will come from telemetry stream)
|
// Add mock data for positions (real data will come from telemetry stream)
|
||||||
const carsWithPositions = cars.map((car: any, index: number) => ({
|
const carsWithPositions = cars.map((car: unknown, index: number) => ({
|
||||||
...car,
|
...car,
|
||||||
carID: index,
|
carID: index,
|
||||||
position: index + 1,
|
position: index + 1,
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import Image from "next/image";
|
|
||||||
import { useState, useRef, useEffect, MouseEvent } from 'react';
|
import { useState, useRef, useEffect, MouseEvent } from 'react';
|
||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
@ -113,8 +112,20 @@ export default function MusicPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
void fetchTracks();
|
let active = true;
|
||||||
}, []);
|
|
||||||
|
const run = async () => {
|
||||||
|
const data = await fetchTracks();
|
||||||
|
if (!active) return;
|
||||||
|
setTracks(data);
|
||||||
|
};
|
||||||
|
|
||||||
|
void run();
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
active = false;
|
||||||
|
};
|
||||||
|
}, [isPlaying]);
|
||||||
|
|
||||||
// Group tracks by theme
|
// Group tracks by theme
|
||||||
const tracksByTheme = tracks.reduce<Record<string, Track[]>>((acc, track) => {
|
const tracksByTheme = tracks.reduce<Record<string, Track[]>>((acc, track) => {
|
||||||
@ -338,7 +349,7 @@ export default function MusicPage() {
|
|||||||
<div className="border border-white/10 bg-black overflow-hidden">
|
<div className="border border-white/10 bg-black overflow-hidden">
|
||||||
{isVideo ? (
|
{isVideo ? (
|
||||||
<video
|
<video
|
||||||
ref={mediaRef as any}
|
ref={mediaRef as unknown}
|
||||||
onTimeUpdate={handleTimeUpdate}
|
onTimeUpdate={handleTimeUpdate}
|
||||||
onEnded={nextTrack}
|
onEnded={nextTrack}
|
||||||
onPlay={() => setIsPlaying(true)}
|
onPlay={() => setIsPlaying(true)}
|
||||||
@ -379,7 +390,7 @@ export default function MusicPage() {
|
|||||||
|
|
||||||
{/* Audio element (hidden) */}
|
{/* Audio element (hidden) */}
|
||||||
<audio
|
<audio
|
||||||
ref={mediaRef as any}
|
ref={mediaRef as unknown}
|
||||||
onTimeUpdate={handleTimeUpdate}
|
onTimeUpdate={handleTimeUpdate}
|
||||||
onEnded={nextTrack}
|
onEnded={nextTrack}
|
||||||
onPlay={() => setIsPlaying(true)}
|
onPlay={() => setIsPlaying(true)}
|
||||||
|
|||||||
@ -44,8 +44,8 @@ async function getFilterOptions(): Promise<FilterOptions> {
|
|||||||
const cars = await query(carsQuery);
|
const cars = await query(carsQuery);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
teams: teams.map((t: any) => t.driver_team),
|
teams: teams.map((t: unknown) => t.driver_team),
|
||||||
carModels: cars.map((c: any) => c.car_model)
|
carModels: cars.map((c: unknown) => c.car_model)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -67,7 +67,7 @@ export default function EventRegistrationForm({ eventId }: { eventId: number })
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
router.refresh();
|
router.refresh();
|
||||||
}, 1500);
|
}, 1500);
|
||||||
} catch (err: any) {
|
} catch (err: unknown) {
|
||||||
setError(err.message);
|
setError(err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
|
|||||||
@ -111,7 +111,7 @@ export default function EventResultsClient({
|
|||||||
{/* Driver Results */}
|
{/* Driver Results */}
|
||||||
<div className="border-t border-white/10 pt-4 mt-4">
|
<div className="border-t border-white/10 pt-4 mt-4">
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
||||||
{team.drivers.map((driver: any) => (
|
{team.drivers.map((driver: unknown) => (
|
||||||
<div
|
<div
|
||||||
key={driver.driver_guid}
|
key={driver.driver_guid}
|
||||||
className="flex items-center justify-between p-3 bg-black/30 border border-white/5"
|
className="flex items-center justify-between p-3 bg-black/30 border border-white/5"
|
||||||
|
|||||||
@ -13,7 +13,7 @@ interface LiveSessionClientProps {
|
|||||||
serverTrack: string;
|
serverTrack: string;
|
||||||
serverConfig: string;
|
serverConfig: string;
|
||||||
connectedPlayers: number;
|
connectedPlayers: number;
|
||||||
initialCars: any[];
|
initialCars: unknown[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function LiveSessionClient({
|
export default function LiveSessionClient({
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
// components/live/LiveTiming.tsx
|
// components/live/LiveTiming.tsx
|
||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { BoltIcon, TrophyIcon } from '@/components/ui/icons';
|
import { BoltIcon } from '@/components/ui/icons';
|
||||||
|
|
||||||
interface TimingEntry {
|
interface TimingEntry {
|
||||||
position: number;
|
position: number;
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { getTrackMapUrl, cleanTrackName, cleanTrackConfig } from '@/lib/trackUtils';
|
import { getTrackMapUrl, cleanTrackName, cleanTrackConfig } from '@/lib/trackUtils';
|
||||||
import { getTrackMapConfig, worldToMapCoords, type TrackMapConfig } from '@/lib/trackMapConfig';
|
import { getTrackMapConfig, worldToMapCoords, type TrackMapConfig } from '@/lib/trackMapConfig';
|
||||||
|
import Image from 'next/image';
|
||||||
|
|
||||||
interface Car {
|
interface Car {
|
||||||
carID: number;
|
carID: number;
|
||||||
@ -50,8 +51,9 @@ export default function LiveTrackMap({ track, trackConfig, cars }: LiveTrackMapP
|
|||||||
};
|
};
|
||||||
|
|
||||||
const trackMapUrl = getTrackMapUrl(track, trackConfig);
|
const trackMapUrl = getTrackMapUrl(track, trackConfig);
|
||||||
const displayTrackName = cleanTrackName(track);
|
// INFO: UNUSED
|
||||||
const displayTrackConfig = cleanTrackConfig(trackConfig);
|
//const displayTrackName = cleanTrackName(track);
|
||||||
|
//const displayTrackConfig = cleanTrackConfig(trackConfig);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getTrackMapConfig(track, trackConfig).then(config => {
|
getTrackMapConfig(track, trackConfig).then(config => {
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { usePathname } from 'next/navigation';
|
import { usePathname } from 'next/navigation';
|
||||||
|
import Image from 'next/image';
|
||||||
|
|
||||||
export default function Navbar() {
|
export default function Navbar() {
|
||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
|
|||||||
@ -29,9 +29,9 @@ export function getPool(): Pool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Helper function for queries - handles errors nicely
|
// Helper function for queries - handles errors nicely
|
||||||
export async function query<T = any>(
|
export async function query<T = unknown>(
|
||||||
text: string,
|
text: string,
|
||||||
params?: any[]
|
params?: unknown[]
|
||||||
): Promise<T[]> {
|
): Promise<T[]> {
|
||||||
const pool = getPool();
|
const pool = getPool();
|
||||||
try {
|
try {
|
||||||
@ -44,9 +44,9 @@ export async function query<T = any>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Helper for single row queries
|
// Helper for single row queries
|
||||||
export async function queryOne<T = any>(
|
export async function queryOne<T = unknown>(
|
||||||
text: string,
|
text: string,
|
||||||
params?: any[]
|
params?: unknown[]
|
||||||
): Promise<T | null> {
|
): Promise<T | null> {
|
||||||
const rows = await query<T>(text, params);
|
const rows = await query<T>(text, params);
|
||||||
return rows.length > 0 ? rows[0] : null;
|
return rows.length > 0 ? rows[0] : null;
|
||||||
|
|||||||
@ -75,11 +75,11 @@ class TelemetryBridge {
|
|||||||
const CAR_SIZE = 1 + 64 + 64 + 64 + 4 + 4 + 1 + 2 + 4 + 4 + 2 + 1; // 211 bytes per car
|
const CAR_SIZE = 1 + 64 + 64 + 64 + 4 + 4 + 1 + 2 + 4 + 4 + 2 + 1; // 211 bytes per car
|
||||||
|
|
||||||
while (this.buffer.length >= HEADER_SIZE) {
|
while (this.buffer.length >= HEADER_SIZE) {
|
||||||
const server_id = this.buffer.readUInt8(0);
|
// UNUSED: const server_id = this.buffer.readUInt8(0);
|
||||||
const car_count = this.buffer.readUInt8(1);
|
const car_count = this.buffer.readUInt8(1);
|
||||||
|
|
||||||
// Updated CAR_SIZE: 1 + 64 + 64 + 64 + 12 + 4 + 4 + 1 + 2 + 4 + 4 + 2 + 1 = 227 bytes
|
// Updated CAR_SIZE: 1 + 64 + 64 + 64 + 12 + 4 + 4 + 1 + 2 + 4 + 4 + 2 + 1 = 227 bytes
|
||||||
const CAR_SIZE = 227;
|
// UNUSED: const CAR_SIZE = 227;
|
||||||
const expected_size = HEADER_SIZE + (car_count * CAR_SIZE);
|
const expected_size = HEADER_SIZE + (car_count * CAR_SIZE);
|
||||||
|
|
||||||
if (this.buffer.length >= expected_size) {
|
if (this.buffer.length >= expected_size) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user