From 1fc065a59b019bda6af0412e546879a0b903f5a9 Mon Sep 17 00:00:00 2001 From: JaiPandey425 Date: Fri, 19 Dec 2025 19:36:33 +0530 Subject: [PATCH] add the times pre and next functionality in timesheet modal and add the payoneerAccount user profile update --- resources/wireguard/windows/wg0.conf | 4 +- src/electron/api/axiosClient.ts | 2 +- src/electron/api/baseURL.ts | 4 +- src/electron/ipc/ipcHandler.ts | 19 ++- src/ui/layout/DashboardLayout.tsx | 2 +- .../SettingModal/ChangePaymentModal.tsx | 35 +++++- src/ui/pages/Settings/Settings.tsx | 15 ++- src/ui/pages/Timesheets/ProjectLogsModal.tsx | 111 +++++++++++++++++- src/ui/pages/Timesheets/Timesheets.tsx | 16 ++- src/ui/pages/Vpn/VpnGuard.tsx | 6 +- 10 files changed, 187 insertions(+), 27 deletions(-) diff --git a/resources/wireguard/windows/wg0.conf b/resources/wireguard/windows/wg0.conf index 6e24434..d1b05fc 100644 --- a/resources/wireguard/windows/wg0.conf +++ b/resources/wireguard/windows/wg0.conf @@ -1,7 +1,7 @@ [Interface] -PrivateKey = yHrWqSi5ZV4YV1cVVPBt2NbmTHd/mDWtZGVWGQe5I3s= -Address = 10.0.0.91/32 +PrivateKey = gPqf7ScXv2xtLkZz5a8qa7RNJ7uU5TQUo/rTfcprMWE= +Address = 10.0.0.172/32 DNS = 1.1.1.1 [Peer] diff --git a/src/electron/api/axiosClient.ts b/src/electron/api/axiosClient.ts index f2daad5..862acb1 100644 --- a/src/electron/api/axiosClient.ts +++ b/src/electron/api/axiosClient.ts @@ -18,7 +18,7 @@ const httpsAgent = new https.Agent({ // console.log('Base_URL$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$' ,Base_URL) const api: AxiosInstance = axios.create({ - // baseURL: 'https://portal-sf.docva.com/api/v1/va', // 🔁 your backend + // baseURL: 'http://dreadingly-unfighting-pandora.ngrok-free.dev/api/v1/va', // 🔁 your backend // baseURL: `${Base_URL}/api/v1/va`, httpsAgent // timeout: 10000, diff --git a/src/electron/api/baseURL.ts b/src/electron/api/baseURL.ts index 93c83c0..3ec8abd 100644 --- a/src/electron/api/baseURL.ts +++ b/src/electron/api/baseURL.ts @@ -1,7 +1,7 @@ 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"; +// let CURRENT_BASE_URL = "http://dreadingly-unfighting-pandora.ngrok-free.dev/api/v1/va"; +let CURRENT_BASE_URL = "http://dreadingly-unfighting-pandora.ngrok-free.dev"; export const getBaseURL = () => CURRENT_BASE_URL; export const setBaseURL = (url: string) => { diff --git a/src/electron/ipc/ipcHandler.ts b/src/electron/ipc/ipcHandler.ts index f13f3d4..d9ded33 100644 --- a/src/electron/ipc/ipcHandler.ts +++ b/src/electron/ipc/ipcHandler.ts @@ -202,11 +202,11 @@ ipcMain.handle("get-project-logs", async (event, { projectID, fromDate, toDate } // 🧠 Append query params only if dates are provided if (fromDate && toDate) { - const params = new URLSearchParams({ - from: fromDate, - to: toDate, - }); - url += `?${params.toString()}`; + // const params = new URLSearchParams({ + // from: fromDate, + // to: toDate, + // }); + url += `/${fromDate}/${toDate}`; } console.log("url", url) @@ -509,15 +509,24 @@ ipcMain.handle("update-payment", async (event, data: Record) => { paymentMethod: data.paymentMethod, }; + // paymentMethod: 'payoneeraccount', + // payoneerAccount: 'check@gmail.com' + // Add payment-specific fields if (data.paymentMethod === "wise" && data.wiseEmail) { userDetails.wiseEmail = data.wiseEmail; // Clear veemAccount when switching to wise userDetails.veemAccount = ""; + userDetails.payoneerAccount = "" } else if (data.paymentMethod === "veem" && data.veemAccount) { userDetails.veemAccount = data.veemAccount; // Clear wiseEmail when switching to veem userDetails.wiseEmail = ""; + userDetails.payoneerAccount = "" + } else if (data.paymentMethod === "payoneeraccount" && data.payoneerAccount) { + userDetails.payoneerAccount = data.payoneerAccount; + userDetails.veemAccount = ""; + userDetails.wiseEmail = "" } // Build final payload diff --git a/src/ui/layout/DashboardLayout.tsx b/src/ui/layout/DashboardLayout.tsx index 2c45e1e..86e3ecd 100644 --- a/src/ui/layout/DashboardLayout.tsx +++ b/src/ui/layout/DashboardLayout.tsx @@ -592,7 +592,7 @@ const DashboardLayout = () => { if (!selectedProject?.projectId) return console.log(selectedProject?.projectId, "SelectedProject ID") - socketRef.current = io("https://portal-sf.docva.com", { + socketRef.current = io("http://dreadingly-unfighting-pandora.ngrok-free.dev", { transports: ["websocket"], secure: true, rejectUnauthorized: false, diff --git a/src/ui/pages/Settings/SettingModal/ChangePaymentModal.tsx b/src/ui/pages/Settings/SettingModal/ChangePaymentModal.tsx index 3dc248e..b61ca14 100644 --- a/src/ui/pages/Settings/SettingModal/ChangePaymentModal.tsx +++ b/src/ui/pages/Settings/SettingModal/ChangePaymentModal.tsx @@ -15,10 +15,11 @@ const ChangePaymentModal: React.FC = ({ }) => { const dispatch = useDispatch(); const { profile } = useSelector((state: RootState) => state.profile); - + const [method, setMethod] = useState(profile?.paymentMethod || ""); const [wiseEmail, setWiseEmail] = useState(profile?.wiseEmail || ""); const [veemAccount, setVeemAccount] = useState(profile?.veemAccount || ""); + const [payoneerAccount, setPayoneerAccount] = useState(profile?.payoneerAccount || ""); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); @@ -28,6 +29,7 @@ const ChangePaymentModal: React.FC = ({ setMethod(profile?.paymentMethod || ""); setWiseEmail(profile?.wiseEmail || ""); setVeemAccount(profile?.veemAccount || ""); + setPayoneerAccount(profile?.payoneerAccount || "") setError(""); } }, [isOpen]); @@ -46,12 +48,16 @@ const ChangePaymentModal: React.FC = ({ return setError("Wise email is required."); } - if (method === "wise" && !/^\S+@\S+\.\S+$/.test(wiseEmail)) { - return setError("Enter a valid Wise email."); + if (method === "veem" && !veemAccount.trim()) { + return setError("Veem email is required."); } - if (method === "veem" && !veemAccount.trim()) { - return setError("Veem account number is required."); + if (method === "payoneeraccount" && !payoneerAccount.trim()) { + return setError("Payoneer email is required."); + } + + if ((method === "wise" || "veem" || "payoneeraccount") && !/^\S+@\S+\.\S+$/.test(wiseEmail)) { + return setError("Enter a valid email."); } setLoading(true); @@ -67,6 +73,8 @@ const ChangePaymentModal: React.FC = ({ updateData.wiseEmail = wiseEmail.trim(); } else if (method === "veem") { updateData.veemAccount = veemAccount.trim(); + }else if (method === "payoneeraccount") { + updateData.payoneerAccount = payoneerAccount.trim(); } console.log("Sending to electron:", updateData); @@ -134,6 +142,7 @@ const ChangePaymentModal: React.FC = ({ + @@ -169,6 +178,22 @@ const ChangePaymentModal: React.FC = ({ )} + + {method === "payoneeraccount" && ( +
+ + setPayoneerAccount(e.target.value)} + /> +
+ )} +
+ + + {DateTime.fromJSDate(selectedDate).toFormat("dd LLL yyyy")} + + + +
+ + {loading ? (
diff --git a/src/ui/pages/Timesheets/Timesheets.tsx b/src/ui/pages/Timesheets/Timesheets.tsx index 49cdb60..c35384b 100644 --- a/src/ui/pages/Timesheets/Timesheets.tsx +++ b/src/ui/pages/Timesheets/Timesheets.tsx @@ -35,6 +35,13 @@ const timesheetData: TimesheetEntry[] = [ { id: 5, date: "2025-11-01", project: "AI Model Trainer", hours: 8, status: "Approved", remarks: "Normal day" }, ]; +interface ProjectSession { + from: string; + to: string; + totalSessionTime: string; + tabs: TabActivity[]; +} + interface Project { projectId: string; projectName: string; @@ -55,8 +62,8 @@ const Timesheets: React.FC = () => { console.log(" Timesheet in component:", windowLogs); const [projectsData, setProjectsData] = useState([]); - const [logs, setLogs] = useState([]); - // const [selectedProject, setSelectedProject] = useState(null); + const [logs, setLogs] = useState([]); + const [selectedProjectLogId, setSelectedProjectLogId] = useState(null); const [selectedProjectName, setSelectedProjectName] = useState(""); const [modalOpen, setModalOpen] = useState(false); const [loading, setLoading] = useState(false); @@ -122,7 +129,7 @@ const Timesheets: React.FC = () => { try { setModalOpen(true); setLoading(true); - // setSelectedProject(projectID); + setSelectedProjectLogId(projectID); setSelectedProjectName(projectName); console.log("projectID", projectID) @@ -290,6 +297,9 @@ const Timesheets: React.FC = () => { projectName={selectedProjectName} logs={logs} loading={loading} + setLoading={setLoading} + setLogs={setLogs} + projectID={selectedProjectLogId} /> ); diff --git a/src/ui/pages/Vpn/VpnGuard.tsx b/src/ui/pages/Vpn/VpnGuard.tsx index 0a48b8e..005e9b8 100644 --- a/src/ui/pages/Vpn/VpnGuard.tsx +++ b/src/ui/pages/Vpn/VpnGuard.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from "react"; -import { Shield, ShieldAlert, RefreshCw, Wifi, Power } from "lucide-react"; +import { Shield, ShieldAlert, RefreshCw, Wifi, Power, X } from "lucide-react"; interface Props { children: React.ReactNode; @@ -8,7 +8,7 @@ interface Props { const VpnGuard: React.FC = ({ children }) => { const VPN_API = "http://10.0.0.1"; - const DEFAULT_API = "https://portal-sf.docva.com" + const DEFAULT_API = "http://dreadingly-unfighting-pandora.ngrok-free.dev" const [checking, setChecking] = useState(true); const [vpnConnected, setVpnConnected] = useState(true); @@ -21,6 +21,7 @@ const VpnGuard: React.FC = ({ children }) => { const res = await window.electron?.checkRegion(); console.log("VpnGuard", res); if (res.status === 200) { + const baseRes = await window.electron.updateBaseURL(DEFAULT_API); setVpnConnected(true); } else { setVpnConnected(false); @@ -130,6 +131,7 @@ const VpnGuard: React.FC = ({ children }) => {
+ setVpnConnected(true)} />
{/* Icon */}