Files
OFLauncher/src/preload/index.ts
T
2026-06-17 20:43:27 +02:00

82 lines
3.5 KiB
TypeScript

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<PlayerProfile> => ipcRenderer.invoke(IPC.authLogin),
logout: (): Promise<void> => ipcRenderer.invoke(IPC.authLogout),
getProfile: (): Promise<PlayerProfile | null> => ipcRenderer.invoke(IPC.authGetProfile),
// --- Jouer (install + sync + launch) ---
play: (opts?: PlayOptions): Promise<void> => ipcRenderer.invoke(IPC.play, opts),
stopGame: (): Promise<boolean> => ipcRenderer.invoke(IPC.playStop),
getPackMeta: (): Promise<PackMeta | null> => ipcRenderer.invoke(IPC.packGet),
// --- Réglages ---
getSettings: (): Promise<UserSettings> => ipcRenderer.invoke(IPC.settingsGet),
setSettings: (s: UserSettings): Promise<UserSettings> => ipcRenderer.invoke(IPC.settingsSet, s),
getAppVersion: (): Promise<string> => ipcRenderer.invoke(IPC.appVersion),
/** Ouvre le dossier d'instance (mods/config/saves) dans l'explorateur. */
openInstanceDir: (): Promise<string> => ipcRenderer.invoke(IPC.openInstanceDir),
/** Ouvre le dossier des logs du launcher. */
openLogsDir: (): Promise<string> => ipcRenderer.invoke(IPC.openLogsDir),
/** Quitte et installe la mise à jour téléchargée. */
installUpdate: (): Promise<void> => ipcRenderer.invoke(IPC.updateInstall),
// --- Dossier de données ---
isFirstLaunch: (): Promise<boolean> => ipcRenderer.invoke(IPC.isFirstLaunch),
getDataDir: (): Promise<DataDirInfo> => ipcRenderer.invoke(IPC.dataDirGet),
browseDataDir: (): Promise<string | null> => ipcRenderer.invoke(IPC.dataDirBrowse),
/** relaunch=true : relance l'app (pour un changement post-installation). */
setDataDir: (dir: string, relaunch: boolean): Promise<string> =>
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)