From b7d0da09ada30dcfa874c2336b23e089ca4dd917 Mon Sep 17 00:00:00 2001 From: Tamilselvan Date: Thu, 11 Dec 2025 01:45:23 -0800 Subject: [PATCH] i 've added Session --- .env.development | 30 +++++++++++++++++++++ .env.production | 22 ++++++++++++++++ src/redux/thunks/userThunk.js | 8 +++--- src/routes/AppRoutes.jsx | 39 ++++++++++++++++++++++++++++ src/routes/RouteDefinitions.jsx | 18 ------------- src/utils/axiosInstances.js | 34 +++++++++++++++++------- src/utils/others.js | 11 ++++++-- src/utils/sessionUtils.js | 46 ++++++++++++++++++++++++--------- 8 files changed, 162 insertions(+), 46 deletions(-) diff --git a/.env.development b/.env.development index e69de29..780aeae 100644 --- a/.env.development +++ b/.env.development @@ -0,0 +1,30 @@ +ENV_BASE_URL='/' +ENV_COMMON_BASE_URL='http://192.168.1.16:3000/' +# ENV_API_URL='http://192.168.1.25:8001' +# ENV_API_URL='http://api.pozo.co.in/Retailapi_UnderTest' +# ENV_API_URL_COMMON='http://api.pozo.co.in/Pozocommonapi_UnderTest' +# ENV_API_URL='http://192.168.1.37:8010' +# ENV_API_URL_COMMON='http://192.168.1.37' +ENV_API_URL='http://192.168.1.37:8012' +ENV_API_URL_COMMON='http://192.168.1.37:8013' +ENV_API_URL_TOKEN='http://192.168.1.37:8001' +# ENV_API_URL='https://api.pozo.app/pozo-retail-api' +# ENV_API_URL_COMMON='https://api.pozo.app/pozo-common-api' +# ENV_API_URL_TOKEN='https://api.pozo.app/JwtToken' +# ENV_API_URL='https://www.pozo.dev/pozo-retail-api' +# ENV_API_URL_COMMON='https://www.pozo.dev/pozo-common-api' +# ENV_API_URL_TOKEN='https://www.pozo.dev/JwtToken' +ENV_IMAGE_UPLOAD_API_URL="https://api.pozo.app/pozo-common-image-api/" +ENV_SECRET_KEY="3a939a2eed2cca4b64cd47f51b23b135b2b9b765273f695d47682ea803c8429d" +ENV_URL_SECRET_KEY="f2ef79b8b2d4fc1cc569726a5a753552257b4ff2872d6a71cf3119bce3f07c1b" +ENV_MAIN_BASE_URL='http://192.168.1.22:3015/' +ENV_SIGNALR_SERVER_URL='https://www.pozo.dev/' +ENV_IFSC_API_URL = "https://ifsc.razorpay.com" +ENV_PAYMENT_DEVICE_URL='https://pozo.dev/PaymentDevice/PaymentDevice/api/upload-transaction' +ENV_PAYMENT_STATUS_GET_URL='https://pozo.dev/PaymentDevice/PaymentDevice/api/get-transaction-status' +ENV_ANDROID_PRINTER= 'https://pozo.app/downloads/resources/POZO%20Printer.apk' +ENV_ANDROID_KIOSK= 'https://pozo.app/downloads/resources/POZO%20KIOSK.apk' +ENV_ANDROID_HANDHELD= 'https://pozo.dev/downloads/resources/Handheld.apk' +ENV_ANDROID_BILLING= 'https://pozo.dev/downloads/resources/PozoBillingApp.apk' +ENV_EMAIL_API='http://192.168.1.37:8014' + \ No newline at end of file diff --git a/.env.production b/.env.production index e69de29..2f1fb1d 100644 --- a/.env.production +++ b/.env.production @@ -0,0 +1,22 @@ + +ENV_BASE_URL='/apps/retail/' +ENV_COMMON_BASE_URL='https://pozo.dev' +ENV_API_URL='https://www.pozo.dev/pozo-retail-api' +ENV_API_URL_COMMON='https://www.pozo.dev/pozo-common-api' +ENV_API_URL_TOKEN='https://www.pozo.dev/JwtToken' +ENV_IMAGE_UPLOAD_API_URL="https://www.pozo.dev/pozo-common-image-api" +ENV_SECRET_KEY="3a939a2eed2cca4b64cd47f51b23b135b2b9b765273f695d47682ea803c8429d" +ENV_URL_SECRET_KEY="f2ef79b8b2d4fc1cc569726a5a753552257b4ff2872d6a71cf3119bce3f07c1b" +ENV_MAIN_BASE_URL='https://pozo.dev/apps/retail/' +ENV_SIGNALR_SERVER_URL='https://www.pozo.dev/' +ENV_CUSTOM_PAYMENT_URL='https://pozo.app/CustomPaymentGateway/CustomPaymentGateway' +ENV_IFSC_API_URL = "https://ifsc.razorpay.com" +ENV_PAYMENT_DEVICE_URL='https://pozo.dev/PaymentDevice/PaymentDevice/api/upload-transaction' +ENV_PAYMENT_STATUS_GET_URL='https://pozo.dev/PaymentDevice/PaymentDevice/api/get-transaction-status' +# ENV_PAYMENT_DEVICE_URL='https://www.plutuscloudserviceuat.in:8201/API/CloudBasedIntegration/V1/UploadBilledTransaction' +# ENV_PAYMENT_STATUS_GET_URL='https://www.plutuscloudserviceuat.in:8201/API/CloudBasedIntegration/V1/GetCloudBasedTxnStatus' +ENV_ANDROID_PRINTER= 'https://pozo.dev/downloads/resources/POZO%20Printer.apk' +ENV_ANDROID_KIOSK= 'https://pozo.dev/downloads/resources/POZO%20KIOSK.apk' +ENV_ANDROID_HANDHELD= 'https://pozo.dev/downloads/resources/Handheld.apk' +ENV_ANDROID_BILLING= 'https://pozo.dev/downloads/resources/PozoApp.apk' +ENV_EMAIL_API='https://www.pozo.dev/pozo-sms-email-template-api' \ No newline at end of file diff --git a/src/redux/thunks/userThunk.js b/src/redux/thunks/userThunk.js index 62a7102..1fcffe2 100644 --- a/src/redux/thunks/userThunk.js +++ b/src/redux/thunks/userThunk.js @@ -1,5 +1,5 @@ import { createAsyncThunk } from '@reduxjs/toolkit'; -import { axiosInstance } from '../../utils/axiosInstances'; +import { axiosCommonInstance, axiosInstance } from '../../utils/axiosInstances'; export const getUserData = createAsyncThunk('userSlice/getEmpAccess', async (data) => { const { UserId } = data; @@ -8,10 +8,10 @@ export const getUserData = createAsyncThunk('userSlice/getEmpAccess', async (dat } }); -export const getSessionData = createAsyncThunk( - 'userSlice/getSessionData', +export const getSessionDataFromCommon = createAsyncThunk( + 'userSlice/getSessionDataFromCommon', async (postData) => { - return await axiosCommonInstanceData.get( + return await axiosCommonInstance.get( `/URLshortener?referenceNo=${postData}` ); } diff --git a/src/routes/AppRoutes.jsx b/src/routes/AppRoutes.jsx index 331abed..43c5c7d 100644 --- a/src/routes/AppRoutes.jsx +++ b/src/routes/AppRoutes.jsx @@ -2,6 +2,11 @@ import { Routes, Route } from "react-router-dom"; import { RouteDefinitions } from "./RouteDefinitions"; +import { useDispatch } from "react-redux"; +import { getSessionDataFromCommon } from "../redux/thunks/userThunk"; +import { decryptToObject } from "../utils/others"; +import { sessionStore } from "../utils/sessionUtils"; +import { useEffect } from "react"; const generateRoutes = (routes) => routes.map(({ path, element, children, index }, routeIndex) => ( @@ -11,6 +16,40 @@ const generateRoutes = (routes) => )); export default function AppRoutes() { + const dispatch = useDispatch() + useEffect(() => { + const init = async () => { + try { + const qrResponse = await dispatch( + getSessionDataFromCommon("sRhok0") + ).unwrap(); + if (qrResponse?.data?.statusCode == 1) { + const urldata = decryptToObject(qrResponse.data.data?.[0]?.OldUrl); + + console.log("Decrypted URL Data:", urldata); + + sessionStore("AppId", urldata?.AppId); + sessionStore("CompId", urldata?.CompId); + sessionStore("UserId", urldata?.UserId); + sessionStore("UserType", urldata?.UserType); + sessionStore("MobileNo", urldata?.MobileNo); + sessionStore("SessionId", urldata?.SessionId); + + if (urldata?.BranchId) sessionStore("BranchId", urldata?.BranchId); + + sessionStorage.setItem("auth", urldata?.auth); + } + + + } + catch (err) { + + } + + }; + + init(); + }, []); const routes = generateRoutes(RouteDefinitions); return {routes}; } diff --git a/src/routes/RouteDefinitions.jsx b/src/routes/RouteDefinitions.jsx index c6edcd3..6c09015 100644 --- a/src/routes/RouteDefinitions.jsx +++ b/src/routes/RouteDefinitions.jsx @@ -11,28 +11,10 @@ import Transactions from "../pages/Transactions/Transactions.jsx"; import Cashbook from "../pages/Cashbook/Cashbook.jsx"; import Expenses from "../pages/Expenses/Expenses.jsx"; import ProtectedRoute from "./ProtectedRoute.jsx"; -import { decryptToObject } from "../utils/others.js"; const user = { name: "Ram", avatar: "R" }; const isAuthenticated = true; - const qrResponse = await dispatch( - PublicQrCodeget(sessionDataCommon) - ).unwrap(); - - const urldata = decryptToObject(qrResponse.data.data?.[0]?.OldUrl); - console.log("Decrypted URL Data:", qrResponse, urldata); - sessionStore("AppId", urldata?.AppId); - sessionStore("CompId", urldata?.CompId); - sessionStore("UserId", urldata?.UserId); - sessionStore("UserType", urldata?.UserType); - sessionStore("MobileNo", urldata?.MobileNo); - sessionStore("SessionId", urldata?.SessionId); - sessionStorage.setItem("auth", urldata?.auth); - if (urldata.BranchId) sessionStore("BranchId", urldata.BranchId); - - window.history.replaceState(null, "", window.location.pathname); - window.location.replace(window.location.pathname); export const RouteDefinitions = [ { path: "/", diff --git a/src/utils/axiosInstances.js b/src/utils/axiosInstances.js index c466d1c..43edc89 100644 --- a/src/utils/axiosInstances.js +++ b/src/utils/axiosInstances.js @@ -1,11 +1,16 @@ import axios from 'axios' import { getAuthTokens } from './others.js' -import { getSessionData } from './sessionUtils.js' +import { getSession } from './sessionUtils.js' -const API_URL = import.meta.env.ENV_API_URL - -const axiosInstance = axios.create({ baseURL: API_URL }) +const apiUrl = import.meta.env.ENV_API_URL; +const apiCommonUrl = import.meta.env.ENV_API_URL_COMMON; +const subDirectory = import.meta.env.ENV_COMMON_BASE_URL; +const EmailApiUrl = import.meta.env.ENV_EMAIL_API; +const axiosInstance = axios.create({ baseURL: apiUrl }) +const axiosCommonInstance = axios.create({ + baseURL: apiCommonUrl, +}); const addAuthHeader = async (config) => { try { const tokens = getAuthTokens(); @@ -18,14 +23,14 @@ const addAuthHeader = async (config) => { console.warn('No access token available.') } - const mobileNo = await getSessionData('MobileNo'); - const userId = await getSessionData('UserId'); + const mobileNo = await getSession('MobileNo'); + const userId = await getSession('UserId'); if (mobileNo && userId) { config.headers['MobileNo'] = decryptedUser.MobileNo } else { console.warn('MobileNo not found in decrypted data.') - config.headers['MobileNo'] = '9000000001' + config.headers['MobileNo'] = '1000000001' } } catch (error) { @@ -36,13 +41,13 @@ const addAuthHeader = async (config) => { } axiosInstance.interceptors.request.use(addAuthHeader, (error) => Promise.reject(error)) - +axiosCommonInstance.interceptors.request.use(addAuthHeader, (error) => {console.error('Error in request interceptor:', error);return Promise.reject(error)}); const responseErrorHandler = async (error, axiosInstance) => { if (error.response && error.response.status === 401) { console.warn('Your session has expired. or Unauthorized') try { - const userId = getSessionData('UserId'); + const userId = getSession('UserId'); if (userId) { error.config.headers['Authorization'] = `Bearer ${newAccessToken}` return axiosInstance.request(error.config) @@ -63,4 +68,13 @@ axiosInstance.interceptors.response.use( ) -export { axiosInstance }; +export { axiosInstance ,axiosCommonInstance}; + + + + + + + + + diff --git a/src/utils/others.js b/src/utils/others.js index ef43964..2ea812d 100644 --- a/src/utils/others.js +++ b/src/utils/others.js @@ -1,4 +1,6 @@ import CryptoJS from 'crypto-js' +const SECRET_KEY = import.meta.env.ENV_SECRET_KEY; +const URL_SECRET_KEY = import.meta.env.ENV_URL_SECRET_KEY; export function encryptData(data, ENCRYPTION_KEY) { try { @@ -9,16 +11,21 @@ export function encryptData(data, ENCRYPTION_KEY) { return null } } - export const decryptToObject=(encryptedUrlSafeStr) =>{ + +export const decryptToObject=(encryptedUrlSafeStr) =>{ try { if (!encryptedUrlSafeStr) return null; + + // Restore base64 format let base64 = encryptedUrlSafeStr .replace(/-/g, "+") .replace(/_/g, "/"); - + + // Add missing padding while (base64.length % 4 !== 0) { base64 += "="; } + const bytes = CryptoJS.AES.decrypt(base64, SECRET_KEY); const decrypted = bytes.toString(CryptoJS.enc.Utf8); return JSON.parse(decrypted); diff --git a/src/utils/sessionUtils.js b/src/utils/sessionUtils.js index f73e2b7..96dda30 100644 --- a/src/utils/sessionUtils.js +++ b/src/utils/sessionUtils.js @@ -1,4 +1,5 @@ import { decryptData, encryptData } from './others' +import CryptoJS from 'crypto-js'; const SECRET_KEY = import.meta.env.ENV_SECRET_KEY @@ -11,19 +12,40 @@ export const setSessionData = (key, value) => { } } -export const getSessionData = (key) => { - const data = sessionStorage.getItem(key) - if (data) { - try { - const decrypted = decryptData(data, SECRET_KEY) - return decrypted - } catch (err) { - console.error(`Error decrypting session data for key "${key}":`, err) - } - } - return null -} +// export const getSessionData = (key) => { +// const data = sessionStorage.getItem(key) +// if (data) { +// try { +// const decrypted = decryptData(data, SECRET_KEY) +// return decrypted +// } catch (err) { +// console.error(`Error decrypting session data for key "${key}":`, err) +// } +// } +// return null +// } +export const getSession = (key) => { + const val = sessionStorage.getItem(key); + if (val) { + const decrypted = CryptoJS.AES.decrypt(val, SECRET_KEY).toString( + CryptoJS.enc.Utf8 + ); + + if (decrypted) { + return JSON.parse(decrypted); + } + } +}; + +export const sessionStore = (key, value) => { + const encryptedValue = CryptoJS.AES.encrypt( + JSON.stringify(value), + SECRET_KEY + ).toString(); + + if (encryptedValue) sessionStorage.setItem(key, encryptedValue); +}; export const clearSessionData = (key) => { sessionStorage.removeItem(key) }