Files
gridpilot.gg/apps/website/app/profile/page.tsx
2025-12-04 23:31:55 +01:00

94 lines
3.1 KiB
TypeScript

'use client';
import { useState, useEffect } from 'react';
import { getDriverRepository } from '@/lib/di-container';
import { Driver } from '@gridpilot/racing/domain/entities/Driver';
import { EntityMappers } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import CreateDriverForm from '@/components/drivers/CreateDriverForm';
import Card from '@/components/ui/Card';
import DriverProfile from '@/components/drivers/DriverProfile';
import ProfileRaceHistory from '@/components/drivers/ProfileRaceHistory';
import ProfileSettings from '@/components/drivers/ProfileSettings';
import { useEffectiveDriverId } from '@/lib/currentDriver';
export default function ProfilePage() {
const [driver, setDriver] = useState<DriverDTO | null>(null);
const [loading, setLoading] = useState(true);
const effectiveDriverId = useEffectiveDriverId();
useEffect(() => {
const loadDriver = async () => {
const driverRepo = getDriverRepository();
const currentDriverId = effectiveDriverId;
const currentDriver = await driverRepo.findById(currentDriverId);
const driverData = EntityMappers.toDriverDTO(currentDriver);
setDriver(driverData);
setLoading(false);
};
void loadDriver();
}, [effectiveDriverId]);
const handleSaveSettings = async (updates: Partial<DriverDTO>) => {
if (!driver) return;
const driverRepo = getDriverRepository();
const drivers = await driverRepo.findAll();
const currentDriver = drivers[0];
if (currentDriver) {
const updatedDriver: Driver = currentDriver.update({
bio: updates.bio ?? currentDriver.bio,
country: updates.country ?? currentDriver.country,
});
const persistedDriver = await driverRepo.update(updatedDriver);
const updatedDto = EntityMappers.toDriverDTO(persistedDriver);
setDriver(updatedDto);
}
};
if (loading) {
return (
<div className="max-w-6xl mx-auto">
<div className="text-center text-gray-400">Loading profile...</div>
</div>
);
}
if (!driver) {
return (
<div className="max-w-4xl mx-auto">
<div className="text-center mb-8">
<h1 className="text-3xl font-bold text-white mb-2">Driver Profile</h1>
<p className="text-gray-400">
Create your GridPilot profile to get started
</p>
</div>
<Card className="max-w-2xl mx-auto">
<div className="mb-6">
<h2 className="text-xl font-semibold text-white mb-2">Create Your Profile</h2>
<p className="text-gray-400 text-sm">
Create your driver profile. Alpha data resets on reload, so test freely.
</p>
</div>
<CreateDriverForm />
</Card>
</div>
);
}
return (
<div className="max-w-6xl mx-auto space-y-6">
<DriverProfile driver={driver} isOwnProfile />
<Card>
<ProfileSettings driver={driver} onSave={handleSaveSettings} />
</Card>
<Card>
<ProfileRaceHistory />
</Card>
</div>
);
}