import { useState, useEffect } from 'react'; import axios from 'axios'; import { Car, Clock, CheckCircle, AlertCircle, Users, Trash2, PlusCircle, UserPlus, AlertTriangle } from 'lucide-react'; import io from 'socket.io-client'; import { useTranslation } from 'react-i18next'; import LanguageSelector from '../components/LanguageSelector'; const API_URL = import.meta.env.VITE_API_URL || ''; const socket = io(API_URL); function UserDashboard({ token, username }) { const { t } = useTranslation(); const [plates, setPlates] = useState([]); const [newPlate, setNewPlate] = useState({ number: '', owner: '' }); const [detections, setDetections] = useState([]); const [people, setPeople] = useState([]); const [newPerson, setNewPerson] = useState({ name: '', rut: '', durationDays: 1 }); useEffect(() => { fetchPlates(); fetchPeople(); // Listen for live detections (optional, maybe user wants to see their plates detected?) // For now, let's show all global detections but emphasize this is a "Portal" socket.on('new_detection', (data) => { setDetections(prev => [data, ...prev].slice(0, 5)); }); // Real-time status updates socket.on('new_plate_registered', () => fetchPlates()); // Sync when plate added socket.on('plate_status_updated', () => fetchPlates()); socket.on('people_updated', () => fetchPeople()); return () => { socket.off('new_detection'); socket.off('new_plate_registered'); socket.off('plate_status_updated'); socket.off('people_updated'); }; }, [token]); const fetchPlates = async () => { try { const res = await axios.get(`${API_URL}/api/plates`, { headers: { Authorization: `Bearer ${token}` } }); // Backend already filters by user, so use data directly setPlates(res.data); } catch (err) { console.error(err); } }; const fetchPeople = async () => { try { const res = await axios.get(`${API_URL}/api/people`, { headers: { Authorization: `Bearer ${token}` } }); setPeople(res.data); } catch (err) { console.error(err); } }; const handleRegister = async (e) => { e.preventDefault(); try { await axios.post(`${API_URL}/api/plates`, { number: newPlate.number.toUpperCase(), owner: newPlate.owner }, { headers: { Authorization: `Bearer ${token}` } }); setNewPlate({ number: '', owner: '' }); fetchPlates(); // Alert removed for better UX } catch (err) { alert('Error: ' + err.message); } }; const handleAddPerson = async (e) => { e.preventDefault(); try { await axios.post(`${API_URL}/api/people`, newPerson, { headers: { Authorization: `Bearer ${token}` } }); setNewPerson({ name: '', rut: '', durationDays: 1 }); fetchPeople(); // Alert removed for better UX } catch (err) { alert('Error: ' + (err.response?.data?.error || err.message)); } }; const handleDeletePlate = async (id) => { if (!confirm(t('confirm_delete_plate'))) return; try { await axios.delete(`${API_URL}/api/plates/${id}`, { headers: { Authorization: `Bearer ${token}` } }); fetchPlates(); } catch (err) { alert(err.response?.data?.error || err.message); } }; const handleDeletePerson = async (id) => { if (!confirm(t('confirm_delete_visitor'))) return; try { await axios.delete(`${API_URL}/api/people/${id}`, { headers: { Authorization: `Bearer ${token}` } }); fetchPeople(); } catch (err) { alert(err.response?.data?.error || err.message); } }; return (

{t('welcome')}, {username}

Manage your vehicles and visitors.

{/* Plate Registration Form (Existing) */}

{t('register_plate')}

setNewPlate({ ...newPlate, number: e.target.value.toUpperCase() })} required /> setNewPlate({ ...newPlate, owner: e.target.value })} required />
{/* Visitor Registration Form (Existing) */}

{t('register_visitor')}

setNewPerson({ ...newPerson, rut: e.target.value })} required />
setNewPerson({ ...newPerson, name: e.target.value })} required />
{/* My Plates List */}

{t('my_plates_title')}

{plates.length === 0 &&

No plates registered.

} {plates.map(plate => (
{plate.number}
{plate.owner}
{plate.status === 'ALLOWED' && ( {t('active')} )} {plate.status === 'PENDING' && ( {t('pending')} )} {plate.status === 'DENIED' && ( {t('denied')} )}
))}
{/* My Visitors List */}

{t('my_visitors_title')}

{people.length === 0 &&

No visitors registered.

} {people.map(p => (
{p.name}
{p.rut}
Until: {new Date(p.endDate).toLocaleDateString()}
{p.status === 'APPROVED' ? t('approved') : p.status === 'DENIED' ? t('denied') : t('pending')}
))}
); } export default UserDashboard;