//component/icon.js var Icon = React.createClass({ propTypes: { style: React.PropTypes.object, fixed: React.PropTypes.boolean, }, render: function() { var className = 'icon ' + ('fixed' in this.props ? 'icon-fixed-width ' : '') + this.props.icon; return } }); var TruncatedText = React.createClass({ propTypes: { limit: React.PropTypes.string, }, getDefaultProps: function() { return { limit: 250, } }, render: function() { var text = this.props.children; var limit = this.props.limit; return {text.slice(0, limit) + (text.length > limit ? ' ...' : '')}; } }); var toolTipStyle = { position: 'absolute', zIndex: '1', top: '100%', left: '-120px', width: '260px', padding: '15px', border: '1px solid #aaa', backgroundColor: '#fff', fontSize: '14px', }; var ToolTip = React.createClass({ propTypes: { open: React.PropTypes.bool.isRequired, onMouseOut: React.PropTypes.func }, render: function() { return (
{this.props.children}
); } }); var linkContainerStyle = { position: 'relative', }; var Link = React.createClass({ getInitialState: function() { return { showTooltip: false, }; }, handleClick: function() { if (this.props.tooltip) { this.setState({ showTooltip: !this.state.showTooltip, }); } if (this.props.onClick) { this.props.onClick(); } }, handleTooltipMouseOut: function() { this.setState({ showTooltip: false, }); }, render: function() { var href = this.props.href ? this.props.href : 'javascript:;', icon = this.props.icon ? : '', className = (this.props.button ? 'button-block button-' + this.props.button : 'button-text') + (this.props.hidden ? ' hidden' : '') + (this.props.disabled ? ' disabled' : ''); return ( {this.props.icon ? icon : '' } {this.props.label} {(!this.props.tooltip ? null : {this.props.tooltip} )} ); } }); var DownloadLink = React.createClass({ propTypes: { type: React.PropTypes.string, streamName: React.PropTypes.string, label: React.PropTypes.string, downloadingLabel: React.PropTypes.string, button: React.PropTypes.string, style: React.PropTypes.object, hidden: React.PropTypes.bool, }, getDefaultProps: function() { return { icon: 'icon-download', label: 'Download', downloadingLabel: 'Downloading...', } }, getInitialState: function() { return { downloading: false, } }, handleClick: function() { lbry.getCostEstimate(this.props.streamName, (amount) => { lbry.getBalance((balance) => { if (amount > balance) { alert("You don't have enough LBRY credits to pay for this stream."); } else { this.startDownload(); } }); }); }, startDownload: function() { if (!this.state.downloading) { //@TODO: Continually update this.state.downloading based on actual status of file this.setState({ downloading: true }); lbry.getStream(this.props.streamName, (streamInfo) => { alert('Downloading to ' + streamInfo.path); console.log(streamInfo); }); } }, render: function() { var label = (!this.state.downloading ? this.props.label : this.props.downloadingLabel); return ; } }); var WatchLink = React.createClass({ propTypes: { type: React.PropTypes.string, streamName: React.PropTypes.string, label: React.PropTypes.string, button: React.PropTypes.string, style: React.PropTypes.object, hidden: React.PropTypes.bool, }, handleClick: function() { lbry.getCostEstimate(this.props.streamName, (amount) => { lbry.getBalance((balance) => { if (amount > balance) { alert("You don't have enough LBRY credits to pay for this stream."); } else { window.location = '?watch=' + this.props.streamName; } }); }); }, getDefaultProps: function() { return { icon: 'icon-play', label: 'Watch', } }, render: function() { return ; } }); var requiredFieldWarningStyle = { color: '#cc0000', transition: 'opacity 400ms ease-in', }; var FormField = React.createClass({ _type: null, _element: null, propTypes: { type: React.PropTypes.string.isRequired, hidden: React.PropTypes.bool, }, getInitialState: function() { return { warningState: 'hidden', } }, componentWillMount: function() { if (['text', 'radio', 'checkbox', 'file'].indexOf(this.props.type) != -1) { this._element = 'input'; this._type = this.props.type; } else { // Non field, e.g.