lbry-desktop/src/renderer/index.js

159 lines
4.9 KiB
JavaScript
Raw Normal View History

import amplitude from 'amplitude-js';
import App from 'component/app';
import SnackBar from 'component/snackBar';
import SplashScreen from 'component/splash';
import * as ACTIONS from 'constants/action_types';
import { ipcRenderer, remote, shell } from 'electron';
import lbry from 'lbry';
/* eslint-disable react/jsx-filename-extension */
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { doConditionalAuthNavigate, doDaemonReady, doShowSnackBar, doAutoUpdate } from 'redux/actions/app';
import { doNavigate } from 'redux/actions/navigation';
import { doDownloadLanguages } from 'redux/actions/settings';
import { doUserEmailVerify } from 'redux/actions/user';
import 'scss/all.scss';
import store from 'store';
2017-12-21 23:09:30 +01:00
import app from './app';
2016-11-22 21:19:08 +01:00
const { autoUpdater } = remote.require('electron-updater');
const { contextMenu } = remote.require('./main.js');
2017-12-13 22:36:30 +01:00
2017-12-10 09:06:30 +01:00
autoUpdater.logger = remote.require("electron-log");
window.addEventListener('contextmenu', event => {
2018-01-05 23:25:33 +01:00
contextMenu(remote.getCurrentWindow(), event.x, event.y, app.env === 'development');
2017-06-08 02:56:52 +02:00
event.preventDefault();
});
2017-12-26 14:25:26 +01:00
ipcRenderer.on('open-uri-requested', (event, uri, newSession) => {
if (uri && uri.startsWith('lbry://')) {
2017-12-26 14:25:26 +01:00
if (uri.startsWith('lbry://?verify=')) {
2017-12-23 03:09:06 +01:00
let verification = {};
try {
verification = JSON.parse(atob(uri.substring(15)));
2017-12-26 14:25:26 +01:00
} catch (error) {
console.log(error);
2017-12-26 14:25:26 +01:00
}
2017-12-23 03:09:06 +01:00
if (verification.token && verification.recaptcha) {
app.store.dispatch(doConditionalAuthNavigate(newSession));
2017-12-26 14:25:26 +01:00
app.store.dispatch(doUserEmailVerify(verification.token, verification.recaptcha));
2017-12-23 03:09:06 +01:00
} else {
2017-12-26 14:25:26 +01:00
app.store.dispatch(doShowSnackBar({ message: 'Invalid Verification URI' }));
2017-12-23 03:09:06 +01:00
}
} else {
2017-12-26 14:25:26 +01:00
app.store.dispatch(doNavigate('/show', { uri }));
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('');
});
((history, ...args) => {
2017-12-22 02:21:22 +01:00
const { replaceState } = history;
const newHistory = history;
newHistory.replaceState = (_, __, path) => {
2017-12-22 02:21:22 +01:00
amplitude.getInstance().logEvent('NAVIGATION', { destination: path ? path.slice(1) : path });
return replaceState.apply(history, args);
2017-12-19 06:53:01 +01:00
};
})(window.history);
document.addEventListener('click', event => {
let { target } = event;
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('#');
2017-12-22 02:21:22 +01:00
const element = target.title || (target.textContent && target.textContent.trim());
2017-12-06 01:16:54 +01:00
if (element) {
amplitude.getInstance().logEvent('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 {
amplitude.getInstance().logEvent('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"]')) {
2017-06-08 02:56:52 +02:00
event.preventDefault();
shell.openExternal(target.href);
return;
}
target = target.parentNode;
}
2017-05-21 18:15:41 +02:00
});
const init = () => {
autoUpdater.on("update-downloaded", () => {
app.store.dispatch(doAutoUpdate());
});
2017-12-10 09:06:30 +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());
});
}
2017-08-08 11:36:14 +02:00
app.store.dispatch(doDownloadLanguages());
2017-06-08 02:56:52 +02:00
function onDaemonReady() {
2017-12-05 22:05:59 +01:00
lbry.status().then(info => {
2017-12-06 02:16:06 +01:00
amplitude.getInstance().init(
// Amplitude API Key
'0b130efdcbdbf86ec2f7f9eff354033e',
2017-12-06 02:16:06 +01:00
info.lbry_id,
null,
2017-12-13 22:36:30 +01:00
() => {
window.sessionStorage.setItem('loaded', 'y'); // once we've made it here once per session, we don't need to show splash again
2017-12-06 02:16:06 +01:00
app.store.dispatch(doDaemonReady());
2017-06-06 06:21:55 +02:00
2017-12-06 02:16:06 +01:00
ReactDOM.render(
<Provider store={store}>
<div>
2017-12-06 02:16:06 +01:00
<App />
<SnackBar />
</div>
2017-12-06 02:16:06 +01:00
</Provider>,
document.getElementById('app')
2017-12-06 02:16:06 +01:00
);
}
);
2017-12-05 22:05:59 +01:00
});
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}>
<SplashScreen onReadyToLaunch={onDaemonReady} />
</Provider>,
document.getElementById('app')
);
}
};
init();