'use client'; import { useState, useRef, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import { Upload, Paintbrush, Move, ZoomIn, Check, X, AlertTriangle, Car, RotateCw, Gamepad2 } from 'lucide-react'; interface DecalPosition { id: string; type: 'name' | 'number' | 'rank'; x: number; y: number; width: number; height: number; rotation: number; } interface GameOption { id: string; name: string; } interface CarOption { id: string; name: string; manufacturer: string; gameId: string; } // Mock data - in production these would come from API const GAMES: GameOption[] = [ { id: 'iracing', name: 'iRacing' }, { id: 'acc', name: 'Assetto Corsa Competizione' }, { id: 'ac', name: 'Assetto Corsa' }, { id: 'rf2', name: 'rFactor 2' }, { id: 'ams2', name: 'Automobilista 2' }, { id: 'lmu', name: 'Le Mans Ultimate' }, ]; const CARS: CarOption[] = [ // iRacing cars { id: 'ir-porsche-911-gt3r', name: '911 GT3 R', manufacturer: 'Porsche', gameId: 'iracing' }, { id: 'ir-ferrari-296-gt3', name: '296 GT3', manufacturer: 'Ferrari', gameId: 'iracing' }, { id: 'ir-bmw-m4-gt3', name: 'M4 GT3', manufacturer: 'BMW', gameId: 'iracing' }, { id: 'ir-mercedes-amg-gt3', name: 'AMG GT3 Evo', manufacturer: 'Mercedes-AMG', gameId: 'iracing' }, { id: 'ir-audi-r8-gt3', name: 'R8 LMS GT3 Evo II', manufacturer: 'Audi', gameId: 'iracing' }, { id: 'ir-dallara-f3', name: 'F3', manufacturer: 'Dallara', gameId: 'iracing' }, { id: 'ir-dallara-ir18', name: 'IR-18', manufacturer: 'Dallara', gameId: 'iracing' }, // ACC cars { id: 'acc-porsche-911-gt3r', name: '911 GT3 R', manufacturer: 'Porsche', gameId: 'acc' }, { id: 'acc-ferrari-296-gt3', name: '296 GT3', manufacturer: 'Ferrari', gameId: 'acc' }, { id: 'acc-bmw-m4-gt3', name: 'M4 GT3', manufacturer: 'BMW', gameId: 'acc' }, { id: 'acc-mercedes-amg-gt3', name: 'AMG GT3 Evo', manufacturer: 'Mercedes-AMG', gameId: 'acc' }, { id: 'acc-lamborghini-huracan-gt3', name: 'Huracán GT3 Evo2', manufacturer: 'Lamborghini', gameId: 'acc' }, { id: 'acc-aston-martin-v8-gt3', name: 'V8 Vantage GT3', manufacturer: 'Aston Martin', gameId: 'acc' }, // AC cars { id: 'ac-porsche-911-gt3r', name: '911 GT3 R', manufacturer: 'Porsche', gameId: 'ac' }, { id: 'ac-ferrari-488-gt3', name: '488 GT3', manufacturer: 'Ferrari', gameId: 'ac' }, { id: 'ac-lotus-exos', name: 'Exos 125', manufacturer: 'Lotus', gameId: 'ac' }, // rFactor 2 cars { id: 'rf2-porsche-911-gt3r', name: '911 GT3 R', manufacturer: 'Porsche', gameId: 'rf2' }, { id: 'rf2-bmw-m4-gt3', name: 'M4 GT3', manufacturer: 'BMW', gameId: 'rf2' }, // AMS2 cars { id: 'ams2-porsche-911-gt3r', name: '911 GT3 R', manufacturer: 'Porsche', gameId: 'ams2' }, { id: 'ams2-mclaren-720s-gt3', name: '720S GT3', manufacturer: 'McLaren', gameId: 'ams2' }, // LMU cars { id: 'lmu-porsche-963', name: '963 LMDh', manufacturer: 'Porsche', gameId: 'lmu' }, { id: 'lmu-ferrari-499p', name: '499P', manufacturer: 'Ferrari', gameId: 'lmu' }, { id: 'lmu-toyota-gr010', name: 'GR010', manufacturer: 'Toyota', gameId: 'lmu' }, ]; export default function LiveryUploadPage() { const router = useRouter(); const fileInputRef = useRef(null); const [uploadedFile, setUploadedFile] = useState(null); const [previewUrl, setPreviewUrl] = useState(null); const [selectedGame, setSelectedGame] = useState(''); const [selectedCar, setSelectedCar] = useState(''); const [filteredCars, setFilteredCars] = useState([]); const [decals, setDecals] = useState([ { id: 'name', type: 'name', x: 0.1, y: 0.8, width: 0.2, height: 0.05, rotation: 0 }, { id: 'number', type: 'number', x: 0.8, y: 0.1, width: 0.15, height: 0.15, rotation: 0 }, { id: 'rank', type: 'rank', x: 0.05, y: 0.1, width: 0.1, height: 0.1, rotation: 0 }, ]); const [activeDecal, setActiveDecal] = useState(null); const [submitting, setSubmitting] = useState(false); // Filter cars when game changes useEffect(() => { if (selectedGame) { const cars = CARS.filter(car => car.gameId === selectedGame); setFilteredCars(cars); setSelectedCar(''); // Reset car selection when game changes } else { setFilteredCars([]); setSelectedCar(''); } }, [selectedGame]); const handleFileChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setUploadedFile(file); const url = URL.createObjectURL(file); setPreviewUrl(url); } }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); const file = e.dataTransfer.files?.[0]; if (file) { setUploadedFile(file); const url = URL.createObjectURL(file); setPreviewUrl(url); } }; const handleSubmit = async () => { if (!uploadedFile || !selectedGame || !selectedCar) return; setSubmitting(true); try { // Alpha: In-memory only console.log('Livery upload:', { file: uploadedFile.name, gameId: selectedGame, carId: selectedCar, decals, }); await new Promise(resolve => setTimeout(resolve, 1000)); alert('Livery uploaded successfully.'); router.push('/profile/liveries'); } catch (err) { console.error('Upload failed:', err); alert('Upload failed. Try again.'); } finally { setSubmitting(false); } }; return (
{/* Header */}

Upload Livery

Add a new livery to your collection

{/* Upload Section */}

Livery File

{/* Game Selection */}
{/* Car Selection */}
{selectedGame && filteredCars.length === 0 && (

No cars available for this game

)}
{/* File Upload */}
fileInputRef.current?.click()} onDrop={handleDrop} onDragOver={(e) => e.preventDefault()} className={`border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors ${ previewUrl ? 'border-performance-green/50 bg-performance-green/5' : 'border-charcoal-outline hover:border-primary-blue/50 hover:bg-primary-blue/5' }`} > {previewUrl ? (

{uploadedFile?.name}

Click to replace

) : (

Drop your livery here or click to browse

PNG or DDS, max 5MB

)}
{/* Validation Warning */}

