Production .exe file issue fixed

This commit is contained in:
BhagwanSingh 2025-11-14 12:51:25 +05:30
parent c2213e0969
commit fc9820217b
8 changed files with 3132 additions and 2060 deletions

BIN
electron-builder.zip Normal file

Binary file not shown.

4968
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,8 @@
"scripts": { "scripts": {
"dev": "npm-run-all --parallel dev:react dev:electron", "dev": "npm-run-all --parallel dev:react dev:electron",
"dev:react": "vite", "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", "build": "tsc && vite build",
"preview": "vite preview", "preview": "vite preview",
"transpile:electron": "tsc --project src/electron/tsconfig.json", "transpile:electron": "tsc --project src/electron/tsconfig.json",
@ -48,6 +49,7 @@
"daisyui": "^5.4.3", "daisyui": "^5.4.3",
"electron": "^32.1.2", "electron": "^32.1.2",
"electron-builder": "^25.0.5", "electron-builder": "^25.0.5",
"electron-rebuild": "^3.2.9",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"typescript": "^5.6.2", "typescript": "^5.6.2",
"vite": "^5.4.7", "vite": "^5.4.7",

View File

@ -57,7 +57,7 @@ export const registerIPCHandlers = (mainWindow: BrowserWindow) => {
ipcMain.handle("resize-window", (event, width: number, height: number) => { ipcMain.handle("resize-window", (event, width: number, height: number) => {
const mainWindow = getMainWindow(); const mainWindow = getMainWindow();
if (mainWindow && !mainWindow.isDestroyed()) { if (mainWindow && !mainWindow.isDestroyed()) {
console.log(`📏 Resizing window to ${width}x${height}`); console.log(`📏 Resizing window to ${width}x${height}`);
@ -65,7 +65,7 @@ ipcMain.handle("resize-window", (event, width: number, height: number) => {
mainWindow.setSize(width, height); mainWindow.setSize(width, height);
mainWindow.setResizable(false); // disable again if you want to lock it mainWindow.setResizable(false); // disable again if you want to lock it
} }
}); });
// ✅ Start background polling when main window is ready // ✅ Start background polling when main window is ready
@ -190,7 +190,7 @@ ipcMain.handle("get-project-logs", async (event, { projectID, fromDate, toDate }
url += `?${params.toString()}`; url += `?${params.toString()}`;
} }
console.log("url" , url) console.log("url", url)
const response = await api.get(url); const response = await api.get(url);
console.log("✅ response-logs:", response); 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) => { ipcMain.handle("forgot-password", async (event, email: string) => {
try { try {
const response = await api.post("/forgot-password", { email }); const response = await api.post("/forgot-password", { email });
console.log(response , "Line response") console.log(response, "Line response")
if (response) { if (response) {
return { success: true, message: response.data?.message }; return { success: true, message: response.data?.message };
} }

View File

@ -11,7 +11,10 @@ export function getPreloadPath() {
} }
export function getUIPath() { 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() { export function getAssetPath() {

View File

@ -1,4 +1,4 @@
import { BrowserWindow, desktopCapturer } from "electron"; import { app, BrowserWindow, desktopCapturer } from "electron";
import * as fs from "fs"; import * as fs from "fs";
import path from "path"; import path from "path";
import axios from 'axios'; import axios from 'axios';
@ -6,6 +6,7 @@ import sharp from 'sharp';
import { saveToken } from "./tokenHelper.js"; import { saveToken } from "./tokenHelper.js";
import { activeWindow } from "get-windows"; import { activeWindow } from "get-windows";
import { exec } from "child_process"; import { exec } from "child_process";
import { getUIPath } from "../pathResolver.js";
// Blur using an offscreen canvas // Blur using an offscreen canvas
async function blurAndCompressBase64Image(base64: string): Promise<Buffer> { async function blurAndCompressBase64Image(base64: string): Promise<Buffer> {
@ -54,6 +55,12 @@ export const handleLogin = async (credentials: { email: string, password: string
// Call your login API // Call your login API
console.log("🟡 login Request received", credentials); console.log("🟡 login Request received", credentials);
console.log("Doom");
console.log("app.getAppPath()", app.getAppPath());
console.log("UIPATH", getUIPath());
console.log("Doom 1");
try { try {
console.log("➡️ Calling API..."); console.log("➡️ Calling API...");
const response = await axios.post( 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 { try {
const sources = await desktopCapturer.getSources({ const sources = await desktopCapturer.getSources({
types: ['window', 'screen'], types: ['window', 'screen'],

View File

@ -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 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 { useDispatch, useSelector } from "react-redux";
import { AppDispatch, RootState } from "./store"; import { AppDispatch, RootState } from "./store";
import { loadUserFromStorage } from "./store/userSlice"; import { loadUserFromStorage } from "./store/userSlice";
@ -20,14 +99,12 @@ const App: React.FC = () => {
const theme = ThemeToggle(); const theme = ThemeToggle();
const dispatch = useDispatch<AppDispatch>(); const dispatch = useDispatch<AppDispatch>();
// ✅ Get user directly from Redux
const user = useSelector((state: RootState) => state.user.user); const user = useSelector((state: RootState) => state.user.user);
useEffect(() => { useEffect(() => {
document.documentElement.setAttribute("data-theme", theme); document.documentElement.setAttribute("data-theme", theme);
}, [theme]); }, [theme]);
// ✅ Load user from localStorage into Redux when app starts
useEffect(() => { useEffect(() => {
dispatch(loadUserFromStorage()); dispatch(loadUserFromStorage());
}, [dispatch]); }, [dispatch]);
@ -35,7 +112,7 @@ const App: React.FC = () => {
console.log("App.tsx → user:", user); console.log("App.tsx → user:", user);
return ( return (
<BrowserRouter> <Router>
<Routes> <Routes>
{/* Public Route */} {/* Public Route */}
<Route <Route
@ -70,7 +147,7 @@ const App: React.FC = () => {
element={<Navigate to={user ? "/dashboard" : "/login"} replace />} element={<Navigate to={user ? "/dashboard" : "/login"} replace />}
/> />
</Routes> </Routes>
</BrowserRouter> </Router>
); );
}; };

View File

@ -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 // Sync global states with selected project tracking data
useEffect(() => { useEffect(() => {
if (selectedProject) { if (selectedProject) {
@ -766,7 +691,7 @@ const DashboardLayout = () => {
{/* Sidebar */} {/* Sidebar */}
<aside className="w-20 bg-base-100 border-r border-base-300 flex flex-col items-center py-4 space-y-4"> <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) => ( {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 <NavLink
key={item.label} key={item.label}
to={item.path} to={item.path}