import type { ErrorReport, KartenAnfrage, KartenAntwort, FileDialogFilter, MenuCommand, OpenFileResult, SaveFileRequest, SaveFileResult, Verweisziel, } from '@shared/ipc'; /** * Bruecke zum Electron-Hauptprozess. * * Die Anwendung laeuft sowohl als Desktop-Programm (Electron) als auch im * Browser. Alles, was nur im Desktop-Betrieb moeglich ist, geht ueber diese * eine Schnittstelle; jede Stelle prueft ueber `desktopBridge()`, ob sie * verfuegbar ist, statt auf `window.require` oder `process` zu raten. * * Die Typen stammen aus shared/ipc.ts und werden vom Preload-Skript * (electron/preload.ts) implementiert. Eine Aenderung an einem Kanal faellt * dadurch beim Uebersetzen auf und nicht erst zur Laufzeit. */ export type { ErrorReport, KartenAnfrage, KartenAntwort, FileDialogFilter, MenuCommand, OpenFileResult, SaveFileRequest, SaveFileResult, } from '@shared/ipc'; export interface DesktopBridge { readonly platform: 'electron'; readonly appVersion: string; saveFile(request: SaveFileRequest): Promise; openFile(filters: readonly FileDialogFilter[]): Promise; /** Schreibt in eine zuvor ueber einen Dialog bestaetigte Datei. */ writeFile(filePath: string, data: string | Uint8Array): Promise; readFile(filePath: string): Promise; /** Meldet dem Hauptprozess, ob ungespeicherte Aenderungen bestehen. */ setDirty(dirty: boolean): void; /** Traegt einen Fehler in das Fehlerprotokoll ein. */ reportError(bericht: ErrorReport): void; /** Pfad der Protokolldatei, zum Anzeigen in der Hilfe. */ logPath(): Promise; /** * Holt ein Kartenbild ueber den Hauptprozess. * * Der Renderer baut selbst keine Verbindung nach aussen auf - seine * Inhaltssicherheitsrichtlinie verbietet das. Der Abruf erfolgt im * Hauptprozess gegen eine feste Liste erlaubter Rechnernamen. */ fetchMapImage(anfrage: KartenAnfrage): Promise; /** * Oeffnet eines von drei festen Zielen im Standardbrowser. * * Ein SCHLUESSEL, keine Adresse: Die Adresse dahinter steht im Hauptprozess * (`electron/verweise.ts`) und laesst sich von hier aus nicht setzen. Sonst * bestimmte am Ende jeder, der etwas in die Oberflaeche traegt, wohin * `shell.openExternal` zeigt - und das ist im Zweifel eine Projektdatei aus * fremder Hand. */ oeffneVerweis(ziel: Verweisziel): void; /** Empfaengt Menuebefehle des Hauptprozesses. */ onMenuCommand(handler: (command: MenuCommand) => void): () => void; /** Der Hauptprozess fragt vor dem Schliessen nach. */ onBeforeClose(handler: () => Promise): void; } declare global { interface Window { lsaPlaner?: DesktopBridge; } } /** Gibt die Desktop-Bruecke zurueck, sofern die Anwendung in Electron laeuft. */ export function desktopBridge(): DesktopBridge | undefined { return typeof window !== 'undefined' ? window.lsaPlaner : undefined; } export function hasDesktopBridge(): boolean { return desktopBridge() !== undefined; }