From b48660393a12be3f39acafc7c6bd6fa822665c9a Mon Sep 17 00:00:00 2001 From: nikhil Date: Sat, 25 Oct 2025 18:52:13 +0000 Subject: [PATCH] updated the requirements --- Vite-React-main/package-lock.json | 10 ++++++ Vite-React-main/src/app.js | 19 +++++++++++ Vite-React-main/src/services/api.js | 36 ++++++++++++++++++++ Vite-React-main/src/services/authServices.js | 28 +++++++++++++++ backend/package-lock.json | 2 ++ 5 files changed, 95 insertions(+) create mode 100644 Vite-React-main/src/app.js create mode 100644 Vite-React-main/src/services/api.js create mode 100644 Vite-React-main/src/services/authServices.js diff --git a/Vite-React-main/package-lock.json b/Vite-React-main/package-lock.json index e6bdb335..0c219dd8 100644 --- a/Vite-React-main/package-lock.json +++ b/Vite-React-main/package-lock.json @@ -85,6 +85,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", @@ -1326,6 +1327,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "devOptional": true, + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1382,6 +1384,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1770,6 +1773,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001629", "electron-to-chromium": "^1.4.796", @@ -2643,6 +2647,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -4842,6 +4847,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -5125,6 +5131,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -5136,6 +5143,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -5946,6 +5954,7 @@ "version": "3.4.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -6284,6 +6293,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz", "integrity": "sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==", "dev": true, + "peer": true, "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", diff --git a/Vite-React-main/src/app.js b/Vite-React-main/src/app.js new file mode 100644 index 00000000..314bcfc0 --- /dev/null +++ b/Vite-React-main/src/app.js @@ -0,0 +1,19 @@ +// frontend/src/App.js +import React, { useEffect } from 'react'; +import { logout } from './services/authService'; +import Routes from './Routes'; // Your routing component + +function App() { + useEffect(() => { + const handleUnauthorized = () => { + logout(); + }; + + window.addEventListener('app:unauthorized', handleUnauthorized); + return () => window.removeEventListener('app:unauthorized', handleUnauthorized); + }, []); + + return ; +} + +export default App; diff --git a/Vite-React-main/src/services/api.js b/Vite-React-main/src/services/api.js new file mode 100644 index 00000000..4d341f7c --- /dev/null +++ b/Vite-React-main/src/services/api.js @@ -0,0 +1,36 @@ +// frontend/src/services/api.js +import axios from 'axios'; + +// Create Axios instance +const api = axios.create({ + baseURL: process.env.REACT_APP_API_URL || 'http://localhost:5000/api', + withCredentials: false, +}); + +// Set token in headers +export const setToken = (token) => { + if (token) { + api.defaults.headers.common['Authorization'] = `Bearer ${token}`; + } else { + delete api.defaults.headers.common['Authorization']; + } +}; + +// Clear token from headers +export const clearToken = () => { + delete api.defaults.headers.common['Authorization']; +}; + +// Interceptor for global 401 handling +api.interceptors.response.use( + (response) => response, + (error) => { + if (error.response?.status === 401) { + // Trigger global logout or redirect + window.dispatchEvent(new CustomEvent('app:unauthorized')); + } + return Promise.reject(error); + } +); + +export default api; diff --git a/Vite-React-main/src/services/authServices.js b/Vite-React-main/src/services/authServices.js new file mode 100644 index 00000000..f839e27e --- /dev/null +++ b/Vite-React-main/src/services/authServices.js @@ -0,0 +1,28 @@ +// frontend/src/services/authService.js +import api, { setToken, clearToken } from './api'; + +// Login +export const login = async (email, password) => { + const response = await api.post('/auth/login', { email, password }); + const { token, user } = response.data; + + if (token) { + localStorage.setItem('token', token); + setToken(token); + } + + return { token, user }; +}; + +// Logout +export const logout = () => { + clearToken(); + localStorage.removeItem('token'); + window.location.href = '/login'; +}; + +// Get profile (example protected endpoint) +export const getProfile = async () => { + const response = await api.get('/auth/profile'); + return response.data; +}; diff --git a/backend/package-lock.json b/backend/package-lock.json index 301f3e4f..4c21c0a5 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -50,6 +50,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1487,6 +1488,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746",