2019-11-26 14:04:28 -05:00
|
|
|
import 'babel-polyfill';
|
2019-03-07 16:46:15 -05:00
|
|
|
import ErrorBoundary from 'component/errorBoundary';
|
2017-12-27 20:48:11 -03:00
|
|
|
import App from 'component/app';
|
|
|
|
import SnackBar from 'component/snackBar';
|
2019-03-28 12:53:13 -04:00
|
|
|
import SplashScreen from 'component/splash';
|
2017-12-27 20:48:11 -03:00
|
|
|
import * as ACTIONS from 'constants/action_types';
|
2020-07-10 14:26:05 +08:00
|
|
|
import { changeZoomFactor } from 'util/zoomWindow';
|
2022-01-02 15:33:11 -05:00
|
|
|
import { ipcRenderer, shell } from 'electron';
|
|
|
|
import * as remote from '@electron/remote';
|
2019-07-29 10:34:20 -04:00
|
|
|
import moment from 'moment';
|
2018-11-28 12:40:52 -05:00
|
|
|
import * as MODALS from 'constants/modal_types';
|
2019-08-27 10:43:42 -04:00
|
|
|
import React, { Fragment, useState, useEffect } from 'react';
|
2017-12-21 14:32:51 -03:00
|
|
|
import ReactDOM from 'react-dom';
|
|
|
|
import { Provider } from 'react-redux';
|
2021-12-15 15:58:47 -05:00
|
|
|
import * as SETTINGS from 'constants/settings';
|
2021-11-11 09:19:09 -05:00
|
|
|
import {
|
|
|
|
doDaemonReady,
|
|
|
|
doAutoUpdate,
|
|
|
|
doOpenModal,
|
|
|
|
doHideModal,
|
|
|
|
doToggle3PAnalytics,
|
|
|
|
doUpdateDownloadProgress,
|
2022-03-01 10:53:00 -03:00
|
|
|
doNotifyUpdateAvailable,
|
2021-11-11 09:19:09 -05:00
|
|
|
} from 'redux/actions/app';
|
2021-10-07 23:47:39 -04:00
|
|
|
import { isURIValid } from 'util/lbryURI';
|
2020-07-27 16:04:12 -04:00
|
|
|
import { setSearchApi } from 'redux/actions/search';
|
2020-05-07 14:44:11 -04:00
|
|
|
import { doSetLanguage, doFetchLanguage, doUpdateIsNightAsync } from 'redux/actions/settings';
|
2021-10-18 19:37:58 -04:00
|
|
|
import { Lbryio, doBlackListedOutpointsSubscribe, doFilteredOutpointsSubscribe } from 'lbryinc';
|
2020-06-15 16:33:03 -04:00
|
|
|
import rewards from 'rewards';
|
2019-07-23 04:05:51 -04:00
|
|
|
import { store, persistor, history } from 'store';
|
2017-12-21 19:09:30 -03:00
|
|
|
import app from './app';
|
2018-05-22 23:37:09 -03:00
|
|
|
import doLogWarningConsoleMessage from './logWarningConsoleMessage';
|
2019-04-18 15:10:46 -04:00
|
|
|
import { ConnectedRouter, push } from 'connected-react-router';
|
2019-12-03 12:55:29 -05:00
|
|
|
import { formatLbryUrlForWeb, formatInAppUrl } from 'util/url';
|
2019-07-23 04:05:51 -04:00
|
|
|
import { PersistGate } from 'redux-persist/integration/react';
|
2019-10-02 14:20:25 -04:00
|
|
|
import analytics from 'analytics';
|
2020-06-12 16:44:25 -04:00
|
|
|
import { doToast } from 'redux/actions/notifications';
|
2021-10-18 19:37:58 -04:00
|
|
|
import { getAuthToken, setAuthToken, doAuthTokenRefresh } from 'util/saved-passwords';
|
2021-12-15 15:58:47 -05:00
|
|
|
import { makeSelectClientSetting } from 'redux/selectors/settings';
|
2021-10-18 19:37:58 -04:00
|
|
|
import { DEFAULT_LANGUAGE, LBRY_API_URL } from 'config';
|
2019-04-18 15:10:46 -04:00
|
|
|
|
2021-06-18 14:44:40 +08:00
|
|
|
// Import 3rd-party styles before ours for the current way we are code-splitting.
|
|
|
|
import 'scss/third-party.scss';
|
|
|
|
|
2019-04-18 15:40:53 -04:00
|
|
|
// Import our app styles
|
|
|
|
// If a style is not necessary for the initial page load, it should be removed from `all.scss`
|
|
|
|
// and loaded dynamically in the component that consumes it
|
|
|
|
import 'scss/all.scss';
|
2019-09-30 16:11:45 -04:00
|
|
|
|
2019-10-22 16:42:13 -04:00
|
|
|
const startTime = Date.now();
|
|
|
|
analytics.startupEvent();
|
|
|
|
|
2019-02-22 00:01:59 -05:00
|
|
|
const { autoUpdater } = remote.require('electron-updater');
|
2018-02-23 17:24:00 -07:00
|
|
|
autoUpdater.logger = remote.require('electron-log');
|
2017-12-10 03:06:30 -05:00
|
|
|
|
2020-08-25 12:08:41 -04:00
|
|
|
if (LBRY_API_URL) {
|
|
|
|
Lbryio.setLocalApi(LBRY_API_URL);
|
2019-01-07 21:46:33 -05:00
|
|
|
}
|
|
|
|
|
2019-01-29 11:46:56 -05:00
|
|
|
if (process.env.SEARCH_API_URL) {
|
|
|
|
setSearchApi(process.env.SEARCH_API_URL);
|
|
|
|
}
|
|
|
|
|
2020-03-12 10:56:13 -04:00
|
|
|
doAuthTokenRefresh();
|
2020-03-11 22:29:53 -04:00
|
|
|
|
2018-09-23 23:44:42 -04:00
|
|
|
// We need to override Lbryio for getting/setting the authToken
|
2019-10-13 23:11:51 +05:30
|
|
|
// We interact with ipcRenderer to get the auth key from a users keyring
|
|
|
|
// We keep a local variable for authToken because `ipcRenderer.send` does not
|
2018-11-30 12:57:12 -05:00
|
|
|
// contain a response, so there is no way to know when it's been set
|
2018-11-30 00:55:45 -05:00
|
|
|
let authToken;
|
2021-06-18 14:44:40 +08:00
|
|
|
Lbryio.setOverride('setAuthToken', (authToken) => {
|
2020-09-04 11:02:30 -04:00
|
|
|
setAuthToken(authToken);
|
|
|
|
return authToken;
|
|
|
|
});
|
2018-09-23 23:44:42 -04:00
|
|
|
|
|
|
|
Lbryio.setOverride(
|
|
|
|
'getAuthToken',
|
|
|
|
() =>
|
2021-06-18 14:44:40 +08:00
|
|
|
new Promise((resolve) => {
|
2019-10-24 14:07:48 -04:00
|
|
|
const authTokenToReturn = authToken || getAuthToken();
|
|
|
|
resolve(authTokenToReturn);
|
2018-09-23 23:44:42 -04:00
|
|
|
})
|
|
|
|
);
|
|
|
|
|
2018-11-28 12:40:52 -05:00
|
|
|
rewards.setCallback('claimFirstRewardSuccess', () => {
|
|
|
|
app.store.dispatch(doOpenModal(MODALS.FIRST_REWARD));
|
|
|
|
});
|
|
|
|
|
2021-06-18 14:44:40 +08:00
|
|
|
rewards.setCallback('claimRewardSuccess', (reward) => {
|
2021-01-07 12:19:33 -03:00
|
|
|
if (reward && reward.type === rewards.TYPE_REWARD_CODE) {
|
|
|
|
app.store.dispatch(doHideModal());
|
|
|
|
}
|
2018-12-13 11:51:37 -05:00
|
|
|
});
|
|
|
|
|
2022-02-25 15:01:14 -05:00
|
|
|
ipcRenderer.on('send-disk-space', (event, result) => {
|
|
|
|
if (result.error) {
|
|
|
|
console.log(`disk space error: ${result.error}`);
|
|
|
|
} else {
|
|
|
|
app.store.dispatch({
|
|
|
|
type: ACTIONS.DISK_SPACE,
|
|
|
|
data: result.diskSpace,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
ipcRenderer.send('get-disk-space');
|
2019-02-22 00:01:59 -05:00
|
|
|
// @if TARGET='app'
|
2019-12-02 12:30:08 -05:00
|
|
|
ipcRenderer.on('open-uri-requested', (event, url, newSession) => {
|
|
|
|
function handleError() {
|
|
|
|
app.store.dispatch(
|
|
|
|
doToast({
|
|
|
|
message: __('Invalid LBRY URL requested'),
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
const path = url.slice('lbry://'.length);
|
|
|
|
if (path.startsWith('?')) {
|
2019-12-03 12:55:29 -05:00
|
|
|
const redirectUrl = formatInAppUrl(path);
|
2019-12-02 12:30:08 -05:00
|
|
|
return app.store.dispatch(push(redirectUrl));
|
2017-06-07 20:56:52 -04:00
|
|
|
}
|
2019-12-02 12:30:08 -05:00
|
|
|
|
|
|
|
if (isURIValid(url)) {
|
|
|
|
const formattedUrl = formatLbryUrlForWeb(url);
|
|
|
|
analytics.openUrlEvent(formattedUrl);
|
|
|
|
return app.store.dispatch(push(formattedUrl));
|
|
|
|
}
|
|
|
|
|
|
|
|
// If nothing redirected before here the url must be messed up
|
|
|
|
handleError();
|
2017-05-09 16:58:48 -04:00
|
|
|
});
|
2017-05-08 05:04:11 -04:00
|
|
|
|
2022-03-01 10:53:00 -03:00
|
|
|
autoUpdater.on('update-available', (e) => {
|
|
|
|
app.store.dispatch(doNotifyUpdateAvailable(e));
|
2022-02-18 21:15:07 -03:00
|
|
|
});
|
|
|
|
|
2021-11-11 09:19:09 -05:00
|
|
|
ipcRenderer.on('download-progress-update', (e, p) => {
|
|
|
|
app.store.dispatch(doUpdateDownloadProgress(Math.round(p.percent * 100)));
|
|
|
|
});
|
|
|
|
|
|
|
|
ipcRenderer.on('download-update-complete', (e, c) => {
|
|
|
|
app.store.dispatch({
|
|
|
|
type: ACTIONS.UPGRADE_DOWNLOAD_COMPLETED,
|
|
|
|
data: {
|
|
|
|
path: c.path,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2019-11-05 13:54:58 -05:00
|
|
|
ipcRenderer.on('language-set', (event, language) => {
|
|
|
|
app.store.dispatch(doSetLanguage(language));
|
|
|
|
});
|
|
|
|
|
2017-12-21 14:32:51 -03:00
|
|
|
ipcRenderer.on('open-menu', (event, uri) => {
|
|
|
|
if (uri && uri.startsWith('/help')) {
|
2019-04-18 15:10:46 -04:00
|
|
|
app.store.dispatch(push('/$/help'));
|
2017-06-13 17:02:06 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2020-07-10 14:26:05 +08:00
|
|
|
ipcRenderer.on('zoom-window', (event, action) => {
|
|
|
|
changeZoomFactor(action);
|
|
|
|
});
|
|
|
|
|
2017-12-21 14:32:51 -03:00
|
|
|
const { dock } = remote.app;
|
2017-09-14 13:06:41 +05:30
|
|
|
|
2017-12-21 14:32:51 -03:00
|
|
|
ipcRenderer.on('window-is-focused', () => {
|
2017-09-14 13:06:41 +05:30
|
|
|
if (!dock) return;
|
2017-12-21 14:32:51 -03:00
|
|
|
app.store.dispatch({ type: ACTIONS.WINDOW_FOCUSED });
|
|
|
|
dock.setBadge('');
|
2017-09-14 13:06:41 +05:30
|
|
|
});
|
|
|
|
|
2018-05-22 23:37:09 -03:00
|
|
|
ipcRenderer.on('devtools-is-opened', () => {
|
2019-03-20 15:09:58 -04:00
|
|
|
doLogWarningConsoleMessage();
|
2018-05-22 23:37:09 -03:00
|
|
|
});
|
2019-05-26 00:18:47 -06:00
|
|
|
|
|
|
|
// Force exit mode for html5 fullscreen api
|
|
|
|
// See: https://github.com/electron/electron/issues/18188
|
2021-06-18 14:44:40 +08:00
|
|
|
remote.getCurrentWindow().on('leave-full-screen', (event) => {
|
2019-05-26 00:18:47 -06:00
|
|
|
document.webkitExitFullscreen();
|
|
|
|
});
|
|
|
|
|
2021-06-18 14:44:40 +08:00
|
|
|
document.addEventListener('click', (event) => {
|
2017-12-21 14:32:51 -03:00
|
|
|
let { target } = event;
|
2018-11-07 17:44:38 -05:00
|
|
|
|
2017-06-07 20:56:52 -04:00
|
|
|
while (target && target !== document) {
|
2017-12-21 14:32:51 -03:00
|
|
|
if (target.matches('a[href^="http"]') || target.matches('a[href^="mailto"]')) {
|
2017-06-07 20:56:52 -04:00
|
|
|
event.preventDefault();
|
|
|
|
shell.openExternal(target.href);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
target = target.parentNode;
|
|
|
|
}
|
2017-05-21 12:15:41 -04:00
|
|
|
});
|
2020-08-21 11:49:13 -04:00
|
|
|
// @endif
|
|
|
|
|
2021-06-18 14:44:40 +08:00
|
|
|
document.addEventListener('dragover', (event) => {
|
2020-08-21 11:49:13 -04:00
|
|
|
event.preventDefault();
|
|
|
|
});
|
2021-06-18 14:44:40 +08:00
|
|
|
document.addEventListener('drop', (event) => {
|
2020-08-21 11:49:13 -04:00
|
|
|
event.preventDefault();
|
|
|
|
});
|
2017-05-21 12:15:41 -04:00
|
|
|
|
2019-07-23 04:05:51 -04:00
|
|
|
function AppWrapper() {
|
2019-11-18 10:30:15 -08:00
|
|
|
// Splash screen and sdk setup not needed on web
|
2022-01-07 14:02:33 -05:00
|
|
|
const [readyToLaunch, setReadyToLaunch] = useState(false);
|
2019-11-18 10:30:15 -08:00
|
|
|
const [persistDone, setPersistDone] = useState(false);
|
2018-10-14 14:47:18 -03:00
|
|
|
|
2021-12-15 15:58:47 -05:00
|
|
|
useEffect(() => {
|
|
|
|
if (persistDone) {
|
|
|
|
const state = store.getState();
|
|
|
|
const enabled = makeSelectClientSetting(SETTINGS.ENABLE_PRERELEASE_UPDATES)(state);
|
|
|
|
if (enabled) {
|
|
|
|
autoUpdater.allowPrerelease = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, [persistDone]);
|
|
|
|
|
2019-07-23 04:05:51 -04:00
|
|
|
useEffect(() => {
|
2019-07-29 10:34:20 -04:00
|
|
|
// @if TARGET='app'
|
2019-07-23 04:05:51 -04:00
|
|
|
moment.locale(remote.app.getLocale());
|
2018-03-19 21:09:36 -04:00
|
|
|
|
2021-06-18 14:44:40 +08:00
|
|
|
autoUpdater.on('error', (error) => {
|
2019-07-23 04:05:51 -04:00
|
|
|
console.error(error.message); // eslint-disable-line no-console
|
2018-03-14 20:22:54 -04:00
|
|
|
});
|
2018-04-24 14:17:11 -04:00
|
|
|
|
2020-01-14 23:34:28 -05:00
|
|
|
if (['win32', 'darwin'].includes(process.platform) || !!process.env.APPIMAGE) {
|
2019-07-23 04:05:51 -04:00
|
|
|
autoUpdater.on('update-available', () => {
|
|
|
|
console.log('Update available'); // eslint-disable-line no-console
|
|
|
|
});
|
|
|
|
autoUpdater.on('update-not-available', () => {
|
|
|
|
console.log('Update not available'); // eslint-disable-line no-console
|
|
|
|
});
|
|
|
|
autoUpdater.on('update-downloaded', () => {
|
|
|
|
console.log('Update downloaded'); // eslint-disable-line no-console
|
|
|
|
app.store.dispatch(doAutoUpdate());
|
|
|
|
});
|
|
|
|
}
|
2019-07-29 10:34:20 -04:00
|
|
|
// @endif
|
2019-07-23 04:05:51 -04:00
|
|
|
}, []);
|
2019-02-28 08:50:00 +09:00
|
|
|
|
2020-02-19 01:31:40 -05:00
|
|
|
useEffect(() => {
|
|
|
|
if (persistDone) {
|
2020-02-24 14:55:34 -05:00
|
|
|
app.store.dispatch(doToggle3PAnalytics(null, true));
|
2020-02-19 01:31:40 -05:00
|
|
|
}
|
|
|
|
}, [persistDone]);
|
|
|
|
|
2019-07-23 04:05:51 -04:00
|
|
|
useEffect(() => {
|
2019-11-18 10:30:15 -08:00
|
|
|
if (readyToLaunch && persistDone) {
|
2020-05-29 15:20:01 -04:00
|
|
|
if (DEFAULT_LANGUAGE) {
|
|
|
|
app.store.dispatch(doFetchLanguage(DEFAULT_LANGUAGE));
|
2020-05-07 14:44:11 -04:00
|
|
|
}
|
2019-07-23 04:05:51 -04:00
|
|
|
app.store.dispatch(doUpdateIsNightAsync());
|
|
|
|
app.store.dispatch(doDaemonReady());
|
|
|
|
app.store.dispatch(doBlackListedOutpointsSubscribe());
|
|
|
|
app.store.dispatch(doFilteredOutpointsSubscribe());
|
2019-10-02 14:20:25 -04:00
|
|
|
|
|
|
|
const appReadyTime = Date.now();
|
|
|
|
const timeToStart = appReadyTime - startTime;
|
|
|
|
analytics.readyEvent(timeToStart);
|
2019-07-23 04:05:51 -04:00
|
|
|
}
|
2019-11-18 10:30:15 -08:00
|
|
|
}, [readyToLaunch, persistDone]);
|
2017-06-05 21:21:55 -07:00
|
|
|
|
2019-07-23 04:05:51 -04:00
|
|
|
return (
|
|
|
|
<Provider store={store}>
|
2019-11-18 10:30:15 -08:00
|
|
|
<PersistGate
|
|
|
|
persistor={persistor}
|
|
|
|
onBeforeLift={() => setPersistDone(true)}
|
|
|
|
loading={<div className="main--launching" />}
|
|
|
|
>
|
2019-08-27 10:43:42 -04:00
|
|
|
<Fragment>
|
2019-07-23 04:05:51 -04:00
|
|
|
{readyToLaunch ? (
|
|
|
|
<ConnectedRouter history={history}>
|
|
|
|
<ErrorBoundary>
|
|
|
|
<App />
|
|
|
|
<SnackBar />
|
|
|
|
</ErrorBoundary>
|
|
|
|
</ConnectedRouter>
|
|
|
|
) : (
|
2019-12-11 15:27:03 -05:00
|
|
|
<Fragment>
|
2020-02-24 12:07:49 -05:00
|
|
|
<SplashScreen onReadyToLaunch={() => setReadyToLaunch(true)} />
|
2019-12-12 15:18:13 -05:00
|
|
|
<SnackBar />
|
2019-12-11 15:27:03 -05:00
|
|
|
</Fragment>
|
2019-07-23 04:05:51 -04:00
|
|
|
)}
|
2019-08-27 10:43:42 -04:00
|
|
|
</Fragment>
|
2019-07-23 04:05:51 -04:00
|
|
|
</PersistGate>
|
|
|
|
</Provider>
|
|
|
|
);
|
|
|
|
}
|
2017-07-02 21:13:37 +02:00
|
|
|
|
2019-07-23 04:05:51 -04:00
|
|
|
ReactDOM.render(<AppWrapper />, document.getElementById('app'));
|