i 've added Session

This commit is contained in:
Tamilselvan 2025-12-11 01:45:23 -08:00
parent 7a2978e0a7
commit b7d0da09ad
8 changed files with 162 additions and 46 deletions

View File

@ -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'

View File

@ -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'

View File

@ -1,5 +1,5 @@
import { createAsyncThunk } from '@reduxjs/toolkit'; import { createAsyncThunk } from '@reduxjs/toolkit';
import { axiosInstance } from '../../utils/axiosInstances'; import { axiosCommonInstance, axiosInstance } from '../../utils/axiosInstances';
export const getUserData = createAsyncThunk('userSlice/getEmpAccess', async (data) => { export const getUserData = createAsyncThunk('userSlice/getEmpAccess', async (data) => {
const { UserId } = data; const { UserId } = data;
@ -8,10 +8,10 @@ export const getUserData = createAsyncThunk('userSlice/getEmpAccess', async (dat
} }
}); });
export const getSessionData = createAsyncThunk( export const getSessionDataFromCommon = createAsyncThunk(
'userSlice/getSessionData', 'userSlice/getSessionDataFromCommon',
async (postData) => { async (postData) => {
return await axiosCommonInstanceData.get( return await axiosCommonInstance.get(
`/URLshortener?referenceNo=${postData}` `/URLshortener?referenceNo=${postData}`
); );
} }

View File

@ -2,6 +2,11 @@
import { Routes, Route } from "react-router-dom"; import { Routes, Route } from "react-router-dom";
import { RouteDefinitions } from "./RouteDefinitions"; 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) => const generateRoutes = (routes) =>
routes.map(({ path, element, children, index }, routeIndex) => ( routes.map(({ path, element, children, index }, routeIndex) => (
@ -11,6 +16,40 @@ const generateRoutes = (routes) =>
)); ));
export default function AppRoutes() { 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); const routes = generateRoutes(RouteDefinitions);
return <Routes>{routes}</Routes>; return <Routes>{routes}</Routes>;
} }

View File

@ -11,28 +11,10 @@ import Transactions from "../pages/Transactions/Transactions.jsx";
import Cashbook from "../pages/Cashbook/Cashbook.jsx"; import Cashbook from "../pages/Cashbook/Cashbook.jsx";
import Expenses from "../pages/Expenses/Expenses.jsx"; import Expenses from "../pages/Expenses/Expenses.jsx";
import ProtectedRoute from "./ProtectedRoute.jsx"; import ProtectedRoute from "./ProtectedRoute.jsx";
import { decryptToObject } from "../utils/others.js";
const user = { name: "Ram", avatar: "R" }; const user = { name: "Ram", avatar: "R" };
const isAuthenticated = true; 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 = [ export const RouteDefinitions = [
{ {
path: "/", path: "/",

View File

@ -1,11 +1,16 @@
import axios from 'axios' import axios from 'axios'
import { getAuthTokens } from './others.js' 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 apiUrl = import.meta.env.ENV_API_URL;
const apiCommonUrl = import.meta.env.ENV_API_URL_COMMON;
const axiosInstance = axios.create({ baseURL: API_URL }) 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) => { const addAuthHeader = async (config) => {
try { try {
const tokens = getAuthTokens(); const tokens = getAuthTokens();
@ -18,14 +23,14 @@ const addAuthHeader = async (config) => {
console.warn('No access token available.') console.warn('No access token available.')
} }
const mobileNo = await getSessionData('MobileNo'); const mobileNo = await getSession('MobileNo');
const userId = await getSessionData('UserId'); const userId = await getSession('UserId');
if (mobileNo && userId) { if (mobileNo && userId) {
config.headers['MobileNo'] = decryptedUser.MobileNo config.headers['MobileNo'] = decryptedUser.MobileNo
} else { } else {
console.warn('MobileNo not found in decrypted data.') console.warn('MobileNo not found in decrypted data.')
config.headers['MobileNo'] = '9000000001' config.headers['MobileNo'] = '1000000001'
} }
} catch (error) { } catch (error) {
@ -36,13 +41,13 @@ const addAuthHeader = async (config) => {
} }
axiosInstance.interceptors.request.use(addAuthHeader, (error) => Promise.reject(error)) 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) => { const responseErrorHandler = async (error, axiosInstance) => {
if (error.response && error.response.status === 401) { if (error.response && error.response.status === 401) {
console.warn('Your session has expired. or Unauthorized') console.warn('Your session has expired. or Unauthorized')
try { try {
const userId = getSessionData('UserId'); const userId = getSession('UserId');
if (userId) { if (userId) {
error.config.headers['Authorization'] = `Bearer ${newAccessToken}` error.config.headers['Authorization'] = `Bearer ${newAccessToken}`
return axiosInstance.request(error.config) return axiosInstance.request(error.config)
@ -63,4 +68,13 @@ axiosInstance.interceptors.response.use(
) )
export { axiosInstance }; export { axiosInstance ,axiosCommonInstance};

View File

@ -1,4 +1,6 @@
import CryptoJS from 'crypto-js' 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) { export function encryptData(data, ENCRYPTION_KEY) {
try { try {
@ -9,16 +11,21 @@ export function encryptData(data, ENCRYPTION_KEY) {
return null return null
} }
} }
export const decryptToObject=(encryptedUrlSafeStr) =>{ export const decryptToObject=(encryptedUrlSafeStr) =>{
try { try {
if (!encryptedUrlSafeStr) return null; if (!encryptedUrlSafeStr) return null;
// Restore base64 format
let base64 = encryptedUrlSafeStr let base64 = encryptedUrlSafeStr
.replace(/-/g, "+") .replace(/-/g, "+")
.replace(/_/g, "/"); .replace(/_/g, "/");
// Add missing padding
while (base64.length % 4 !== 0) { while (base64.length % 4 !== 0) {
base64 += "="; base64 += "=";
} }
const bytes = CryptoJS.AES.decrypt(base64, SECRET_KEY); const bytes = CryptoJS.AES.decrypt(base64, SECRET_KEY);
const decrypted = bytes.toString(CryptoJS.enc.Utf8); const decrypted = bytes.toString(CryptoJS.enc.Utf8);
return JSON.parse(decrypted); return JSON.parse(decrypted);

View File

@ -1,4 +1,5 @@
import { decryptData, encryptData } from './others' import { decryptData, encryptData } from './others'
import CryptoJS from 'crypto-js';
const SECRET_KEY = import.meta.env.ENV_SECRET_KEY const SECRET_KEY = import.meta.env.ENV_SECRET_KEY
@ -11,19 +12,40 @@ export const setSessionData = (key, value) => {
} }
} }
export const getSessionData = (key) => { // export const getSessionData = (key) => {
const data = sessionStorage.getItem(key) // const data = sessionStorage.getItem(key)
if (data) { // if (data) {
try { // try {
const decrypted = decryptData(data, SECRET_KEY) // const decrypted = decryptData(data, SECRET_KEY)
return decrypted // return decrypted
} catch (err) { // } catch (err) {
console.error(`Error decrypting session data for key "${key}":`, err) // console.error(`Error decrypting session data for key "${key}":`, err)
} // }
} // }
return null // 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) => { export const clearSessionData = (key) => {
sessionStorage.removeItem(key) sessionStorage.removeItem(key)
} }