mirror of
https://github.com/zulip/zulip-desktop.git
synced 2025-11-16 11:51:36 +00:00
Currently, there are two dialog boxes shown while downloading files (in Ubuntu). One by default behavior of electron and other by the dialog box for save as feature. This PR fixes this issue by using electron's save as dialog box. Fixes: #947.
61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
import {ipcRenderer, remote} from 'electron';
|
|
|
|
import * as LinkUtil from '../utils/link-util';
|
|
import * as ConfigUtil from '../utils/config-util';
|
|
import type WebView from './webview';
|
|
|
|
const {shell, app} = remote;
|
|
|
|
const dingSound = new Audio('../resources/sounds/ding.ogg');
|
|
|
|
export default function handleExternalLink(this: WebView, event: Electron.NewWindowEvent): void {
|
|
event.preventDefault();
|
|
|
|
const url = new URL(event.url);
|
|
const downloadPath = ConfigUtil.getConfigItem('downloadsPath', `${app.getPath('downloads')}`);
|
|
|
|
if (LinkUtil.isUploadsUrl(this.props.url, url)) {
|
|
ipcRenderer.send('downloadFile', url.href, downloadPath);
|
|
ipcRenderer.once('downloadFileCompleted', async (_event: Event, filePath: string, fileName: string) => {
|
|
const downloadNotification = new Notification('Download Complete', {
|
|
body: `Click to show ${fileName} in folder`,
|
|
silent: true // We'll play our own sound - ding.ogg
|
|
});
|
|
|
|
downloadNotification.addEventListener('click', () => {
|
|
// Reveal file in download folder
|
|
shell.showItemInFolder(filePath);
|
|
});
|
|
ipcRenderer.removeAllListeners('downloadFileFailed');
|
|
|
|
// Play sound to indicate download complete
|
|
if (!ConfigUtil.getConfigItem('silent')) {
|
|
await dingSound.play();
|
|
}
|
|
});
|
|
|
|
ipcRenderer.once('downloadFileFailed', (_event: Event, state: string) => {
|
|
// Automatic download failed, so show save dialog prompt and download
|
|
// through webview
|
|
// Only do this if it is the automatic download, otherwise show an error (so we aren't showing two save
|
|
// prompts right after each other)
|
|
// Check that the download is not cancelled by user
|
|
if (state !== 'cancelled') {
|
|
if (ConfigUtil.getConfigItem('promptDownload', false)) {
|
|
// We need to create a "new Notification" to display it, but just `Notification(...)` on its own
|
|
// doesn't work
|
|
new Notification('Download Complete', { // eslint-disable-line no-new
|
|
body: 'Download failed'
|
|
});
|
|
} else {
|
|
this.$el.downloadURL(url.href);
|
|
}
|
|
}
|
|
|
|
ipcRenderer.removeAllListeners('downloadFileCompleted');
|
|
});
|
|
} else {
|
|
(async () => LinkUtil.openBrowser(url))();
|
|
}
|
|
}
|