2016-11-22 21:19:08 +01:00
|
|
|
import React from 'react';
|
2017-02-20 19:56:15 +01:00
|
|
|
import {Line} from 'rc-progress';
|
|
|
|
|
2016-11-22 21:19:08 +01:00
|
|
|
import lbry from './lbry.js';
|
|
|
|
import SettingsPage from './page/settings.js';
|
|
|
|
import HelpPage from './page/help.js';
|
|
|
|
import WatchPage from './page/watch.js';
|
|
|
|
import ReportPage from './page/report.js';
|
|
|
|
import StartPage from './page/start.js';
|
|
|
|
import ClaimCodePage from './page/claim_code.js';
|
|
|
|
import ReferralPage from './page/referral.js';
|
|
|
|
import WalletPage from './page/wallet.js';
|
|
|
|
import DetailPage from './page/show.js';
|
|
|
|
import PublishPage from './page/publish.js';
|
|
|
|
import DiscoverPage from './page/discover.js';
|
|
|
|
import SplashScreen from './component/splash.js';
|
2016-12-29 10:23:28 +01:00
|
|
|
import DeveloperPage from './page/developer.js';
|
2017-01-13 23:18:37 +01:00
|
|
|
import {FileListDownloaded, FileListPublished} from './page/file-list.js';
|
2016-11-22 21:19:08 +01:00
|
|
|
import Drawer from './component/drawer.js';
|
|
|
|
import Header from './component/header.js';
|
|
|
|
import Modal from './component/modal.js';
|
|
|
|
import {Link} from './component/link.js';
|
|
|
|
|
2017-02-17 04:26:29 +01:00
|
|
|
|
2017-02-20 19:56:15 +01:00
|
|
|
const {remote, ipcRenderer} = require('electron');
|
2017-02-17 04:26:29 +01:00
|
|
|
const {download} = remote.require('electron-dl');
|
|
|
|
|
2017-02-20 19:56:15 +01:00
|
|
|
const UPDATE_URL = 'https://lbry.io/get/latest';
|
2017-02-17 04:26:29 +01:00
|
|
|
|
2016-04-10 02:00:56 +02:00
|
|
|
var App = React.createClass({
|
2016-10-21 11:21:07 +02:00
|
|
|
_error_key_labels: {
|
2016-10-22 10:40:46 +02:00
|
|
|
connectionString: 'API connection string',
|
2016-10-21 11:21:07 +02:00
|
|
|
method: 'Method',
|
|
|
|
params: 'Parameters',
|
|
|
|
code: 'Error code',
|
|
|
|
message: 'Error message',
|
|
|
|
data: 'Error data',
|
|
|
|
},
|
|
|
|
|
2016-04-10 02:00:56 +02:00
|
|
|
getInitialState: function() {
|
2016-04-21 11:51:27 +02:00
|
|
|
// For now, routes are in format ?page or ?page=args
|
2016-08-07 22:10:44 +02:00
|
|
|
var match, param, val, viewingPage,
|
|
|
|
drawerOpenRaw = sessionStorage.getItem('drawerOpen');
|
|
|
|
|
2016-08-27 16:12:56 +02:00
|
|
|
[match, viewingPage, val] = window.location.search.match(/\??([^=]*)(?:=(.*))?/);
|
2016-04-21 11:51:27 +02:00
|
|
|
|
2016-08-08 02:57:12 +02:00
|
|
|
|
2016-04-20 12:28:13 +02:00
|
|
|
return {
|
2016-08-27 16:12:56 +02:00
|
|
|
viewingPage: viewingPage,
|
2016-08-07 22:10:44 +02:00
|
|
|
drawerOpen: drawerOpenRaw !== null ? JSON.parse(drawerOpenRaw) : true,
|
2016-12-30 13:42:47 +01:00
|
|
|
pageArgs: typeof val !== 'undefined' ? val : null,
|
2016-10-21 11:21:07 +02:00
|
|
|
errorInfo: null,
|
2016-10-21 09:47:06 +02:00
|
|
|
modal: null,
|
|
|
|
isOldOSX: null,
|
2017-02-20 19:56:15 +01:00
|
|
|
downloadProgress: null,
|
2016-04-20 12:28:13 +02:00
|
|
|
};
|
2016-04-10 02:00:56 +02:00
|
|
|
},
|
2016-04-12 12:30:25 +02:00
|
|
|
componentWillMount: function() {
|
2016-10-22 11:22:44 +02:00
|
|
|
document.addEventListener('unhandledError', (event) => {
|
2016-10-21 11:21:07 +02:00
|
|
|
this.alertError(event.detail);
|
|
|
|
});
|
|
|
|
|
2016-10-21 09:47:06 +02:00
|
|
|
lbry.checkNewVersionAvailable((isAvailable) => {
|
2016-08-07 23:05:04 +02:00
|
|
|
if (!isAvailable || sessionStorage.getItem('upgradeSkipped')) {
|
2016-05-30 15:43:34 +02:00
|
|
|
return;
|
|
|
|
}
|
2016-04-20 11:46:13 +02:00
|
|
|
|
2016-10-21 09:47:06 +02:00
|
|
|
lbry.getVersionInfo((versionInfo) => {
|
|
|
|
var isOldOSX = false;
|
2016-08-03 12:56:40 +02:00
|
|
|
if (versionInfo.os_system == 'Darwin') {
|
|
|
|
var maj, min, patch;
|
|
|
|
[maj, min, patch] = versionInfo.lbrynet_version.split('.');
|
|
|
|
if (maj == 0 && min <= 2 && patch <= 2) {
|
2016-10-21 09:47:06 +02:00
|
|
|
isOldOSX = true;
|
2016-08-03 12:56:40 +02:00
|
|
|
}
|
2016-05-30 15:43:34 +02:00
|
|
|
}
|
2016-10-21 09:47:06 +02:00
|
|
|
this.setState({
|
|
|
|
modal: 'upgrade',
|
|
|
|
isOldOSX: isOldOSX,
|
|
|
|
})
|
2016-05-30 15:43:34 +02:00
|
|
|
});
|
2016-04-12 12:30:25 +02:00
|
|
|
});
|
|
|
|
},
|
2016-08-07 22:10:44 +02:00
|
|
|
openDrawer: function() {
|
|
|
|
sessionStorage.setItem('drawerOpen', true);
|
|
|
|
this.setState({ drawerOpen: true });
|
|
|
|
},
|
|
|
|
closeDrawer: function() {
|
|
|
|
sessionStorage.setItem('drawerOpen', false);
|
|
|
|
this.setState({ drawerOpen: false });
|
|
|
|
},
|
2016-10-21 09:47:06 +02:00
|
|
|
closeModal: function() {
|
|
|
|
this.setState({
|
|
|
|
modal: null,
|
|
|
|
});
|
|
|
|
},
|
|
|
|
handleUpgradeClicked: function() {
|
2017-02-17 04:26:29 +01:00
|
|
|
// TODO: create a callback for onProgress and have the UI
|
|
|
|
// show download progress
|
|
|
|
// TODO: remove the saveAs popup. Thats just me being lazy and having
|
|
|
|
// some indication that the download is happening
|
|
|
|
// TODO: calling lbry.stop() ends up displaying the "daemon
|
|
|
|
// unexpectedly stopped" page. Have a better way of shutting down
|
2017-02-20 19:56:15 +01:00
|
|
|
let options = {
|
|
|
|
onProgress: (p) => this.setState({downloadProgress: Math.round(p * 100)}),
|
|
|
|
}
|
|
|
|
download(remote.getCurrentWindow(), UPDATE_URL, options)
|
|
|
|
.then(dl => ipcRenderer.send('shutdown'));
|
|
|
|
this.setState({modal: 'downloading'});
|
2016-10-21 09:47:06 +02:00
|
|
|
},
|
|
|
|
handleSkipClicked: function() {
|
|
|
|
sessionStorage.setItem('upgradeSkipped', true);
|
|
|
|
this.setState({
|
|
|
|
modal: null,
|
|
|
|
});
|
|
|
|
},
|
2016-08-08 04:48:45 +02:00
|
|
|
onSearch: function(term) {
|
|
|
|
this.setState({
|
|
|
|
viewingPage: 'discover',
|
|
|
|
pageArgs: term
|
|
|
|
});
|
2016-08-08 02:57:12 +02:00
|
|
|
},
|
2016-10-21 11:21:07 +02:00
|
|
|
alertError: function(error) {
|
|
|
|
var errorInfoList = [];
|
|
|
|
for (let key of Object.keys(error)) {
|
2016-10-22 10:35:47 +02:00
|
|
|
let val = typeof error[key] == 'string' ? error[key] : JSON.stringify(error[key]);
|
2016-10-21 11:21:07 +02:00
|
|
|
let label = this._error_key_labels[key];
|
2016-10-22 11:50:55 +02:00
|
|
|
errorInfoList.push(<li key={key}><strong>{label}</strong>: <code>{val}</code></li>);
|
2016-10-21 11:21:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
this.setState({
|
|
|
|
modal: 'error',
|
2016-10-26 08:57:20 +02:00
|
|
|
errorInfo: <ul className="error-modal__error-list">{errorInfoList}</ul>,
|
2016-10-21 11:21:07 +02:00
|
|
|
});
|
|
|
|
},
|
2016-08-27 16:12:56 +02:00
|
|
|
getHeaderLinks: function()
|
|
|
|
{
|
|
|
|
switch(this.state.viewingPage)
|
|
|
|
{
|
|
|
|
case 'wallet':
|
|
|
|
case 'send':
|
|
|
|
case 'receive':
|
|
|
|
case 'claim':
|
2016-09-08 10:17:08 +02:00
|
|
|
case 'referral':
|
2016-08-27 16:12:56 +02:00
|
|
|
return {
|
|
|
|
'?wallet' : 'Overview',
|
|
|
|
'?send' : 'Send',
|
|
|
|
'?receive' : 'Receive',
|
2016-09-08 10:17:08 +02:00
|
|
|
'?claim' : 'Claim Beta Code',
|
2016-09-09 13:40:27 +02:00
|
|
|
'?referral' : 'Check Referral Credit',
|
2016-08-27 16:12:56 +02:00
|
|
|
};
|
2016-09-23 11:19:39 +02:00
|
|
|
case 'downloaded':
|
|
|
|
case 'published':
|
|
|
|
return {
|
|
|
|
'?downloaded': 'Downloaded',
|
|
|
|
'?published': 'Published',
|
|
|
|
};
|
2016-08-27 16:12:56 +02:00
|
|
|
default:
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
},
|
2016-08-08 00:13:17 +02:00
|
|
|
getMainContent: function()
|
|
|
|
{
|
|
|
|
switch(this.state.viewingPage)
|
|
|
|
{
|
|
|
|
case 'settings':
|
|
|
|
return <SettingsPage />;
|
|
|
|
case 'help':
|
|
|
|
return <HelpPage />;
|
|
|
|
case 'watch':
|
|
|
|
return <WatchPage name={this.state.pageArgs} />;
|
|
|
|
case 'report':
|
|
|
|
return <ReportPage />;
|
2016-09-23 11:19:39 +02:00
|
|
|
case 'downloaded':
|
2017-01-13 23:18:37 +01:00
|
|
|
return <FileListDownloaded />;
|
2016-09-23 11:19:39 +02:00
|
|
|
case 'published':
|
2017-01-13 23:18:37 +01:00
|
|
|
return <FileListPublished />;
|
2016-08-08 00:13:17 +02:00
|
|
|
case 'start':
|
|
|
|
return <StartPage />;
|
|
|
|
case 'claim':
|
|
|
|
return <ClaimCodePage />;
|
2016-09-08 10:17:08 +02:00
|
|
|
case 'referral':
|
|
|
|
return <ReferralPage />;
|
2016-08-08 00:13:17 +02:00
|
|
|
case 'wallet':
|
2016-08-27 16:12:56 +02:00
|
|
|
case 'send':
|
|
|
|
case 'receive':
|
|
|
|
return <WalletPage viewingPage={this.state.viewingPage} />;
|
2016-08-08 00:13:17 +02:00
|
|
|
case 'show':
|
|
|
|
return <DetailPage name={this.state.pageArgs} />;
|
|
|
|
case 'publish':
|
|
|
|
return <PublishPage />;
|
2016-12-29 10:23:28 +01:00
|
|
|
case 'developer':
|
|
|
|
return <DeveloperPage />;
|
2016-08-27 16:12:56 +02:00
|
|
|
case 'discover':
|
|
|
|
default:
|
2016-12-30 13:42:47 +01:00
|
|
|
return <DiscoverPage {... this.state.pageArgs !== null ? {query: this.state.pageArgs} : {} } />;
|
2016-08-08 00:13:17 +02:00
|
|
|
}
|
|
|
|
},
|
2016-04-10 02:00:56 +02:00
|
|
|
render: function() {
|
2016-08-27 16:12:56 +02:00
|
|
|
var mainContent = this.getMainContent(),
|
2017-01-13 04:36:03 +01:00
|
|
|
headerLinks = this.getHeaderLinks(),
|
|
|
|
searchQuery = this.state.viewingPage == 'discover' && this.state.pageArgs ? this.state.pageArgs : '';
|
2016-08-08 00:13:17 +02:00
|
|
|
|
2016-08-07 22:10:44 +02:00
|
|
|
return (
|
2016-08-08 05:39:44 +02:00
|
|
|
this.state.viewingPage == 'watch' ?
|
|
|
|
mainContent :
|
|
|
|
<div id="window" className={ this.state.drawerOpen ? 'drawer-open' : 'drawer-closed' }>
|
|
|
|
<Drawer onCloseDrawer={this.closeDrawer} viewingPage={this.state.viewingPage} />
|
2016-08-27 16:12:56 +02:00
|
|
|
<div id="main-content" className={ headerLinks ? 'with-sub-nav' : 'no-sub-nav' }>
|
2017-01-13 04:36:03 +01:00
|
|
|
<Header onOpenDrawer={this.openDrawer} initialQuery={searchQuery} onSearch={this.onSearch} links={headerLinks} viewingPage={this.state.viewingPage} />
|
2016-08-08 05:39:44 +02:00
|
|
|
{mainContent}
|
|
|
|
</div>
|
2017-01-13 23:05:09 +01:00
|
|
|
<Modal isOpen={this.state.modal == 'upgrade'} contentLabel="Update available"
|
|
|
|
type="confirm" confirmButtonLabel="Upgrade" abortButtonLabel="Skip"
|
|
|
|
onConfirmed={this.handleUpgradeClicked} onAborted={this.handleSkipClicked}>
|
2016-12-05 20:51:36 +01:00
|
|
|
<p>Your version of LBRY is out of date and may be unreliable or insecure.</p>
|
2016-10-21 09:47:06 +02:00
|
|
|
{this.state.isOldOSX
|
|
|
|
? <p>Before installing the new version, make sure to exit LBRY. If you started the app, click the LBRY icon in your status bar and choose "Quit."</p>
|
|
|
|
: null}
|
|
|
|
|
|
|
|
</Modal>
|
2017-02-20 19:56:15 +01:00
|
|
|
// TODO: have color refence css color-primary
|
|
|
|
<Modal isOpen={this.state.modal == 'downloading'} contentLabel="Downloading Update" type="custom">
|
|
|
|
Downloading Update: {this.state.downloadProgress}% Complete
|
|
|
|
<Line percent={this.state.downloadProgress} strokeWidth="4"/>
|
|
|
|
</Modal>
|
2017-01-13 23:05:09 +01:00
|
|
|
<Modal isOpen={this.state.modal == 'error'} contentLabel="Error" type="custom"
|
|
|
|
className="error-modal" overlayClassName="error-modal-overlay" >
|
2016-10-26 08:57:20 +02:00
|
|
|
<h3 className="modal__header">Error</h3>
|
|
|
|
|
|
|
|
<div className="error-modal__content">
|
|
|
|
<div><img className="error-modal__warning-symbol" src={lbry.imagePath('warning.png')} /></div>
|
|
|
|
<p>We're sorry that LBRY has encountered an error. This has been reported and we will investigate the problem.</p>
|
2016-10-25 05:52:36 +02:00
|
|
|
</div>
|
2016-10-21 11:21:07 +02:00
|
|
|
{this.state.errorInfo}
|
2016-10-26 08:57:20 +02:00
|
|
|
<div className="modal__buttons">
|
|
|
|
<Link button="alt" label="OK" className="modal__button" onClick={this.closeModal} />
|
|
|
|
</div>
|
2016-10-21 11:21:07 +02:00
|
|
|
</Modal>
|
2016-08-07 22:10:44 +02:00
|
|
|
</div>
|
|
|
|
);
|
2016-04-10 02:00:56 +02:00
|
|
|
}
|
2016-08-23 16:53:45 +02:00
|
|
|
});
|
2016-11-22 21:19:08 +01:00
|
|
|
|
|
|
|
|
|
|
|
export default App;
|