diff --git a/app/api.js b/app/api.js index f7fb839..11a6a1a 100644 --- a/app/api.js +++ b/app/api.js @@ -378,7 +378,11 @@ export function saveFileToPath (hash, dest) { // First make all the directories if (file.type === 'dir' || !file.content) { - mkdirSync(finalDest) + try { + mkdirSync(finalDest) + } catch (err) { + if (err.code !== 'EEXIST') throw err + } } else { // Pipe the file content into an actual write stream const writeStream = createWriteStream(finalDest) diff --git a/app/windows/Storage/Components/Header.jsx b/app/windows/Storage/Components/Header.jsx index d52bb4b..b834f4a 100644 --- a/app/windows/Storage/Components/Header.jsx +++ b/app/windows/Storage/Components/Header.jsx @@ -67,31 +67,26 @@ class Header extends React.Component { if (this.props.storageStore.selected.length === 0) return const selected = this.props.storageStore.selected - const opts = { title: 'Where should I save?' } - - let promises - // More than one object/element - if (selected.length > 1) { - opts.properties = ['openDirectory', 'createDirectory'] - opts.buttonLabel = 'Save everything here' - const filePaths = remote.dialog.showOpenDialog(remote.app.mainWindow, opts) - if (!filePaths) return - - const destination = filePaths[0] - promises = selected.map(element => saveFileToPath(element.hash, destination)) - } else { - // selected.length === 1 - opts.properties = ['openDirectory'] - opts.buttonLabel = 'Save here' - const filePaths = remote.dialog.showOpenDialog(remote.app.mainWindow, opts) - if (!filePaths) return - - const destination = filePaths[0] - promises = [saveFileToPath(selected[0].hash, destination)] + const opts = { + title: 'Where should I save?', + properties: ['openDirectory', 'createDirectory'], + buttonLabel: 'Save here' } + const filePaths = remote.dialog.showOpenDialog(remote.app.mainWindow, opts) + if (!filePaths) return + + const destination = filePaths[0] + let sequentialChain = Promise.resolve() + + // we call saveFileToPath only after the previous call finished (in .then) + selected.forEach(element => { + sequentialChain = sequentialChain.then((res) => { + return saveFileToPath(element.hash, destination) + }) + }) this.setState({ isSavingOnDisk: true }) - Promise.all(promises) + sequentialChain .then(result => this.setState({ isSavingOnDisk: false })) .catch(err => { remote.dialog.showErrorBox('Saving to disk has failed', err.message)