import { contextBridge, ipcRenderer } from 'electron' import { IPC, IPC_EVENT, type PlayerProfile, type ProgressEvent, type GameLogLine, type UserSettings, type DeviceCodeInfo, type UpdateStatus, type PlayOptions, type PackMeta, type DataDirInfo } from '../shared/ipc' /** API typée exposée au renderer via window.api. */ const api = { // --- Auth --- login: (): Promise => ipcRenderer.invoke(IPC.authLogin), logout: (): Promise => ipcRenderer.invoke(IPC.authLogout), getProfile: (): Promise => ipcRenderer.invoke(IPC.authGetProfile), // --- Jouer (install + sync + launch) --- play: (opts?: PlayOptions): Promise => ipcRenderer.invoke(IPC.play, opts), stopGame: (): Promise => ipcRenderer.invoke(IPC.playStop), getPackMeta: (): Promise => ipcRenderer.invoke(IPC.packGet), // --- Réglages --- getSettings: (): Promise => ipcRenderer.invoke(IPC.settingsGet), setSettings: (s: UserSettings): Promise => ipcRenderer.invoke(IPC.settingsSet, s), getAppVersion: (): Promise => ipcRenderer.invoke(IPC.appVersion), /** Ouvre le dossier d'instance (mods/config/saves) dans l'explorateur. */ openInstanceDir: (): Promise => ipcRenderer.invoke(IPC.openInstanceDir), /** Ouvre le dossier des logs du launcher. */ openLogsDir: (): Promise => ipcRenderer.invoke(IPC.openLogsDir), /** Quitte et installe la mise à jour téléchargée. */ installUpdate: (): Promise => ipcRenderer.invoke(IPC.updateInstall), // --- Dossier de données --- isFirstLaunch: (): Promise => ipcRenderer.invoke(IPC.isFirstLaunch), getDataDir: (): Promise => ipcRenderer.invoke(IPC.dataDirGet), browseDataDir: (): Promise => ipcRenderer.invoke(IPC.dataDirBrowse), /** relaunch=true : relance l'app (pour un changement post-installation). */ setDataDir: (dir: string, relaunch: boolean): Promise => ipcRenderer.invoke(IPC.dataDirSet, dir, relaunch), // --- Abonnements aux événements (retournent une fonction de désabonnement) --- onProgress: (cb: (e: ProgressEvent) => void): (() => void) => { const handler = (_: unknown, e: ProgressEvent): void => cb(e) ipcRenderer.on(IPC_EVENT.progress, handler) return () => ipcRenderer.removeListener(IPC_EVENT.progress, handler) }, onGameLog: (cb: (l: GameLogLine) => void): (() => void) => { const handler = (_: unknown, l: GameLogLine): void => cb(l) ipcRenderer.on(IPC_EVENT.gameLog, handler) return () => ipcRenderer.removeListener(IPC_EVENT.gameLog, handler) }, onGameClosed: (cb: (code: number | null) => void): (() => void) => { const handler = (_: unknown, code: number | null): void => cb(code) ipcRenderer.on(IPC_EVENT.gameClosed, handler) return () => ipcRenderer.removeListener(IPC_EVENT.gameClosed, handler) }, onAuthCode: (cb: (info: DeviceCodeInfo) => void): (() => void) => { const handler = (_: unknown, info: DeviceCodeInfo): void => cb(info) ipcRenderer.on(IPC_EVENT.authCode, handler) return () => ipcRenderer.removeListener(IPC_EVENT.authCode, handler) }, onUpdateStatus: (cb: (s: UpdateStatus) => void): (() => void) => { const handler = (_: unknown, s: UpdateStatus): void => cb(s) ipcRenderer.on(IPC_EVENT.updateStatus, handler) return () => ipcRenderer.removeListener(IPC_EVENT.updateStatus, handler) } } export type LauncherApi = typeof api contextBridge.exposeInMainWorld('api', api)