DNDGamePlayer: Electron редактор сцен, презентация, упаковка electron-builder

Made-with: Cursor
This commit is contained in:
Ivan Fontosh
2026-04-19 14:16:54 +08:00
commit a6cbcc273e
82 changed files with 22195 additions and 0 deletions
@@ -0,0 +1,4 @@
.root {
height: 100vh;
width: 100vw;
}
@@ -0,0 +1,41 @@
import React, { useEffect, useState } from 'react';
import { ipcChannels, type SessionState } from '../../shared/ipc/contracts';
import { getDndApi } from '../shared/dndApi';
import { PresentationView } from '../shared/PresentationView';
import styles from './PresentationApp.module.css';
export function PresentationApp() {
const [session, setSession] = useState<SessionState | null>(null);
const api = getDndApi();
useEffect(() => {
void api.invoke(ipcChannels.project.get, {}).then((res) => {
setSession({
project: res.project,
currentSceneId: res.project?.currentSceneId ?? null,
});
});
return api.on(ipcChannels.session.stateChanged, ({ state }) => setSession(state));
}, [api]);
useEffect(() => {
const onKeyDown = (e: KeyboardEvent) => {
if (e.key === 'Escape') {
void api.invoke(ipcChannels.windows.closeMultiWindow, {});
}
};
window.addEventListener('keydown', onKeyDown);
return () => window.removeEventListener('keydown', onKeyDown);
}, [api]);
return (
<div
className={styles.root}
onDoubleClick={() => void api.invoke(ipcChannels.windows.togglePresentationFullscreen, {})}
>
<PresentationView session={session} showTitle={false} />
</div>
);
}
+16
View File
@@ -0,0 +1,16 @@
import React from 'react';
import { createRoot } from 'react-dom/client';
import '../shared/ui/globals.css';
import { PresentationApp } from './PresentationApp';
const rootEl = document.getElementById('root');
if (!rootEl) {
throw new Error('Missing #root element');
}
createRoot(rootEl).render(
<React.StrictMode>
<PresentationApp />
</React.StrictMode>,
);