diff --git a/Backend/.env b/Backend/.env index fca8438..9a150d9 100644 --- a/Backend/.env +++ b/Backend/.env @@ -1,6 +1,6 @@ PORT = 5000 MONGODB_URL = mongodb+srv://Healthsync_data:pL4vYIRxN7L3SEir@cluster0.57ywj.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0 -JWT_SECRET_kEY = "kxrWhWOqleunI+fSNaTGzD2eENVeJO0o2qTyUCYfUf/0IRhO9Taeqs+o7CXFqt6qcwCFuKlwxzWOa2kzZJm117qn6HcZCV5veZWfCMCR6uE04dvSsnbmUvtmr6NurYL7Wmk5uAtOTJW0/QZA5VUf0kEXtV5PU0af/V6a2BLgB5GX005488JHGWBJbIRqXDSaxR/Ne+a4jmsM2FQVpEqRP00cNWmlhvfmGiek0Za7DfuDmRMgmS0PsMr9sry8f+nvAp4OTz6AGJ4=" +JWT_SECRET_KEY = kxrWhWOqleunI+fSNaTGzD2eENVeJO0o2qTyUCYfUf/0IRhO9Taeqs+o7CXFqt6qcwCFuKlwxzWOa2kzZJm117qn6HcZCV5veZWfCMCR6uE04dvSsnbmUvtmr6NurYL7Wmk5uAtOTJW0/QZA5VUf0kEXtV5PU0af/V6a2BLgB5GX005488JHGWBJbIRqXDSaxR/Ne+a4jmsM2FQVpEqRP00cNWmlhvfmGiek0Za7DfuDmRMgmS0PsMr9sry8f+nvAp4OTz6AGJ4= STRIPE_SECRET_KEY=sk_test_51Qvu25KsK9fpnXzm8ehU2ujA7p4UTTJeNIV44GzoO5PtXhNOcoyGRXm8Hz9Vos3mqne0Dq5NXcQIIu9iwNuOe1Ln00b8oKsjTL CLIENT_SITE_URL =http://localhost:5173 EMAIL_USER=krutagya.kaneria.cg@gmail.com diff --git a/Backend/Controllers/authController.js b/Backend/Controllers/authController.js index d8b96b9..a4d1423 100644 --- a/Backend/Controllers/authController.js +++ b/Backend/Controllers/authController.js @@ -7,6 +7,7 @@ import dotenv from "dotenv"; dotenv.config(); const generateToken = (user) => { + return jwt.sign( { id: user._id, role: user.role }, process.env.JWT_SECRET_KEY, @@ -80,16 +81,19 @@ export const register = async (req, res) => { export const login = async (req, res) => { const { email } = req.body; - + + try { let user = null; const patient = await User.findOne({ email }); const doctor = await Doctor.findOne({ email }); - + + if (patient) user = patient; if (doctor) user = doctor; - + + if (!user) { return res.status(404).json({ message: "User not found" }); } @@ -98,10 +102,11 @@ export const login = async (req, res) => { if (!isPasswordMatch) { return res.status(400).json({ status: false, message: "Invalid credentials" }); } - + const token = generateToken(user); + const { password, role, appointments, ...rest } = user._doc; - + res.status(200).json({ status: true, message: "Successfully logged in", diff --git a/Backend/index.js b/Backend/index.js index e8c237e..5a026c9 100644 --- a/Backend/index.js +++ b/Backend/index.js @@ -76,6 +76,12 @@ io.on('connection', (socket) => { console.log(`User ${userId} joined room`); }); + socket.on('emergency_alert', (data)=>{ + console.log("Received emergency alert", data); + io.emit("new_emergency_alert", data); + //SMS and email aletr go here... + }) + socket.on('disconnect', () => { console.log('A client disconnected:', socket.id); }); diff --git a/Frountend/src/Dashboard/doctor-account/DashBoard.jsx b/Frountend/src/Dashboard/doctor-account/DashBoard.jsx index f297029..303d875 100644 --- a/Frountend/src/Dashboard/doctor-account/DashBoard.jsx +++ b/Frountend/src/Dashboard/doctor-account/DashBoard.jsx @@ -1,23 +1,53 @@ -import React, { useState } from 'react' +import React, { useState, useEffect } from 'react' import Loader from '../../components/Loader/Loading.jsx'; import Error from "../../components/Error/Error.jsx"; import useGetProfile from '../../hooks/useFetchData.jsx' -import { BASE_URL } from '../../config'; +import { BASE_URL, SOCKET_URL } from '../../config'; import Tabs from './Tabs'; import starIcon from '../../assets/images/Star.png' import DoctorAbout from '../../pages/Docters/DoctorAbout.jsx'; import Profile from './Profile.jsx'; import Appointments from './Appointment.jsx'; +import { io } from 'socket.io-client'; +const socket = io(SOCKET_URL) // setting up socket connection const DashBoard = () => { - - const {data,loading,error} = useGetProfile(`${BASE_URL}/doctors/profile/me`); - + const [emergencyMsg, setEmergencyMsg] = useState('') const [tab,setTab] = useState('overview') - - + const [address, setAddress] = useState(""); + + const getAddress = async (lat, lng) => { + const response = await fetch( + `https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${lng}` + ); + const data = await response.json(); + setAddress(data.display_name); + }; + + + //listen for incoming emergency messages + useEffect(() => { + console.log("In use effect"); + + // Confirm socket connected + socket.on('connect', () => { + console.log('Socket connected with ID:', socket.id); + }); + + // Listen for emergency alerts + socket.on('new_emergency_alert', (data) => { + setEmergencyMsg(data); + getAddress(data.location.latitude,data.location.longitude) + }); + + return () => { + socket.off('new_emergency_alert'); + socket.off('connect'); + }; + }, []); + return (
@@ -26,6 +56,34 @@ const DashBoard = () => { { !loading && !error && ( +
+ {/* Emergency alert goes below */} {emergencyMsg!=="" && +
+ + + Emergency +
+
Emergency! {emergencyMsg && emergencyMsg.name ? emergencyMsg.name : "Unknown" } has an emergency.
+ {address && ( +
+ Location: {address} +
+ )} + +
+
}
@@ -92,9 +150,11 @@ const DashBoard = () => { )} {tab==='appointments' && } {tab==='settings' && } +
+
)}
diff --git a/Frountend/src/Dashboard/doctor-account/Tabs.jsx b/Frountend/src/Dashboard/doctor-account/Tabs.jsx index f81ae2c..b514213 100644 --- a/Frountend/src/Dashboard/doctor-account/Tabs.jsx +++ b/Frountend/src/Dashboard/doctor-account/Tabs.jsx @@ -19,7 +19,7 @@ const Tabs = ({tab,setTab}) => {
- +
)} + + +
+ Profile +
-
) : ( +
+ ) : ( diff --git a/Frountend/src/config.js b/Frountend/src/config.js index 136b094..e85503c 100644 --- a/Frountend/src/config.js +++ b/Frountend/src/config.js @@ -1,2 +1,3 @@ export const BASE_URL = "http://localhost:5000/api/v1"; +export const SOCKET_URL = "http://localhost:5000" export const token = localStorage.getItem('token') \ No newline at end of file diff --git a/Frountend/src/pages/Login.jsx b/Frountend/src/pages/Login.jsx index 88bdaf5..4370739 100644 --- a/Frountend/src/pages/Login.jsx +++ b/Frountend/src/pages/Login.jsx @@ -27,7 +27,8 @@ const Login = () => { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData), }); - + console.log(res); + const result = await res.json(); if (!res.ok) { throw new Error(result.message || "Login Failed");