import React from 'react'; import lbry from '../lbry.js'; import {Link, DownloadLink, WatchLink} from '../component/link.js'; import {Thumbnail, TruncatedText, CreditAmount} from '../component/common.js'; let FileTile = React.createClass({ _isMounted: false, _statusCheckInterval: 5000, propTypes: { name: React.PropTypes.string.isRequired, mediaType: React.PropTypes.string.isRequired, title: React.PropTypes.string.isRequired, description: React.PropTypes.string, compact: React.PropTypes.boolean, cost: React.PropTypes.number, costIncludesData: React.PropTypes.boolean, }, updateFileInfo: function(progress=null) { const updateStatusCallback = ((result) => { if (!this._isMounted || 'fileInfo' in this.props) { /** * The component was unmounted, or a file info data structure has now been provided by the * containing component. */ return; } this.setState({ fileInfo: result || null, }); setTimeout(() => { this.updateFileInfo() }, this._statusCheckInterval); }); if ('sdHash' in this.props) { lbry.getFileInfoBySdHash(this.props.sdHash, updateStatusCallback); } else if ('name' in this.props) { lbry.getFileInfoByName(this.props.name, updateStatusCallback); } else { throw new Error("No progress, stream name or sd hash passed to FileTile"); } }, getInitialState: function() { return { downloading: false, isHovered: false, cost: null, costIncludesData: null, fileInfo: 'fileInfo' in this.props ? this.props.fileInfo : null, } }, getDefaultProps: function() { return { compact: false, } }, handleMouseOver: function() { this.setState({ isHovered: true, }); }, handleMouseOut: function() { this.setState({ isHovered: false, }); }, componentWillMount: function() { if ('cost' in this.props) { this.setState({ cost: this.props.cost, costIncludesData: this.props.costIncludesData, }); } else { lbry.getCostInfoForName(this.props.name, ({cost, includesData}) => { this.setState({ cost: cost, costIncludesData: includesData, }); }); } }, componentDidMount: function() { this._isMounted = true; this.updateFileInfo(); }, componentWillUnmount: function() { this._isMounted = false; }, render: function() { const obscureNsfw = !lbry.getClientSetting('showNsfw') && this.props.nsfw; let downloadLinkExtraProps = {}; if (this.state.fileInfo !== null) { const {written_bytes, total_bytes, completed} = this.state.fileInfo; downloadLinkExtraProps['progress'] = written_bytes / total_bytes; downloadLinkExtraProps['downloading'] = !completed; } return (
{this.state.cost !== null ? : null}
lbry://{this.props.name}

{this.props.title}

{this.props.mediaType == 'video' ? : null} {!this.props.isMine ? : null}

{this.props.description}

{obscureNsfw && this.state.isHovered ?

This content is Not Safe For Work. To view adult content, please change your .

: null}
); } }); export default FileTile;