diff --git a/backend/src/index.js b/backend/src/index.js index fa7816b..416bb9c 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -59,6 +59,10 @@ app.post('/api/plates', authenticateToken, async (req, res) => { addedById: req.user.id } }); + + // Notify Admin via WebSocket + io.emit('new_plate_registered', plate); + res.json(plate); } catch (err) { res.status(500).json({ error: err.message }); @@ -197,6 +201,10 @@ app.post('/api/people', authenticateToken, async (req, res) => { addedById: req.user.id } }); + + // Notify Admin via WebSocket + io.emit('new_person_registered', person); + res.json(person); } catch (err) { res.status(500).json({ error: err.message }); diff --git a/frontend/src/pages/AdminDashboard.jsx b/frontend/src/pages/AdminDashboard.jsx index acbd615..34e36f5 100644 --- a/frontend/src/pages/AdminDashboard.jsx +++ b/frontend/src/pages/AdminDashboard.jsx @@ -29,7 +29,15 @@ function AdminDashboard({ token }) { setDetections(prev => [data, ...prev].slice(0, 10)); }); - return () => socket.off('new_detection'); + // Real-time updates for approvals + socket.on('new_plate_registered', () => fetchData()); + socket.on('new_person_registered', () => fetchData()); + + return () => { + socket.off('new_detection'); + socket.off('new_plate_registered'); + socket.off('new_person_registered'); + }; }, [token]); useEffect(() => {