aboutsummaryrefslogtreecommitdiffstats
path: root/src/electron/ipc-api/download.ts
diff options
context:
space:
mode:
authorLibravatar Markus Hatvan <markus_hatvan@aon.at>2021-09-14 11:03:28 +0200
committerLibravatar GitHub <noreply@github.com>2021-09-14 11:03:28 +0200
commit087113d8a1214ba4c7df03bfe66747d8d944280c (patch)
tree4d853a03057138dfa845cd6a7d91ccf63565a1a6 /src/electron/ipc-api/download.ts
parentchore: codebase improvements (#1930) (diff)
downloadferdium-app-087113d8a1214ba4c7df03bfe66747d8d944280c.tar.gz
ferdium-app-087113d8a1214ba4c7df03bfe66747d8d944280c.tar.zst
ferdium-app-087113d8a1214ba4c7df03bfe66747d8d944280c.zip
chore: convert JS to TS (#1934)
Diffstat (limited to 'src/electron/ipc-api/download.ts')
-rw-r--r--src/electron/ipc-api/download.ts59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/electron/ipc-api/download.ts b/src/electron/ipc-api/download.ts
new file mode 100644
index 000000000..822658f26
--- /dev/null
+++ b/src/electron/ipc-api/download.ts
@@ -0,0 +1,59 @@
1import { ipcMain, dialog, BrowserWindow } from 'electron';
2import { download } from 'electron-dl';
3import mime from 'mime-types';
4import { writeFileSync } from 'fs-extra';
5import { PathLike } from 'fs';
6
7const debug = require('debug')('Ferdi:ipcApi:download');
8
9function decodeBase64Image(dataString: string) {
10 const matches = dataString.match(/^data:([A-Za-z-+/]+);base64,(.+)$/);
11
12 if (matches?.length !== 3) {
13 return new Error('Invalid input string');
14 }
15
16 return Buffer.from(matches[2], 'base64');
17}
18
19export default (params: { mainWindow: BrowserWindow }) => {
20 ipcMain.on(
21 'download-file',
22 async (_event, { url, content, fileOptions = {} }) => {
23 const win = BrowserWindow.getFocusedWindow();
24
25 try {
26 if (!content) {
27 const dl = await download(win!, url, {
28 saveAs: true,
29 });
30 debug('File saved to', dl.savePath);
31 } else {
32 const extension = mime.extension(fileOptions.mime);
33 const filename = `${fileOptions.name}.${extension}`;
34
35 try {
36 const saveDialog = await dialog.showSaveDialog(params.mainWindow, {
37 defaultPath: filename,
38 });
39
40 if (saveDialog.canceled) return;
41
42 const binaryImage = decodeBase64Image(content);
43 writeFileSync(
44 saveDialog.filePath as PathLike,
45 binaryImage as unknown as string,
46 'binary',
47 );
48
49 debug('File blob saved to', saveDialog.filePath);
50 } catch (err) {
51 console.log(err);
52 }
53 }
54 } catch (e) {
55 console.error(e);
56 }
57 },
58 );
59};