Skip to content

Commit 0449dfb

Browse files
authored
fix(electron): resolve production build path issues (#45)
- main.ts: Fix HTML path resolution in packaged app (3 levels up vs 4) - main.tsx: Switch from BrowserRouter to HashRouter for file:// protocol - Landing.tsx: Fix logo path from absolute to relative These changes fix the blank white screen issue in the packaged Electron app.
1 parent 9a223c0 commit 0449dfb

File tree

4 files changed

+13
-115
lines changed

4 files changed

+13
-115
lines changed

package-lock.json

Lines changed: 0 additions & 105 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/electron_app/main.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,18 +142,22 @@ function createWindow(): void {
142142
console.error('Failed to load dev server:', err);
143143
});
144144
} else {
145-
// __dirname is: dist/electron/src/electron_app/
146-
// Go up 4 levels to app root, then into dist/renderer/
147-
const htmlPath = path.join(__dirname, '..', '..', '..', '..', 'dist', 'renderer', 'index.html');
145+
// In production, __dirname is inside app.asar
146+
// The dist/renderer folder IS inside the asar, so we can use a relative path
147+
// __dirname = resources/app.asar/dist/electron/src/electron_app
148+
// We need: resources/app.asar/dist/renderer/index.html
149+
// Go up 3 levels to reach app.asar/dist, then down to renderer/index.html
150+
const htmlPath = path.join(__dirname, '..', '..', '..', 'renderer', 'index.html');
148151
console.log('Loading production HTML from:', htmlPath);
149152
console.log('App is packaged:', app.isPackaged);
150153
console.log('Resolved path:', path.resolve(htmlPath));
151-
154+
152155
if (!fs.existsSync(htmlPath)) {
153156
console.error('ERROR: Production HTML not found at:', htmlPath);
154157
console.error('__dirname is:', __dirname);
158+
console.error('Resolved path is:', path.resolve(htmlPath));
155159
}
156-
160+
157161
mainWindow.loadFile(htmlPath);
158162
}
159163

src/ui/main.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom/client';
3-
import { BrowserRouter } from 'react-router-dom';
3+
import { HashRouter } from 'react-router-dom';
44
import App from './App';
55
import './index.css';
66

77
ReactDOM.createRoot(document.getElementById('root')!).render(
88
<React.StrictMode>
9-
{/* @ts-expect-error: Suppressing future flag type error until types catch up */}
10-
<BrowserRouter future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>
9+
<HashRouter>
1110
<App />
12-
</BrowserRouter>
11+
</HashRouter>
1312
</React.StrictMode>,
1413
);

src/ui/pages/Landing.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ const Landing: React.FC = () => {
207207

208208
{/* Logo + Title */}
209209
<div className="flex flex-col items-center mb-10">
210-
<img src="/logo.png" alt="lemonade" className="w-16 h-16 mb-4" />
210+
<img src="./logo.png" alt="lemonade" className="w-16 h-16 mb-4" />
211211
<h1 className="text-2xl font-bold tracking-tight">interviewer</h1>
212212
<p className={`mt-2 text-sm text-gray-500 dark:text-white/40 transition-all duration-500 ${
213213
step !== 'initial' ? 'opacity-100' : 'opacity-0 pointer-events-none'

0 commit comments

Comments
 (0)