mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-08-02 10:00:17 +05:30
The v5.0.0 React UI redesign shipped without a working dev workflow — `npm start` only ran `electron .` which loaded the source index.html that references raw .tsx files. The browser couldn't execute them, so the app rendered an empty #root and the user saw 'lot of errors'. This commit restores a real dev workflow: 1. **Vite dev server wired into npm scripts** — added `concurrently` + `wait-on` as devDeps. `npm run dev` now runs Vite (port 5173) and Electron together with `wait-on tcp:5173` so Electron only starts after the dev server is ready. 2. **Main process loads Vite URL in dev, dist/ in prod** — window module now checks `process.env.VITE_DEV_SERVER_URL` and `app.isPackaged` to decide what to load. Production still loads the built `dist/renderer/index.html`. 3. **Fixed ReferenceError: app is not defined** — window module referenced `app.isPackaged` but only imported `BrowserWindow`. Added `app` to the destructured import. 4. **Fixed wrong icon path** — window creation used `../../assets/icon.png` from src/main/window/ which resolved to `src/assets/icon.png` (doesn't exist). Icon lives at project root, so path is now `../../../assets/icon.png`. 5. **Allowed Google Fonts in CSP** — the strict CSP (`font-src 'self' data:`, `connect-src 'self'`) blocked the preconnect/css link to fonts.googleapis.com / .gstatic.com. Added both domains so Plus Jakarta Sans loads. 6. **Renamed onLayout → onLayoutChange** in AppShell — react-resizable-panels v4 renamed the prop. The v1 name was being spread to a DOM div and React logged 'Unknown event handler property' warnings. Test mock updated for parity. 7. **show: false → show: true** — ready-to-show was hanging on this Wayland/container combo. Now the window is shown immediately on create. Verified end-to-end: - 305/305 vitest tests pass - Vite dev server starts on :5173 - Electron loads localhost:5173 and React mounts - Header 'MarkdownConverter' + sidebar with 'No files open' visible - No onLayout warnings after HMR - All blocked errors resolved
49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
import { render, screen } from '@testing-library/react';
|
|
import { ThemeProvider } from '@/components/theme-provider';
|
|
import { AppShell } from '@/components/layout/AppShell';
|
|
import { useAppStore } from '@/stores/app-store';
|
|
|
|
// Mock react-resizable-panels for jsdom environment
|
|
vi.mock('@/components/ui/resizable', () => ({
|
|
ResizablePanelGroup: ({ children, direction, onLayoutChange }: any) => (
|
|
<div data-testid="resizable-panel-group" data-direction={direction}>
|
|
{children}
|
|
</div>
|
|
),
|
|
ResizablePanel: ({ children, defaultSize, minSize, maxSize }: any) => (
|
|
<div data-testid="resizable-panel" data-size={defaultSize} data-min={minSize} data-max={maxSize}>
|
|
{children}
|
|
</div>
|
|
),
|
|
ResizableHandle: () => <div data-testid="resizable-handle" />,
|
|
}));
|
|
|
|
describe('AppShell', () => {
|
|
beforeEach(() => {
|
|
localStorage.clear();
|
|
useAppStore.setState({ sidebarVisible: true, previewVisible: true, zenMode: false });
|
|
});
|
|
|
|
it('renders all shell surfaces when sidebar and preview are visible', () => {
|
|
render(
|
|
<ThemeProvider defaultTheme="dark" attribute="class">
|
|
<AppShell />
|
|
</ThemeProvider>
|
|
);
|
|
expect(screen.getByText(/markdownconverter/i)).toBeInTheDocument();
|
|
expect(screen.getByText(/no files open/i)).toBeInTheDocument();
|
|
expect(screen.getByText(/no file selected/i)).toBeInTheDocument();
|
|
expect(screen.getByText(/0 words/i)).toBeInTheDocument();
|
|
});
|
|
|
|
it('hides sidebar when sidebarVisible is false', () => {
|
|
useAppStore.setState({ sidebarVisible: false });
|
|
render(
|
|
<ThemeProvider defaultTheme="dark" attribute="class">
|
|
<AppShell />
|
|
</ThemeProvider>
|
|
);
|
|
expect(screen.queryByText(/file tree placeholder/i)).not.toBeInTheDocument();
|
|
});
|
|
}); |