From 18214bdeae7b3cd7aea8c4507de30abfd82cdebe Mon Sep 17 00:00:00 2001 From: thecodrr Date: Fri, 20 Aug 2021 11:05:27 +0500 Subject: [PATCH] feat(desktop): add setting to change backups storage location --- apps/web/desktop/ipc/actions/saveFile.js | 13 ++-------- apps/web/desktop/ipc/calls/index.js | 2 ++ apps/web/desktop/ipc/calls/selectDirectory.js | 14 +++++++++++ apps/web/desktop/ipc/utils.js | 17 ++++++++++++- apps/web/desktop/preload.js | 11 ++++++++ apps/web/src/common/reminders.js | 6 ++++- apps/web/src/components/tip/index.js | 6 ++++- apps/web/src/views/settings.js | 25 +++++++++++++++++++ 8 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 apps/web/desktop/ipc/calls/selectDirectory.js diff --git a/apps/web/desktop/ipc/actions/saveFile.js b/apps/web/desktop/ipc/actions/saveFile.js index 9d4d78d32..62e99f096 100644 --- a/apps/web/desktop/ipc/actions/saveFile.js +++ b/apps/web/desktop/ipc/actions/saveFile.js @@ -1,23 +1,14 @@ -const { app } = require("electron"); const fs = require("fs"); const path = require("path"); const { logger } = require("../../logger"); +const { resolvePath } = require("../utils"); module.exports = (args) => { try { const { data, filePath } = args; if (!data || !filePath) return; - const resolvedPath = path.join( - ...filePath.split("/").map((segment) => { - let resolved = segment; - try { - resolved = app.getPath(resolved); - } finally { - return resolved; - } - }) - ); + const resolvedPath = resolvePath(filePath); logger.info("Saving file to", resolvedPath); diff --git a/apps/web/desktop/ipc/calls/index.js b/apps/web/desktop/ipc/calls/index.js index 4788cb3db..7f67556fb 100644 --- a/apps/web/desktop/ipc/calls/index.js +++ b/apps/web/desktop/ipc/calls/index.js @@ -1,7 +1,9 @@ const getZoomFactor = require("./getZoomFactor"); +const selectDirectory = require("./selectDirectory"); const calls = { getZoomFactor, + selectDirectory, }; module.exports.getCall = function getAction(callName) { diff --git a/apps/web/desktop/ipc/calls/selectDirectory.js b/apps/web/desktop/ipc/calls/selectDirectory.js new file mode 100644 index 000000000..663e51eef --- /dev/null +++ b/apps/web/desktop/ipc/calls/selectDirectory.js @@ -0,0 +1,14 @@ +const { dialog } = require("electron"); +const { resolvePath } = require("../utils"); + +module.exports = function (args, win) { + const { title, buttonLabel, defaultPath } = args; + + const paths = dialog.showOpenDialogSync(win, { + title, + buttonLabel, + properties: ["openDirectory"], + defaultPath: resolvePath(defaultPath), + }); + return !paths ? undefined : paths[0]; +}; diff --git a/apps/web/desktop/ipc/utils.js b/apps/web/desktop/ipc/utils.js index f83f3a49b..a6a6ccf42 100644 --- a/apps/web/desktop/ipc/utils.js +++ b/apps/web/desktop/ipc/utils.js @@ -1,4 +1,6 @@ const { logger } = require("../logger"); +const { app } = require("electron"); +const path = require("path"); function sendMessageToRenderer(type, payload = {}) { const message = { type, ...payload }; @@ -6,4 +8,17 @@ function sendMessageToRenderer(type, payload = {}) { global.win.webContents.send("fromMain", message); } -module.exports = { sendMessageToRenderer }; +function resolvePath(_path) { + return path.join( + ..._path.split("/").map((segment) => { + let resolved = segment; + try { + resolved = app.getPath(resolved); + } finally { + return resolved; + } + }) + ); +} + +module.exports = { resolvePath, sendMessageToRenderer }; diff --git a/apps/web/desktop/preload.js b/apps/web/desktop/preload.js index 5895c3b15..c8724945f 100644 --- a/apps/web/desktop/preload.js +++ b/apps/web/desktop/preload.js @@ -29,3 +29,14 @@ contextBridge.exposeInMainWorld("config", { return ipcRenderer.callMain("fromRenderer", { type: "getZoomFactor" }); }, }); + +contextBridge.exposeInMainWorld("native", { + selectDirectory: ({ title, buttonLabel, defaultPath }) => { + return ipcRenderer.callMain("fromRenderer", { + type: "selectDirectory", + title, + buttonLabel, + defaultPath, + }); + }, +}); diff --git a/apps/web/src/common/reminders.js b/apps/web/src/common/reminders.js index 32b2c65de..5b5838253 100644 --- a/apps/web/src/common/reminders.js +++ b/apps/web/src/common/reminders.js @@ -73,7 +73,11 @@ export async function resetReminders() { if (await shouldAddBackupReminder()) { if (isDesktop()) { const { data, filename, ext } = await createBackup(false); - saveFile(`${PATHS.backupsDirectory}/${filename}.${ext}`, data); + const directory = Config.get( + "backupStorageLocation", + PATHS.backupsDirectory + ); + saveFile(`${directory}/${filename}.${ext}`, data); } else { appStore.addReminder("backup", "high"); } diff --git a/apps/web/src/components/tip/index.js b/apps/web/src/components/tip/index.js index ac55d0f83..992888221 100644 --- a/apps/web/src/components/tip/index.js +++ b/apps/web/src/components/tip/index.js @@ -4,7 +4,11 @@ function TextWithTip({ text, tip, sx, color }) { return ( {text} - + {tip} diff --git a/apps/web/src/views/settings.js b/apps/web/src/views/settings.js index 78cbbea97..00b39b4a0 100644 --- a/apps/web/src/views/settings.js +++ b/apps/web/src/views/settings.js @@ -34,6 +34,7 @@ import { isUserPremium } from "../hooks/use-is-user-premium"; import { Slider } from "@rebass/forms"; import useZoomFactor from "../hooks/use-zoom-factor"; import debounce from "just-debounce"; +import { PATHS } from "@notesnook/desktop/paths"; function importBackup() { return new Promise((resolve, reject) => { @@ -152,6 +153,10 @@ function Settings(props) { 0 ); const [homepage, setHomepage] = usePersistentState("homepage", 0); + const [backupStorageLocation, setBackupStorageLocation] = usePersistentState( + "backupStorageLocation", + PATHS.backupsDirectory + ); const [enableTelemetry, setEnableTelemetry] = usePersistentState( "telemetry", true @@ -469,6 +474,26 @@ function Settings(props) { setBackupReminderOffset(index) } /> + {isDesktop() && !!backupReminderOffset ? ( + + ) : null} )}