This repository was archived by the owner on Jan 6, 2026. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 33
Expand file tree
/
Copy pathdialog.ts
More file actions
122 lines (110 loc) · 3.13 KB
/
dialog.ts
File metadata and controls
122 lines (110 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { type BrowserWindow, dialog } from 'electron';
import { access, constants } from 'node:fs/promises';
import type Node from '../common/node';
import type { NodeId } from '../common/node';
import {
type CheckStorageDetails,
getNodesDirPath,
getSystemFreeDiskSpace,
} from './files';
import i18nMain from './i18nMain';
import logger from './logger';
import { getMainWindow } from './main';
import { getNode, updateNode } from './state/nodes';
const t = i18nMain.getFixedT(null, 'dialog');
export const updateNodeDataDir = async (node: Node, newDataDir: string) => {
node.runtime.dataDir = newDataDir;
node.config.configValuesMap.dataDir = newDataDir;
updateNode(node);
};
export const openDialogForNodeDataDir = async (nodeId: NodeId) => {
const node = getNode(nodeId);
if (!node) {
logger.error(
`Unable to open dialog to select node data dir. No node found for node id ${nodeId}`,
);
return;
}
const mainWindow: BrowserWindow | null = getMainWindow();
if (!mainWindow) {
logger.error(
'Unable to open dialog to select node data dir. mainWindow is null.',
);
return;
}
let defaultPath;
if (node.runtime.dataDir) {
defaultPath = node.runtime.dataDir;
} else {
defaultPath = getNodesDirPath();
}
const result = await dialog.showOpenDialog(mainWindow, {
title: t('SelectFolderForStorage', {
storageForName: node.spec.displayName,
}),
defaultPath,
properties: ['openDirectory'],
});
console.log('dir select result: ', result);
if (result.canceled) {
return;
}
if (result.filePaths) {
if (result.filePaths.length > 0) {
return result.filePaths[0];
}
}
return;
};
export const checkWritePermissions = async (
folderPath: string,
): Promise<boolean> => {
try {
await access(folderPath, constants.W_OK);
return true;
} catch (err) {
logger.error(`No write permissions for path ${folderPath}:`, err);
return false;
}
};
export const openDialogForStorageLocation = async (): Promise<
CheckStorageDetails | undefined
> => {
const mainWindow: BrowserWindow | null = getMainWindow();
if (!mainWindow) {
logger.error(
'Unable to open dialog to select storage location. mainWindow is null.',
);
return;
}
const defaultPath = getNodesDirPath();
const result = await dialog.showOpenDialog(mainWindow, {
title: t('SelectNodeFolder'),
defaultPath,
properties: ['openDirectory'],
});
if (result.canceled) {
return;
}
if (result.filePaths && result.filePaths.length > 0) {
const folderPath = result.filePaths[0];
// Check write permissions
const hasWritePermissions = await checkWritePermissions(folderPath);
if (!hasWritePermissions) {
// Show error dialog to user
await dialog.showMessageBox(mainWindow, {
type: 'error',
title: t('NoWritePermissions'),
message: t('NoWritePermissionsMessage'),
detail: t('NoWritePermissionsDetail', { path: folderPath }),
});
return;
}
const freeStorageGBs = await getSystemFreeDiskSpace(folderPath);
return {
folderPath,
freeStorageGBs,
};
}
return;
};