va-tracker/src/electron/ipc/ipcHandler.ts

509 lines
13 KiB
TypeScript

import { ipcMain, BrowserWindow } from "electron";
import { getToken, saveToken, clearToken } from "../utils/tokenHelper.js";
import { getActiveApp, handleLogin, takeScreenshot, startWindowPolling, getRunningAppsList, captureSpecificApp } from "../utils/utilityFunctions.js";
import api from "../api/axiosClient.js";
import { getMainWindow } from '../main.js';
export const registerIPCHandlers = (mainWindow: BrowserWindow) => {
console.log("⚙️ Registering IPC Handlers...");
ipcMain.handle("get-token", async (_, key: "ACCESS_TOKEN" | "REFRESH_TOKEN") => {
return await getToken(key);
});
ipcMain.handle("save-token", async (_, key: "ACCESS_TOKEN" | "REFRESH_TOKEN", token: string) => {
await saveToken(key, token);
return true;
});
ipcMain.handle("clear-token", async (_, key: string) => {
await clearToken(key);
return true;
});
ipcMain.handle("upload-screenshot", async () => {
await takeScreenshot();
return { success: true };
});
ipcMain.handle("login-request", async (_, credentials: { email: string; password: string }) => {
return handleLogin(credentials);
});
ipcMain.handle("logout-request", async () => {
try {
console.log("Handle Logout listened");
console.log("Token", await getToken("ACCESS_TOKEN"));
const res = await api.get("/logout");
if (res && "success" in res && res.success) {
return { success: true, message: "Logout Successfully" };
}
return { success: false, message: "" };
} catch {
return { success: false, message: "Logout failed" };
}
});
ipcMain.handle("get-active-app", async () => {
return await getActiveApp();
});
ipcMain.handle('toggle-close-btn', (event, shouldEnable: boolean) => {
const mainWindow = getMainWindow()
console.log("toggle-close-btn Called", mainWindow)
if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.setClosable(shouldEnable);
}
});
ipcMain.handle("resize-window", (event, width: number, height: number) => {
const mainWindow = getMainWindow();
if (mainWindow && !mainWindow.isDestroyed()) {
console.log(`📏 Resizing window to ${width}x${height}`);
mainWindow.setResizable(true); // temporarily enable resizing
mainWindow.setSize(width, height);
mainWindow.setResizable(false); // disable again if you want to lock it
}
});
// ✅ Start background polling when main window is ready
};
// startWindowPolling(mainWindow);
ipcMain.handle("get-project-list", async () => {
console.log("📡 get-project-list called");
try {
const res = await api.get("/list/projects");
console.log(" API /list/project response:", res);
// Return only serializable data
return JSON.parse(JSON.stringify(res));
} catch (error: any) {
console.error(" get-project-list error:", error.status);
return {
success: false,
message: error?.message || String(error) || "Unknown error",
status: error?.status
};
}
});
// When project tracking start
ipcMain.handle("start-project-tracking", async (event, payload) => {
try {
console.log("🚀 start-project-tracking called with:", payload);
const response = await api.post("/log/project", payload);
console.log(" Tracking start synced:", response);
return { success: true, data: response };
} catch (error: any) {
console.error("❌ Error syncing project start:", error);
// If API sent a response (like 400)
if (error.response) {
return {
success: false,
message: error.response.data?.message || "Request failed",
status: error.response.status
};
}
return {
success: false,
message: "Something went wrong",
status: 500
};
}
});
// When project tracking stop
ipcMain.handle("stop-project-tracking", async (event, payload) => {
try {
console.log("stop-project-tracking called with:", payload);
const response = await api.post("/log/project", payload);
console.log(" Tracking stop synced:", response);
return response;
} catch (error) {
console.error(" Error syncing project stop:", error);
throw error;
}
});
// tabs opening and closing when and tracking start
ipcMain.handle("tracking-tabs-opening-and-closing", async (event, payload) => {
try {
console.log("🟦 IPC tracking-tabs-opening-and-closing:", payload);
let response;
if (!payload.id) {
// POST new log (new tab opened)
response = await api.post("/log/project/track", {
logId: payload.logId,
projectId: payload.projectId,
title: payload.title,
appName: payload.appName,
});
console.log(" New log created:", response);
} else {
// PATCH existing log (same tab, update)
response = await api.patch("/log/project/track", {
id: payload.id,
logId: payload.logId,
projectId: payload.projectId,
title: payload.title,
appName: payload.appName,
});
console.log("Log updated:", response);
}
return response;
} catch (error) {
console.error("Error syncing project tab tracking:", error);
throw error;
}
});
ipcMain.handle("get-project-logs", async (event, { projectID, fromDate, toDate }) => {
try {
console.log("📥 get-project-logs called with:", { projectID, fromDate, toDate });
let url = `/report/project/${projectID}`;
// 🧠 Append query params only if dates are provided
if (fromDate && toDate) {
const params = new URLSearchParams({
from: fromDate,
to: toDate,
});
url += `?${params.toString()}`;
}
console.log("url", url)
const response = await api.get(url);
console.log("✅ response-logs:", response);
return { success: true, data: response.data };
} catch (error) {
console.error("❌ Error fetching project logs:", error);
throw error;
}
});
ipcMain.handle("forgot-password", async (event, email: string) => {
try {
const response = await api.post("/forgot-password", { email });
console.log(response, "Line response")
if (response) {
return { success: true, message: response.data?.message };
}
} catch (error: any) {
console.error("Forgot password error:", error.response?.data || error.message);
return {
success: false,
message: error.response?.data?.message || "Something went wrong",
};
}
});
ipcMain.handle('get-running-apps', async () => {
return await getRunningAppsList()
});
ipcMain.handle('capture-specific-window', async (event, appTitle: string) => {
console.log(appTitle, "IPC HANDLE")
return await captureSpecificApp(appTitle)
});
ipcMain.handle("get-profile", async () => {
try {
const response = await api.get("/profile");
console.log(response.data)
return {
success: true,
data: response.data,
};
} catch (error: any) {
console.error(" Profile fetch error:", error.response?.data || error.message);
return {
success: false,
message: error.response?.data?.message || "Something went wrong",
};
}
});
ipcMain.handle("change-password", async (event, data) => {
console.log("data-change-password", data)
// Build final payload
const payload = {
userDetails: {
oldPassword: data.oldPassword,
password: data.password,
cPassword: data.cPassword,
},
};
console.log("Change Password payload", payload)
try {
const response = await api.patch("/profile", payload);
console.log("Chnage-passowrd-response", response)
return { success: true, data: response.data };
} catch (error: any) {
console.error("❌ Change password error:", error.message);
return {
success: false,
message: error.response?.data?.message || "Password update failed",
};
}
});
ipcMain.handle("get-project-summary", async (_, { projectId, date }) => {
try {
const url = `/timesheet/summary/${projectId}/${date}`;
console.log("📡 Fetching summary:", url);
const res = await api.get(url);
return {
success: true,
data: res.data,
};
} catch (error: any) {
console.error("❌ Error fetching summary:", error.message);
return {
success: false,
message: error.response?.data?.message || "Something went wrong",
};
}
});
ipcMain.handle("create-timesheet", async (event, data) => {
console.log("data", data)
try {
console.log("📩 Timesheet Payload:", data);
const res = await api.post("/timesheet/adjustment/request", data);
console.log(res, " Line 323")
return {
success: true,
message: "Timesheet created successfully",
data: res,
};
} catch (error: any) {
console.error("❌ Timesheet Error:", error);
return {
success: false,
message: error.response?.data?.message || "Failed to create timesheet",
};
}
})
ipcMain.handle("create-leave-request", async (event, payload) => {
try {
console.log("Leave Request Received:", payload);
const response = await api.post("/leave/request", payload);
console.log("Leave Saved:", response);
return {
success: true,
data: response.data
};
} catch (error: any) {
console.error("❌ Leave Save Failed:");
let message = "Unknown error";
console.log(error.response)
if (error.response) {
console.log("Status:", error.response.status);
console.log("Message:", error.response.statusText);
console.log("Server Response:", error.response.data);
// Extract the backend message properly
message = error.response.data?.message || error.response.statusText;
} else {
message = error.message;
}
return {
success: false,
message
};
}
});
ipcMain.handle("get-schedules", async () => {
try {
console.log(" Fetching schedules...");
const response = await api.get("/payrollSchedule"); // Backend API call
console.log("✅ Schedule Data:", response.data);
return {
success: true,
result: response.data
};
} catch (error: any) {
console.error("❌ Fetch Schedules Failed:");
let message = "Unknown error occurred";
if (error.response) {
console.log("Status:", error.response.status);
console.log("Message:", error.response.statusText);
console.log("Server Response:", error.response.data);
message = error.response.data?.message || error.response.statusText;
} else {
message = error.message;
}
return {
success: false,
message
};
}
});
ipcMain.handle("get-payslips", async (event, vaId: string) => {
console.log("get-payslips", vaId)
try {
const response = await api.get(`/paySlip/${vaId}`);
console.log(response.data , "Line 409")
return {
success: true,
data: response.data || [],
};
} catch (error: any) {
let message = "Unknown error occurred";
if (error.response) {
console.log("Status:", error.response.status);
console.log("Message:", error.response.statusText);
console.log("Server Response:", error.response.data);
message = error.response.data?.message || error.response.statusText;
} else {
message = error.message;
}
return {
success: false,
message
};
}
});
ipcMain.handle("get-leave-list", async () => {
try {
const res = await api.get("/leaves/all");
console.log("/leaves/all", res.data);
return {
success: true,
data: res.data,
};
} catch (error: any) {
let message = "Unknown error occurred";
if (error.response) {
console.log("Status:", error.response.status);
console.log("Message:", error.response.statusText);
console.log("Server Response:", error.response.data);
message = error.response.data?.message || error.response.statusText;
} else {
message = error.message;
}
return {
success: false,
message
};
}
});
ipcMain.handle("get-adjustments-list", async (event, vaId: string) => {
try {
const res = await api.get(`/timesheet/adjustments/list?vaId=${vaId}`);
console.log("/timesheet/adjustments/list", res.data);
return {
success: true,
data: res.data,
};
} catch (error: any) {
let message = "Unknown error occurred";
if (error.response) {
console.log("Status:", error.response.status);
console.log("Message:", error.response.statusText);
console.log("Server Response:", error.response.data);
message = error.response.data?.message || error.response.statusText;
} else {
message = error.message;
}
return {
success: false,
message
};
}
});
export const sendTokenExpired = () => {
console.log("⚠️ Sending token-expired event to renderer");
BrowserWindow.getAllWindows().forEach((win) => {
if (!win.isDestroyed()) {
win.webContents.send("token-expired");
}
});
};
;