Skip to content

Commit

Permalink
Use main-side electro utils to open file and path pickers
Browse files Browse the repository at this point in the history
  • Loading branch information
nukeop committed Feb 1, 2025
1 parent 0db7ae8 commit b3e91fd
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 20 deletions.
22 changes: 13 additions & 9 deletions packages/app/app/actions/local.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { createAction } from 'redux-actions';
import { dialog } from 'electron';
import { ipcRenderer } from 'electron';
import { LIST_TYPE } from '@nuclear/ui/lib/components/LibraryListTypeToggle';
import { IpcEvents } from '@nuclear/core';

import { LocalLibrary } from './actionTypes';
import { VoidAction } from './helpers';
Expand Down Expand Up @@ -79,23 +80,26 @@ export function addLocalFolders(folders) {
}

export const openLocalFolderPicker = () => async dispatch => {
let folders = await (await dialog.showOpenDialog({ properties: ['openDirectory', 'multiSelections'] })).filePaths;
if (folders) {
const filePaths = await ipcRenderer.invoke(IpcEvents.OPEN_PATH_PICKER, {
properties: ['openDirectory', 'multiSelections']
});

if (filePaths) {
// normalize path-seps (gets normalized on save to disk, but must happen from start for some UI code)
folders = folders.map(path => path.replace(/\\/g, '/'));
dispatch(addLocalFolders(folders));
const normalizedPaths = filePaths.map(path => path.replace(/\\/g, '/'));
dispatch(addLocalFolders(normalizedPaths));
}
};

export const openLocalFilePicker = async () => {
let filePaths = await (await dialog.showOpenDialog({
const filePaths = await ipcRenderer.invoke(IpcEvents.OPEN_FILE_PICKER, {
filters: [
{ name: 'json', extensions: ['json'] }
],
properties: ['openFile']
})).filePaths;
});

if (filePaths) {
filePaths = filePaths.map(path => path.replace(/\\/g, '/'));
return filePaths;
return filePaths.map(path => path.replace(/\\/g, '/'));
}
};
18 changes: 9 additions & 9 deletions packages/app/app/components/Downloads/DownloadsHeader/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
Segment
} from 'semantic-ui-react';
import { useTranslation } from 'react-i18next';
import { dialog, ipcRenderer } from 'electron';
import { ipcRenderer } from 'electron';

import { setStringOption } from '../../../actions/settings';
import styles from './styles.scss';
Expand All @@ -23,18 +23,18 @@ const DownloadsHeader: React.FC<DownloadsHeaderProps> = ({
}) => {
const { t } = useTranslation('settings');
const [downloadsDir, setDownloadsDir] = useState<string>('');

const setDirectory = useCallback(async () => {
const dialogResult = await dialog.showOpenDialog({
const selectedPath = await ipcRenderer.invoke(IpcEvents.OPEN_PATH_PICKER, {
title: t('downloads-dir-button'),
properties: ['openDirectory']
});
if (!dialogResult.canceled && !_.isEmpty(dialogResult.filePaths)) {
setStringOption(
'downloads.dir',
_.head(dialogResult.filePaths)
);
setDownloadsDir(_.head(dialogResult.filePaths));

if (selectedPath) {
setStringOption('downloads.dir', selectedPath[0]);
setDownloadsDir(selectedPath[0]);
}
}, [setStringOption]);
}, [setStringOption, t]);

useEffect(() => {
ipcRenderer.invoke(IpcEvents.DOWNLOAD_GET_PATH).then((storedDownloadsDir) => {
Expand Down
7 changes: 5 additions & 2 deletions packages/main/src/controllers/electron-utils.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { IpcEvents } from '@nuclear/core';
import { dialog, shell, clipboard, app } from 'electron';
import { inject } from 'inversify';
import { ipcController, ipcInvokeHandler } from '../utils/decorators';
import { ipcController, ipcEvent, ipcInvokeHandler } from '../utils/decorators';
import Logger, { $mainLogger } from '../services/logger';
import Window from '../services/window';

Expand All @@ -24,6 +24,9 @@ class ElectronUtilsIpcCtrl {
@inject($mainLogger) private logger: Logger,
@inject(Window) private window: Window
) {}

@ipcEvent(IpcEvents.DOWNLOAD_PAUSE)
async onPauseDownload() {}

@ipcInvokeHandler(IpcEvents.OPEN_PATH_PICKER)
async openPathPicker(options: PathPickerOptions = {}) {
Expand All @@ -33,7 +36,7 @@ class ElectronUtilsIpcCtrl {
defaultPath: options.defaultPath,
properties: options.properties || ['openDirectory']
});
return filePaths[0];
return filePaths;
} catch (error) {
this.logger.error('Failed to open path picker:', error);
throw error;
Expand Down
2 changes: 2 additions & 0 deletions packages/main/src/ioc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import TouchbarMenu from './services/touchbar';
import ListeningHistoryService from './services/listening-history';
import ListeningHistoryDb from './services/listening-history/db';
import ListeningHistoryController from './controllers/listening-history';
import ElectronUtilsIpcCtrl from './controllers/electron-utils';

const services: ServiceProvider[] = [
{ useClass: AcousticId },
Expand All @@ -53,6 +54,7 @@ const services: ServiceProvider[] = [

const controllers: Class[] = [
DownloadCtrl,
ElectronUtilsIpcCtrl,
LocalLibraryCtrl,
ListeningHistoryController,
LoggerCtrl,
Expand Down

0 comments on commit b3e91fd

Please sign in to comment.