lbry-desktop/src/ui/index.js

277 lines
7.5 KiB
JavaScript
Raw Normal View History

2018-10-14 19:47:18 +02:00
/* eslint-disable no-console */
import App from 'component/app';
import SnackBar from 'component/snackBar';
import SplashScreen from 'component/splash';
2019-02-22 06:01:59 +01:00
// @if TARGET='app'
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';
import * as ACTIONS from 'constants/action_types';
2019-02-22 06:01:59 +01:00
// @endif
import * as MODALS from 'constants/modal_types';
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import {
doConditionalAuthNavigate,
doDaemonReady,
doAutoUpdate,
doOpenModal,
doHideModal,
} from 'redux/actions/app';
2019-02-22 07:59:50 +01:00
import {
Lbry,
doToast,
doBlackListedOutpointsSubscribe,
isURIValid,
setSearchApi,
} from 'lbry-redux';
import { doNavigate, doHistoryBack, doHistoryForward } from 'redux/actions/navigation';
import { doDownloadLanguages, doUpdateIsNightAsync } from 'redux/actions/settings';
2019-01-08 05:42:54 +01:00
import { doAuthenticate, Lbryio, rewards } from 'lbryinc';
import 'scss/all.scss';
import store 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';
import doLogWarningConsoleMessage from './logWarningConsoleMessage';
2016-11-22 21:19:08 +01: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='app'
ipcRenderer.on('navigate-backward', () => {
app.store.dispatch(doHistoryBack());
});
ipcRenderer.on('navigate-forward', () => {
app.store.dispatch(doHistoryForward());
});
2019-02-22 07:59:50 +01:00
// @endif
// @if TARGET='web'
2019-03-05 18:54:11 +01:00
Lbry.setDaemonConnectionString('https://beta.lbry.tv/api/proxy');
2019-02-22 07:59:50 +01:00
// @endif
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
// 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;
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
const newAuthToken = response.auth_token;
authToken = newAuthToken;
2019-02-22 06:01:59 +01:00
// @if TARGET='app'
ipcRenderer.send('set-auth-token', authToken);
2019-02-22 06:01:59 +01:00
// @endif
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
2018-11-30 06:55:45 +01:00
}
2018-09-24 05:44:42 +02:00
})
);
rewards.setCallback('claimFirstRewardSuccess', () => {
app.store.dispatch(doOpenModal(MODALS.FIRST_REWARD));
});
rewards.setCallback('rewardApprovalRequired', () => {
app.store.dispatch(doOpenModal(MODALS.REWARD_APPROVAL_REQUIRED));
});
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) => {
if (uri && uri.startsWith('lbry://')) {
2019-01-08 05:42:54 +01:00
if (uri.startsWith('lbry://?verify')) {
app.store.dispatch(doConditionalAuthNavigate(newSession));
} else if (uri.startsWith(APPPAGEURL)) {
const navpage = uri.replace(APPPAGEURL, '').toLowerCase();
app.store.dispatch(doNavigate(`/${navpage}`));
} else if (isURIValid(uri)) {
2017-12-26 14:25:26 +01:00
app.store.dispatch(doNavigate('/show', { uri }));
} else {
app.store.dispatch(
doToast({
message: __('Invalid LBRY URL requested'),
})
);
2017-12-23 03:09:06 +01:00
}
2017-06-08 02:56:52 +02:00
}
});
ipcRenderer.on('open-menu', (event, uri) => {
if (uri && uri.startsWith('/help')) {
app.store.dispatch(doNavigate('/help'));
}
});
const { dock } = remote.app;
ipcRenderer.on('window-is-focused', () => {
if (!dock) return;
app.store.dispatch({ type: ACTIONS.WINDOW_FOCUSED });
dock.setBadge('');
});
ipcRenderer.on('devtools-is-opened', () => {
const logOnDevelopment = false;
doLogWarningConsoleMessage(logOnDevelopment);
});
2019-02-22 06:01:59 +01:00
// @endif
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();
});
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) {
if (target.matches('a') || target.matches('button')) {
2017-12-06 01:16:54 +01:00
// TODO: Look into using accessiblity labels (this would also make the app more accessible)
const hrefParts = window.location.href.split('#');
2018-11-07 23:44:38 +01:00
// Buttons that we want to track should use `data-id`
// This prevents multiple buttons being grouped together if they have the same text
const element =
target.dataset.id || target.title || (target.textContent && target.textContent.trim());
2017-12-06 01:16:54 +01:00
if (element) {
2018-02-16 09:47:52 +01:00
analytics.track('CLICK', {
2017-12-06 02:16:06 +01:00
target: element,
location: hrefParts.length > 1 ? hrefParts[hrefParts.length - 1] : '/',
2017-12-06 02:16:06 +01:00
});
2017-12-06 01:16:54 +01:00
} else {
2018-02-16 09:47:52 +01:00
analytics.track('UNMARKED_CLICK', {
location: hrefParts.length > 1 ? hrefParts[hrefParts.length - 1] : '/',
2017-12-19 07:34:03 +01:00
source: target.outerHTML,
2017-12-06 02:16:06 +01:00
});
2017-12-06 01:16:54 +01:00
}
2017-12-05 09:04:00 +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
});
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 => {
// eslint-disable-next-line no-console
2018-03-22 16:43:35 +01:00
console.error(error.message);
});
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() {
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
app.store.dispatch(doDaemonReady());
2017-06-06 06:21:55 +02:00
2018-02-16 09:47:52 +01:00
ReactDOM.render(
<Provider store={store}>
<React.Fragment>
2018-06-04 02:17:58 +02:00
<App />
2018-02-16 09:47:52 +01:00
<SnackBar />
</React.Fragment>
2018-02-16 09:47:52 +01:00
</Provider>,
document.getElementById('app')
);
2019-02-22 06:01:59 +01:00
// @if TARGET='web'
// window.sessionStorage.removeItem('loaded');
// @endif
2017-06-08 02:56:52 +02:00
}
2017-06-06 06:21:55 +02:00
if (window.sessionStorage.getItem('loaded') === 'y') {
2017-06-08 02:56:52 +02:00
onDaemonReady();
} else {
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))}
2018-08-16 07:17:15 +02:00
onReadyToLaunch={onDaemonReady}
/>
</Provider>,
document.getElementById('app')
);
}
};
init();
2018-10-14 19:47:18 +02:00
2018-10-19 22:38:07 +02:00
/* eslint-enable react/jsx-filename-extension */
2018-10-14 19:47:18 +02:00
/* eslint-enable no-console */