From b4403c2cd5b9faab06f8247eccd55de26fadd644 Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Thu, 18 Dec 2025 15:32:19 +0530 Subject: [PATCH] fixed issue if no project assign --- resources/wireguard/windows/wg0.conf | 7 ++-- src/electron/api/axiosClient.ts | 49 ++++++++++++++++++-------- src/electron/api/baseURL.ts | 3 ++ src/ui/hooks/useActiveAppTracker.tsx | 2 +- src/ui/pages/Dashboard.tsx | 43 +++++++++++++--------- src/ui/pages/PaySlips/PaysSlips.tsx | 2 ++ src/ui/pages/Timesheets/Timesheets.tsx | 10 +++--- src/ui/pages/Vpn/VpnGuard.tsx | 3 +- 8 files changed, 77 insertions(+), 42 deletions(-) diff --git a/resources/wireguard/windows/wg0.conf b/resources/wireguard/windows/wg0.conf index c5a6248..6e24434 100644 --- a/resources/wireguard/windows/wg0.conf +++ b/resources/wireguard/windows/wg0.conf @@ -1,12 +1,11 @@ [Interface] -PrivateKey = EA2j6mOQB17w497cZS4B91m/xDzEcGz9lU3jKtc1wU8= -Address = 10.0.0.27/32 +PrivateKey = yHrWqSi5ZV4YV1cVVPBt2NbmTHd/mDWtZGVWGQe5I3s= +Address = 10.0.0.91/32 DNS = 1.1.1.1 [Peer] PublicKey = jG+7H5thEiNjxY1XqI1R9oyMAMTIegLwE3tZkS1Rj2U= -AllowedIPs = 10.0.0.0/24 Endpoint = 35.95.209.161:51820 AllowedIPs = 10.0.0.0/24 -PersistentKeepalive = 25 \ No newline at end of file +PersistentKeepalive = 25 diff --git a/src/electron/api/axiosClient.ts b/src/electron/api/axiosClient.ts index 3cd6426..f2daad5 100644 --- a/src/electron/api/axiosClient.ts +++ b/src/electron/api/axiosClient.ts @@ -1,5 +1,5 @@ // electron/api/axiosClient.ts -import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; +import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; import { getToken } from '../utils/tokenHelper.js'; import chalk from "chalk"; import { sendTokenExpired } from '../ipc/ipcHandler.js'; @@ -8,40 +8,61 @@ import { getBaseURL } from './baseURL.js'; const TOKEN_KEY = 'ACCESS_TOKEN'; -const Base_URL = await getBaseURL() +// const Base_URL = await getBaseURL() const httpsAgent = new https.Agent({ rejectUnauthorized: false }); -console.log('Base_URL$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$' ,Base_URL) +// console.log('Base_URL$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$' ,Base_URL) const api: AxiosInstance = axios.create({ // baseURL: 'https://portal-sf.docva.com/api/v1/va', // 🔁 your backend - baseURL: `${Base_URL}/api/v1/va`, + // baseURL: `${Base_URL}/api/v1/va`, httpsAgent // timeout: 10000, }); + +export function syncAxiosBaseURL() { + const baseURL = getBaseURL(); + api.defaults.baseURL = `${baseURL}/api/v1/va`; + + console.log('✅ Axios baseURL synced →', api.defaults.baseURL); +} + // console.log("Creating Axios Instance", axios.VERSION); // console.log("Axios .get reference:", api.get); // console.log("Axios .request reference:", api.request); // --- Request Interceptor --- +// api.interceptors.request.use( +// async (config: AxiosRequestConfig): Promise => { +// const token = await getToken(TOKEN_KEY); +// config.headers = config.headers || {} + +// if (token) { +// config.headers['token'] = token; +// config.headers['ngrok-skip-browser-warning'] = 'true'; +// } + +// return config; +// }, +// (error) => Promise.reject(error) +// ); + api.interceptors.request.use( - async (config: AxiosRequestConfig): Promise => { - const token = await getToken(TOKEN_KEY); - config.headers = config.headers || {} + async (config: InternalAxiosRequestConfig) => { + const token = await getToken(TOKEN_KEY); - if (token) { - config.headers['token'] = token; - config.headers['ngrok-skip-browser-warning'] = 'true'; - } + if (token) { + config.headers.token = token; + config.headers['ngrok-skip-browser-warning'] = 'true'; + } - return config; - }, - (error) => Promise.reject(error) + return config; + } ); // --- Response Interceptor --- diff --git a/src/electron/api/baseURL.ts b/src/electron/api/baseURL.ts index 2a33d5a..93c83c0 100644 --- a/src/electron/api/baseURL.ts +++ b/src/electron/api/baseURL.ts @@ -1,7 +1,10 @@ +import { syncAxiosBaseURL } from "./axiosClient.js"; + // let CURRENT_BASE_URL = "https://portal-sf.docva.com/api/v1/va"; let CURRENT_BASE_URL = "https://portal-sf.docva.com"; export const getBaseURL = () => CURRENT_BASE_URL; export const setBaseURL = (url: string) => { CURRENT_BASE_URL = url; + syncAxiosBaseURL(); }; diff --git a/src/ui/hooks/useActiveAppTracker.tsx b/src/ui/hooks/useActiveAppTracker.tsx index 2993c5e..d66fb60 100644 --- a/src/ui/hooks/useActiveAppTracker.tsx +++ b/src/ui/hooks/useActiveAppTracker.tsx @@ -132,7 +132,7 @@ const finalizeAndSendLogs = useCallback( // } : null, // }); - let res = window.electron.trackingTabsOpeningClosing(payload); + let res = await window.electron.trackingTabsOpeningClosing(payload); console.log("Tracking response:", res); dispatch(clearProjectLogs({ projectId })); diff --git a/src/ui/pages/Dashboard.tsx b/src/ui/pages/Dashboard.tsx index 46c89f5..9216697 100644 --- a/src/ui/pages/Dashboard.tsx +++ b/src/ui/pages/Dashboard.tsx @@ -152,6 +152,14 @@ const Dashboard: React.FC = () => { }) ); + // FIX: Check if we have any projects + if (res.data.length === 0) { + // No projects available, clear selected project + dispatch(setSelectedProjectSlice(null)); + // fetchProfile(); + return; + } + // Check if we already have a selected project that's being tracked const currentlySelected = selectedProject; const currentlyTracking = isTracking; @@ -208,9 +216,13 @@ const Dashboard: React.FC = () => { fetchProfile(); } else { console.warn("⚠️ Unexpected response:", res); + // FIX: Also clear selected project on unexpected response + dispatch(setSelectedProjectSlice(null)); } } catch (err) { console.error("❌ Error fetching projects:", err); + // FIX: Clear selected project on error + dispatch(setSelectedProjectSlice(null)); } finally { setIsRefreshing(false); } @@ -218,6 +230,7 @@ const Dashboard: React.FC = () => { useEffect(() => { fetchProjects(); + fetchProfile() }, []); const handleRefresh = async () => { @@ -285,6 +298,7 @@ const Dashboard: React.FC = () => {

