const { contextBridge, ipcRenderer, webUtils } = require('electron'); contextBridge.exposeInMainWorld('api', { // Config getConfig: () => ipcRenderer.invoke('get-config'), saveConfig: (config) => ipcRenderer.invoke('save-config', config), getHistory: () => ipcRenderer.invoke('get-history'), clearHistory: () => ipcRenderer.invoke('clear-history'), // Hoster settings getHosterSettings: () => ipcRenderer.invoke('get-hoster-settings'), saveHosterSettings: (settings) => ipcRenderer.invoke('save-hoster-settings', settings), // Global settings getGlobalSettings: () => ipcRenderer.invoke('get-global-settings'), saveGlobalSettings: (settings) => ipcRenderer.invoke('save-global-settings', settings), saveGlobalSettingsSync: (settings) => ipcRenderer.sendSync('save-global-settings-sync', settings), // Always on top setAlwaysOnTop: (value) => ipcRenderer.invoke('set-always-on-top', value), getAlwaysOnTop: () => ipcRenderer.invoke('get-always-on-top'), // Shutdown after finish setShutdownAfterFinish: (mode) => ipcRenderer.invoke('set-shutdown-after-finish', mode), getShutdownAfterFinish: () => ipcRenderer.invoke('get-shutdown-after-finish'), cancelShutdown: () => ipcRenderer.invoke('cancel-shutdown'), // File selection selectFiles: () => ipcRenderer.invoke('select-files'), selectFolder: () => ipcRenderer.invoke('select-folder'), resolveFolderFiles: (folderPath) => ipcRenderer.invoke('resolve-folder-files', folderPath), // Upload control startUpload: (payload) => ipcRenderer.invoke('start-upload', payload), cancelUpload: () => ipcRenderer.invoke('cancel-upload'), cancelSelectedJobs: (jobIds) => ipcRenderer.invoke('cancel-selected-jobs', jobIds), addJobsToBatch: (payload) => ipcRenderer.invoke('add-jobs-to-batch', payload), finishAfterActive: () => ipcRenderer.invoke('finish-after-active'), runHealthCheck: (payload) => ipcRenderer.invoke('run-health-check', payload), // Log import importUploadLog: () => ipcRenderer.invoke('import-upload-log'), // Clipboard copyToClipboard: (text) => ipcRenderer.invoke('copy-to-clipboard', text), // Updates checkForUpdate: () => ipcRenderer.invoke('app:check-updates'), installUpdate: () => ipcRenderer.invoke('app:install-update'), abortUpdate: () => ipcRenderer.invoke('app:abort-update'), getVersion: () => ipcRenderer.invoke('app:get-version'), onUpdateAvailable: (callback) => { ipcRenderer.on('app:update-available', (_event, data) => callback(data)); }, onUpdateProgress: (callback) => { ipcRenderer.on('app:update-progress', (_event, data) => callback(data)); }, // Backup exportBackup: (password) => ipcRenderer.invoke('export-backup', password), importBackup: (password) => ipcRenderer.invoke('import-backup', password), // Folder Monitor folderMonitorStart: (settings) => ipcRenderer.invoke('folder-monitor:start', settings), folderMonitorStop: () => ipcRenderer.invoke('folder-monitor:stop'), folderMonitorStatus: () => ipcRenderer.invoke('folder-monitor:status'), folderMonitorSelectFolder: () => ipcRenderer.invoke('folder-monitor:select-folder'), onFolderMonitorNewFiles: (callback) => { ipcRenderer.on('folder-monitor:new-files', (_event, data) => callback(data)); }, // Account switched event onAccountSwitched: (callback) => { ipcRenderer.on('account-switched', (_event, data) => callback(data)); }, // Drop Target showDropTarget: () => ipcRenderer.invoke('show-drop-target'), hideDropTarget: () => ipcRenderer.invoke('hide-drop-target'), onDropTargetFiles: (callback) => { ipcRenderer.on('drop-target:files', (_event, paths) => callback(paths)); }, // Debug debugTestUpload: () => ipcRenderer.invoke('debug-test-upload'), debugLog: (msg) => ipcRenderer.invoke('debug-log', msg), // Events (main -> renderer) onUploadProgress: (callback) => { ipcRenderer.on('upload-progress', (_event, data) => callback(data)); }, onUploadBatchDone: (callback) => { ipcRenderer.on('upload-batch-done', (_event, data) => callback(data)); }, onUploadStats: (callback) => { ipcRenderer.on('upload-stats', (_event, data) => callback(data)); }, onShutdownCountdown: (callback) => { ipcRenderer.on('shutdown-countdown', (_event, data) => callback(data)); }, // Remote Control remoteGetSettings: () => ipcRenderer.invoke('remote:get-settings'), remoteSaveSettings: (settings) => ipcRenderer.invoke('remote:save-settings', settings), remoteGenerateToken: () => ipcRenderer.invoke('remote:generate-token'), remoteStatus: () => ipcRenderer.invoke('remote:status'), onRemoteClientCount: (callback) => { ipcRenderer.on('remote:client-count', (_event, count) => callback(count)); }, // File path from drag & drop (Electron 33+ compatible) getPathForFile: (file) => webUtils.getPathForFile(file), removeAllListeners: () => { ipcRenderer.removeAllListeners('upload-progress'); ipcRenderer.removeAllListeners('upload-batch-done'); ipcRenderer.removeAllListeners('upload-stats'); ipcRenderer.removeAllListeners('app:update-available'); ipcRenderer.removeAllListeners('app:update-progress'); ipcRenderer.removeAllListeners('shutdown-countdown'); ipcRenderer.removeAllListeners('folder-monitor:new-files'); ipcRenderer.removeAllListeners('drop-target:files'); ipcRenderer.removeAllListeners('account-switched'); ipcRenderer.removeAllListeners('remote:client-count'); } });