const { ipcMain, dialog } = require('electron'); const path = require('node:path'); const { pathToFileURL } = require('node:url'); const { browseDirectory, browseFiles, normalizeAndResolvePath, isFile, isDirectory } = require('../utils/filesystem'); const { findUniqueFolderName } = require('../utils/collection-import'); const registerFilesystemIpc = (mainWindow) => { ipcMain.handle('renderer:browse-directory', async (event, pathname, request) => { try { return await browseDirectory(mainWindow); } catch (error) { return Promise.reject(error); } }); ipcMain.handle('renderer:browse-files', async (_, filters, properties) => { try { return await browseFiles(mainWindow, filters, properties); } catch (error) { throw error; } }); ipcMain.handle('renderer:browse-pac-file', async () => { const { filePaths } = await dialog.showOpenDialog(mainWindow, { properties: ['openFile'], filters: [{ name: 'PAC Files', extensions: ['pac', 'js'] }] }); if (!filePaths || filePaths.length === 0) return null; return pathToFileURL(filePaths[0]).href; }); ipcMain.handle('renderer:exists-sync', async (_, filePath) => { try { const normalizedPath = normalizeAndResolvePath(filePath); return isFile(normalizedPath); } catch (error) { return false; } }); ipcMain.handle('renderer:resolve-path', async (_, relativePath, basePath) => { try { const resolvedPath = path.resolve(basePath, relativePath); return normalizeAndResolvePath(resolvedPath); } catch (error) { return relativePath; } }); ipcMain.handle('renderer:is-directory', async (_, pathname) => { return isDirectory(pathname); }); ipcMain.handle('renderer:find-unique-folder-name', async (_, baseName, location) => { try { return await findUniqueFolderName(baseName, location); } catch (error) { throw error; } }); }; module.exports = registerFilesystemIpc;