mirror of
https://github.com/zulip/zulip-desktop.git
synced 2025-10-24 16:43:38 +00:00
62 lines
2.1 KiB
TypeScript
62 lines
2.1 KiB
TypeScript
import {ipcRenderer, remote} from 'electron';
|
|
|
|
import * as ConfigUtil from '../utils/config-util';
|
|
import * as LinkUtil from '../utils/link-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))();
|
|
}
|
|
}
|