2019-03-07 22:46:15 +01:00
|
|
|
import ErrorBoundary from 'component/errorBoundary';
|
2017-12-28 00:48:11 +01:00
|
|
|
import App from 'component/app';
|
|
|
|
import SnackBar from 'component/snackBar';
|
2019-02-22 06:01:59 +01:00
|
|
|
// @if TARGET='app'
|
2019-03-28 17:53:13 +01:00
|
|
|
import SplashScreen from 'component/splash';
|
2018-10-14 19:47:18 +02:00
|
|
|
import moment from 'moment';
|
2019-02-22 06:01:59 +01:00
|
|
|
import { ipcRenderer, remote, shell } from 'electron';
|
2017-12-28 00:48:11 +01:00
|
|
|
import * as ACTIONS from 'constants/action_types';
|
2019-02-22 06:01:59 +01:00
|
|
|
// @endif
|
2018-11-28 18:40:52 +01:00
|
|
|
import * as MODALS from 'constants/modal_types';
|
2017-12-21 18:32:51 +01:00
|
|
|
import React from 'react';
|
|
|
|
import ReactDOM from 'react-dom';
|
|
|
|
import { Provider } from 'react-redux';
|
2018-11-28 18:40:52 +01:00
|
|
|
import {
|
|
|
|
doConditionalAuthNavigate,
|
|
|
|
doDaemonReady,
|
|
|
|
doAutoUpdate,
|
|
|
|
doOpenModal,
|
2018-12-13 17:51:37 +01:00
|
|
|
doHideModal,
|
2018-11-28 18:40:52 +01:00
|
|
|
} from 'redux/actions/app';
|
2019-03-12 20:53:55 +01:00
|
|
|
import { Lbry, doToast, isURIValid, setSearchApi } from 'lbry-redux';
|
2018-03-08 00:03:45 +01:00
|
|
|
import { doDownloadLanguages, doUpdateIsNightAsync } from 'redux/actions/settings';
|
2019-03-12 20:53:55 +01:00
|
|
|
import { doAuthenticate, Lbryio, rewards, doBlackListedOutpointsSubscribe } from 'lbryinc';
|
2019-04-04 23:05:23 +02:00
|
|
|
import { store, history } from 'store';
|
2018-09-24 05:44:42 +02:00
|
|
|
import pjson from 'package.json';
|
2017-12-21 23:09:30 +01:00
|
|
|
import app from './app';
|
2018-02-16 09:47:52 +01:00
|
|
|
import analytics from './analytics';
|
2018-05-23 04:37:09 +02:00
|
|
|
import doLogWarningConsoleMessage from './logWarningConsoleMessage';
|
2019-04-18 21:10:46 +02:00
|
|
|
import { ConnectedRouter, push } from 'connected-react-router';
|
2019-04-11 20:45:38 +02:00
|
|
|
import cookie from 'cookie';
|
2019-04-18 21:10:46 +02:00
|
|
|
import { formatLbryUriForWeb } from 'util/uri';
|
|
|
|
|
2019-04-11 20:45:38 +02:00
|
|
|
import(/* webpackChunkName: "styles" */
|
|
|
|
/* webpackPrefetch: true */
|
2019-04-18 21:10:46 +02:00
|
|
|
'scss/all.scss');
|
2016-11-22 21:19:08 +01:00
|
|
|
|
2018-05-30 20:29:22 +02:00
|
|
|
const APPPAGEURL = 'lbry://?';
|
2017-12-13 22:36:30 +01:00
|
|
|
|
2019-02-22 06:01:59 +01:00
|
|
|
// @if TARGET='app'
|
|
|
|
const { autoUpdater } = remote.require('electron-updater');
|
2018-02-24 01:24:00 +01:00
|
|
|
autoUpdater.logger = remote.require('electron-log');
|
2019-02-22 06:01:59 +01:00
|
|
|
// @endif
|
2017-12-10 09:06:30 +01:00
|
|
|
|
2019-01-08 03:46:33 +01:00
|
|
|
if (process.env.LBRY_API_URL) {
|
|
|
|
Lbryio.setLocalApi(process.env.LBRY_API_URL);
|
|
|
|
}
|
|
|
|
|
2019-01-29 17:46:56 +01:00
|
|
|
if (process.env.SEARCH_API_URL) {
|
|
|
|
setSearchApi(process.env.SEARCH_API_URL);
|
|
|
|
}
|
|
|
|
|
2019-02-22 07:59:50 +01:00
|
|
|
// @if TARGET='web'
|
2019-04-11 21:18:52 +02:00
|
|
|
const SDK_API_URL = process.env.SDK_API_URL || 'https://api.piratebay.com/api/proxy';
|
2019-03-08 21:12:20 +01:00
|
|
|
Lbry.setDaemonConnectionString(SDK_API_URL);
|
2019-02-22 07:59:50 +01:00
|
|
|
// @endif
|
2019-01-30 06:35:36 +01:00
|
|
|
|
2018-09-24 05:44:42 +02:00
|
|
|
// We need to override Lbryio for getting/setting the authToken
|
|
|
|
// We interect with ipcRenderer to get the auth key from a users keyring
|
2018-11-30 18:57:12 +01:00
|
|
|
// We keep a local variable for authToken beacuse `ipcRenderer.send` does not
|
|
|
|
// contain a response, so there is no way to know when it's been set
|
2018-11-30 06:55:45 +01:00
|
|
|
let authToken;
|
2018-11-30 18:57:12 +01:00
|
|
|
Lbryio.setOverride(
|
|
|
|
'setAuthToken',
|
|
|
|
status =>
|
|
|
|
new Promise(resolve => {
|
|
|
|
Lbryio.call(
|
|
|
|
'user',
|
|
|
|
'new',
|
|
|
|
{
|
|
|
|
auth_token: '',
|
|
|
|
language: 'en',
|
|
|
|
app_id: status.installation_id,
|
|
|
|
},
|
|
|
|
'post'
|
|
|
|
).then(response => {
|
|
|
|
if (!response.auth_token) {
|
|
|
|
throw new Error(__('auth_token is missing from response'));
|
|
|
|
}
|
2018-09-24 05:44:42 +02:00
|
|
|
|
2018-11-30 18:57:12 +01:00
|
|
|
const newAuthToken = response.auth_token;
|
|
|
|
authToken = newAuthToken;
|
2019-04-11 20:45:38 +02:00
|
|
|
// @if TARGET='web'
|
2019-04-11 21:18:52 +02:00
|
|
|
document.cookie = cookie.serialize('auth_token', authToken);
|
2019-04-11 20:45:38 +02:00
|
|
|
// @endif
|
2019-02-22 06:01:59 +01:00
|
|
|
// @if TARGET='app'
|
2018-11-30 18:57:12 +01:00
|
|
|
ipcRenderer.send('set-auth-token', authToken);
|
2019-02-22 06:01:59 +01:00
|
|
|
// @endif
|
2018-11-30 18:57:12 +01:00
|
|
|
resolve();
|
|
|
|
});
|
|
|
|
})
|
|
|
|
);
|
2018-09-24 05:44:42 +02:00
|
|
|
|
|
|
|
Lbryio.setOverride(
|
|
|
|
'getAuthToken',
|
|
|
|
() =>
|
|
|
|
new Promise(resolve => {
|
2018-11-30 06:55:45 +01:00
|
|
|
if (authToken) {
|
|
|
|
resolve(authToken);
|
|
|
|
} else {
|
2019-02-22 06:01:59 +01:00
|
|
|
// @if TARGET='app'
|
2018-11-30 06:55:45 +01:00
|
|
|
ipcRenderer.once('auth-token-response', (event, token) => {
|
|
|
|
Lbryio.authToken = token;
|
|
|
|
resolve(token);
|
|
|
|
});
|
2018-09-24 05:44:42 +02:00
|
|
|
|
2018-11-30 06:55:45 +01:00
|
|
|
ipcRenderer.send('get-auth-token');
|
2019-02-22 06:01:59 +01:00
|
|
|
// @endif
|
2019-04-11 20:45:38 +02:00
|
|
|
// @if TARGET='web'
|
2019-04-11 21:18:52 +02:00
|
|
|
const { auth_token: authToken } = cookie.parse(document.cookie);
|
2019-04-11 20:45:38 +02:00
|
|
|
resolve(authToken);
|
|
|
|
// @endif
|
2018-11-30 06:55:45 +01:00
|
|
|
}
|
2018-09-24 05:44:42 +02:00
|
|
|
})
|
|
|
|
);
|
|
|
|
|
2018-11-28 18:40:52 +01:00
|
|
|
rewards.setCallback('claimFirstRewardSuccess', () => {
|
|
|
|
app.store.dispatch(doOpenModal(MODALS.FIRST_REWARD));
|
|
|
|
});
|
|
|
|
|
|
|
|
rewards.setCallback('rewardApprovalRequired', () => {
|
|
|
|
app.store.dispatch(doOpenModal(MODALS.REWARD_APPROVAL_REQUIRED));
|
|
|
|
});
|
|
|
|
|
2018-12-13 17:51:37 +01:00
|
|
|
rewards.setCallback('claimRewardSuccess', () => {
|
|
|
|
app.store.dispatch(doHideModal(MODALS.REWARD_APPROVAL_REQUIRED));
|
|
|
|
});
|
|
|
|
|
2019-02-22 06:01:59 +01:00
|
|
|
// @if TARGET='app'
|
2017-12-26 14:25:26 +01:00
|
|
|
ipcRenderer.on('open-uri-requested', (event, uri, newSession) => {
|
2017-12-21 18:32:51 +01:00
|
|
|
if (uri && uri.startsWith('lbry://')) {
|
2019-01-08 05:42:54 +01:00
|
|
|
if (uri.startsWith('lbry://?verify')) {
|
|
|
|
app.store.dispatch(doConditionalAuthNavigate(newSession));
|
2018-05-30 20:29:22 +02:00
|
|
|
} else if (uri.startsWith(APPPAGEURL)) {
|
|
|
|
const navpage = uri.replace(APPPAGEURL, '').toLowerCase();
|
2019-04-18 21:10:46 +02:00
|
|
|
app.store.dispatch(push(`/$/${navpage}`));
|
2018-05-30 20:29:22 +02:00
|
|
|
} else if (isURIValid(uri)) {
|
2019-04-18 21:10:46 +02:00
|
|
|
const formattedUri = formatLbryUriForWeb(uri);
|
|
|
|
app.store.dispatch(push(formattedUri));
|
2018-05-30 20:29:22 +02:00
|
|
|
} else {
|
|
|
|
app.store.dispatch(
|
2018-10-29 18:23:53 +01:00
|
|
|
doToast({
|
2018-05-30 20:29:22 +02:00
|
|
|
message: __('Invalid LBRY URL requested'),
|
|
|
|
})
|
|
|
|
);
|
2017-12-23 03:09:06 +01:00
|
|
|
}
|
2017-06-08 02:56:52 +02:00
|
|
|
}
|
2017-05-09 22:58:48 +02:00
|
|
|
});
|
2017-05-08 11:04:11 +02:00
|
|
|
|
2017-12-21 18:32:51 +01:00
|
|
|
ipcRenderer.on('open-menu', (event, uri) => {
|
|
|
|
if (uri && uri.startsWith('/help')) {
|
2019-04-18 21:10:46 +02:00
|
|
|
app.store.dispatch(push('/$/help'));
|
2017-06-13 17:02:06 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2017-12-21 18:32:51 +01:00
|
|
|
const { dock } = remote.app;
|
2017-09-14 09:36:41 +02:00
|
|
|
|
2017-12-21 18:32:51 +01:00
|
|
|
ipcRenderer.on('window-is-focused', () => {
|
2017-09-14 09:36:41 +02:00
|
|
|
if (!dock) return;
|
2017-12-21 18:32:51 +01:00
|
|
|
app.store.dispatch({ type: ACTIONS.WINDOW_FOCUSED });
|
|
|
|
dock.setBadge('');
|
2017-09-14 09:36:41 +02:00
|
|
|
});
|
|
|
|
|
2018-05-23 04:37:09 +02:00
|
|
|
ipcRenderer.on('devtools-is-opened', () => {
|
2019-03-20 20:09:58 +01:00
|
|
|
doLogWarningConsoleMessage();
|
2018-05-23 04:37:09 +02:00
|
|
|
});
|
2019-02-22 06:01:59 +01:00
|
|
|
// @endif
|
2018-05-23 04:37:09 +02:00
|
|
|
|
2018-02-28 23:03:36 +01:00
|
|
|
document.addEventListener('dragover', event => {
|
|
|
|
event.preventDefault();
|
2018-03-06 09:36:04 +01:00
|
|
|
});
|
2018-02-28 23:03:36 +01:00
|
|
|
document.addEventListener('drop', event => {
|
|
|
|
event.preventDefault();
|
|
|
|
});
|
2017-12-21 18:32:51 +01:00
|
|
|
document.addEventListener('click', event => {
|
|
|
|
let { target } = event;
|
2018-11-07 23:44:38 +01:00
|
|
|
|
2017-06-08 02:56:52 +02:00
|
|
|
while (target && target !== document) {
|
2017-12-21 18:32:51 +01:00
|
|
|
if (target.matches('a[href^="http"]') || target.matches('a[href^="mailto"]')) {
|
2019-02-22 06:01:59 +01:00
|
|
|
// @if TARGET='app'
|
2017-06-08 02:56:52 +02:00
|
|
|
event.preventDefault();
|
|
|
|
shell.openExternal(target.href);
|
|
|
|
return;
|
2019-02-22 06:01:59 +01:00
|
|
|
// @endif
|
2017-06-08 02:56:52 +02:00
|
|
|
}
|
|
|
|
target = target.parentNode;
|
|
|
|
}
|
2017-05-21 18:15:41 +02:00
|
|
|
});
|
|
|
|
|
2017-12-28 00:48:11 +01:00
|
|
|
const init = () => {
|
2019-02-22 06:01:59 +01:00
|
|
|
// @if TARGET='app'
|
2018-10-14 19:47:18 +02:00
|
|
|
moment.locale(remote.app.getLocale());
|
|
|
|
|
2018-03-22 16:43:35 +01:00
|
|
|
autoUpdater.on('error', error => {
|
|
|
|
console.error(error.message);
|
2018-03-20 02:09:36 +01:00
|
|
|
});
|
|
|
|
|
2018-03-15 01:22:54 +01:00
|
|
|
if (['win32', 'darwin'].includes(process.platform)) {
|
|
|
|
autoUpdater.on('update-available', () => {
|
|
|
|
console.log('Update available');
|
|
|
|
});
|
|
|
|
autoUpdater.on('update-not-available', () => {
|
|
|
|
console.log('Update not available');
|
|
|
|
});
|
|
|
|
autoUpdater.on('update-downloaded', () => {
|
|
|
|
console.log('Update downloaded');
|
|
|
|
app.store.dispatch(doAutoUpdate());
|
|
|
|
});
|
|
|
|
}
|
2018-04-24 20:17:11 +02:00
|
|
|
|
2018-01-14 10:14:15 +01:00
|
|
|
app.store.dispatch(doUpdateIsNightAsync());
|
2019-02-22 06:01:59 +01:00
|
|
|
// @endif
|
2017-08-08 11:36:14 +02:00
|
|
|
|
2019-03-05 05:46:57 +01:00
|
|
|
app.store.dispatch(doDownloadLanguages());
|
2019-02-28 00:50:00 +01:00
|
|
|
app.store.dispatch(doBlackListedOutpointsSubscribe());
|
|
|
|
|
2017-06-08 02:56:52 +02:00
|
|
|
function onDaemonReady() {
|
2019-03-28 17:53:13 +01:00
|
|
|
// @if TARGET='app'
|
2018-02-16 09:47:52 +01:00
|
|
|
window.sessionStorage.setItem('loaded', 'y'); // once we've made it here once per session, we don't need to show splash again
|
2019-03-28 17:53:13 +01:00
|
|
|
// @endif
|
2017-06-06 06:21:55 +02:00
|
|
|
|
2019-03-29 15:23:32 +01:00
|
|
|
app.store.dispatch(doDaemonReady());
|
2018-02-16 09:47:52 +01:00
|
|
|
ReactDOM.render(
|
|
|
|
<Provider store={store}>
|
2019-04-04 23:05:23 +02:00
|
|
|
<ConnectedRouter history={history}>
|
|
|
|
<ErrorBoundary>
|
|
|
|
<App />
|
|
|
|
<SnackBar />
|
|
|
|
</ErrorBoundary>
|
|
|
|
</ConnectedRouter>
|
2018-02-16 09:47:52 +01:00
|
|
|
</Provider>,
|
|
|
|
document.getElementById('app')
|
|
|
|
);
|
2017-06-08 02:56:52 +02:00
|
|
|
}
|
2017-06-06 06:21:55 +02:00
|
|
|
|
2019-03-28 17:53:13 +01:00
|
|
|
// @if TARGET='app'
|
2019-03-08 20:20:17 +01:00
|
|
|
if (window.sessionStorage.getItem('loaded') === 'y') {
|
2017-06-08 02:56:52 +02:00
|
|
|
onDaemonReady();
|
|
|
|
} else {
|
2017-07-19 23:05:08 +02:00
|
|
|
ReactDOM.render(
|
|
|
|
<Provider store={store}>
|
2018-08-16 07:17:15 +02:00
|
|
|
<SplashScreen
|
2018-09-24 05:44:42 +02:00
|
|
|
authenticate={() => app.store.dispatch(doAuthenticate(pjson.version))}
|
2019-03-08 20:20:17 +01:00
|
|
|
onReadyToLaunch={onDaemonReady}
|
2018-08-16 07:17:15 +02:00
|
|
|
/>
|
2017-07-19 23:05:08 +02:00
|
|
|
</Provider>,
|
2017-12-21 18:32:51 +01:00
|
|
|
document.getElementById('app')
|
2017-07-19 23:05:08 +02:00
|
|
|
);
|
2017-07-02 21:13:37 +02:00
|
|
|
}
|
2019-03-28 17:53:13 +01:00
|
|
|
// @endif
|
|
|
|
// @if TARGET='web'
|
|
|
|
onDaemonReady();
|
|
|
|
// @endif
|
2017-07-02 21:13:37 +02:00
|
|
|
};
|
|
|
|
|
2017-04-01 08:36:45 +02:00
|
|
|
init();
|