electron-apilisted
Install: claude install-skill mits-pl/wove
# Adding Electron APIs
Electron APIs allow the frontend to call Electron main process functionality directly via IPC.
## Four Files to Edit
1. [`frontend/types/custom.d.ts`](frontend/types/custom.d.ts) - TypeScript [`ElectronApi`](frontend/types/custom.d.ts:82) type
2. [`emain/preload.ts`](emain/preload.ts) - Expose method via `contextBridge`
3. [`emain/emain-ipc.ts`](emain/emain-ipc.ts) - Implement IPC handler
4. [`frontend/preview/preview-electron-api.ts`](frontend/preview/preview-electron-api.ts) - Add a no-op stub to keep the `previewElectronApi` object in sync with the `ElectronApi` type
## Three Communication Patterns
1. **Sync** - `ipcRenderer.sendSync()` + `ipcMain.on()` + `event.returnValue = ...`
2. **Async** - `ipcRenderer.invoke()` + `ipcMain.handle()`
3. **Fire-and-forget** - `ipcRenderer.send()` + `ipcMain.on()`
## Example: Async Method
### 1. Define TypeScript Interface
In [`frontend/types/custom.d.ts`](frontend/types/custom.d.ts):
```typescript
type ElectronApi = {
captureScreenshot: (rect: Electron.Rectangle) => Promise<string>; // capture-screenshot
};
```
### 2. Expose in Preload
In [`emain/preload.ts`](emain/preload.ts):
```typescript
contextBridge.exposeInMainWorld("api", {
captureScreenshot: (rect: Rectangle) => ipcRenderer.invoke("capture-screenshot", rect),
});
```
### 3. Implement Handler
In [`emain/emain-ipc.ts`](emain/emain-ipc.ts):
```typescript
electron.ipcMain.handle("capture-screenshot", async (event, rect) => {
const