import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { Header } from './components/Header.jsx'; import { Card } from './components/Card.jsx'; import { Button } from './components/Button.jsx'; import { PageTransition } from './components/PageTransition.jsx'; import { getCarsFolder, loadCars, resetCarsFolder, saveCars, selectCarsFolder, } from './carStorage.js'; // Admin interface to add, edit, and remove car size presets. export default function CarManager() { const navigate = useNavigate(); const [options, setOptions] = useState([]); const [addForm, setAddForm] = useState({ name: '', width: '', height: '', hasRear: false, rearWidth: '', rearHeight: '', }); const [editName, setEditName] = useState(''); const [editForm, setEditForm] = useState({ name: '', width: '', height: '', hasRear: false, rearWidth: '', rearHeight: '', }); const [deleteName, setDeleteName] = useState(''); const [password, setPassword] = useState(''); const [authenticated, setAuthenticated] = useState(false); const [error, setError] = useState(''); const [toast, setToast] = useState(false); const [carsFolder, setCarsFolder] = useState(''); const [folderMessage, setFolderMessage] = useState(''); const applyCars = (cars) => { const sorted = [...cars].sort((a, b) => a.name.localeCompare(b.name)); setOptions(sorted); setEditName(sorted[0]?.name || ''); setDeleteName(sorted[0]?.name || ''); }; useEffect(() => { loadCars().then((opts) => { applyCars(opts); }); getCarsFolder().then((folder) => { setCarsFolder(folder || ''); }); }, []); useEffect(() => { const car = options.find((o) => o.name === editName); if (car) { setEditForm({ name: car.name, width: String(car.width), height: String(car.height), hasRear: Boolean(car.rearWidth && car.rearHeight), rearWidth: car.rearWidth ? String(car.rearWidth) : '', rearHeight: car.rearHeight ? String(car.rearHeight) : '', }); } }, [editName, options]); useEffect(() => { setDeleteName((dn) => options.find((o) => o.name === dn) ? dn : options[0]?.name || '' ); }, [options]); useEffect(() => { if (toast) { const t = setTimeout(() => setToast(false), 2000); return () => clearTimeout(t); } }, [toast]); useEffect(() => { if (folderMessage) { const t = setTimeout(() => setFolderMessage(''), 2500); return () => clearTimeout(t); } }, [folderMessage]); const handleAddChange = (e) => { const { name, value, type, checked } = e.target; setAddForm((fd) => ({ ...fd, [name]: type === 'checkbox' ? checked : value, })); }; const handleEditChange = (e) => { const { name, value, type, checked } = e.target; setEditForm((fd) => ({ ...fd, [name]: type === 'checkbox' ? checked : value, })); }; const handleAddSubmit = async (e) => { e.preventDefault(); const newCar = { name: addForm.name, width: parseFloat(addForm.width), height: parseFloat(addForm.height), }; if (addForm.hasRear) { newCar.rearWidth = parseFloat(addForm.rearWidth); newCar.rearHeight = parseFloat(addForm.rearHeight); } const newOptions = [...options, newCar].sort((a, b) => a.name.localeCompare(b.name) ); setOptions(newOptions); await saveCars(newOptions); setAddForm({ name: '', width: '', height: '', hasRear: false, rearWidth: '', rearHeight: '', }); setToast(true); }; const handleEditSubmit = async (e) => { e.preventDefault(); const updatedCar = { name: editForm.name, width: parseFloat(editForm.width), height: parseFloat(editForm.height), }; if (editForm.hasRear) { updatedCar.rearWidth = parseFloat(editForm.rearWidth); updatedCar.rearHeight = parseFloat(editForm.rearHeight); } const newOptions = options .map((o) => (o.name === editName ? updatedCar : o)) .sort((a, b) => a.name.localeCompare(b.name)); setOptions(newOptions); setEditName(updatedCar.name); await saveCars(newOptions); setToast(true); }; const handleDeleteSubmit = async (e) => { e.preventDefault(); const newOptions = options.filter((o) => o.name !== deleteName); setOptions(newOptions); setDeleteName(newOptions[0]?.name || ''); await saveCars(newOptions); setToast(true); }; const handleAuthSubmit = (e) => { e.preventDefault(); if (password === 'Rotterdam-010') { setAuthenticated(true); setPassword(''); setError(''); } else { setError('Onjuist wachtwoord'); } }; const handleSelectFolder = async () => { const result = await selectCarsFolder(); if (!result || result.canceled) { setFolderMessage('Geen map gekozen'); return; } setCarsFolder(result.folder || ''); if (result.cars) { applyCars(result.cars); } else { const refreshed = await loadCars(); applyCars(refreshed); } setFolderMessage('Opslaglocatie bijgewerkt'); }; const handleResetFolder = async () => { const result = await resetCarsFolder(); if (result?.folder) { setCarsFolder(result.folder); } if (result?.cars) { applyCars(result.cars); } else { const refreshed = await loadCars(); applyCars(refreshed); } setFolderMessage('Standaardmap ingesteld'); }; return (
navigate('/')} /> {!authenticated ? (
setPassword(e.target.value)} required />
{error &&

{error}

}
) : (
)} {toast &&
Opgeslagen
} ); }