import { contextBridge, ipcRenderer } from 'electron'; // Expose protected methods that allow the renderer process to use // ipcRenderer without exposing the entire object contextBridge.exposeInMainWorld('electronAPI', { // Posts posts: { create: (data: unknown) => ipcRenderer.invoke('posts:create', data), update: (id: string, data: unknown) => ipcRenderer.invoke('posts:update', id, data), delete: (id: string) => ipcRenderer.invoke('posts:delete', id), get: (id: string) => ipcRenderer.invoke('posts:get', id), getAll: () => ipcRenderer.invoke('posts:getAll'), getByStatus: (status: string) => ipcRenderer.invoke('posts:getByStatus', status), publish: (id: string) => ipcRenderer.invoke('posts:publish', id), unpublish: (id: string) => ipcRenderer.invoke('posts:unpublish', id), rebuildFromFiles: () => ipcRenderer.invoke('posts:rebuildFromFiles'), }, // Media media: { import: (sourcePath: string, metadata?: unknown) => ipcRenderer.invoke('media:import', sourcePath, metadata), importDialog: () => ipcRenderer.invoke('media:importDialog'), update: (id: string, data: unknown) => ipcRenderer.invoke('media:update', id, data), delete: (id: string) => ipcRenderer.invoke('media:delete', id), get: (id: string) => ipcRenderer.invoke('media:get', id), getAll: () => ipcRenderer.invoke('media:getAll'), rebuildFromFiles: () => ipcRenderer.invoke('media:rebuildFromFiles'), }, // Sync sync: { configure: (config: unknown) => ipcRenderer.invoke('sync:configure', config), start: (direction?: string) => ipcRenderer.invoke('sync:start', direction), getStatus: () => ipcRenderer.invoke('sync:getStatus'), isConfigured: () => ipcRenderer.invoke('sync:isConfigured'), getPendingCount: () => ipcRenderer.invoke('sync:getPendingCount'), getLog: (limit?: number) => ipcRenderer.invoke('sync:getLog', limit), stopAutoSync: () => ipcRenderer.invoke('sync:stopAutoSync'), }, // Tasks tasks: { getAll: () => ipcRenderer.invoke('tasks:getAll'), getRunning: () => ipcRenderer.invoke('tasks:getRunning'), cancel: (taskId: string) => ipcRenderer.invoke('tasks:cancel', taskId), clearCompleted: () => ipcRenderer.invoke('tasks:clearCompleted'), }, // App app: { getDataPaths: () => ipcRenderer.invoke('app:getDataPaths'), openFolder: (folderPath: string) => ipcRenderer.invoke('app:openFolder', folderPath), showItemInFolder: (itemPath: string) => ipcRenderer.invoke('app:showItemInFolder', itemPath), }, // Event listeners on: (channel: string, callback: (...args: unknown[]) => void) => { const subscription = (_event: Electron.IpcRendererEvent, ...args: unknown[]) => callback(...args); ipcRenderer.on(channel, subscription); return () => ipcRenderer.removeListener(channel, subscription); }, once: (channel: string, callback: (...args: unknown[]) => void) => { ipcRenderer.once(channel, (_event, ...args) => callback(...args)); }, }); // Type definitions for the exposed API export interface ElectronAPI { posts: { create: (data: unknown) => Promise; update: (id: string, data: unknown) => Promise; delete: (id: string) => Promise; get: (id: string) => Promise; getAll: () => Promise; getByStatus: (status: string) => Promise; publish: (id: string) => Promise; unpublish: (id: string) => Promise; rebuildFromFiles: () => Promise; }; media: { import: (sourcePath: string, metadata?: unknown) => Promise; importDialog: () => Promise; update: (id: string, data: unknown) => Promise; delete: (id: string) => Promise; get: (id: string) => Promise; getAll: () => Promise; rebuildFromFiles: () => Promise; }; sync: { configure: (config: unknown) => Promise; start: (direction?: string) => Promise; getStatus: () => Promise; isConfigured: () => Promise; getPendingCount: () => Promise<{ posts: number; media: number }>; getLog: (limit?: number) => Promise; stopAutoSync: () => Promise; }; tasks: { getAll: () => Promise; getRunning: () => Promise; cancel: (taskId: string) => Promise; clearCompleted: () => Promise; }; app: { getDataPaths: () => Promise<{ database: string; posts: string; media: string }>; openFolder: (folderPath: string) => Promise; showItemInFolder: (itemPath: string) => Promise; }; on: (channel: string, callback: (...args: unknown[]) => void) => () => void; once: (channel: string, callback: (...args: unknown[]) => void) => void; } declare global { interface Window { electronAPI: ElectronAPI; } }