lbry-desktop/ui/js/page/show.js

159 lines
4.9 KiB
JavaScript
Raw Normal View History

2016-11-22 21:19:08 +01:00
import React from 'react';
import lbry from '../lbry.js';
2016-12-08 00:07:28 +01:00
import lighthouse from '../lighthouse.js';
2017-04-11 03:29:07 +02:00
import uri from '../uri.js';
2016-12-08 00:07:28 +01:00
import {CreditAmount, Thumbnail} from '../component/common.js';
import {FileActions} from '../component/file-actions.js';
import {Link} from '../component/link.js';
2016-11-22 21:19:08 +01:00
2016-08-08 06:47:48 +02:00
var formatItemImgStyle = {
2016-07-16 04:58:24 +02:00
maxWidth: '100%',
maxHeight: '100%',
display: 'block',
marginLeft: 'auto',
marginRight: 'auto',
marginTop: '5px',
};
var FormatItem = React.createClass({
propTypes: {
2017-04-11 03:29:07 +02:00
metadata: React.PropTypes.object,
contentType: React.PropTypes.string,
cost: React.PropTypes.number,
2017-04-11 03:29:07 +02:00
uri: React.PropTypes.string,
outpoint: React.PropTypes.string,
costIncludesData: React.PropTypes.bool,
2016-07-16 04:58:24 +02:00
},
render: function() {
2017-04-11 03:29:07 +02:00
const {thumbnail, author, title, description, language, license} = this.props.metadata;
const mediaType = lbry.getMediaType(this.props.contentType);
var costIncludesData = this.props.costIncludesData;
var cost = this.props.cost || 0.0;
2016-07-16 04:58:24 +02:00
return (
2016-08-08 06:47:48 +02:00
<div className="row-fluid">
2016-07-16 04:58:24 +02:00
<div className="span4">
<Thumbnail src={thumbnail} alt={'Photo for ' + title} style={formatItemImgStyle} />
2016-07-16 04:58:24 +02:00
</div>
<div className="span8">
2016-08-08 06:47:48 +02:00
<p>{description}</p>
2016-08-27 00:06:22 +02:00
<section>
<table className="table-standard">
<tbody>
<tr>
2017-04-11 03:29:07 +02:00
<td>Content-Type</td><td>{this.props.contentType}</td>
2016-08-27 00:06:22 +02:00
</tr>
<tr>
<td>Cost</td><td><CreditAmount amount={cost} isEstimate={!costIncludesData}/></td>
2016-08-27 00:06:22 +02:00
</tr>
<tr>
<td>Author</td><td>{author}</td>
</tr>
<tr>
<td>Language</td><td>{language}</td>
</tr>
<tr>
<td>License</td><td>{license}</td>
</tr>
</tbody>
</table>
</section>
2017-04-11 03:29:07 +02:00
<FileActions uri={this._uri} outpoint={this.props.outpoint} metadata={this.props.metadata} contentType={this.props.contentType} />
2016-11-02 17:13:20 +01:00
<section>
<Link href="https://lbry.io/dmca" label="report" className="button-text-help" />
</section>
2016-07-16 04:58:24 +02:00
</div>
</div>
);
}
});
var FormatsSection = React.createClass({
propTypes: {
2017-04-11 03:29:07 +02:00
uri: React.PropTypes.string,
outpoint: React.PropTypes.string,
metadata: React.PropTypes.object,
contentType: React.PropTypes.string,
cost: React.PropTypes.number,
costIncludesData: React.PropTypes.bool,
2016-07-16 04:58:24 +02:00
},
render: function() {
2017-04-11 03:29:07 +02:00
if(this.props.metadata == null)
{
return (
<div>
2016-08-08 06:47:48 +02:00
<h2>Sorry, no results found for "{name}".</h2>
</div>);
}
2016-07-16 04:58:24 +02:00
return (
2016-07-16 07:19:40 +02:00
<div>
2017-04-11 03:29:07 +02:00
<div className="meta">{this.props.uri}</div>
<h2>{this.props.metadata.title}</h2>
2016-07-16 07:19:40 +02:00
{/* In future, anticipate multiple formats, just a guess at what it could look like
2017-04-11 03:29:07 +02:00
// var formats = this.props.metadata.formats
2016-07-16 07:19:40 +02:00
// return (<tbody>{formats.map(function(format,i){ */}
2017-04-11 03:29:07 +02:00
<FormatItem metadata={this.props.metadata} contentType={this.props.contentType} cost={this.props.cost} uri={this.props.uri} outpoint={this.props.outpoint} costIncludesData={this.props.costIncludesData} />
2016-07-16 07:19:40 +02:00
{/* })}</tbody>); */}
</div>);
2016-07-16 04:58:24 +02:00
}
});
2017-04-11 03:29:07 +02:00
var ShowPage = React.createClass({
_uri: null,
2016-07-16 04:58:24 +02:00
propTypes: {
2017-04-11 03:29:07 +02:00
uri: React.PropTypes.string,
2016-07-16 04:58:24 +02:00
},
getInitialState: function() {
return {
metadata: null,
2017-04-11 03:29:07 +02:00
contentType: null,
cost: null,
costIncludesData: null,
2017-04-11 03:29:07 +02:00
uriLookupComplete: null,
};
},
componentWillMount: function() {
2017-04-11 03:29:07 +02:00
this._uri = uri.normalizeLbryUri(this.props.uri);
document.title = this._uri;
2016-08-08 06:47:48 +02:00
2017-04-11 03:29:07 +02:00
lbry.resolve({uri: this._uri}).then(({txid, nout, claim: {value: {stream: {metadata, source: {contentType}}}}}) => {
this.setState({
outpoint: txid + ':' + nout,
2017-04-11 03:29:07 +02:00
metadata: metadata,
contentType: contentType,
uriLookupComplete: true,
});
});
2017-04-11 03:29:07 +02:00
lbry.getCostInfo(this._uri, ({cost, includesData}) => {
this.setState({
cost: cost,
costIncludesData: includesData,
});
});
},
2016-07-16 04:58:24 +02:00
render: function() {
if (this.state.metadata == null) {
return null;
}
2016-07-16 04:58:24 +02:00
return (
2016-08-08 06:47:48 +02:00
<main>
<section className="card">
2017-04-11 03:29:07 +02:00
{this.state.uriLookupComplete ? (
<FormatsSection uri={this._uri} outpoint={this.state.outpoint} metadata={this.state.metadata} cost={this.state.cost} costIncludesData={this.state.costIncludesData} contentType={this.state.contentType} />
) : (
<div>
<h2>No content</h2>
2017-04-11 03:29:07 +02:00
There is no content available at <strong>{this._uri}</strong>. If you reached this page from a link within the LBRY interface, please <Link href="?report" label="report a bug" />. Thanks!
</div>
)}
2016-08-08 06:47:48 +02:00
</section>
2016-07-16 04:58:24 +02:00
</main>);
}
2016-11-22 21:19:08 +01:00
});
2017-04-11 03:29:07 +02:00
export default ShowPage;