fix: updated from 9.3.3 to 15

This commit is contained in:
Afonso Clerigo Mendes de Sousa 2026-05-19 20:22:37 +01:00
parent 27806f438f
commit 8589c83fb8
18 changed files with 45 additions and 76 deletions

View File

@ -43,7 +43,7 @@ export async function GET(request: Request) {
const rows = await query(sql);
// Transform to proper structure
const drivers: DriverWithServer[] = rows.map((row: any) => ({
const drivers: DriverWithServer[] = rows.map((row: unkown) => ({
driver_guid: row.driver_guid,
driver_name: row.driver_name,
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 }
);
}
}

View File

@ -51,7 +51,7 @@ export async function POST(request: Request) {
}
// 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 COUNT(*) FROM event_registrations
WHERE event_id = $1 AND status = 'REGISTERED') as current_registrations

View File

@ -31,7 +31,7 @@ async function updateRankCache() {
);
rankCache.clear();
users.forEach((row: any) => {
users.forEach((row: unknown) => {
rankCache.set(row.driver_guid.toString(), {
rank: row.rank_position,
rating: row.user_rank
@ -112,7 +112,7 @@ export async function GET(request: Request) {
const heartbeat = setInterval(() => {
try {
controller.enqueue(encoder.encode(`: heartbeat\n\n`));
} catch (error) {
} catch {
clearInterval(heartbeat);
}
}, 30000);
@ -124,7 +124,7 @@ export async function GET(request: Request) {
clearInterval(heartbeat);
try {
controller.close();
} catch (error) {
} catch {
// Controller already closed
}
});

View File

@ -36,7 +36,7 @@ async function getConnectedDrivers() {
const rows = await query(sql);
return rows.map((row: any) => ({
return rows.map((row: unknown) => ({
driver_guid: row.driver_guid,
driver_name: row.driver_name,
driver_team: row.driver_team,

View File

@ -107,7 +107,7 @@ export default async function EventDetailPage({
params: Promise<{ event_id: number }>;
}) {
const { event_id } = await params;
const event: any = await getEvent(event_id);
const event: unknown = await getEvent(event_id);
if (!event) {
notFound();
}
@ -205,7 +205,7 @@ export default async function EventDetailPage({
{registrations.length === 0 ? (
<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 className="flex items-start justify-between mb-2">
<div className="flex items-center space-x-2">

View File

@ -2,26 +2,11 @@
// Event championship results page with auto-refresh
import { query } from '@/lib/db';
import { TrophyIcon } from '@/components/ui/icons';
import Link from 'next/link';
import EventResultsClient from '@/components/events/EventResultsClient';
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) {
if (eventId == undefined) {
@ -72,15 +57,6 @@ async function getEventResults(eventId: number) {
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({
params,

View File

@ -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>
</div>
) : (
events.map((event: any) => {
events.map((event: unknown) => {
const isOpen = event.event_status === 'OPEN';
const isFull = event.registrations_count >= event.max_participants;
const deadlinePassed = event.registration_deadline && new Date(event.registration_deadline) < new Date();

View File

@ -12,7 +12,7 @@ interface LiveData {
server_track: string;
server_config: string;
connected_players: number;
cars: any[];
cars: unknown[];
}
async function getLiveData(): Promise<LiveData[]> {
@ -32,7 +32,7 @@ async function getLiveData(): Promise<LiveData[]> {
// For each server, get connected cars with their positions
const liveData = await Promise.all(
servers.map(async (server: any) => {
servers.map(async (server: unknown) => {
const carsSql = `
SELECT
u.driver_guid,
@ -47,7 +47,7 @@ async function getLiveData(): Promise<LiveData[]> {
const cars = await query(carsSql, [server.server_id]);
// 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,
carID: index,
position: index + 1,

View File

@ -1,6 +1,5 @@
'use client';
import Image from "next/image";
import { useState, useRef, useEffect, MouseEvent } from 'react';
// Configuration
@ -113,8 +112,20 @@ export default function MusicPage() {
};
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
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">
{isVideo ? (
<video
ref={mediaRef as any}
ref={mediaRef as unknown}
onTimeUpdate={handleTimeUpdate}
onEnded={nextTrack}
onPlay={() => setIsPlaying(true)}
@ -379,7 +390,7 @@ export default function MusicPage() {
{/* Audio element (hidden) */}
<audio
ref={mediaRef as any}
ref={mediaRef as unknown}
onTimeUpdate={handleTimeUpdate}
onEnded={nextTrack}
onPlay={() => setIsPlaying(true)}

View File

@ -44,8 +44,8 @@ async function getFilterOptions(): Promise<FilterOptions> {
const cars = await query(carsQuery);
return {
teams: teams.map((t: any) => t.driver_team),
carModels: cars.map((c: any) => c.car_model)
teams: teams.map((t: unknown) => t.driver_team),
carModels: cars.map((c: unknown) => c.car_model)
};
}

View File

@ -67,7 +67,7 @@ export default function EventRegistrationForm({ eventId }: { eventId: number })
setTimeout(() => {
router.refresh();
}, 1500);
} catch (err: any) {
} catch (err: unknown) {
setError(err.message);
} finally {
setLoading(false);

View File

@ -111,7 +111,7 @@ export default function EventResultsClient({
{/* 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) => (
{team.drivers.map((driver: unknown) => (
<div
key={driver.driver_guid}
className="flex items-center justify-between p-3 bg-black/30 border border-white/5"

View File

@ -13,7 +13,7 @@ interface LiveSessionClientProps {
serverTrack: string;
serverConfig: string;
connectedPlayers: number;
initialCars: any[];
initialCars: unknown[];
}
export default function LiveSessionClient({

View File

@ -1,7 +1,7 @@
// components/live/LiveTiming.tsx
'use client';
import { BoltIcon, TrophyIcon } from '@/components/ui/icons';
import { BoltIcon } from '@/components/ui/icons';
interface TimingEntry {
position: number;

View File

@ -4,6 +4,7 @@
import { useEffect, useState } from 'react';
import { getTrackMapUrl, cleanTrackName, cleanTrackConfig } from '@/lib/trackUtils';
import { getTrackMapConfig, worldToMapCoords, type TrackMapConfig } from '@/lib/trackMapConfig';
import Image from 'next/image';
interface Car {
carID: number;
@ -50,8 +51,9 @@ export default function LiveTrackMap({ track, trackConfig, cars }: LiveTrackMapP
};
const trackMapUrl = getTrackMapUrl(track, trackConfig);
const displayTrackName = cleanTrackName(track);
const displayTrackConfig = cleanTrackConfig(trackConfig);
// INFO: UNUSED
//const displayTrackName = cleanTrackName(track);
//const displayTrackConfig = cleanTrackConfig(trackConfig);
useEffect(() => {
getTrackMapConfig(track, trackConfig).then(config => {

View File

@ -3,6 +3,7 @@
import Link from 'next/link';
import { usePathname } from 'next/navigation';
import Image from 'next/image';
export default function Navbar() {
const pathname = usePathname();

View File

@ -29,9 +29,9 @@ export function getPool(): Pool {
}
// Helper function for queries - handles errors nicely
export async function query<T = any>(
export async function query<T = unknown>(
text: string,
params?: any[]
params?: unknown[]
): Promise<T[]> {
const pool = getPool();
try {
@ -44,9 +44,9 @@ export async function query<T = any>(
}
// Helper for single row queries
export async function queryOne<T = any>(
export async function queryOne<T = unknown>(
text: string,
params?: any[]
params?: unknown[]
): Promise<T | null> {
const rows = await query<T>(text, params);
return rows.length > 0 ? rows[0] : null;

View File

@ -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
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);
// 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);
if (this.buffer.length >= expected_size) {