No logos or text allowed.{' '} Your base livery must be clean. Sponsor logos are added by league admins.

{/* Decal Editor */}

Position Decals

Drag to position your driver name, number, and rank badge.

{/* Preview Canvas */}
{previewUrl ? ( Livery preview ) : (
)} {/* Decal Placeholders */} {decals.map((decal) => (
setActiveDecal(decal.id === activeDecal ? null : decal.id)} className={`absolute cursor-move border-2 rounded flex items-center justify-center text-xs font-medium transition-all ${ activeDecal === decal.id ? 'border-primary-blue bg-primary-blue/20 text-primary-blue' : 'border-white/30 bg-black/30 text-white/70' }`} style={{ left: `${decal.x * 100}%`, top: `${decal.y * 100}%`, width: `${decal.width * 100}%`, height: `${decal.height * 100}%`, transform: `rotate(${decal.rotation}deg)`, }} > {decal.type === 'name' && 'NAME'} {decal.type === 'number' && '#'} {decal.type === 'rank' && 'RANK'}
))}
{/* Decal Controls */}
{decals.map((decal) => ( ))}
{/* Rotation Controls */} {activeDecal && (
{decals.find(d => d.id === activeDecal)?.type} Rotation {decals.find(d => d.id === activeDecal)?.rotation}°
d.id === activeDecal)?.rotation ?? 0} onChange={(e) => { const rotation = parseInt(e.target.value, 10); setDecals(decals.map(d => d.id === activeDecal ? { ...d, rotation } : d )); }} className="flex-1 h-2 bg-charcoal-outline rounded-lg appearance-none cursor-pointer accent-primary-blue" />
)}

Click a decal above, then drag on preview to reposition. Use the slider or button to rotate.

{/* Actions */}
{/* Alpha Notice */}

Alpha Note: Livery upload is demonstration-only. Decal positioning and image validation are not functional in this preview.

); }