diff --git a/ElectronClient/app/bridge.js b/ElectronClient/app/bridge.js index 7e92131e4..c5d55aed9 100644 --- a/ElectronClient/app/bridge.js +++ b/ElectronClient/app/bridge.js @@ -1,4 +1,5 @@ const { _ } = require('lib/locale.js'); +const { dirname } = require('lib/path-utils.js'); const { Logger } = require('lib/logger.js'); class Bridge { @@ -6,6 +7,7 @@ class Bridge { constructor(electronWrapper) { this.electronWrapper_ = electronWrapper; this.autoUpdateLogger_ = null; + this.lastSelectedPath_ = null; } electronApp() { @@ -39,7 +41,13 @@ class Bridge { showOpenDialog(options) { const {dialog} = require('electron'); - return dialog.showOpenDialog(options); + if (!options) options = {}; + if (!('defaultPath' in options) && this.lastSelectedPath_) options.defaultPath = this.lastSelectedPath_; + const filePaths = dialog.showOpenDialog(options); + if (filePaths && filePaths.length) { + this.lastSelectedPath_ = dirname(filePaths[0]); + } + return filePaths; } showMessageBox(options) { diff --git a/ElectronClient/app/gui/NoteText.jsx b/ElectronClient/app/gui/NoteText.jsx index a3075240c..885f487ed 100644 --- a/ElectronClient/app/gui/NoteText.jsx +++ b/ElectronClient/app/gui/NoteText.jsx @@ -339,23 +339,26 @@ class NoteTextComponent extends React.Component { if (!noteId) return; const filePaths = bridge().showOpenDialog({ - properties: ['openFile', 'createDirectory'], + properties: ['openFile', 'createDirectory', 'multiSelections'], }); if (!filePaths || !filePaths.length) return; await this.saveIfNeeded(); - const note = await Note.load(noteId); + let note = await Note.load(noteId); - try { - reg.logger().info('Attaching ' + filePaths[0]); - const newNote = await shim.attachFileToNote(note, filePaths[0]); - reg.logger().info('File was attached.'); - this.setState({ - note: newNote, - lastSavedNote: Object.assign({}, newNote), - }); - } catch (error) { - reg.logger().error(error); + for (let i = 0; i < filePaths.length; i++) { + const filePath = filePaths[i]; + try { + reg.logger().info('Attaching ' + filePath); + note = await shim.attachFileToNote(note, filePath); + reg.logger().info('File was attached.'); + this.setState({ + note: Object.assign({}, note), + lastSavedNote: Object.assign({}, note), + }); + } catch (error) { + reg.logger().error(error); + } } } diff --git a/ReactNativeClient/lib/shim-init-node.js b/ReactNativeClient/lib/shim-init-node.js index cbb54e186..7007375e4 100644 --- a/ReactNativeClient/lib/shim-init-node.js +++ b/ReactNativeClient/lib/shim-init-node.js @@ -5,44 +5,6 @@ const { FileApiDriverLocal } = require('lib/file-api-driver-local.js'); const { time } = require('lib/time-utils.js'); const { setLocale, defaultLocale, closestSupportedLocale } = require('lib/locale.js'); -// // Node requests can go wrong is so many different ways and with so -// // many different error messages... This handler inspects the error -// // and decides whether the request can safely be repeated or not. -// function fetchRequestCanBeRetried(error) { -// if (!error) return false; - -// // Unfortunately the error 'Network request failed' doesn't have a type -// // or error code, so hopefully that message won't change and is not localized -// if (error.message == 'Network request failed') return true; - -// // request to https://public-ch3302....1fab24cb1bd5f.md failed, reason: socket hang up" -// if (error.code == 'ECONNRESET') return true; - -// // OneDrive (or Node?) sometimes sends back a "not found" error for resources -// // that definitely exist and in this case repeating the request works. -// // Error is: -// // request to https://graph.microsoft.com/v1.0/drive/special/approot failed, reason: getaddrinfo ENOTFOUND graph.microsoft.com graph.microsoft.com:443 -// if (error.code == 'ENOTFOUND') return true; - -// // network timeout at: https://public-ch3302...859f9b0e3ab.md -// if (error.message && error.message.indexOf('network timeout') === 0) return true; - -// // name: 'FetchError', -// // message: 'request to https://api.ipify.org/?format=json failed, reason: getaddrinfo EAI_AGAIN api.ipify.org:443', -// // type: 'system', -// // errno: 'EAI_AGAIN', -// // code: 'EAI_AGAIN' } } reason: { FetchError: request to https://api.ipify.org/?format=json failed, reason: getaddrinfo EAI_AGAIN api.ipify.org:443 -// // -// // It's a Microsoft error: "A temporary failure in name resolution occurred." -// if (error.code == 'EAI_AGAIN') return true; - -// // request to https://public-...8fd8bc6bb68e9c4d17a.md failed, reason: connect ETIMEDOUT 204.79.197.213:443 -// // Code: ETIMEDOUT -// if (error.code === 'ETIMEDOUT') return true; - -// return false; -// } - function shimInit() { shim.fs = fs; shim.FileApiDriverLocal = FileApiDriverLocal;