// preload.js — expose IPC to renderer const { contextBridge, ipcRenderer, webUtils } = require('electron'); contextBridge.exposeInMainWorld('electronAPI', { // Lokale Datei-Operationen selectFolder: () => ipcRenderer.invoke('select-folder'), selectFile: () => ipcRenderer.invoke('select-file'), getFileTree: (data) => ipcRenderer.invoke('getFileTree', data), readFile: (data) => ipcRenderer.invoke('readFile', data), writeFile: (data) => ipcRenderer.invoke('writeFile', data), deleteFile: (data) => ipcRenderer.invoke('deleteFile', data), // Umbenennen, Erstellen, Verschieben, Kopieren renameGiteaItem: (data) => ipcRenderer.invoke('rename-gitea-item', data), createGiteaItem: (data) => ipcRenderer.invoke('create-gitea-item', data), renameLocalItem: (data) => ipcRenderer.invoke('rename-local-item', data), createLocalItem: (data) => ipcRenderer.invoke('create-local-item', data), moveLocalItem: (data) => ipcRenderer.invoke('move-local-item', data), copyLocalItem: (data) => ipcRenderer.invoke('copy-local-item', data), // Gitea Datei-Operationen listGiteaRepos: (data) => ipcRenderer.invoke('list-gitea-repos', data), getGiteaCurrentUser: () => ipcRenderer.invoke('get-gitea-current-user'), getGiteaUserHeatmap: (data) => ipcRenderer.invoke('get-gitea-user-heatmap', data), // GitHub Datei-Operationen listGithubRepos: (data) => ipcRenderer.invoke('list-github-repos', data), getGithubCurrentUser: () => ipcRenderer.invoke('get-github-current-user'), getGithubUserHeatmap: (data) => ipcRenderer.invoke('get-github-user-heatmap', data), getGiteaRepoContents: (data) => ipcRenderer.invoke('get-gitea-repo-contents', data), getGiteaFileContent: (data) => ipcRenderer.invoke('get-gitea-file-content', data), readGiteaFile: (data) => ipcRenderer.invoke('read-gitea-file', data), writeGiteaFile: (data) => ipcRenderer.invoke('write-gitea-file', data), uploadGiteaFile: (data) => ipcRenderer.invoke('upload-gitea-file', data), downloadGiteaFolder: (data) => ipcRenderer.invoke('download-gitea-folder', data), downloadGiteaFile: (data) => ipcRenderer.invoke('download-gitea-file', data), uploadLocalFolderToGitea: (data) => ipcRenderer.invoke('upload-local-folder-to-gitea', data), // Repository & Git Management saveCredentials: (data) => ipcRenderer.invoke('save-credentials', data), loadCredentials: () => ipcRenderer.invoke('load-credentials'), getCredentialsStatus: () => ipcRenderer.invoke('get-credentials-status'), testGiteaConnection: (data) => ipcRenderer.invoke('test-gitea-connection', data), testGithubConnection: (data) => ipcRenderer.invoke('test-github-connection', data), updateGiteaAvatar: (data) => ipcRenderer.invoke('update-gitea-avatar', data), updateGiteaRepoAvatar: (data) => ipcRenderer.invoke('update-gitea-repo-avatar', data), updateGiteaRepoVisibility: (data) => ipcRenderer.invoke('update-gitea-repo-visibility', data), updateGiteaRepoTopics: (data) => ipcRenderer.invoke('update-gitea-repo-topics', data), getGiteaTopicsCatalog: () => ipcRenderer.invoke('get-gitea-topics-catalog'), migrateRepoToGitea: (data) => ipcRenderer.invoke('migrate-repo-to-gitea', data), createRepo: (data) => ipcRenderer.invoke('create-repo', data), pushProject: (data) => ipcRenderer.invoke('push-project', data), getBranches: (data) => ipcRenderer.invoke('getBranches', data), getCommitLogs: (data) => ipcRenderer.invoke('getCommitLogs', data), uploadAndPush: (data) => ipcRenderer.invoke('upload-and-push', data), deleteGiteaRepo: (data) => ipcRenderer.invoke('delete-gitea-repo', data), syncRepoToGitHub: (data) => ipcRenderer.invoke('sync-repo-to-github', data), runBatchRepoAction: (data) => ipcRenderer.invoke('run-batch-repo-action', data), validateRepoName: (data) => ipcRenderer.invoke('validate-repo-name', data), checkCloneTargetCollisions: (data) => ipcRenderer.invoke('check-clone-target-collisions', data), // Offline/Retry Queue getRetryQueue: () => ipcRenderer.invoke('get-retry-queue'), processRetryQueueNow: () => ipcRenderer.invoke('process-retry-queue-now'), removeRetryQueueItem: (data) => ipcRenderer.invoke('remove-retry-queue-item', data), // Drag & Drop prepareDownloadDrag: (data) => ipcRenderer.invoke('prepare-download-drag', data), startNativeDrag: (filePath) => ipcRenderer.send('ondragstart', filePath), getPathType: (filePath) => ipcRenderer.invoke('get-path-type', filePath), getPathForFile: (file) => { try { return webUtils.getPathForFile(file) || ''; } catch (_) { return ''; } }, // Release Management listReleases: (data) => ipcRenderer.invoke('list-releases', data), getRelease: (data) => ipcRenderer.invoke('get-release', data), createRelease: (data) => ipcRenderer.invoke('create-release', data), editRelease: (data) => ipcRenderer.invoke('edit-release', data), deleteRelease: (data) => ipcRenderer.invoke('delete-release', data), uploadReleaseAsset: (data) => ipcRenderer.invoke('upload-release-asset', data), deleteReleaseAsset: (data) => ipcRenderer.invoke('delete-release-asset', data), downloadReleaseArchive: (data) => ipcRenderer.invoke('download-release-archive', data), // Commit History & Visualization getCommits: (data) => ipcRenderer.invoke('get-commits', data), getCommitDetails: (data) => ipcRenderer.invoke('get-commit-details', data), getCommitDiff: (data) => ipcRenderer.invoke('get-commit-diff', data), getCommitFiles: (data) => ipcRenderer.invoke('get-commit-files', data), searchCommits: (data) => ipcRenderer.invoke('search-commits', data), getRepoBranches: (data) => ipcRenderer.invoke('get-repo-branches', data), // Local Repository Commits getLocalCommits: (data) => ipcRenderer.invoke('get-local-commits', data), getLocalCommitDiff: (data) => ipcRenderer.invoke('get-local-commit-diff', data), getLocalCommitDetails: (data) => ipcRenderer.invoke('get-local-commit-details', data), searchLocalCommits: (data) => ipcRenderer.invoke('search-local-commits', data), // === FAVORITEN & ZULETZT GEÖFFNET === loadFavorites: () => ipcRenderer.invoke('load-favorites'), saveFavorites: (data) => ipcRenderer.invoke('save-favorites', data), loadRecent: () => ipcRenderer.invoke('load-recent'), saveRecent: (data) => ipcRenderer.invoke('save-recent', data), // === UPDATER APIs === checkForUpdates: (options) => ipcRenderer.invoke('check-for-updates', options || {}), getAppVersion: () => ipcRenderer.invoke('get-app-version'), // Triggert den tatsächlichen Download des Assets // WICHTIG: Muss in renderer.js als window.electronAPI.startUpdateDownload(asset) aufgerufen werden startUpdateDownload: (asset) => ipcRenderer.invoke('start-update-download', asset), // === Progress & Update Subscriptions === onUpdateAvailable: (cb) => { const listener = (event, info) => cb(info); ipcRenderer.on('update-available', listener); return () => ipcRenderer.removeListener('update-available', listener); }, onUpdateNotAvailable: (cb) => { const listener = (event, info) => cb(info); ipcRenderer.on('update-not-available', listener); return () => ipcRenderer.removeListener('update-not-available', listener); }, onUpdateProgress: (cb) => { const listener = (event, percent) => cb(percent); ipcRenderer.on('update-progress', listener); return () => ipcRenderer.removeListener('update-progress', listener); }, onPushProgress: (cb) => { const listener = (event, percent) => { try { cb(percent); } catch (_) {} }; ipcRenderer.on('push-progress', listener); return () => ipcRenderer.removeListener('push-progress', listener); }, onFolderUploadProgress: (cb) => { const listener = (event, payload) => { try { cb(payload); } catch (_) {} }; ipcRenderer.on('folder-upload-progress', listener); return () => ipcRenderer.removeListener('folder-upload-progress', listener); }, onFolderDownloadProgress: (cb) => { const listener = (event, payload) => { try { cb(payload); } catch (_) {} }; ipcRenderer.on('folder-download-progress', listener); return () => ipcRenderer.removeListener('folder-download-progress', listener); }, onRetryQueueUpdated: (cb) => { const listener = (event, payload) => { try { cb(payload); } catch (_) {} }; ipcRenderer.on('retry-queue-updated', listener); return () => ipcRenderer.removeListener('retry-queue-updated', listener); }, onBatchActionProgress: (cb) => { const listener = (event, payload) => { try { cb(payload); } catch (_) {} }; ipcRenderer.on('batch-action-progress', listener); return () => ipcRenderer.removeListener('batch-action-progress', listener); }, // Window Controls windowMinimize: () => ipcRenderer.send('window-minimize'), windowMaximize: () => ipcRenderer.send('window-maximize'), windowClose: () => ipcRenderer.send('window-close'), // Autostart setAutostart: (enable) => ipcRenderer.invoke('set-autostart', enable), getAutostart: () => ipcRenderer.invoke('get-autostart'), // Utility copyToClipboard: (text) => ipcRenderer.invoke('copy-to-clipboard', text), openExternalUrl: (url) => ipcRenderer.invoke('open-external-url', url), debugToMain: (level, message, payload) => ipcRenderer.send('renderer-debug-log', { level, message, payload }) });