Dashboard

{/* Tracking Section */} + {/* Tracking Section */}
@@ -305,11 +319,6 @@ const Dashboard: React.FC = () => {

{formatTime(displayTime)}

- - {/*

- {formatTime(displayTime)} - {isLimitReached && " ⚠️"} -

*/}
Project:{" "} @@ -356,7 +365,9 @@ const Dashboard: React.FC = () => { ) : (

- Select a project below to start tracking. + {projectsData.length === 0 + ? "No projects available." + : "Select a project below to start tracking."}

)}
@@ -368,16 +379,16 @@ const Dashboard: React.FC = () => { {/* 🔹 Sticky Header */}

Projects

- {!selectedData?.isTracking && - } + {!selectedData?.isTracking && + }
{/* 🔹 Table or Empty State or Skeleton */} diff --git a/src/ui/pages/PaySlips/PaysSlips.tsx b/src/ui/pages/PaySlips/PaysSlips.tsx index 5c9b931..0e1a51e 100644 --- a/src/ui/pages/PaySlips/PaysSlips.tsx +++ b/src/ui/pages/PaySlips/PaysSlips.tsx @@ -9,6 +9,8 @@ const PaysSlips = () => { const [error, setError] = useState(null); const [rows, setRows] = useState([]); + + useEffect(() => { if (!projectSummary?.vaId) return; diff --git a/src/ui/pages/Timesheets/Timesheets.tsx b/src/ui/pages/Timesheets/Timesheets.tsx index 8ca6afc..49cdb60 100644 --- a/src/ui/pages/Timesheets/Timesheets.tsx +++ b/src/ui/pages/Timesheets/Timesheets.tsx @@ -64,13 +64,11 @@ const Timesheets: React.FC = () => { const [lastRefreshed, setLastRefreshed] = useState(null); const [initialLoading, setInitialLoading] = useState(true); const [tick, setTick] = useState(0); - const { selectedProject } = - useSelector((state: any) => state.projects); + const { selectedProject } = useSelector((state: any) => state.projects); + const selectedProjectId = selectedProject?.projectId ?? null; const activeProjects = projectsData.filter(p => p.status === "ACTIVE"); - console.log("selectedProject", selectedProject.projectId) - useEffect(() => { const interval = setInterval(() => { @@ -225,13 +223,13 @@ const Timesheets: React.FC = () => { {formatWorkTime(entry.totalWorkTime)}