Production .exe file issue fixed
This commit is contained in:
parent
c2213e0969
commit
fc9820217b
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
|
@ -7,7 +7,8 @@
|
|||
"scripts": {
|
||||
"dev": "npm-run-all --parallel dev:react dev:electron",
|
||||
"dev:react": "vite",
|
||||
"dev:electron": "npm run transpile:electron && cross-env NODE_ENV=development electron --inspect=5858 .",
|
||||
"dev:electron": "npm run build && cross-env NODE_ENV=development electron --inspect=5858 .",
|
||||
"prod:electron": "npm run build && cross-env NODE_ENV=production electron .",
|
||||
"build": "tsc && vite build",
|
||||
"preview": "vite preview",
|
||||
"transpile:electron": "tsc --project src/electron/tsconfig.json",
|
||||
|
|
@ -48,6 +49,7 @@
|
|||
"daisyui": "^5.4.3",
|
||||
"electron": "^32.1.2",
|
||||
"electron-builder": "^25.0.5",
|
||||
"electron-rebuild": "^3.2.9",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"typescript": "^5.6.2",
|
||||
"vite": "^5.4.7",
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ export const registerIPCHandlers = (mainWindow: BrowserWindow) => {
|
|||
return { success: true };
|
||||
});
|
||||
|
||||
ipcMain.handle("login-request", async (_, credentials: { email: string; password: string }) => {
|
||||
ipcMain.handle("login-request", async (_, credentials: { email: string; password: string }) => {
|
||||
return handleLogin(credentials);
|
||||
});
|
||||
|
||||
|
|
@ -53,19 +53,19 @@ export const registerIPCHandlers = (mainWindow: BrowserWindow) => {
|
|||
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
|
||||
}
|
||||
});
|
||||
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
|
||||
|
|
@ -85,9 +85,9 @@ ipcMain.handle("get-project-list", async () => {
|
|||
return JSON.parse(JSON.stringify(res));
|
||||
} catch (error: any) {
|
||||
console.error(" get-project-list error:", error);
|
||||
return {
|
||||
success: false,
|
||||
message: error?.message || String(error) || "Unknown error"
|
||||
return {
|
||||
success: false,
|
||||
message: error?.message || String(error) || "Unknown error"
|
||||
};
|
||||
}
|
||||
});
|
||||
|
|
@ -164,7 +164,7 @@ ipcMain.handle("tracking-tabs-opening-and-closing", async (event, payload) => {
|
|||
// console.log("get-project-logs",projectID)
|
||||
// const response = await api.get(`/report/project/${projectID}`);
|
||||
// console.log("response-logs 164" , response)
|
||||
|
||||
|
||||
// return response;
|
||||
// } catch (error) {
|
||||
// console.error("Error fetching project logs:", error);
|
||||
|
|
@ -179,7 +179,7 @@ ipcMain.handle("get-project-logs", async (event, { projectID, fromDate, toDate }
|
|||
|
||||
let url = `/report/project/${projectID}`;
|
||||
|
||||
|
||||
|
||||
|
||||
// 🧠 Append query params only if dates are provided
|
||||
if (fromDate && toDate) {
|
||||
|
|
@ -190,7 +190,7 @@ ipcMain.handle("get-project-logs", async (event, { projectID, fromDate, toDate }
|
|||
url += `?${params.toString()}`;
|
||||
}
|
||||
|
||||
console.log("url" , url)
|
||||
console.log("url", url)
|
||||
|
||||
const response = await api.get(url);
|
||||
console.log("✅ response-logs:", response);
|
||||
|
|
@ -205,7 +205,7 @@ ipcMain.handle("get-project-logs", async (event, { projectID, fromDate, toDate }
|
|||
ipcMain.handle("forgot-password", async (event, email: string) => {
|
||||
try {
|
||||
const response = await api.post("/forgot-password", { email });
|
||||
console.log(response , "Line response")
|
||||
console.log(response, "Line response")
|
||||
if (response) {
|
||||
return { success: true, message: response.data?.message };
|
||||
}
|
||||
|
|
@ -223,5 +223,5 @@ ipcMain.handle('get-running-apps', async () => {
|
|||
|
||||
ipcMain.handle('capture-specific-window', async (event, appTitle: string) => {
|
||||
console.log(appTitle, "IPC HANDLE")
|
||||
return await captureSpecificApp(appTitle)
|
||||
return await captureSpecificApp(appTitle)
|
||||
});
|
||||
|
|
|
|||
|
|
@ -11,7 +11,10 @@ export function getPreloadPath() {
|
|||
}
|
||||
|
||||
export function getUIPath() {
|
||||
return path.join(app.getAppPath(), '/dist-react/index.html');
|
||||
return path.join(app.getAppPath(), "dist-react", "index.html");
|
||||
|
||||
// return "C:\\Users\\user\\OneDrive\\Desktop\\electron-main\\dist-react\\index.html";
|
||||
// return path.join(app.getAppPath(), '/dist-react/index.html');
|
||||
}
|
||||
|
||||
export function getAssetPath() {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { BrowserWindow, desktopCapturer } from "electron";
|
||||
import { app, BrowserWindow, desktopCapturer } from "electron";
|
||||
import * as fs from "fs";
|
||||
import path from "path";
|
||||
import axios from 'axios';
|
||||
|
|
@ -6,6 +6,7 @@ import sharp from 'sharp';
|
|||
import { saveToken } from "./tokenHelper.js";
|
||||
import { activeWindow } from "get-windows";
|
||||
import { exec } from "child_process";
|
||||
import { getUIPath } from "../pathResolver.js";
|
||||
|
||||
// Blur using an offscreen canvas
|
||||
async function blurAndCompressBase64Image(base64: string): Promise<Buffer> {
|
||||
|
|
@ -54,6 +55,12 @@ export const handleLogin = async (credentials: { email: string, password: string
|
|||
// Call your login API
|
||||
console.log("🟡 login Request received", credentials);
|
||||
|
||||
console.log("Doom");
|
||||
console.log("app.getAppPath()", app.getAppPath());
|
||||
console.log("UIPATH", getUIPath());
|
||||
console.log("Doom 1");
|
||||
|
||||
|
||||
try {
|
||||
console.log("➡️ Calling API...");
|
||||
const response = await axios.post(
|
||||
|
|
@ -138,7 +145,7 @@ export const getRunningAppsList = async () => {
|
|||
}
|
||||
|
||||
|
||||
export const captureSpecificApp = async (windowTitle: string) : Promise<string> => {
|
||||
export const captureSpecificApp = async (windowTitle: string): Promise<string> => {
|
||||
try {
|
||||
const sources = await desktopCapturer.getSources({
|
||||
types: ['window', 'screen'],
|
||||
|
|
@ -169,7 +176,7 @@ export const captureSpecificApp = async (windowTitle: string) : Promise<string>
|
|||
// console.log(`Screenshot saved to ${filePath}`);
|
||||
} else {
|
||||
console.log(`Window with title "${windowTitle}" not found.`);
|
||||
return "Not Found"
|
||||
return "Not Found"
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error capturing screenshot:', error);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,84 @@
|
|||
// import React, { useEffect } from "react";
|
||||
// import { BrowserRouter, Route, Routes, Navigate } from "react-router-dom";
|
||||
// import { useDispatch, useSelector } from "react-redux";
|
||||
// import { AppDispatch, RootState } from "./store";
|
||||
// import { loadUserFromStorage } from "./store/userSlice";
|
||||
|
||||
// import Login from "./pages/Login";
|
||||
// import Dashboard from "./pages/Dashboard";
|
||||
// import Projects from "./pages/Projects/Projects";
|
||||
// import DashboardLayout from "./layout/DashboardLayout";
|
||||
// import ProtectedRoute from "./routes/ProtectedRoute";
|
||||
// import PublicRoute from "./routes/PublicRoute";
|
||||
// import { ThemeToggle } from "./helper/ThemeToggle";
|
||||
// import LeaveAndAdjustments from "./pages/LeaveAndAdjustments/LeaveAndAdjustments";
|
||||
// import Timesheets from "./pages/Timesheets/Timesheets";
|
||||
// import Settings from "./pages/Settings/Settings";
|
||||
// import HelpSupport from "./pages/HelpSupport/HelpSupport";
|
||||
|
||||
// const App: React.FC = () => {
|
||||
// const theme = ThemeToggle();
|
||||
// const dispatch = useDispatch<AppDispatch>();
|
||||
|
||||
// // ✅ Get user directly from Redux
|
||||
// const user = useSelector((state: RootState) => state.user.user);
|
||||
|
||||
// useEffect(() => {
|
||||
// document.documentElement.setAttribute("data-theme", theme);
|
||||
// }, [theme]);
|
||||
|
||||
// // ✅ Load user from localStorage into Redux when app starts
|
||||
// useEffect(() => {
|
||||
// dispatch(loadUserFromStorage());
|
||||
// }, [dispatch]);
|
||||
|
||||
// console.log("App.tsx → user:", user);
|
||||
|
||||
// return (
|
||||
// <BrowserRouter>
|
||||
// <Routes>
|
||||
// {/* Public Route */}
|
||||
// <Route
|
||||
// path="/login"
|
||||
// element={
|
||||
// <PublicRoute user={user}>
|
||||
// <Login />
|
||||
// </PublicRoute>
|
||||
// }
|
||||
// />
|
||||
|
||||
// {/* Protected Routes */}
|
||||
// <Route
|
||||
// path="/dashboard"
|
||||
// element={
|
||||
// <ProtectedRoute user={user}>
|
||||
// <DashboardLayout />
|
||||
// </ProtectedRoute>
|
||||
// }
|
||||
// >
|
||||
// <Route index element={<Dashboard />} />
|
||||
// <Route path="projects" element={<Projects />} />
|
||||
// <Route path="leave-adjustments" element={<LeaveAndAdjustments />} />
|
||||
// <Route path="timesheet" element={<Timesheets />} />
|
||||
// <Route path="settings" element={<Settings />} />
|
||||
// <Route path="help-support" element={<HelpSupport />} />
|
||||
// </Route>
|
||||
|
||||
// {/* Default Redirect */}
|
||||
// <Route
|
||||
// path="*"
|
||||
// element={<Navigate to={user ? "/dashboard" : "/login"} replace />}
|
||||
// />
|
||||
// </Routes>
|
||||
// </BrowserRouter>
|
||||
// );
|
||||
// };
|
||||
|
||||
// export default App;
|
||||
|
||||
|
||||
import React, { useEffect } from "react";
|
||||
import { BrowserRouter, Route, Routes, Navigate } from "react-router-dom";
|
||||
import { HashRouter as Router, Route, Routes, Navigate } from "react-router-dom";
|
||||
import { useDispatch, useSelector } from "react-redux";
|
||||
import { AppDispatch, RootState } from "./store";
|
||||
import { loadUserFromStorage } from "./store/userSlice";
|
||||
|
|
@ -20,14 +99,12 @@ const App: React.FC = () => {
|
|||
const theme = ThemeToggle();
|
||||
const dispatch = useDispatch<AppDispatch>();
|
||||
|
||||
// ✅ Get user directly from Redux
|
||||
const user = useSelector((state: RootState) => state.user.user);
|
||||
|
||||
useEffect(() => {
|
||||
document.documentElement.setAttribute("data-theme", theme);
|
||||
}, [theme]);
|
||||
|
||||
// ✅ Load user from localStorage into Redux when app starts
|
||||
useEffect(() => {
|
||||
dispatch(loadUserFromStorage());
|
||||
}, [dispatch]);
|
||||
|
|
@ -35,7 +112,7 @@ const App: React.FC = () => {
|
|||
console.log("App.tsx → user:", user);
|
||||
|
||||
return (
|
||||
<BrowserRouter>
|
||||
<Router>
|
||||
<Routes>
|
||||
{/* Public Route */}
|
||||
<Route
|
||||
|
|
@ -70,7 +147,7 @@ const App: React.FC = () => {
|
|||
element={<Navigate to={user ? "/dashboard" : "/login"} replace />}
|
||||
/>
|
||||
</Routes>
|
||||
</BrowserRouter>
|
||||
</Router>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -302,81 +302,6 @@ const DashboardLayout = () => {
|
|||
}
|
||||
};
|
||||
|
||||
// Connect and start sending
|
||||
const handleConnect = async () => {
|
||||
|
||||
const token = await window.electron.getToken("ACCESS_TOKEN");
|
||||
|
||||
if (socketRef.current) {
|
||||
console.warn("Already connected");
|
||||
return;
|
||||
}
|
||||
if(!selectedProject?.projectId) return
|
||||
|
||||
console.log(selectedProject?.projectId, "SelectedProject ID")
|
||||
socketRef.current = io("https://wired-terminally-muskrat.ngrok-free.app", {
|
||||
transports: ["websocket"],
|
||||
secure: true,
|
||||
auth: {
|
||||
token: token,
|
||||
projectId: selectedProject?.projectId,
|
||||
userType: "va"
|
||||
},
|
||||
});
|
||||
|
||||
socketRef.current.on("connect", () => {
|
||||
console.log("🟢 Connected:", socketRef.current?.id);
|
||||
setIsConnected(true);
|
||||
|
||||
// Start sending every 5 seconds
|
||||
intervalRef.current = setInterval(async () => {
|
||||
const apps = await window.electron.getRunningApps()
|
||||
socketRef.current?.emit("getVisibleApps", { token: await token, apps });
|
||||
|
||||
// const base64String = await window.electron.captureAppScreenShot("Screen 1");
|
||||
// if (base64String) {
|
||||
// socketRef.current?.emit("sendImage", {token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY5MGIzMjhkMDkxMDFmNzRjZjUyNGMwNyIsImVtYWlsIjoiYmhhZ3dhbi5yQGhpY2dsb2JhbHNvbHV0aW9ucy5jb20iLCJuYW1lIjoiUm9oaXQiLCJpYXQiOjE3NjI4NTgxOTMsImV4cCI6MTc2Mjk0NDU5M30.UlHy3RU9W5LOid7smG7WzyNT7dnqhQT4qqzRrN1axmU", image: base64String, title: "Screen 1"});
|
||||
// }
|
||||
}, 5000);
|
||||
});
|
||||
|
||||
socketRef.current.on("appToCapture", async ({ appTitle }) => {
|
||||
console.log("📸 Capture requested for:", appTitle);
|
||||
|
||||
const base64String = await window.electron.captureAppScreenShot(appTitle);
|
||||
if (base64String && socketRef.current) {
|
||||
socketRef.current.emit("sendImage", {
|
||||
token: token,
|
||||
image: base64String,
|
||||
title: appTitle
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
socketRef.current.on("disconnect", () => {
|
||||
console.log("🔴 Disconnected");
|
||||
setIsConnected(false);
|
||||
if (intervalRef.current) {
|
||||
clearInterval(intervalRef.current);
|
||||
intervalRef.current = null;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const handleDisconnect = () => {
|
||||
if (intervalRef.current) {
|
||||
clearInterval(intervalRef.current);
|
||||
intervalRef.current = null;
|
||||
}
|
||||
|
||||
if (socketRef.current) {
|
||||
socketRef.current.disconnect();
|
||||
socketRef.current = null;
|
||||
setIsConnected(false);
|
||||
console.log("🔌 Disconnected manually");
|
||||
}
|
||||
};
|
||||
|
||||
// Sync global states with selected project tracking data
|
||||
useEffect(() => {
|
||||
if (selectedProject) {
|
||||
|
|
@ -766,7 +691,7 @@ const DashboardLayout = () => {
|
|||
{/* Sidebar */}
|
||||
<aside className="w-20 bg-base-100 border-r border-base-300 flex flex-col items-center py-4 space-y-4">
|
||||
{menuItems.map((item , index) => (
|
||||
<div className="tooltip z-100 tooltip-right" key={item.label} data-tip={item.label} key={index}>
|
||||
<div className="tooltip z-100 tooltip-right" key={item.label} data-tip={item.label}>
|
||||
<NavLink
|
||||
key={item.label}
|
||||
to={item.path}
|
||||
|
|
|
|||
Loading…
Reference in New Issue