2017-12-28 00:48:11 +01:00
|
|
|
/* eslint-disable import/no-commonjs */
|
2017-12-21 18:32:51 +01:00
|
|
|
import * as ACTIONS from 'constants/action_types';
|
2017-12-28 00:48:11 +01:00
|
|
|
import * as MODALS from 'constants/modal_types';
|
|
|
|
import { ipcRenderer, remote } from 'electron';
|
2017-12-21 18:32:51 +01:00
|
|
|
import Lbry from 'lbry';
|
2017-12-28 00:48:11 +01:00
|
|
|
import Path from 'path';
|
|
|
|
import { doFetchRewardedContent } from 'redux/actions/content';
|
|
|
|
import { doFetchFileInfosAndPublishedClaims } from 'redux/actions/file_info';
|
|
|
|
import { doAuthNavigate } from 'redux/actions/navigation';
|
|
|
|
import { doFetchDaemonSettings } from 'redux/actions/settings';
|
|
|
|
import { doAuthenticate } from 'redux/actions/user';
|
|
|
|
import { doBalanceSubscribe } from 'redux/actions/wallet';
|
2017-04-07 07:15:22 +02:00
|
|
|
import {
|
2017-12-28 00:48:11 +01:00
|
|
|
selectCurrentModal,
|
|
|
|
selectIsUpgradeSkipped,
|
|
|
|
selectRemoteVersion,
|
2017-04-07 07:15:22 +02:00
|
|
|
selectUpdateUrl,
|
|
|
|
selectUpgradeDownloadItem,
|
2017-12-28 00:48:11 +01:00
|
|
|
selectUpgradeDownloadPath,
|
2017-07-29 01:31:10 +02:00
|
|
|
selectUpgradeFilename,
|
2018-01-17 11:50:02 +01:00
|
|
|
selectAutoUpdateDeclined,
|
2017-12-21 18:32:51 +01:00
|
|
|
} from 'redux/selectors/app';
|
|
|
|
|
2017-12-08 13:14:37 +01:00
|
|
|
const { autoUpdater } = remote.require('electron-updater');
|
2017-12-21 18:32:51 +01:00
|
|
|
const { download } = remote.require('electron-dl');
|
|
|
|
const Fs = remote.require('fs');
|
|
|
|
const { lbrySettings: config } = require('package.json');
|
2017-12-13 22:36:30 +01:00
|
|
|
|
2017-11-16 22:39:10 +01:00
|
|
|
const CHECK_UPGRADE_INTERVAL = 10 * 60 * 1000;
|
2017-04-07 07:15:22 +02:00
|
|
|
|
2017-09-08 05:15:05 +02:00
|
|
|
export function doOpenModal(modal, modalProps = {}) {
|
2017-04-07 07:15:22 +02:00
|
|
|
return {
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.OPEN_MODAL,
|
2017-04-07 07:15:22 +02:00
|
|
|
data: {
|
2017-06-06 23:19:12 +02:00
|
|
|
modal,
|
2017-09-08 05:15:05 +02:00
|
|
|
modalProps,
|
2017-06-06 23:19:12 +02:00
|
|
|
},
|
|
|
|
};
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export function doCloseModal() {
|
|
|
|
return {
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.CLOSE_MODAL,
|
2017-06-06 23:19:12 +02:00
|
|
|
};
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export function doUpdateDownloadProgress(percent) {
|
|
|
|
return {
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.UPGRADE_DOWNLOAD_PROGRESSED,
|
2017-04-07 07:15:22 +02:00
|
|
|
data: {
|
2017-12-13 22:36:30 +01:00
|
|
|
percent,
|
2017-06-06 23:19:12 +02:00
|
|
|
},
|
|
|
|
};
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export function doSkipUpgrade() {
|
|
|
|
return {
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.SKIP_UPGRADE,
|
2017-06-06 23:19:12 +02:00
|
|
|
};
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export function doStartUpgrade() {
|
2017-12-28 00:48:11 +01:00
|
|
|
return (dispatch, getState) => {
|
2017-06-06 23:19:12 +02:00
|
|
|
const state = getState();
|
|
|
|
const upgradeDownloadPath = selectUpgradeDownloadPath(state);
|
2017-04-07 07:15:22 +02:00
|
|
|
|
2017-12-21 18:32:51 +01:00
|
|
|
ipcRenderer.send('upgrade', upgradeDownloadPath);
|
2017-06-06 23:19:12 +02:00
|
|
|
};
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
2018-01-16 06:38:23 +01:00
|
|
|
export function doDownloadUpgradeRequested() {
|
|
|
|
// This means the user requested an upgrade by clicking the "upgrade" button in the navbar.
|
|
|
|
// If on Mac and Windows, we do some new behavior for the auto-update system.
|
|
|
|
// This will probably be reorganized once we get auto-update going on Linux and remove
|
|
|
|
// the old logic.
|
|
|
|
|
|
|
|
return (dispatch, getState) => {
|
|
|
|
const state = getState();
|
2018-01-17 11:50:02 +01:00
|
|
|
const autoUpdateDeclined = selectAutoUpdateDeclined(state);
|
2018-01-16 06:38:23 +01:00
|
|
|
|
|
|
|
if (['win32', 'darwin'].includes(process.platform)) { // electron-updater behavior
|
2018-01-17 11:50:02 +01:00
|
|
|
if (autoUpdateDeclined) {
|
|
|
|
// The user declined an update before, so show the "confirm" dialog
|
|
|
|
dispatch({
|
|
|
|
type: ACTIONS.OPEN_MODAL,
|
|
|
|
data: { modal: MODALS.AUTO_UPDATE_CONFIRM },
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
// The user was never shown the original update dialog (e.g. because they were
|
|
|
|
// watching a video). So show the inital "update downloaded" dialog.
|
|
|
|
dispatch({
|
|
|
|
type: ACTIONS.OPEN_MODAL,
|
|
|
|
data: { modal: MODALS.AUTO_UPDATE_DOWNLOADED },
|
|
|
|
});
|
|
|
|
}
|
2018-01-16 06:38:23 +01:00
|
|
|
} else { // Old behavior for Linux
|
|
|
|
doDownloadUpgrade();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-04-07 07:15:22 +02:00
|
|
|
export function doDownloadUpgrade() {
|
2017-12-28 00:48:11 +01:00
|
|
|
return (dispatch, getState) => {
|
2017-06-06 23:19:12 +02:00
|
|
|
const state = getState();
|
2017-04-07 07:15:22 +02:00
|
|
|
// Make a new directory within temp directory so the filename is guaranteed to be available
|
2017-12-21 18:32:51 +01:00
|
|
|
const dir = Fs.mkdtempSync(remote.app.getPath('temp') + Path.sep);
|
|
|
|
const upgradeFilename = selectUpgradeFilename(state);
|
2017-04-07 07:15:22 +02:00
|
|
|
|
2017-12-13 22:36:30 +01:00
|
|
|
const options = {
|
2017-06-06 23:19:12 +02:00
|
|
|
onProgress: p => dispatch(doUpdateDownloadProgress(Math.round(p * 100))),
|
2017-04-07 07:15:22 +02:00
|
|
|
directory: dir,
|
|
|
|
};
|
2017-12-21 18:32:51 +01:00
|
|
|
download(remote.getCurrentWindow(), selectUpdateUrl(state), options).then(downloadItem => {
|
|
|
|
/**
|
|
|
|
* TODO: get the download path directly from the download object. It should just be
|
|
|
|
* downloadItem.getSavePath(), but the copy on the main process is being garbage collected
|
|
|
|
* too soon.
|
|
|
|
*/
|
2017-04-07 07:15:22 +02:00
|
|
|
|
2017-12-21 18:32:51 +01:00
|
|
|
dispatch({
|
|
|
|
type: ACTIONS.UPGRADE_DOWNLOAD_COMPLETED,
|
|
|
|
data: {
|
|
|
|
downloadItem,
|
|
|
|
path: Path.join(dir, upgradeFilename),
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
2017-04-07 07:15:22 +02:00
|
|
|
|
|
|
|
dispatch({
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.UPGRADE_DOWNLOAD_STARTED,
|
2017-06-06 23:19:12 +02:00
|
|
|
});
|
2017-04-07 07:15:22 +02:00
|
|
|
dispatch({
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.OPEN_MODAL,
|
2017-04-07 07:15:22 +02:00
|
|
|
data: {
|
2017-12-21 18:32:51 +01:00
|
|
|
modal: MODALS.DOWNLOADING,
|
2017-06-06 23:19:12 +02:00
|
|
|
},
|
|
|
|
});
|
|
|
|
};
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
2017-12-08 13:14:37 +01:00
|
|
|
export function doAutoUpdate() {
|
|
|
|
return function(dispatch, getState) {
|
|
|
|
const state = getState();
|
2018-01-16 06:38:23 +01:00
|
|
|
dispatch({
|
|
|
|
type: ACTIONS.AUTO_UPDATE_DOWNLOADED,
|
|
|
|
});
|
|
|
|
|
2017-12-08 13:14:37 +01:00
|
|
|
dispatch({
|
2018-01-02 12:51:37 +01:00
|
|
|
type: ACTIONS.OPEN_MODAL,
|
|
|
|
data: { modal: MODALS.AUTO_UPDATE_DOWNLOADED },
|
2017-12-08 13:14:37 +01:00
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-01-17 11:50:02 +01:00
|
|
|
export function doAutoUpdateDeclined() {
|
|
|
|
return function(dispatch, getState) {
|
|
|
|
const state = getState();
|
|
|
|
dispatch({
|
|
|
|
type: ACTIONS.AUTO_UPDATE_DECLINED,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-04-07 07:15:22 +02:00
|
|
|
export function doCancelUpgrade() {
|
2017-12-28 00:48:11 +01:00
|
|
|
return (dispatch, getState) => {
|
2017-06-06 23:19:12 +02:00
|
|
|
const state = getState();
|
|
|
|
const upgradeDownloadItem = selectUpgradeDownloadItem(state);
|
2017-04-07 07:15:22 +02:00
|
|
|
|
|
|
|
if (upgradeDownloadItem) {
|
|
|
|
/*
|
|
|
|
* Right now the remote reference to the download item gets garbage collected as soon as the
|
|
|
|
* the download is over (maybe even earlier), so trying to cancel a finished download may
|
|
|
|
* throw an error.
|
|
|
|
*/
|
|
|
|
try {
|
|
|
|
upgradeDownloadItem.cancel();
|
|
|
|
} catch (err) {
|
2017-06-06 23:19:12 +02:00
|
|
|
console.error(err);
|
2017-04-07 07:15:22 +02:00
|
|
|
// Do nothing
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-21 18:32:51 +01:00
|
|
|
dispatch({ type: ACTIONS.UPGRADE_CANCELLED });
|
2017-06-06 23:19:12 +02:00
|
|
|
};
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export function doCheckUpgradeAvailable() {
|
2017-12-28 00:48:11 +01:00
|
|
|
return (dispatch, getState) => {
|
2017-06-06 23:19:12 +02:00
|
|
|
const state = getState();
|
2017-11-15 02:50:21 +01:00
|
|
|
dispatch({
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.CHECK_UPGRADE_START,
|
2017-11-15 02:50:21 +01:00
|
|
|
});
|
2017-04-07 07:15:22 +02:00
|
|
|
|
2017-12-08 13:14:37 +01:00
|
|
|
if (["win32", "darwin"].includes(process.platform)) {
|
|
|
|
// On Windows and Mac, updates happen silently
|
|
|
|
autoUpdater.checkForUpdates();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-11-15 02:50:21 +01:00
|
|
|
const success = ({ remoteVersion, upgradeAvailable }) => {
|
|
|
|
dispatch({
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.CHECK_UPGRADE_SUCCESS,
|
2017-11-15 02:50:21 +01:00
|
|
|
data: {
|
|
|
|
upgradeAvailable,
|
|
|
|
remoteVersion,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
if (
|
|
|
|
upgradeAvailable &&
|
2017-11-16 22:39:10 +01:00
|
|
|
!selectCurrentModal(state) &&
|
2017-12-21 18:32:51 +01:00
|
|
|
(!selectIsUpgradeSkipped(state) || remoteVersion !== selectRemoteVersion(state))
|
2017-11-15 02:50:21 +01:00
|
|
|
) {
|
2017-04-07 07:15:22 +02:00
|
|
|
dispatch({
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.OPEN_MODAL,
|
2017-04-07 07:15:22 +02:00
|
|
|
data: {
|
2017-12-21 18:32:51 +01:00
|
|
|
modal: MODALS.UPGRADE,
|
2017-06-06 23:19:12 +02:00
|
|
|
},
|
|
|
|
});
|
2017-05-04 05:44:08 +02:00
|
|
|
}
|
2017-11-15 02:50:21 +01:00
|
|
|
};
|
|
|
|
|
2017-11-16 22:39:10 +01:00
|
|
|
const fail = () => {
|
2017-11-15 02:50:21 +01:00
|
|
|
dispatch({
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.CHECK_UPGRADE_FAIL,
|
2017-11-15 02:50:21 +01:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2017-12-21 18:32:51 +01:00
|
|
|
Lbry.getAppVersionInfo().then(success, fail);
|
2017-11-15 02:50:21 +01:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
Initiate a timer that will check for an app upgrade every 10 minutes.
|
|
|
|
*/
|
2017-11-16 22:39:10 +01:00
|
|
|
export function doCheckUpgradeSubscribe() {
|
2017-12-28 00:48:11 +01:00
|
|
|
return dispatch => {
|
2017-11-15 02:50:21 +01:00
|
|
|
const checkUpgradeTimer = setInterval(
|
|
|
|
() => dispatch(doCheckUpgradeAvailable()),
|
2017-11-16 22:39:10 +01:00
|
|
|
CHECK_UPGRADE_INTERVAL
|
2017-11-15 02:50:21 +01:00
|
|
|
);
|
|
|
|
dispatch({
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.CHECK_UPGRADE_SUBSCRIBE,
|
2017-11-15 02:50:21 +01:00
|
|
|
data: { checkUpgradeTimer },
|
2017-04-07 07:15:22 +02:00
|
|
|
});
|
2017-06-06 23:19:12 +02:00
|
|
|
};
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
2017-07-19 23:05:08 +02:00
|
|
|
export function doCheckDaemonVersion() {
|
2017-12-28 00:48:11 +01:00
|
|
|
return dispatch => {
|
2017-12-21 18:32:51 +01:00
|
|
|
Lbry.version().then(({ lbrynet_version: lbrynetVersion }) => {
|
2017-07-19 23:05:08 +02:00
|
|
|
dispatch({
|
2017-11-24 15:31:05 +01:00
|
|
|
type:
|
2017-12-21 18:32:51 +01:00
|
|
|
config.lbrynetDaemonVersion === lbrynetVersion
|
|
|
|
? ACTIONS.DAEMON_VERSION_MATCH
|
|
|
|
: ACTIONS.DAEMON_VERSION_MISMATCH,
|
2017-07-19 23:05:08 +02:00
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2017-04-07 07:15:22 +02:00
|
|
|
export function doAlertError(errorList) {
|
2017-12-28 00:48:11 +01:00
|
|
|
return dispatch => {
|
2017-04-07 07:15:22 +02:00
|
|
|
dispatch({
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.OPEN_MODAL,
|
2017-04-07 07:15:22 +02:00
|
|
|
data: {
|
2017-12-21 18:32:51 +01:00
|
|
|
modal: MODALS.ERROR,
|
2017-09-08 05:15:05 +02:00
|
|
|
modalProps: { error: errorList },
|
2017-06-06 23:19:12 +02:00
|
|
|
},
|
|
|
|
});
|
|
|
|
};
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
2017-04-22 15:17:01 +02:00
|
|
|
export function doDaemonReady() {
|
2017-12-28 00:48:11 +01:00
|
|
|
return (dispatch, getState) => {
|
2017-11-16 22:39:10 +01:00
|
|
|
const state = getState();
|
|
|
|
|
2017-06-08 02:56:52 +02:00
|
|
|
dispatch(doAuthenticate());
|
2017-12-21 18:32:51 +01:00
|
|
|
dispatch({ type: ACTIONS.DAEMON_READY });
|
2017-06-08 02:56:52 +02:00
|
|
|
dispatch(doFetchDaemonSettings());
|
2017-09-23 00:59:28 +02:00
|
|
|
dispatch(doBalanceSubscribe());
|
2017-09-07 15:38:44 +02:00
|
|
|
dispatch(doFetchFileInfosAndPublishedClaims());
|
2017-11-16 22:39:10 +01:00
|
|
|
dispatch(doFetchRewardedContent());
|
|
|
|
if (!selectIsUpgradeSkipped(state)) {
|
|
|
|
dispatch(doCheckUpgradeAvailable());
|
|
|
|
}
|
|
|
|
dispatch(doCheckUpgradeSubscribe());
|
2017-06-08 02:56:52 +02:00
|
|
|
};
|
2017-04-22 15:17:01 +02:00
|
|
|
}
|
2017-05-23 09:21:21 +02:00
|
|
|
|
|
|
|
export function doShowSnackBar(data) {
|
|
|
|
return {
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.SHOW_SNACKBAR,
|
2017-05-23 09:21:21 +02:00
|
|
|
data,
|
2017-06-06 23:19:12 +02:00
|
|
|
};
|
2017-05-23 09:21:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export function doRemoveSnackBarSnack() {
|
|
|
|
return {
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.REMOVE_SNACKBAR_SNACK,
|
2017-06-06 23:19:12 +02:00
|
|
|
};
|
2017-05-23 09:21:21 +02:00
|
|
|
}
|
2017-06-16 07:43:43 +02:00
|
|
|
|
|
|
|
export function doClearCache() {
|
2017-12-28 00:48:11 +01:00
|
|
|
return () => {
|
2017-06-16 07:43:43 +02:00
|
|
|
window.cacheStore.purge();
|
|
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
};
|
|
|
|
}
|
2017-07-19 23:05:08 +02:00
|
|
|
|
2017-07-29 21:22:17 +02:00
|
|
|
export function doQuit() {
|
2017-12-28 00:48:11 +01:00
|
|
|
return () => {
|
2017-07-19 23:05:08 +02:00
|
|
|
remote.app.quit();
|
|
|
|
};
|
|
|
|
}
|
2017-08-25 21:05:00 +02:00
|
|
|
|
|
|
|
export function doChangeVolume(volume) {
|
2017-12-28 00:48:11 +01:00
|
|
|
return dispatch => {
|
2017-08-25 21:05:00 +02:00
|
|
|
dispatch({
|
2017-12-21 18:32:51 +01:00
|
|
|
type: ACTIONS.VOLUME_CHANGED,
|
2017-08-25 21:05:00 +02:00
|
|
|
data: {
|
|
|
|
volume,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
2017-12-23 03:09:06 +01:00
|
|
|
|
|
|
|
export function doConditionalAuthNavigate(newSession) {
|
2017-12-28 00:48:11 +01:00
|
|
|
return (dispatch, getState) => {
|
2017-12-23 03:09:06 +01:00
|
|
|
const state = getState();
|
2017-12-26 14:25:26 +01:00
|
|
|
if (newSession || selectCurrentModal(state) !== 'email_collection') {
|
2017-12-23 03:09:06 +01:00
|
|
|
dispatch(doAuthNavigate());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|