From b7fedb19833446e0fa37c6de151f9af983b5cd17 Mon Sep 17 00:00:00 2001 From: Sharon Grossman Date: Tue, 26 Sep 2017 18:39:43 +0300 Subject: [PATCH 1/3] feat(delete-all-torrents): added remove all torrents capability to the Transfers menu --- src/main/menu.js | 8 +++++ .../components/delete-all-torrents-modal.js | 30 +++++++++++++++++++ .../controllers/torrent-list-controller.js | 27 +++++++++++++++++ src/renderer/main.js | 4 +++ src/renderer/pages/app.js | 4 ++- 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/renderer/components/delete-all-torrents-modal.js diff --git a/src/main/menu.js b/src/main/menu.js index b9a6f3b4..a1ebc610 100644 --- a/src/main/menu.js +++ b/src/main/menu.js @@ -288,6 +288,14 @@ function getMenuTemplate () { { label: 'Resume All', click: () => windows.main.dispatch('resumeAllTorrents') + }, + { + label: 'Remove All From List', + click: () => windows.main.dispatch('confirmDeleteAllTorrents', false) + }, + { + label: 'Remove All Data Files', + click: () => windows.main.dispatch('confirmDeleteAllTorrents', true) } ] }, diff --git a/src/renderer/components/delete-all-torrents-modal.js b/src/renderer/components/delete-all-torrents-modal.js new file mode 100644 index 00000000..6e34a41d --- /dev/null +++ b/src/renderer/components/delete-all-torrents-modal.js @@ -0,0 +1,30 @@ +const React = require('react') + +const ModalOKCancel = require('./modal-ok-cancel') +const {dispatch, dispatcher} = require('../lib/dispatcher') + +module.exports = class DeleteAllTorrentsModal extends React.Component { + render () { + const {state: {modal: {deleteData}}} = this.props + const message = deleteData + ? 'Are you sure you want to remove all the torrents from the list and delete the data files?' + : 'Are you sure you want to remove all the torrents from the list?' + const buttonText = deleteData ? 'REMOVE DATA' : 'REMOVE' + + return ( +
+

{message}

+ +
+ ) + + function handleRemove () { + dispatch('deleteAllTorrents', deleteData) + dispatch('exitModal') + } + } +} diff --git a/src/renderer/controllers/torrent-list-controller.js b/src/renderer/controllers/torrent-list-controller.js index f726c800..699749a2 100644 --- a/src/renderer/controllers/torrent-list-controller.js +++ b/src/renderer/controllers/torrent-list-controller.js @@ -201,6 +201,13 @@ module.exports = class TorrentListController { } } + confirmDeleteAllTorrents (deleteData) { + this.state.modal = { + id: 'delete-all-torrents-modal', + deleteData + } + } + // TODO: use torrentKey, not infoHash deleteTorrent (infoHash, deleteData) { ipcRenderer.send('wt-stop-torrenting', infoHash) @@ -227,6 +234,26 @@ module.exports = class TorrentListController { sound.play('DELETE') } + deleteAllTorrents (deleteData) { + this.state.saved.torrents.forEach((summary) => { + ipcRenderer.send('wt-stop-torrenting', summary.infoHash) + + // remove torrent and poster file + deleteFile(TorrentSummary.getTorrentPath(summary)) + deleteFile(TorrentSummary.getPosterPath(summary)) + + if (deleteData) moveItemToTrash(summary) + + dispatch('stateSave') + }) + + this.state.saved.torrents = [] + + // prevent user from going forward to a deleted torrent + this.state.location.clearForward('player') + sound.play('DELETE') + } + toggleSelectTorrent (infoHash) { if (this.state.selectedInfoHash === infoHash) { this.state.selectedInfoHash = null diff --git a/src/renderer/main.js b/src/renderer/main.js index 9beab04c..ee0b3b43 100644 --- a/src/renderer/main.js +++ b/src/renderer/main.js @@ -250,6 +250,10 @@ const dispatchHandlers = { controllers.torrentList().confirmDeleteTorrent(infoHash, deleteData), 'deleteTorrent': (infoHash, deleteData) => controllers.torrentList().deleteTorrent(infoHash, deleteData), + 'confirmDeleteAllTorrents': (deleteData) => + controllers.torrentList().confirmDeleteAllTorrents(deleteData), + 'deleteAllTorrents': (deleteData) => + controllers.torrentList().deleteAllTorrents(deleteData), 'toggleSelectTorrent': (infoHash) => controllers.torrentList().toggleSelectTorrent(infoHash), 'openTorrentContextMenu': (infoHash) => diff --git a/src/renderer/pages/app.js b/src/renderer/pages/app.js index 5d9ec807..0184735b 100644 --- a/src/renderer/pages/app.js +++ b/src/renderer/pages/app.js @@ -24,7 +24,9 @@ const Modals = { ), 'remove-torrent-modal': createGetter(() => require('../components/remove-torrent-modal')), 'update-available-modal': createGetter(() => require('../components/update-available-modal')), - 'unsupported-media-modal': createGetter(() => require('../components/unsupported-media-modal')) + 'unsupported-media-modal': createGetter(() => require('../components/unsupported-media-modal')), + 'delete-all-torrents-modal': + createGetter(() => require('../components/delete-all-torrents-modal')) } const fontFamily = process.platform === 'win32' From 60862ec01d0bb619fa1e5a03399e11a24dd1385b Mon Sep 17 00:00:00 2001 From: Mathias Rasmussen Date: Mon, 8 Oct 2018 01:42:40 +0200 Subject: [PATCH 2/3] refactor torrent-list-controller --- .../components/delete-all-torrents-modal.js | 4 +- .../controllers/torrent-list-controller.js | 46 +++++++++---------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/renderer/components/delete-all-torrents-modal.js b/src/renderer/components/delete-all-torrents-modal.js index 6e34a41d..91993275 100644 --- a/src/renderer/components/delete-all-torrents-modal.js +++ b/src/renderer/components/delete-all-torrents-modal.js @@ -1,11 +1,11 @@ const React = require('react') const ModalOKCancel = require('./modal-ok-cancel') -const {dispatch, dispatcher} = require('../lib/dispatcher') +const { dispatch, dispatcher } = require('../lib/dispatcher') module.exports = class DeleteAllTorrentsModal extends React.Component { render () { - const {state: {modal: {deleteData}}} = this.props + const { state: { modal: { deleteData } } } = this.props const message = deleteData ? 'Are you sure you want to remove all the torrents from the list and delete the data files?' : 'Are you sure you want to remove all the torrents from the list?' diff --git a/src/renderer/controllers/torrent-list-controller.js b/src/renderer/controllers/torrent-list-controller.js index 699749a2..aff42c8e 100644 --- a/src/renderer/controllers/torrent-list-controller.js +++ b/src/renderer/controllers/torrent-list-controller.js @@ -210,44 +210,29 @@ module.exports = class TorrentListController { // TODO: use torrentKey, not infoHash deleteTorrent (infoHash, deleteData) { - ipcRenderer.send('wt-stop-torrenting', infoHash) - const index = this.state.saved.torrents.findIndex((x) => x.infoHash === infoHash) if (index > -1) { const summary = this.state.saved.torrents[index] - - // remove torrent and poster file - deleteFile(TorrentSummary.getTorrentPath(summary)) - deleteFile(TorrentSummary.getPosterPath(summary)) - - // optionally delete the torrent data - if (deleteData) moveItemToTrash(summary) + deleteTorrentFile(summary, deleteData) // remove torrent from saved list this.state.saved.torrents.splice(index, 1) dispatch('stateSave') - } - // prevent user from going forward to a deleted torrent - this.state.location.clearForward('player') - sound.play('DELETE') + // prevent user from going forward to a deleted torrent + this.state.location.clearForward('player') + sound.play('DELETE') + } else { + throw new TorrentKeyNotFoundError(infoHash) + } } deleteAllTorrents (deleteData) { - this.state.saved.torrents.forEach((summary) => { - ipcRenderer.send('wt-stop-torrenting', summary.infoHash) - - // remove torrent and poster file - deleteFile(TorrentSummary.getTorrentPath(summary)) - deleteFile(TorrentSummary.getPosterPath(summary)) - - if (deleteData) moveItemToTrash(summary) - - dispatch('stateSave') - }) + this.state.saved.torrents.forEach((summary) => deleteTorrentFile(summary, deleteData)) this.state.saved.torrents = [] + dispatch('stateSave') // prevent user from going forward to a deleted torrent this.state.location.clearForward('player') @@ -313,7 +298,7 @@ module.exports = class TorrentListController { // Shows a Save File dialog, then saves the .torrent file wherever the user requests saveTorrentFileAs (torrentKey) { const torrentSummary = TorrentSummary.getByKey(this.state, torrentKey) - if (!torrentSummary) throw new Error('Missing torrentKey: ' + torrentKey) + if (!torrentSummary) throw new TorrentKeyNotFoundError(torrentKey) const downloadPath = this.state.saved.prefs.downloadPath const newFileName = path.parse(torrentSummary.name).name + '.torrent' const win = electron.remote.getCurrentWindow() @@ -398,3 +383,14 @@ function moveItemToTrash (torrentSummary) { function showItemInFolder (torrentSummary) { ipcRenderer.send('showItemInFolder', TorrentSummary.getFileOrFolder(torrentSummary)) } + +function deleteTorrentFile (torrentSummary, deleteData) { + ipcRenderer.send('wt-stop-torrenting', torrentSummary.infoHash) + + // remove torrent and poster file + deleteFile(TorrentSummary.getTorrentPath(torrentSummary)) + deleteFile(TorrentSummary.getPosterPath(torrentSummary)) + + // optionally delete the torrent data + if (deleteData) moveItemToTrash(torrentSummary) +} From 5b894df71bf10ec5fd7812dbc399b9a47c12041b Mon Sep 17 00:00:00 2001 From: Julen Garcia Leunda Date: Thu, 19 Dec 2019 18:34:35 +0100 Subject: [PATCH 3/3] fix lint errors --- src/renderer/components/delete-all-torrents-modal.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/delete-all-torrents-modal.js b/src/renderer/components/delete-all-torrents-modal.js index 91993275..f3424dc0 100644 --- a/src/renderer/components/delete-all-torrents-modal.js +++ b/src/renderer/components/delete-all-torrents-modal.js @@ -18,7 +18,8 @@ module.exports = class DeleteAllTorrentsModal extends React.Component { cancelText='CANCEL' onCancel={dispatcher('exitModal')} okText={buttonText} - onOK={handleRemove} /> + onOK={handleRemove} + /> )